Quickstart: Make a Transfer
Capera supports two payout channels:
| Channel | Use case |
|---|---|
| NGN Bank Transfer | Send 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/banksResponse
[
{ "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
| Parameter | Required | Description |
|---|---|---|
accountNumber | Yes | 10-digit bank account number |
bankSlug | Yes | Bank 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
| Field | Type | Required | Description |
|---|---|---|---|
reference | string | Yes | Your unique identifier for this transfer — used for idempotency |
amount | integer | Yes | Amount in kobo. ₦1 = 100 kobo. Must be greater than 0. |
bankSlug | string | Yes | Bank slug from the List Banks response |
accountNumber | string | Yes | Destination account number |
accountName | string | Yes | Account holder name from the resolve step |
narration | string | No | Description shown on the recipient's bank statement |
Use a unique
referencefor 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
| Status | Meaning |
|---|---|
PENDING | Queued, not yet sent |
PROCESSING | Sent to the bank, awaiting confirmation |
SUCCESS | Funds delivered |
FAILED | Transfer failed — safe to retry with a new reference |
CANCELLED | Transfer 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/GHReplace 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
| Field | Type | Required | Description |
|---|---|---|---|
reference | string | Yes | Your unique identifier for this transfer |
amount | integer | Yes | Amount in the currency's minor unit. Must be greater than 0. |
operatorCode | string | Yes | Operator code from the List Operators response |
phoneNumber | string | Yes | Recipient's phone number in E.164 format |
narration | string | No | Transfer description |
counterparty.firstName | string | Yes | Recipient's first name |
counterparty.lastName | string | Yes | Recipient'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
- Quickstart: Receive a Payment — collect payments via virtual accounts
- Integration Journey — end-to-end guide from sandbox to production
- Transfers API Reference — full endpoint documentation
Updated 4 months ago