Merchant Payin (Collect Payment)
Collect payments from customers via mobile money.
Note: Currently, only mobile money payment method is supported for payin transactions.
Endpoint
POST /api/v1/merchant/payin
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 collect from the customer (minimum: 0.01) |
| 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 payment status updates will be sent (webhook URL). If provided, overrides the default webhook URL in your dashboard. | |
| metadata | object | ✅ | Additional payment information (required for mobile_money) |
| metadata.network | string | ✅ | Mobile money network (e.g., mtn, orange, moov, vodafone, tigo, airtel, mpesa, afrimoney) |
| metadata.phone_number | string | ✅ | Customer phone number for mobile money |
| metadata.country_code | string | ✅ | 2-letter ISO country code (e.g., BF, GH, KE, CD) |
| metadata.om_otp | string | OTP authorization code (optional). For networks that require OTP (see table below), provide the customer's OTP here for immediate processing. |
Example Request
curl -X POST "https://dashboard.mbiyo.africa/api/v1/merchant/payin" \
-H "Authorization: Bearer YOUR_MERCHANT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"amount": 1000,
"currency": "XOF",
"payment_method": "mobile_money",
"order_id": "ORDER-12345",
"callback_url": "https://yourdomain.com/webhook/payment-status",
"metadata": {
"network": "orange",
"phone_number": "+22670123456",
"country_code": "BF",
"om_otp": "123456"
}
}'
The om_otp field is optional and only applicable for networks that require OTP (see supported networks table below).
Success Response (200 OK)
{
"status": "success",
"message": "Payment initiated successfully",
"data": {
"transaction_id": "TXN-1234567890ABCDEF",
"amount": 1000,
"fee": 15,
"charged_amount": 1015,
"currency": "XOF",
"order_id": "ORDER-12345",
"status": "pending",
"payment_method": "mobile_money",
"redirect_url": null,
"instructions": null,
"auth_mode": null,
"created_at": "2025-12-16T10:30:00Z"
}
}
Important: Check the
auth_modefield to determine the next step:
- auth_mode = null — Standard flow. Wait for webhook.
- auth_mode = "confirm" — Confirmation is handled automatically. Show the
instructionsto the user and wait for webhook.- auth_mode = "pin" — Collect the PIN/OTP from the customer and call the Finalize endpoint.
- redirect_url present — Redirect the customer to this URL to complete the payment externally.
Response with Redirect URL
{
"status": "success",
"message": "Payment initiated successfully",
"data": {
"transaction_id": "TXN-1234567890ABCDEF",
"amount": 5000,
"fee": 75,
"charged_amount": 5075,
"currency": "GHS",
"order_id": "ORDER-67890",
"status": "pending",
"payment_method": "mobile_money",
"redirect_url": "https://payment-gateway.com/pay?ref=TXN-1234567890ABCDEF",
"created_at": "2025-12-16T10:30:00Z"
}
}
When redirect_url is present, redirect your customer to this URL. They will complete the payment and be redirected back to your application.
Gambia (GM) — Additional Response Fields
For mobile money networks in Gambia (GM), the response may include additional fields:
- instructions — HTML content from the telecom operator to display to the user
- auth_mode — Determines the next step to complete the payment
Rendered instructions preview
When auth_mode is "confirm" and instructions contains HTML, it renders as:
You can confirm your Afrimoney payment using either of the two methods below:
- Via the Afrimoney App: Open the Afrimoney app on your phone and follow the prompts to approve the payment.
- Using a Dial Code (USSD):
- Dial *777*7*3*[Your PIN]# on your phone
- Select the Transaction from the menu
- Choose option 1 to Confirm the transaction
Once you've completed the steps, return to this page to confirm your payment.
Response with Confirmation Instructions (Afrimoney)
{
"status": "success",
"message": "Transaction initiated successfully",
"data": {
"transaction_id": "CI-6789ABCDEF12345",
"amount": 100,
"fee": 2,
"charged_amount": 102,
"currency": "GMD",
"order_id": "ORDER-99999",
"status": "pending",
"redirect_url": null,
"instructions": "<p>You can confirm your Afrimoney payment using either of the two methods below:</p><ol><li><strong>Via the Afrimoney App:</strong><br/>Open the Afrimoney app on your phone and follow the prompts to approve the payment.</li><li><strong>Using a Dial Code (USSD):</strong><ul><li>Dial <strong>*777*7*3*[Your PIN]#</strong> on your phone</li><li>Select the <strong>Transaction</strong> from the menu</li><li>Choose option <strong>1</strong> to <strong>Confirm</strong> the transaction</li></ul></li></ol><p>Once you've completed the steps, return to this page to confirm your payment.</p>",
"auth_mode": "confirm",
"created_at": "2026-04-15T20:07:08Z"
}
}
When auth_mode is "confirm", display the instructions (HTML) to the user so they know how to approve the payment on their phone. Then wait for the webhook.
Response with PIN Required (QMoney / APS)
{
"status": "success",
"message": "Transaction initiated successfully",
"data": {
"transaction_id": "CI-ABCDEF1234567890",
"amount": 50,
"fee": 1,
"charged_amount": 51,
"currency": "GMD",
"order_id": "ORDER-88888",
"status": "pending",
"redirect_url": null,
"instructions": null,
"auth_mode": "pin",
"created_at": "2026-04-15T20:07:08Z"
}
}
When auth_mode is "pin", collect the OTP/PIN from the customer and call the Finalize Payment endpoint to complete the transaction.
Error Response (422 Validation Error)
{
"status": "error",
"message": "Validation failed",
"data": {
"amount": [
"The amount field is required."
],
"metadata.phone_number": [
"The metadata.phone_number field is required when payment method is mobile_money."
]
}
}
Payment Status
| Status | Description |
|---|---|
| pending | Payment has been initiated and is waiting for customer confirmation |
| successful | Payment has been completed successfully |
| failed | Payment has failed |
| cancelled | Payment has been cancelled |
Webhook Notification
When the payment status changes, we will send a POST request to your callback_url with the following payload:
{
"transaction_id": "TXN-1234567890ABCDEF",
"amount": 1000,
"fee": 15,
"currency": "XOF",
"order_id": "ORDER-12345",
"status": "successful",
"charged_amount": 1015,
"type": "cashin",
"created_at": "2025-12-16T10:30:00Z",
"updated_at": "2025-12-16T10:35:00Z",
"metadata": {
"country_code": "BF",
"phone_number": "22670123456",
"network": "orange",
"om_otp": null
}
}
Best Practice: Always verify the transaction status by calling the transaction status endpoint before crediting your customer account.
Callback URL Priority: If you provide a
callback_urlin your request, notifications will be sent to this URL. If nocallback_urlis provided, we will use the default webhook URL configured in your merchant dashboard settings.
Webhook Security: If you have configured a webhook secret in your dashboard, we will include a
Signatureheader with HMAC-SHA256 hash of the payload for verification.
Supported Networks by Country
| Country | Code | Currency | Networks | OTP Required |
|---|---|---|---|---|
| Burkina Faso | BF | XOF | orange, moov, coris | Orange: *144*4*6*AMOUNT# (replace AMOUNT with the transaction amount, e.g., *144*4*6*500# for 500 XOF) (replace AMOUNT with transaction amount) |
| 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 | Orange: #144*82# |
| Gambia | GM | GMD | afrimoney, qmoney, wave, aps | QMoney & APS: PIN required (auth_mode: pin) |
| Guinea | GN | GNF | orange, mtn | Orange: #144# (Opt 4→2) |
| Mali | ML | XOF | orange, moov | Orange: #144#77# |
| Senegal | SN | XOF | orange, free | Orange: #144#391# |
| Togo | TG | XOF | moov, togocom | - |
About OTP
Networks marked with USSD codes require customers to dial the code to generate an authorization code before payment. The OTP validation is handled automatically by the mobile operator. You will receive the final payment status via webhook.
Senegal Orange: The customer must dial
#144#391#on their phone before you initiate the payment. You must display this USSD code to the customer so they can authorize the transaction. Once they've dialed the code, proceed with the payin request. The OTP validation is handled automatically — no need to collect an OTP from the customer.