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.

What would a 50,000 RWF charge cost?
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.

Keep 10,000 RWF 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.

On this page