Developers

Send income to Qonta

If your platform takes payments for a business, send each one to Qonta as it happens. It lands in that business's books as money in, so nobody types it in again.

Last updated: 19 September 2026

1. Get a key

The business makes the key in Qonta, under Settings, Connections, Make a key, and gives it to you. It starts with qk_ and is shown to them once. Send it on every request:

Authorization: Bearer qk_your_key_here

A key records money in for one business only. It cannot read their books. The business can take it back at any time, and it stops working at once.

2. Record a payment

POST https://api.qonta.rw/v1/income
Content-Type: application/json

{
  "external_id": "pay_1001",
  "amount": 150000,
  "paid_at": "2026-09-19T10:15:00+02:00",
  "customer": "Uwase Aline",
  "description": "Term 1 fees"
}
FieldWhat it is
external_id requiredYour platform's own id for this payment, up to 200 characters. Unique per business.
amount requiredMore than zero, at most two decimals, in currency.
currencyRWF (the default), USD, EUR, GBP, KES, UGX, TZS, BIF, CDF or ZAR.
fx_rateFrancs for one unit of the currency. Needed for a foreign payment the first time; Qonta then remembers the business's last rate.
paid_atWhen the money was paid: a date (2026-09-19) or an ISO 8601 time. A time with no offset is read as Kigali time. Not in the future. Now, if left out.
customerWho paid, up to 120 characters. Linked to the business's customer of that name when there is one.
descriptionWhat it was for, up to 500 characters.
categorysales (the default), other, loan, transfer or savings.
money_account_idThe account the money landed in, from GET /v1/money-accounts. Left out, the business's default account for money in.
vat_amountThe VAT included in amount, when there is some.

3. What Qonta answers

StatusMeaning
201Recorded. {"status": "recorded", "income": {...}}
200This external_id was already recorded with the same amount. Nothing changed. "status": "already_recorded"
409This external_id was already recorded with a different amount. Nothing changed. A different payment needs its own id.
401The key is missing, wrong, or was taken back.
402The business's Qonta subscription is not active. Nothing was recorded. Send it again once they renew.
422Something in the body is wrong. detail names the field and says why.

Retries are safe. If a request times out or you are not sure it landed, send the same payment again with the same external_id. It is never recorded twice.

{
  "status": "recorded",
  "income": {
    "id": "9f1c2b1e-...",
    "external_id": "pay_1001",
    "amount": 150000.0,
    "currency": "RWF",
    "amount_rwf": 150000.0,
    "paid_at": "2026-09-19T10:15:00+02:00",
    "category": "sales",
    "customer": "Uwase Aline",
    "description": "Term 1 fees",
    "vat_amount": null,
    "money_account": {"id": "3b7e...", "name": "MTN MoMo"},
    "recorded_at": "2026-09-19T10:15:02+02:00"
  }
}

4. Look a payment up

GET https://api.qonta.rw/v1/income/{external_id}

200 with the income, or 404 when Qonta does not have it. Useful after an outage, to find what still needs sending.

5. Money accounts

GET https://api.qonta.rw/v1/money-accounts

{"money_accounts": [
  {"id": "3b7e...", "name": "MTN MoMo", "kind": "momo",
   "provider": "MTN", "default_for_income": true}
]}

Send an account's id as money_account_id to say where a payment landed.

6. Try it

curl -X POST https://api.qonta.rw/v1/income \
  -H "Authorization: Bearer qk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"external_id": "pay_1001", "amount": 150000, "customer": "Uwase Aline"}'

7. If you pay out to the business's bank

When the money first sits with your platform or a payment gateway and reaches the business's bank later, ask them to add your platform as its own money account in Qonta, and send its money_account_id with each payment. The payout to their bank is then a transfer between two of their accounts, not a second sale, and their income is counted once.

8. Help

Message us on WhatsApp at 0781 653 156 or email hello@qonta.rw.