API Referencev1.0
HomeLog inSign up
PAYOUTS

Create a payout

POSThttps://production.dutchapi.co/v1/payouts

Sends money to a mobile money wallet or bank account. The amount plus the Dutch fee is debited from your wallet immediately; a failed payout is returned to your balance.

🔒Send the project API key as a Bearer token and your Business ID with this call.

Requires an Idempotency-Key header. Repeating a request with the same key returns the original payout and never pays twice.

If payout approval is switched on for your organization, the response is 202 with status awaiting_approval, and an approver must confirm it in the dashboard.

Subscribe to payout.completed and payout.failed webhooks, or poll GET /v1/payouts/{id}.

Body Params

amountnumberrequired

Amount to send, in the source currency. Greater than 0.

currencystringrequired

Source wallet currency: USD, XAF, GHS, ZAR, NGN, RWF, UGX or KES.

railstringrequired

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.namestringrequired

Recipient full name (2 to 100 characters).

recipient.accountstringrequired

Mobile number in international format, or bank account number.

recipient.countrystringrequired

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.bankCodestringoptional

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.bankstringoptional

Bank name (required for bank unless recipient.bankCode is sent).

recipient.networkstringoptional

Mobile money network, for example MTN MoMo.

markupPercentnumberoptional

Your own markup as a percentage of the amount (0 to 50). Reported in fees, never debited.

markupFixednumberoptional

Your own fixed markup in the request currency. Reported in fees, never debited.

referencestringoptional

Your own reference, 4 to 64 characters (letters, digits, - _ : .). Must be unique.

descriptionstringoptional

Up to 140 characters.

fundstringoptional

Only balance is available. Just-in-time funding is coming soon.

Responses

{
  "id": "pyt_8f2c1a",
  "object": "payout",
  "kind": "disbursement",
  "status": "processing",
  "amount": 40000,
  "currency": "XAF",
  "fee": 300,
  "description": "Payout to Ada Obi",
  "created_at": "2026-10-13T09:30:00.000Z",
  "completed_at": null,
  "failure_reason": null,
  "funding": "balance",
  "rail": "bank",
  "recipient": {
    "name": "Ada Obi",
    "account": "******6789",
    "country": "NG"
  },
  "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
  }
}
{
  "error": "idempotency_key_required",
  "message": "Send an Idempotency-Key header."
}

Errors

StatuserrorMeaning
400idempotency_key_requiredSend an Idempotency-Key header.
400valid_amount_requiredamount must be a positive number.
400unsupported_currencycurrency must be one of USD, XAF, GHS, ZAR, NGN, RWF, UGX or KES.
402insufficient_fundsThe wallet balance is too low.
403limits_not_setNo live limit is enabled for this currency (Dashboard, Limits & safety).
422over_per_request_limitThe amount is above the per-request limit.
422over_daily_limitThe daily limit would be exceeded.
423money_movement_pausedThe kill switch is on.
409duplicate_referenceThat reference was already used.
409request_in_progressA request with the same Idempotency-Key is still running.
422idempotency_key_reusedThe Idempotency-Key was used with a different request.
422unsupported_payout_railThat bank or mobile-money rail is not supported in the requested country.
422payout_rejectedDutch API could not complete the payout; the amount was returned.
Updated 2026
Did this page help you?