Merchant Payout (Send Money)
Send money to customers via mobile money.
KYC Required: Your business account must have an approved KYC status to perform payout transactions in live mode.
Endpoint
POST /api/v1/merchant/payout
Headers
| Header | Type | Required | Description |
|---|---|---|---|
| Authorization | string | ✅ | Bearer token with your merchant API key |
| Content-Type | string | ✅ | application/json |
Request Body Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| amount | number | ✅ | The amount to send to the recipient. Must be at least 0.01, and within the minimum/maximum of the network (see Transaction Limits) |
| currency | string | ✅ | 3-letter ISO currency code (e.g., XOF, GHS, KES) |
| payment_method | string | ✅ | Payment method to use. Currently only supports: mobile_money |
| order_id | string | Your internal order/transaction reference ID (max 255 characters) | |
| callback_url | string | ✅ | URL where payout status updates will be sent (webhook URL). Required for payouts; it takes precedence over the default webhook URL of your dashboard. |
| metadata | object | ✅ | Recipient information (required for mobile_money) |
| metadata.network | string | ✅ | Mobile money network (e.g., mtn, orange, moov, airtel, mpesa). The network is normally detected from the phone number prefix; this value is decisive only for networks without prefixes (e.g. wave, aps) and in countries where operators share prefixes (e.g. Benin) |
| metadata.phone_number | string | ✅ | Recipient phone number for mobile money |
| metadata.country_code | string | ✅ | 2-letter ISO country code (e.g., BF, GH, KE, CI) |
| metadata.beneficiary | string | ✅ | Full name of the beneficiary |
Amount rounding: For transactions in certain countries (BF, BJ, CI, CM, GN, ML, TG), the amount may be automatically rounded to the nearest multiple of 5 to meet local processing requirements. The response always reflects the actual processed amount.
Example Request
curl -X POST "https://dashboard.mbiyo.africa/api/v1/merchant/payout" \
-H "Authorization: Bearer YOUR_MERCHANT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"amount": 5000,
"currency": "XOF",
"payment_method": "mobile_money",
"order_id": "PAYOUT-12345",
"callback_url": "https://yourdomain.com/webhook/payout-status",
"metadata": {
"network": "orange",
"phone_number": "+22670123456",
"country_code": "BF",
"beneficiary": "John Doe"
}
}'
Success Response (200 OK)
{
"status": "success",
"message": "Transaction initiated successfully",
"data": {
"transaction_id": "CO-66F3A1B2C4D5E1727258400A1B2",
"amount": 5000,
"fee": 50,
"currency": "XOF",
"order_id": "PAYOUT-12345",
"type": "cashout",
"status": "pending",
"charged_amount": 5050,
"created_at": "2025-12-16T14:20:00Z"
}
}
Amounts: for a payout,
charged_amount=amount+fee: this is what is debited from your balance when the payout is created. The recipient receivesamount.
Error Response — KYC Not Approved (403 Forbidden)
{
"status": "error",
"message": "KYC approval required for live payouts",
"data": null
}
Error Response — Insufficient Balance (400 Bad Request)
Your balance in the payout currency must cover amount + fee.
{
"status": "error",
"message": "Insufficient balance for payout",
"data": null
}
Other Error Responses
| HTTP | message (examples) |
Meaning |
|---|---|---|
| 422 | Validation failed (details in data) |
A parameter is missing or malformed |
| 400 | Minimum XOF transaction amount for orange is 500., Payout is temporarily disabled for orange, Invalid phone number or unsupported network for BF/mobile_money |
The payout cannot be routed (country/currency/network, limits, network disabled for your account) |
| 400 | Insufficient orange network balance. Available: … |
Balance per network is checked and too low for this network |
| 503 | Payout feature is currently disabled |
Payouts are temporarily disabled platform-wide |
| 200 | Transaction initiation failed (top-level "status": "error") |
The operator rejected the payout: the transaction is failed and amount + fee are refunded to your balance immediately |
Always check the top-level
statusfield, not only the HTTP code.
Payout Status
| Status | Description |
|---|---|
| pending | Payout has been initiated and is being processed |
| successful | Payout has been completed successfully and money has been sent to recipient |
| failed | Payout has failed. amount + fee are refunded to your balance |
| cancelled | Payout has been cancelled |
Webhook Notification
When the payout status changes, we will send a POST request to your callback_url with the following payload:
Callback URL:
callback_urlis required for payouts, and notifications for this payout are sent to it.
{
"transaction_id": "CO-66F3A1B2C4D5E1727258400A1B2",
"amount": 5000,
"fee": 50,
"currency": "XOF",
"order_id": "PAYOUT-12345",
"status": "successful",
"charged_amount": 5050,
"type": "cashout",
"created_at": "2025-12-16T14:20:00Z",
"updated_at": "2025-12-16T14:25:00Z",
"metadata": {
"country_code": "BF",
"phone_number": "22670123456",
"network": "orange",
"beneficiary": "John Doe"
}
}
metadata echoes the payout details and may contain additional fields; ignore the ones you do not use.
Important: Always verify the payout status by calling the transaction status endpoint to confirm the final state before marking it as completed in your system.
Fee Structure
Payout fees are automatically deducted from your merchant wallet balance. The total charged amount includes:
- Payout amount (sent to recipient)
- Service fee (varies by country and network)
Note: Ensure your wallet has sufficient balance to cover both the payout amount and the service fee before initiating a payout.
Best Practices
- Verify KYC Status: Ensure your business account KYC is approved before implementing payout functionality.
- Check Balance: Always verify your wallet balance before initiating payouts.
- Use Webhooks: Implement webhook handlers to receive real-time payout status updates.
- Validate Recipients: Verify recipient phone numbers and network information before initiating payouts.
- Handle Failures: Implement proper error handling for failed payouts.
- Keep Records: Store
transaction_idandorder_idfor reconciliation purposes.
Supported Networks by Country
| Country | Code | Currency | Networks |
|---|---|---|---|
| Burkina Faso | BF | XOF | orange, moov, coris |
| Benin | BJ | XOF | mtn, moov, celtiis |
| Congo - Brazzaville | CG | XAF | mtn |
| Congo - Kinshasa | CD | USD/CDF | vodacom, airtel, orange, africell |
| Cameroon | CM | XAF | orange, mtn |
| Cote d'Ivoire | CI | XOF | orange, mtn, wave, moov |
| Gambia | GM | GMD | afrimoney, qmoney, wave, aps |
| Guinea | GN | GNF | orange, mtn |
| Mali | ML | XOF | orange, moov |
| Senegal | SN | XOF | orange, free, wave |
| Togo | TG | XOF | moov, togocom |
| Uganda | UG | UGX | mtn, airtel |
| Tanzania | TZ | TZS | vodacom, airtel, tigo, halotel |
| Kenya | KE | KES | safaricom, airtel |
| Rwanda | RW | RWF | mtn, airtel |
| Ghana | GH | GHS | mtn, vodafone, airtel, tigo |
| Nigeria | NG | NGN | mtn, airtel, glo, 9mobile |
| South Africa | ZA | ZAR | eft |
| Zambia | ZM | ZMW/USD | mtn, airtel, zamtel |
| Mozambique | MZ | MZN | vodacom, mpesa |
| Egypt | EG | EGP | wallet |
Transaction Limits
Each country and currency has minimum and maximum transaction amount limits enforced at the network level. Transactions exceeding these limits will be rejected with a 400 error.
| Country | Currency | Minimum | Maximum |
|---|---|---|---|
| DR Congo | USD | $0.10 | $2,500.00 |
| DR Congo | CDF | 40.00 | 5,000,000.00 |
| Benin | XOF | 50.00 | 1,500,000.00 |
| Cameroon | XAF | 50.00 | 1,500,000.00 |
| Burkina Faso | XOF | 500.00 | 1,500,000.00 |
| Cote d'Ivoire | XOF | 500.00 | 1,500,000.00 |
| Senegal | XOF | 500.00 | 1,500,000.00 |
| Togo | XOF | 500.00 | 1,500,000.00 |
| Congo - Brazzaville | XAF | 500.00 | 1,500,000.00 |
| Guinea | GNF | 500.00 | 1,500,000.00 |
| Mali | XOF | 500.00 | 1,500,000.00 |
| Gambia | GMD | 10.00 | 200,000.00 |
| Uganda | UGX | 500.00 | 5,000,000.00 |
| Tanzania | TZS | 500.00 | 5,000,000.00 |
| Kenya | KES | 10.00 | 70,000.00 |
| Rwanda | RWF | 100.00 | 5,000,000.00 |
| South Africa | ZAR | 10.00 | 50,000.00 |
| Egypt | EGP | 1.00 | 50,000.00 |