Docs
ENFR
Dashboard
Products

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

  1. 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).
  2. 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_balance and nothing is sent.
  3. Follow the outcome. The remittance moves to processing, then succeeded or failed. 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:

bash
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.

bash
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.

bash
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:

JSON
{
  "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:

bash
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