Remittance
Top up a remittance balance in local currency and send money to other African countries, from the dashboard or the API.
Remittance lets your business move money between African countries. You top up a remittance balance by mobile money or bank transfer in one country, then send from that balance to mobile money wallets and bank accounts in other countries. The balance is kept in your business currency (for example XAF for a business registered in Cameroon).
Access on request. Remittance is opened per business after a short review. Request access from Remittance in the dashboard. Until access is approved, every endpoint below returns
403 remittance_not_enabled.
How it works
- Ask for a quote. Create a top-up or a transfer. Monerails returns a quote with the amount, the fees, the amount credited to or debited from your balance and the rate applied. A quote is valid for about 9 minutes (
quote_expires_at). - Confirm. Confirm the quote. For a transfer, the debit is reserved on your balance at this point; if your balance does not cover it, confirmation fails with
400 insufficient_balanceand nothing is sent. - Follow the outcome. The remittance moves to
processing, thensucceededorfailed. You receive a webhook either way. A failed transfer returns the reserved amount to your balance automatically.
To skip the review step, send "confirm": true when you create the operation: the quote is confirmed in the same request.
Find a network
List the mobile money operators and banks available for a country and a direction:
curl "https://api.monerails.com/v1/remittances/options?type=transfer&country=CI" \
-H "Authorization: Bearer $MONERAIL_KEY"Each item has an id (send it as network), a channel (mobile_money or bank), the account format expected (phone or account_number) and the fee_percent that applies.
Top up your balance
The payer approves the payment on their phone. Your balance is credited as soon as it is received.
curl https://api.monerails.com/v1/remittances/topups \
-H "Authorization: Bearer $MONERAIL_KEY" \
-H "Idempotency-Key: topup-0001" \
-H "Content-Type: application/json" \
-d '{
"country": "CM",
"amount": 500000,
"network": "NETWORK_ID",
"payer": { "name": "Alpha SARL", "phone": "+237670000000" }
}'Send money
amount is what the recipient receives, in the currency of the destination country, in minor units.
curl https://api.monerails.com/v1/remittances/transfers \
-H "Authorization: Bearer $MONERAIL_KEY" \
-H "Idempotency-Key: transfer-inv-204" \
-H "Content-Type: application/json" \
-d '{
"country": "CI",
"amount": 50000,
"network": "NETWORK_ID",
"beneficiary": { "name": "Kouassi Yao", "phone": "+2250700000000" },
"reason": "Supplier invoice 204",
"client_reference": "inv_204"
}'The response is a remittance object in status quoted:
{
"id": "7c1f0d0e-5d2b-4a43-9b1e-2f3f9a9d1c10",
"object": "remittance",
"type": "send",
"status": "quoted",
"country": "CI",
"currency": "XOF",
"amount": 50000,
"balance_currency": "XAF",
"fee": 1750,
"balance_debit": 51750,
"rate": 1,
"network": "Orange Money",
"beneficiary": { "name": "Kouassi Yao", "phone": "+2250700000000" },
"quote_expires_at": "2026-11-22T10:09:00Z",
"created_at": "2026-11-22T10:00:00Z"
}Confirm it:
curl -X POST https://api.monerails.com/v1/remittances/7c1f0d0e-5d2b-4a43-9b1e-2f3f9a9d1c10/confirm \
-H "Authorization: Bearer $MONERAIL_KEY" \
-H "Idempotency-Key: confirm-inv-204"Balance, list and retrieve
| Endpoint | Description |
|---|---|
GET /v1/remittances/balance |
available and pending (reserved) amounts, in your balance currency. |
GET /v1/remittances |
Your top-ups and transfers, newest first. Filters: type=topup or type=transfer, limit, starting_after. |
GET /v1/remittances/{id} |
One operation. |
Statuses
| Status | Meaning |
|---|---|
quoted |
Quote ready, waiting for confirmation. |
processing |
Confirmed and on its way. For a transfer, the debit is reserved. |
succeeded |
Top-up credited, or transfer delivered. |
failed |
Did not go through. A reserved debit is returned to your balance. |
expired |
The quote was not confirmed in time. Nothing moved. |
Webhooks
| Event | When |
|---|---|
remittance.topup_succeeded |
A top-up is credited to your balance. |
remittance.topup_failed |
A top-up did not go through. |
remittance.transfer_succeeded |
A transfer is delivered. |
remittance.transfer_failed |
A transfer failed and its amount is back on your balance. |
The event data is the remittance object.
Fees
Fees are a percentage of the operation, per country and direction, shown in Settings › Pricing once access is approved, and in every quote. They are charged in your balance currency: deducted from a top-up, added to a transfer.
Test mode
With a mr_test_ key, nothing moves for real. The outcome depends on the number:
| Number | Outcome |
|---|---|
Mobile money ending in 1111111111 (for example +2371111111111) |
succeeded |
Mobile money ending in 0000000000 |
failed |
Bank account 1111111111 |
succeeded |
Bank account 0000000000 |
failed |