Public developer API
POST /v1/payouts/quote
Prices a payout without reserving or charging anything: what the recipient gets, and the fees object.
Access
A project-specific API key (Authorization: Bearer dapi_live_...) and its Business ID (X-Business-Id). Rate limited per business (120 calls a minute by default).
The quote is indicative. The payout itself is priced again when you create it, using the published rate for the route.
Africa-only destination coverage: CM (XAF, mobile money); GH (GHS, mobile money or bank); KE (KES, mobile money or bank); NG (NGN, bank); RW (RWF, mobile money); SN (XOF, mobile money); TZ (TZS, mobile money); UG (UGX, mobile money or bank); ZA (ZAR, bank); CD (CDF, mobile money); ZM (ZMW, mobile money); CI (XOF, mobile money). The API does not select a named mobile operator/network; the provider route is selected by country and rail.
Body
| Field | Type | Required | Description |
|---|---|---|---|
amount | number | yes | Amount to send, in the source currency. Greater than 0. |
currency | string | yes | Source wallet currency: USD, XAF, GHS, ZAR, NGN, RWF, UGX or KES. |
rail | string | yes | mobile_money or bank, where that rail is supported: CM/RW/CD/CI/SN/TZ/ZM mobile money; GH/KE/UG mobile money or bank; NG/ZA bank. |
recipient.name | string | yes | Recipient full name (2 to 100 characters). |
recipient.account | string | yes | Mobile number in international format, or bank account number. |
recipient.country | string | yes | ISO 3166 alpha-2 payout destination: CM, GH, KE, RW, UG, NG, ZA, CD, TZ, ZM, SN or CI. Only the rail listed for each country is accepted. |
recipient.bankCode | string | no | Required for bank unless recipient.bank is sent. The public developer API has no bank-list endpoint; obtain the code from your business dashboard or support. |
recipient.bank | string | no | Bank name (required for bank unless recipient.bankCode is sent). |
markupPercent | number | no | Your own markup as a percentage of the amount (0 to 50). Reported in fees, never debited. |
markupFixed | number | no | Your own fixed markup in the request currency. Reported in fees, never debited. |
Example request
curl --request POST \
--url 'https://production.dutchapi.co/v1/payouts/quote' \
--header 'X-Business-Id: YOUR_BUSINESS_ID' \
--header 'Authorization: Bearer bsk_live_YOUR_BUSINESS_SECRET' \
--header 'Content-Type: application/json' \
--data '{"amount":40000,"currency":"XAF","rail":"bank","recipient":{"name":"Ada Obi","account":"0123456789","country":"NG","bankCode":"058","bank":"GTBank"},"markupFixed":100}'
Response 200
{
"send": {
"amount": 40000,
"currency": "XAF"
},
"receive": {
"amount": 88978.6,
"currency": "NGN",
"rate": 2.2244
},
"fees": {
"currency": "XAF",
"rule": "fixed",
"ruleDetail": "Under 50,000 XAF: 300 XAF fixed",
"dutchFee": 300,
"markup": 100,
"totalFee": 400
},
"indicative": true
}
Errors
| Status | error | Meaning |
|---|---|---|
| 400 | valid_amount_required | amount must be a positive number. |
| 400 | unsupported_currency | currency must be one of USD, XAF, GHS, ZAR, NGN, RWF, UGX or KES. |
| 400 | bank_required | Bank payouts need recipient.bank or recipient.bankCode. |
| 422 | unsupported_payout_rail | That bank or mobile-money rail is not supported in the requested country. |
| 422 | amount_below_minimum | The amount is under the published minimum for that route. |
| 422 | currency_not_priced | There is no published sending rate for that currency. |
| 502 | quote_failed | Dutch API could not produce a quote for this corridor. |