Fees
How InversePay's fee is set, where it shows up, and how to quote it before you charge.
InversePay sets the fee on every charge and payout from your plan. Leave
fee_minor out of your requests. The fee comes back on the response, so you
always see what was taken, and you can ask for it in advance with the quote
endpoints below.
Your plan is the standard rate for your business's verification tier, or a rate negotiated for your business. Your account manager has the details. Every fee on this page is made up to show the arithmetic, on a 2% charge and a flat RWF 300 payout. Yours come from your plan, and the quote endpoints tell you exactly what they are.
Where the fee shows up
On a charge, the fee is taken out of what the payer pays.
{ "amount_minor": 10000000, "fee_minor": 200000, "net_minor": 9800000 }The payer was charged 100,000 RWF and you receive 98,000 RWF. Amounts are in minor units, two places even for RWF.
On a payout, the fee is added on top, so the recipient gets the full amount.
{ "amount_minor": 15000000, "fee_minor": 30000, "total_minor": 15030000 }The recipient receives 150,000 RWF, and 150,300 RWF leaves your balance. A
payout is affordable only when your balance covers total_minor.
Bulk payouts and payroll are priced line by line when the file is checked. The batch total you approve already includes the fees, and the batch runs at that total.
Quote a fee before you charge
GET /charges/fee and
GET /payouts/fee price an amount on
your plan without creating anything. They are priced exactly as the charge or payout itself will
be, so the quote is the fee.
curl "https://sandbox.inversepay.app/api/b/v1/charges/fee?currency=RWF&amount_minor=5000000" \
-H "Authorization: Bearer $INVERSEPAY_SESSION_TOKEN"{
"currency": "RWF",
"amount_minor": 5000000,
"fee_minor": 100000,
"net_minor": 4900000,
"price": {
"percentage_basis_points": 200,
"fixed_minor": 0,
"min_fee_minor": null,
"max_fee_minor": null,
"plan": "standard"
}
}Add channel=card when the payer will pay by card, which is priced separately.
GET /payouts/fee takes currency and amount_minor, the amount the recipient
should receive, and answers with total_minor instead of net_minor.
price is the terms the quote was priced on: the percentage of the amount in
basis points, rounded down, plus the flat part, then no less than
min_fee_minor and no more than max_fee_minor. With it you can price any
other amount yourself without asking again. plan is negotiated when a rate
was agreed for your business, tier for your verification tier's, otherwise
standard.
Putting your own margin on top
If you charge your own customers, decide what you want to keep and ask with
net_minor instead of amount_minor. The answer's amount_minor is the least
to charge so that this much is left after the fee.
curl "https://sandbox.inversepay.app/api/b/v1/charges/fee?currency=RWF&net_minor=1000000" \
-H "Authorization: Bearer $INVERSEPAY_SESSION_TOKEN"On the 2% plan above, the answer is to charge 10,205 RWF (amount_minor: 1020500). Adding 2% to your price would fall just short, because the fee is on
what the payer pays, not on what you keep. RWF settles in whole francs, so the
answer is always a whole amount.
For payouts, the quote is your cost per payout. Whatever you charge your customers on top of it, for a payroll run or a transfer, is your margin.
fee_minor in a request
Leave it out. A request that sets fee_minor to anything but 0 is refused
with 422 VALIDATION_FAILED, and so is a bulk payout line with a fee in its
fee_minor column. See the changelog entry of 2026-10-10.