Quickstart: Make a Transfer

Capera supports two payout channels:

ChannelUse case
NGN Bank TransferSend money to any Nigerian bank account
Mobile Money (MoMo)Send money to a mobile wallet across supported countries

Path A — NGN Bank Transfer

Sending an NGN bank transfer follows four steps: get the list of banks, resolve the destination account, initiate the transfer, then check status.

Step 1: Get the list of banks

This endpoint requires no authentication and returns all banks available for transfers.

curl https://api.withcapera.com/b2b/v1/banks

Response

[
  { "id": "bank_001", "name": "First Bank of Nigeria", "slug": "first-bank" },
  { "id": "bank_002", "name": "Guaranty Trust Bank",   "slug": "gtb" },
  { "id": "bank_003", "name": "United Bank for Africa", "slug": "uba" }
]

Cache this list — it changes infrequently. Use the slug value when initiating transfers.

Step 2: Resolve the destination account

Before sending money, verify that the account number is valid and retrieve the account holder's name.

curl "https://api.withcapera.com/b2b/v1/bank/resolve?accountNumber=1234567890&bankSlug=first-bank" \
  -H "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Query parameters

ParameterRequiredDescription
accountNumberYes10-digit bank account number
bankSlugYesBank slug from the List Banks response

Response

{
  "accountName": "Amara Okafor"
}

Show the accountName to the user before they confirm the transfer. This prevents sending to the wrong account.

Step 3: Initiate the transfer

curl -X POST https://api.withcapera.com/b2b/v1/transfers/initiate \
  -H "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "reference": "TRF-2024-001",
    "amount": 500000,
    "bankSlug": "first-bank",
    "accountNumber": "1234567890",
    "accountName": "Amara Okafor",
    "narration": "Payment for invoice #1042"
  }'

Request fields

FieldTypeRequiredDescription
referencestringYesYour unique identifier for this transfer — used for idempotency
amountintegerYesAmount in kobo. ₦1 = 100 kobo. Must be greater than 0.
bankSlugstringYesBank slug from the List Banks response
accountNumberstringYesDestination account number
accountNamestringYesAccount holder name from the resolve step
narrationstringNoDescription shown on the recipient's bank statement

Use a unique reference for every transfer. If you retry a failed request with the same reference, Capera returns the original result rather than creating a duplicate.

Response

{
  "status": "PENDING"
}

The transfer is queued. Processing happens asynchronously — use the next step to check the outcome.

Step 4: Check transfer status

curl https://api.withcapera.com/b2b/v1/transfers/TRF-2024-001 \
  -H "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Response

{
  "reference": "TRF-2024-001",
  "status": "SUCCESS",
  "amount": 500000,
  "fee": 50
}

Transfer statuses

StatusMeaning
PENDINGQueued, not yet sent
PROCESSINGSent to the bank, awaiting confirmation
SUCCESSFunds delivered
FAILEDTransfer failed — safe to retry with a new reference
CANCELLEDTransfer was cancelled

Instead of polling, subscribe to transfer.success and transfer.failed webhook events to get notified the moment the status changes.


Path B — Mobile Money Transfer

Use this to send funds directly to a mobile wallet. The flow is: list operators → resolve the account → initiate the transfer → check status.

Step 1: List MoMo operators

curl https://api.withcapera.com/b2b/v1/momo/operators/GH

Replace GH with the ISO 3166-1 alpha-2 country code for the destination. You can filter by type using the type query parameter.

Response

{
  "success": true,
  "data": [
    { "operator": "MTN Ghana", "operatorCode": "MTN_GH" },
    { "operator": "Vodafone Ghana", "operatorCode": "VOD_GH" }
  ]
}

Use the operatorCode in the steps below.

Step 2: Resolve the MoMo account

Verify the phone number and get the account holder's name before sending.

curl -X GET https://api.withcapera.com/b2b/v1/momo/resolve-account \
  -H "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "operatorCode": "MTN_GH",
    "phoneNumber": "+233241234567"
  }'

Response

{
  "success": true,
  "data": {
    "firstName": "Kwame",
    "lastName": "Mensah",
    "operatorCode": "MTN_GH"
  }
}

Step 3: Initiate the MoMo transfer

curl -X POST https://api.withcapera.com/b2b/v1/momo/transfer \
  -H "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "reference": "MOMO-TRF-001",
    "amount": 5000,
    "operatorCode": "MTN_GH",
    "phoneNumber": "+233241234567",
    "narration": "Salary payment",
    "counterparty": {
      "firstName": "Kwame",
      "lastName": "Mensah"
    }
  }'

Request fields

FieldTypeRequiredDescription
referencestringYesYour unique identifier for this transfer
amountintegerYesAmount in the currency's minor unit. Must be greater than 0.
operatorCodestringYesOperator code from the List Operators response
phoneNumberstringYesRecipient's phone number in E.164 format
narrationstringNoTransfer description
counterparty.firstNamestringYesRecipient's first name
counterparty.lastNamestringYesRecipient's last name

Response

{
  "success": true,
  "data": {
    "reference": "MOMO-TRF-001",
    "status": "PENDING",
    "amount": 5000,
    "fee": 0
  }
}

Step 4: Check MoMo transfer status

curl https://api.withcapera.com/b2b/v1/momo/transfer/MOMO-TRF-001 \
  -H "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Response

{
  "success": true,
  "data": {
    "reference": "MOMO-TRF-001",
    "status": "SUCCESS",
    "amount": 5000,
    "fee": 0
  }
}

What's next


Did this page help you?