Xendly Pay
Xendly Pay moves Rwandan francs over MTN MoMo and Airtel Money. One HTTPS API, signed webhooks, and a test mode you can build the whole thing against before anyone verifies anything.
What this is
Two things move money, and everything else is reporting on them:
| What it does | Endpoint | |
|---|---|---|
| Cash in | Takes money from a customer's wallet. They approve a prompt on their phone. | POST /v1/payments |
| Cash out | Sends money to a wallet: a supplier, a refund, a payout. | POST /v1/payouts |
Both are asynchronous. Both return a pending transaction and tell you the outcome by webhook.
What we support
| Country | Rwanda |
| Currency | RWF only. Amounts are integers, so there are no cents. |
| Networks | MTN MoMo and Airtel Money. We route on the number; you do not choose. |
| Settlement | Available 24 hours after a payment succeeds |
| Fee | 3.1% per successful cash in, dropping to 2.3% after 3 months. Withdrawals are free. Failed payments cost nothing. |
RWF, and only RWF
There is no currency conversion here and no other market. If you need to charge someone in dollars, this is not the product, yet.
Base URL
https://api.xendlypay.comEverything is HTTPS and JSON. There is one base URL for both test and live. The key decides which world you are in, not the hostname, so going live never means changing a URL.
Your first payment
curl https://api.xendlypay.com/v1/payments \
-H "Authorization: Bearer $XENDLY_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-1043" \
-d '{
"amount": 5000,
"currency": "RWF",
"msisdn": "0788924941",
"description": "Order #1043",
"reference": "1043",
"metadata": { "order_id": "1043" }
}'That returns a transaction in pending. Your customer now has a prompt on their phone. What happens next is worth two minutes before you build anything else.