COLLECTIONS Copy Page
Create a collection
POST https://production.dutchapi.co/v1/collections
Asks a payer to approve a mobile money payment in CM, GH, KE, RW or UG. When it completes, the amount minus the Dutch fee is credited to your wallet.
🔒 Send the project API key as a Bearer token and your Business ID with this call.
Requires an Idempotency-Key header.
Collections are mobile-money only in Cameroon (XAF), Ghana (GHS), Kenya (KES), Rwanda (RWF) and Uganda (UGX). Nigeria bank deposits are not available through this endpoint.
There is no verification code: the payer simply approves the payment prompt on their phone.
The call waits up to about 20 seconds for the payer. If the payer has not approved yet, the status stays processing; a collection.received or collection.failed webhook follows.
Body Params amountnumber required
Amount to collect, in the local currency.
currencystring required
Local currency matching the country, for example XAF.
phonestring required
Payer mobile number in international format.
countrystring optional
CM, GH, KE, RW or UG. Defaults to the country of the currency.
networkstring optional
Mobile money network.
referencestring optional
Your own unique reference (4 to 64 characters).
descriptionstring optional
Up to 140 characters.
Responses
201 400
{
"id": "col_3b9d7e",
"object": "collection",
"kind": "collection",
"status": "processing",
"amount": 10000,
"currency": "XAF",
"fee": 200,
"description": "Collection from +237670000000",
"created_at": "2026-10-13T09:31:00.000Z",
"completed_at": null,
"failure_reason": null,
"method": "mobile_money",
"country": "CM",
"payer": "******0000"
}
{
"error": "idempotency_key_required",
"message": "Send an Idempotency-Key header."
}
Errors Status error Meaning 400 idempotency_key_requiredSend an Idempotency-Key header. 400 valid_amount_requiredamount must be a positive number. 422 collection_not_pricedThere is no published collection rate for that country or method. 403 limits_not_setNo live limit is enabled for this currency (Dashboard, Limits & safety). 423 money_movement_pausedThe kill switch is on. 400 valid_phone_requiredphone must be an international mobile number. 422 below_minimumThe amount is below the minimum for that currency. 422 amount_below_feeThe amount is not larger than the fee. 422 collection_rejectedDutch API could not complete the collection.
Language Shell Node Ruby PHP Python
Credentials Bearer
curl --request POST --url "https://production.dutchapi.co/v1/collections" \
--header "Authorization: Bearer $DUTCH_PROJECT_KEY" \
--header "X-Business-Id: $DUTCH_BUSINESS_ID" \
--header "Idempotency-Key: create-collection-0001" \
--header "Content-Type: application/json" \
--data '{"amount":10000,"currency":"XAF","phone":"+237670000000","country":"CM","reference":"invoice-77"}'const res = await fetch("https://production.dutchapi.co/v1/collections", {
method: "POST",
headers: {
"Authorization": "Bearer " + process.env.DUTCH_PROJECT_KEY,
"X-Business-Id": process.env.DUTCH_BUSINESS_ID,
"Idempotency-Key": "create-collection-0001",
"Content-Type": "application/json",
},
body: JSON.stringify({"amount": 10000, "currency": "XAF", "phone": "+237670000000", "country": "CM", "reference": "invoice-77"})
});
console.log(await res.json());require "net/http"
require "json"
uri = URI("https://production.dutchapi.co/v1/collections")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer #{ENV.fetch('DUTCH_PROJECT_KEY')}"
req["X-Business-Id"] = ENV.fetch("DUTCH_BUSINESS_ID")
req["Idempotency-Key"] = "create-collection-0001"
req["Content-Type"] = "application/json"
req.body = "{\"amount\":10000,\"currency\":\"XAF\",\"phone\":\"+237670000000\",\"country\":\"CM\",\"reference\":\"invoice-77\"}"
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/collections");
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"),
"Idempotency-Key: create-collection-0001",
"Content-Type: application/json"],
CURLOPT_POSTFIELDS => '{"amount":10000,"currency":"XAF","phone":"+237670000000","country":"CM","reference":"invoice-77"}',
]);
echo curl_exec($ch);import os, requests, json
res = requests.request(
"POST",
"https://production.dutchapi.co/v1/collections",
headers={
"Authorization": "Bearer " + os.environ["DUTCH_PROJECT_KEY"],
"X-Business-Id": os.environ["DUTCH_BUSINESS_ID"],
"Idempotency-Key": "create-collection-0001",
},
json=json.loads("{\"amount\":10000,\"currency\":\"XAF\",\"phone\":\"+237670000000\",\"country\":\"CM\",\"reference\":\"invoice-77\"}")
)
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.
201 - Result 400 - Result