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

FieldTypeRequiredDescription
amountnumberyesAmount to send, in the source currency. Greater than 0.
currencystringyesSource wallet currency: USD, XAF, GHS, ZAR, NGN, RWF, UGX or KES.
railstringyesmobile_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.namestringyesRecipient full name (2 to 100 characters).
recipient.accountstringyesMobile number in international format, or bank account number.
recipient.countrystringyesISO 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.bankCodestringnoRequired 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.bankstringnoBank name (required for bank unless recipient.bankCode is sent).
markupPercentnumbernoYour own markup as a percentage of the amount (0 to 50). Reported in fees, never debited.
markupFixednumbernoYour 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

StatuserrorMeaning
400valid_amount_requiredamount must be a positive number.
400unsupported_currencycurrency must be one of USD, XAF, GHS, ZAR, NGN, RWF, UGX or KES.
400bank_requiredBank payouts need recipient.bank or recipient.bankCode.
422unsupported_payout_railThat bank or mobile-money rail is not supported in the requested country.
422amount_below_minimumThe amount is under the published minimum for that route.
422currency_not_pricedThere is no published sending rate for that currency.
502quote_failedDutch API could not produce a quote for this corridor.

Related references

Browse the complete endpoint directory, the developer portal and the security and controls guide.