Skip to main content

Payouts API

Last updated: 2026-09-25

Use a public key for discovery and a secret key for payout creation. Monetary amounts use minor units and must follow the amount representation rules.

List payout banks​

GET /merchant/api/v1/payouts/banks

Auth: Public key

Query parameterTypePresenceMeaning
countryCodestringRequiredISO 3166-1 alpha-2 market country
paymentMethodstringRequiredSend PAYMENT_METHOD_BANK_ACCOUNT for bank discovery
trafficVerticalenumOptionalTraffic classification for this request; an explicit supported value takes precedence over the account default
customerSegmentenumOptionalCustomer segment used by the payout

The response contains banks[] entries with code and name.

List payout mobile money operators​

GET /merchant/api/v1/payouts/mmo

Auth: Public key

Query parameterTypePresenceMeaning
countryCodestringRequiredISO 3166-1 alpha-2 market country
paymentMethodstringRequiredPAYMENT_METHOD_MOBILE_MONEY
trafficVerticalenumOptionalTraffic classification for this request; an explicit supported value takes precedence over the account default
customerSegmentenumOptionalCustomer segment used by the payout

The response contains operators[] entries with operator and name. Display name; treat the public CAPS operator code as opaque and reuse it exactly as returned.

Create a payout​

POST /merchant/api/v1/payouts/create

Auth: Secret key

Body fieldTypePresenceMeaning
amountstring (int64)RequiredPositive amount in minor units
currencyCodestringRequiredISO 4217 currency
countryCodestringRequiredISO 3166-1 alpha-2 country code of the selected payment market; it is never inferred from currency or payment method
paymentMethodenumRequiredPAYMENT_METHOD_BANK_ACCOUNT or PAYMENT_METHOD_MOBILE_MONEY
merchantReferencestringRequiredMerchant-side payout reference and idempotency key
trafficVerticalenumOptionalTraffic classification for this request; an explicit supported value takes precedence over the account default
customerSegmentenumOptionalCustomer segment

Add the detail block for the selected method:

Detail blockFields
bankAccountDetailsbankCode and account required; supply name unless omission is explicitly supported for your configured payout path; email conditional for INR
mobileMoneyDetailsmobileNumber required; operator required when the selected route is operator-aware; supply accountName unless omission is explicitly supported for your configured payout path; email conditional for INR
{
"amount": "5000",
"currencyCode": "GHS",
"countryCode": "GH",
"paymentMethod": "PAYMENT_METHOD_MOBILE_MONEY",
"merchantReference": "PO-3002",
"mobileMoneyDetails": {
"operator": "<operator_from_discovery>",
"mobileNumber": "<beneficiary_msisdn>",
"accountName": "<beneficiary_name>"
}
}

The response contains the created payment order. Reconcile its latest status; request acceptance is not a final payout outcome.

You can safely retry an equivalent create request with the same merchantReference; the API returns the existing payout. A request that reuses the reference with different data is rejected, so use a new reference for each distinct intended payout.

Outcomes​

Discovery and creation can return INVALID_ARGUMENT for missing, malformed, or unsupported request values. A configured method can return the public method_unavailable reason.

For the account-level HTTP 400 / FAILED_PRECONDITION response with violation type merchant_payout_accounting_not_ready, contact support before retrying. See Payout unavailable for the account.

For HTTP 503 / UNAVAILABLE with the documented operation_busy preparation response, wait for google.rpc.RetryInfo.retryDelay and retry an equivalent request with the same merchantReference. See Payout preparation temporarily unavailable for the distinction from an unknown transport outcome. The JSON retry details are sufficient; an HTTP Retry-After header is not required.

Related guide: Payouts.