Postman Create Account

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 receives amount.

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 status field, 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_url is 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:

Note: Ensure your wallet has sufficient balance to cover both the payout amount and the service fee before initiating a payout.

Best Practices

  1. Verify KYC Status: Ensure your business account KYC is approved before implementing payout functionality.
  2. Check Balance: Always verify your wallet balance before initiating payouts.
  3. Use Webhooks: Implement webhook handlers to receive real-time payout status updates.
  4. Validate Recipients: Verify recipient phone numbers and network information before initiating payouts.
  5. Handle Failures: Implement proper error handling for failed payouts.
  6. Keep Records: Store transaction_id and order_id for 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
Docs Assistant
Hi! I can answer questions about the API documentation. Try asking something like "How do I make a payout?" or "What networks are supported in Burkina Faso?"