Introduction

One API for collections and payouts across Rwanda, Uganda and the EU.

InversePay moves money in and out of mobile money wallets and bank accounts in Rwanda and Uganda, and into the euro area. You call one endpoint to collect and one to pay out; we choose the rail from the corridor.

What that means for your integration

You never name a partner. A charge in Rwandan francs and one in Ugandan shillings are the same request to you and different partners to us, and which partner carries which corridor is a routing table on our side — not a release of your app. It changes more often than you would think: a corridor usually has a second rail behind the first, and a payment that one partner cannot take is re-routed rather than failed.

Which direction are you going?

Money in is a charge or a payment link, and an API key with payments:write can raise one.

Money out is a payout — to a wallet, a bank account or a biller, one at a time or in bulk. Raising one is a person's act: an API key can read payouts but never create one.

The shape of everything

Amounts are minor units. 5,000 RWF is 500000. Nothing in the API accepts a decimal amount, because a decimal amount is a rounding argument waiting to happen.

Writes need an idempotency key. Send the same key again and you get the original object back, not a second one. This is how you retry safely after a timeout, which is the only sane thing to do when you did not hear our answer.

Test and live never mix. A test key cannot see live data and a live key cannot see test data — including idempotency keys, so the order references you used while building do not collide with the real ones later.

On this page