PAYOUTS Copy Page
Quote a payout
POST https://production.dutchapi.co/v1/payouts/quote
Prices a payout without reserving or charging anything: what the recipient gets, and the fees object.
🔒 Send the project API key as a Bearer token and your Business ID with this call.
The quote is indicative. The payout itself is priced again when you create it, using the published rate for the route.
African rails: mobile money in CM, RW, CD, CI, SN, TZ and ZM; mobile money or bank in GH, KE and UG; bank in NG and ZA.
Body Params amountnumber required
Amount to send, in the source currency. Greater than 0.
currencystring required
Source wallet currency: USD, XAF, GHS, ZAR, NGN, RWF, UGX or KES.
railstring required
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.namestring required
Recipient full name (2 to 100 characters).
recipient.accountstring required
Mobile number in international format, or bank account number.
recipient.countrystring required
ISO 3166 alpha-2 payout destination: CM, GH, UG, KE, NG, RW, ZA, CD, TZ, ZM, SN or CI. Only the rail listed for each country is accepted.
recipient.bankCodestring optional
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.bankstring optional
Bank name (required for bank unless recipient.bankCode is sent).
recipient.networkstring optional
Mobile money network, for example MTN MoMo.
markupPercentnumber optional
Your own markup as a percentage of the amount (0 to 50). Reported in fees, never debited.
markupFixednumber optional
Your own fixed markup in the request currency. Reported in fees, never debited.
Responses
200 400
{
"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
}
{
"error": "valid_amount_required",
"message": "amount must be a positive number."
}
Errors Status error Meaning 400 valid_amount_requiredamount must be a positive number. 400 unsupported_currencycurrency must be one of USD, XAF, GHS, ZAR, NGN, RWF, UGX or KES. 400 bank_requiredBank payouts need recipient.bank or recipient.bankCode. 422 unsupported_payout_railThat bank or mobile-money rail is not supported in the requested country. 422 amount_below_minimumThe amount is under the published minimum for that route. 422 currency_not_pricedThere is no published sending rate for that currency. 502 quote_failedDutch API could not produce a quote for this corridor.
Language Shell Node Ruby PHP Python
Credentials Bearer
curl --request POST --url "https://production.dutchapi.co/v1/payouts/quote" \
--header "Authorization: Bearer $DUTCH_PROJECT_KEY" \
--header "X-Business-Id: $DUTCH_BUSINESS_ID" \
--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}'const res = await fetch("https://production.dutchapi.co/v1/payouts/quote", {
method: "POST",
headers: {
"Authorization": "Bearer " + process.env.DUTCH_PROJECT_KEY,
"X-Business-Id": process.env.DUTCH_BUSINESS_ID,
"Content-Type": "application/json",
},
body: JSON.stringify({"amount": 40000, "currency": "XAF", "rail": "bank", "recipient": {"name": "Ada Obi", "account": "0123456789", "country": "NG", "bankCode": "058", "bank": "GTBank"}, "markupFixed": 100})
});
console.log(await res.json());require "net/http"
require "json"
uri = URI("https://production.dutchapi.co/v1/payouts/quote")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer #{ENV.fetch('DUTCH_PROJECT_KEY')}"
req["X-Business-Id"] = ENV.fetch("DUTCH_BUSINESS_ID")
req["Content-Type"] = "application/json"
req.body = "{\"amount\":40000,\"currency\":\"XAF\",\"rail\":\"bank\",\"recipient\":{\"name\":\"Ada Obi\",\"account\":\"0123456789\",\"country\":\"NG\",\"bankCode\":\"058\",\"bank\":\"GTBank\"},\"markupFixed\":100}"
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
puts res.body<?php
$ch = curl_init("https://production.dutchapi.co/v1/payouts/quote");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . getenv("DUTCH_PROJECT_KEY"),
"X-Business-Id: " . getenv("DUTCH_BUSINESS_ID"),
"Content-Type: application/json"],
CURLOPT_POSTFIELDS => '{"amount":40000,"currency":"XAF","rail":"bank","recipient":{"name":"Ada Obi","account":"0123456789","country":"NG","bankCode":"058","bank":"GTBank"},"markupFixed":100}',
]);
echo curl_exec($ch);import os, requests, json
res = requests.request(
"POST",
"https://production.dutchapi.co/v1/payouts/quote",
headers={
"Authorization": "Bearer " + os.environ["DUTCH_PROJECT_KEY"],
"X-Business-Id": os.environ["DUTCH_BUSINESS_ID"],
},
json=json.loads("{\"amount\":40000,\"currency\":\"XAF\",\"rail\":\"bank\",\"recipient\":{\"name\":\"Ada Obi\",\"account\":\"0123456789\",\"country\":\"NG\",\"bankCode\":\"058\",\"bank\":\"GTBank\"},\"markupFixed\":100}")
)
print(res.json())
Show example
Response Click `Show example` to see an example response. Nothing is sent from this page: endpoints are live, so run real requests from your own code with small amounts.
200 - Result 400 - Result