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 as soon as a payment succeeds. No holding period. |
| Fee | 2.5% per successful cash in, and the same on a cash out. 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": "250781234567",
"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.