recipient payload to match your payout use case, or browse the dedicated payout examples for a full walkthrough.
Endpoint
POST{{baseURL}}/v2/payout
Request headers
| Header | Description | Required | Example |
|---|---|---|---|
x-api-key | Workspace API key for authentication. | ✅ Yes | YOUR_API_KEY |
Content-Type | Media type of the request body. | ✅ Yes | application/json |
Request body
copy
Body fields
| Field | Type | Description | Required | Example |
|---|---|---|---|---|
recipient.name | String | Full name of the beneficiary. | ✅ Yes | Chris Tiana |
recipient.paymentChannel | String | Channel to deliver funds (BANK_TRANSFER, MOBILE_MONEY, etc.). | ✅ Yes | BANK_TRANSFER |
recipient.country | String | Recipient country (ISO 3166-1 alpha-2). | ✅ Yes | NG |
recipient.stored | Boolean | Whether the recipient is saved in your address book. | ✅ Yes | false |
recipient.account.bankName | String | Financial institution name. | ✅ Yes | Guaranty Trust Bank |
recipient.account.sortCode | String | Routing or sort code where applicable. | ✅ Yes | 058 |
recipient.account.accountNumber | String | Destination account number. | ✅ Yes | 0712617XXX |
quoteId | String | Quote identifier returned from the Quote API. | ✅ Yes | 453eeu-567j-6tr3d-xxxxxxxxxxxxx |
reason | String | High-level purpose of the transfer. | ✅ Yes | Bills |
remark | String | Additional comments or reference. | Optional | September utilities |
payout docs examples.
Request examples
Successful response
copy
Field reference
| Field | Type | Description |
|---|---|---|
data.id | String | Unique payout identifier returned by meCash. |
data.reference | String | Your client-generated reference if supplied. |
data.state | String | Initial processing state (PROCESSING, QUEUED, etc.). |
data.recipient | Object | Echoes key beneficiary attributes. |
data.created | String | ISO timestamp for when the payout was accepted. |
Error responses
| Status | Message | Cause | How to resolve |
|---|---|---|---|
| 400 | Insufficient wallet balance for transaction | Wallet balance cannot cover the payout amount. | Top up the wallet or lower the payout total before retrying. |
| 400 | Quotes only last for 10 minutes | Quote expired before you attempted to consume it. | Generate a fresh quote and submit the payout immediately. |
| 400 | Invalid country or currency ISO code | Unsupported country/currency combination supplied in the request. | Use corridor-supported ISO codes for both quote and recipient data. |
| 400 | Account name mismatch, use account enquiry endpoint | Account name in payload differs from bank enquiry results. | Re-run account enquiry and match the returned account name. |
| 400 | Invalid Bank Sortcode | Sort code missing, malformed, or unsupported. | Fetch the correct sort code from the bank list and verify formatting. |
| 400 | {field_name} cannot be empty | Required recipient field omitted from the payload. | Fill in every mandatory field (name, account number, etc.) before submitting. |
| 401 | API key missing or incorrect | x-api-key header absent, invalid, or expired. | Supply the correct API key for the environment you are targeting. |
| 403 | IP not whitelisted | Request originated from an unapproved IP. | Add your server IP to the dashboard allowlist. |
| 404 | The requested endpoint does not exist | Incorrect API path or version specified. | Confirm you are calling POST /v2/payout on the right base URL. |
| 422 | Invalid quote ID provided | Quote ID missing, invalid, expired, or already consumed. | Create a new quote and reference it in the payout call. |
| 500 | Service temporarily unavailable | Temporary backend/service disruption. | Retry with exponential backoff; contact support if it persists. |
Best practices
- Generate idempotency references to safely retry without duplicating transfers.
- Validate recipients locally before calling the API to reduce error handling.
- Listen to payout webhooks and reconcile with the
Get Transaction APIfor final settlement details.

