Moniepoint · Arazzo Workflow

Moniepoint Single Transfer With OTP

Version 1.0.0

Initiate a single transfer, branch on whether OTP authorization is required, authorize it, and confirm.

1 workflow 2 source APIs 1 provider
View Spec View on GitHub AfricaNigeriaPaymentsBankingFintechAcquiringPoint-of-SaleCollectionDisbursementsVirtual AccountsDirect DebitBills PaymentSMBWorking CapitalUnicornArazzoWorkflows

Provider

moniepoint

Workflows

single-transfer-otp
Initiate a single transfer and authorize it with an OTP when required.
Validate the beneficiary, initiate the transfer, and branch on the returned status: authorize with an OTP when the transfer is pending authorization, otherwise confirm the settled status directly.
4 steps inputs: amount, authorizationCode, currency, destinationAccountNumber, destinationBankCode, narration, reference, sourceAccountNumber outputs: finalStatus, reference
1
validateBeneficiary
Resolve the beneficiary account name via Name Inquiry before initiating the transfer.
2
initiateTransfer
Initiate the single transfer carrying the verified beneficiary account name.
3
authorizeOtp
Submit the OTP authorization code to authorize the pending transfer.
4
confirmStatus
Confirm the final status of the transfer by querying its summary.

Source API Descriptions

Arazzo Workflow Specification

Raw ↑
arazzo: 1.0.1
info:
  title: Moniepoint Single Transfer With OTP
  summary: Initiate a single transfer, branch on whether OTP authorization is required, authorize it, and confirm.
  description: >-
    Single transfers can require two-factor authorization with an OTP dispatched
    to the merchant. This workflow validates the beneficiary account, initiates
    the transfer, and branches: when the transfer comes back awaiting OTP it
    submits the authorization code and then confirms the final status, and when
    the transfer is already settled it skips straight to confirmation. Every
    step spells out its request inline so the flow can be read and executed
    without opening the underlying OpenAPI description.
  version: 1.0.0
  x-realizes-capability-ids:
  - BC-1340.10
  x-capability-derivation:
    method: 'deterministic join: sourceDescriptions -> per-tag OpenAPI -> tag/capability edge. No classification at this step.'
    min_confidence: 0.7
    sources:
    - capability_id: BC-1340.10
      capability_name: Payment Initiation Management
      spec: moniepoint-single-transfers-api-openapi.yml
      confidence: 0.75
    model: Turbo EA Capabilities by Vincent Verdet — Turbo EA, https://github.com/vincentmakes/turbo-ea-capabilities, CC BY 4.0
sourceDescriptions:
- name: banksApi
  url: ../openapi/moniepoint-banks-api-openapi.yml
  type: openapi
- name: singleTransfersApi
  url: ../openapi/moniepoint-single-transfers-api-openapi.yml
  type: openapi
workflows:
- workflowId: single-transfer-otp
  summary: Initiate a single transfer and authorize it with an OTP when required.
  description: >-
    Validate the beneficiary, initiate the transfer, and branch on the returned
    status: authorize with an OTP when the transfer is pending authorization,
    otherwise confirm the settled status directly.
  inputs:
    type: object
    required:
    - destinationAccountNumber
    - destinationBankCode
    - amount
    - reference
    - narration
    - currency
    - sourceAccountNumber
    - authorizationCode
    properties:
      destinationAccountNumber:
        type: string
        description: Beneficiary bank account number to pay out to.
      destinationBankCode:
        type: string
        description: NIP bank code of the beneficiary bank.
      amount:
        type: number
        description: Amount to transfer.
      reference:
        type: string
        description: Unique merchant reference for the transfer.
      narration:
        type: string
        description: Narration shown on the transfer (max 100 chars).
      currency:
        type: string
        description: ISO currency code for the transfer (e.g. NGN).
      sourceAccountNumber:
        type: string
        description: Merchant disbursement wallet account number to debit.
      authorizationCode:
        type: string
        description: OTP authorization code dispatched to the merchant.
  steps:
  - stepId: validateBeneficiary
    description: >-
      Resolve the beneficiary account name via Name Inquiry before initiating
      the transfer.
    operationId: validateBankAccount
    parameters:
    - name: accountNumber
      in: query
      value: $inputs.destinationAccountNumber
    - name: bankCode
      in: query
      value: $inputs.destinationBankCode
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      accountName: $response.body#/responseBody/accountName
  - stepId: initiateTransfer
    description: >-
      Initiate the single transfer carrying the verified beneficiary account
      name.
    operationId: initiateSingleTransfer
    requestBody:
      contentType: application/json
      payload:
        amount: $inputs.amount
        reference: $inputs.reference
        narration: $inputs.narration
        destinationBankCode: $inputs.destinationBankCode
        destinationAccountNumber: $inputs.destinationAccountNumber
        destinationAccountName: $steps.validateBeneficiary.outputs.accountName
        currency: $inputs.currency
        sourceAccountNumber: $inputs.sourceAccountNumber
    successCriteria:
    - condition: $statusCode == 200
    - condition: $.requestSuccessful == true
      context: $response.body
      type: jsonpath
    outputs:
      reference: $response.body#/responseBody/reference
      status: $response.body#/responseBody/status
    onSuccess:
    - name: needsAuthorization
      type: goto
      stepId: authorizeOtp
      criteria:
      - context: $response.body
        condition: $.responseBody.status == 'PENDING_AUTHORIZATION' || $.responseBody.status == 'OTP_EMAIL_DISPATCH'
        type: jsonpath
    - name: alreadySettled
      type: goto
      stepId: confirmStatus
      criteria:
      - context: $response.body
        condition: $.responseBody.status == 'SUCCESS' || $.responseBody.status == 'PENDING'
        type: jsonpath
  - stepId: authorizeOtp
    description: >-
      Submit the OTP authorization code to authorize the pending transfer.
    operationId: authorizeSingleTransferOtp
    requestBody:
      contentType: application/json
      payload:
        reference: $steps.initiateTransfer.outputs.reference
        authorizationCode: $inputs.authorizationCode
    successCriteria:
    - condition: $statusCode == 200
    - condition: $.requestSuccessful == true
      context: $response.body
      type: jsonpath
    outputs:
      status: $response.body#/responseBody/status
  - stepId: confirmStatus
    description: >-
      Confirm the final status of the transfer by querying its summary.
    operationId: getSingleTransferStatus
    parameters:
    - name: reference
      in: query
      value: $steps.initiateTransfer.outputs.reference
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      status: $response.body#/responseBody/status
      amount: $response.body#/responseBody/amount
  outputs:
    reference: $steps.initiateTransfer.outputs.reference
    finalStatus: $steps.confirmStatus.outputs.status

Work with this as data

Every workflow here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for arazzo workflows

4 MCP tools reach this
  • find_arazzoBrowse and filter every workflow in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This workflow
curl "https://apis.io/api/v1/arazzo/moniepoint-single-transfer-otp-workflow"
All arazzo workflows
curl "https://apis.io/api/v1/arazzo?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.