Send up to 100 payouts at once
Sends up to 100 payouts in one request. Each item has the same fields as POST /v1/payouts and is accepted or refused on its own, so one refusal does not stop the others. Your limits apply to each item as if it were sent alone.
If the batch itself is malformed (no items, more than 100, an invalid item or a reference repeated within the batch), the whole batch is refused with 400 and nothing is sent.
A 200 lists each item with its status: 202 and the payout when it was accepted, otherwise an error with the same codes a single payout would get, such as daily_limit_exceeded. Read each payout back with GET /v1/payouts/{reference}; webhooks arrive for each payout, not for the batch.
Send a required Idempotency-Key header. After a timeout or a 5xx, retry with the same key and body: accepted items are not sent again. Requires the disbursements.write permission.
/v1/payout-batchesAuthorizationBearer token (JWT) · headerrequiredA token from POST /v1/oauth/token on the iSmartPay identity service, obtained with an API credential's client id and secret.
Idempotency-KeystringrequiredA unique value you generate for this attempt, at most 255 characters. Send the same value when you retry the same request: it is answered once, however many times you send it. Reusing a value with a different body is refused with 409 idempotency_key_reused.
application/jsonreferencestringrequiredYour reference for the batch, unique for each batch.
itemsPayoutRequest[]requiredThe payouts. Each reference must be unique within the batch.
Show propertiesHide properties
PayoutRequestreferencestringrequiredYour own identifier for this request, 1 to 64 letters, digits, underscores or hyphens, starting with a letter or digit. It must be unique for each request you start.
amountstringrequiredThe amount to send. A decimal string in major units.
currencystringrequiredThree-letter currency code.
providerstringrequiredThe mobile money or bank provider, for example mtn, telecel or calbank. List what your account can use with GET /v1/payment-methods.
destinationobjectrequiredShow propertiesHide properties
typestringrequiredWhat kind of account the recipient is.
msisdnaccountcardvaluestringrequiredThe mobile money number, account number or card reference.
notestringOptional text stored with the record. At most 50 characters, no control characters. It is not sent to the provider.
The batch was received. Each item has its own outcome.
batchIdstringrequiredThe batch's id.
referencestringrequiredYour reference for the batch.
itemsobject[]requiredOne entry per item, in the order sent.
Show propertiesHide properties
objectreferencestringrequiredThe item's payout reference.
statusintegerrequired202 when the payout was accepted, otherwise the status a single payout would have been refused with.
payoutPayoutShow propertiesHide properties
referencestringrequiredThe reference you chose.
amountstringThe requested amount. A decimal string in major units.
currencystringThree-letter currency code.
statusstringrequiredWhere the request stands, reported as it is: accepted, dispatching, in_review, held, delivered, failed or refunded. Others can appear, so do not treat this list as closed.
providerstringThe provider used.
feestringThe fee charged. Left out when none was recorded. A decimal string in major units.
feeBearerstringWho pays the fee. initiator: the party who starts the request pays the amount plus the fee, and the recipient gets the full amount. non_initiator: the fee comes out of what the recipient gets.
initiatornon_initiatorpayerAmountstringWhat the payer is charged. Left out when the fee bearer is not known. A decimal string in major units.
recipientAmountstringWhat the recipient receives. Left out when the fee bearer is not known. A decimal string in major units.
notestringThe note you sent.
failureReasonstringThe provider's own reason when the request failed. Left out otherwise.
createdAtstring<date-time>completedAtstring<date-time>When it reached its final status. Left out while it is still moving, and on older movements where the time was not recorded.
channelstringHow it was started. api is the only value today.
apireconciliationReconciliationWhat the platform's check against the provider concluded.
Show propertiesHide properties
statusstringrequiredunchecked (not checked yet), matched (the provider agrees) or mismatched (the provider disagrees; the platform is looking into it).
uncheckedmatchedmismatchedcheckedAtstring<date-time>When it was last checked. Left out until it has been.
parentLineageLinkThe movement this one undoes, when it is a reversal. Left out otherwise.
Show propertiesHide properties
typestringrequiredWhat kind of movement it is.
collectionpayoutwallet_transferreferencestringrequiredIts reference.
compensationLineageLinkThe reversal recorded against this movement. Left out when there is none.
Show propertiesHide properties
typestringrequiredWhat kind of movement it is.
collectionpayoutwallet_transferreferencestringrequiredIts reference.
errorobjectWhy this item was refused.
Show propertiesHide properties
codestringrequiredmessagestringrequiredThe request is not valid. message says which field.
errorobjectrequiredShow propertiesHide properties
codestringrequiredA stable, machine-readable code. Branch on this, not on the message. Codes include invalid_input, unauthenticated, forbidden, environment_mismatch, not_found, rate_limited, idempotency_key_reused, request_in_flight, limits_missing, limits_unusable, tier_ineligible, transaction_limit_exceeded, daily_limit_exceeded, monthly_limit_exceeded, business_suspended, business_deactivated, environment_unknown, duplicate_reference, provider_error, provider_timeout, destination_not_verified, destination_verification_unavailable, upstream_timeout and internal.
messagestringrequiredReadable detail for a person. For any 5xx it is always the fixed text internal server error.
The token is missing, expired or not valid. Get a new one from the token endpoint.
errorobjectrequiredShow propertiesHide properties
codestringrequiredA stable, machine-readable code. Branch on this, not on the message. Codes include invalid_input, unauthenticated, forbidden, environment_mismatch, not_found, rate_limited, idempotency_key_reused, request_in_flight, limits_missing, limits_unusable, tier_ineligible, transaction_limit_exceeded, daily_limit_exceeded, monthly_limit_exceeded, business_suspended, business_deactivated, environment_unknown, duplicate_reference, provider_error, provider_timeout, destination_not_verified, destination_verification_unavailable, upstream_timeout and internal.
messagestringrequiredReadable detail for a person. For any 5xx it is always the fixed text internal server error.
The request was understood and refused. Common causes: the token is not an API credential's (forbidden); the credential is for the other environment (environment_mismatch); it does not have the permission this operation needs (forbidden); a limit was reached (limits_missing, limits_unusable, tier_ineligible, transaction_limit_exceeded, daily_limit_exceeded, monthly_limit_exceeded); or iSmartPay has suspended or deactivated the business (business_suspended, business_deactivated). A suspended business's API credentials stop exchanging for tokens, so a request made with a token issued just before the suspension is refused with business_suspended.
errorobjectrequiredShow propertiesHide properties
codestringrequiredA stable, machine-readable code. Branch on this, not on the message. Codes include invalid_input, unauthenticated, forbidden, environment_mismatch, not_found, rate_limited, idempotency_key_reused, request_in_flight, limits_missing, limits_unusable, tier_ineligible, transaction_limit_exceeded, daily_limit_exceeded, monthly_limit_exceeded, business_suspended, business_deactivated, environment_unknown, duplicate_reference, provider_error, provider_timeout, destination_not_verified, destination_verification_unavailable, upstream_timeout and internal.
messagestringrequiredReadable detail for a person. For any 5xx it is always the fixed text internal server error.
idempotency_key_reused: the key was used before with a different body. request_in_flight: a request with this key is still being processed, so retry shortly. duplicate_reference: the reference is already used by a different request, so choose a new one; sending the same body again under a new key replays the first answer.
errorobjectrequiredShow propertiesHide properties
codestringrequiredA stable, machine-readable code. Branch on this, not on the message. Codes include invalid_input, unauthenticated, forbidden, environment_mismatch, not_found, rate_limited, idempotency_key_reused, request_in_flight, limits_missing, limits_unusable, tier_ineligible, transaction_limit_exceeded, daily_limit_exceeded, monthly_limit_exceeded, business_suspended, business_deactivated, environment_unknown, duplicate_reference, provider_error, provider_timeout, destination_not_verified, destination_verification_unavailable, upstream_timeout and internal.
messagestringrequiredReadable detail for a person. For any 5xx it is always the fixed text internal server error.
Too many requests for this credential. Wait the number of seconds in the Retry-After header, then try again.
errorobjectrequiredShow propertiesHide properties
codestringrequiredA stable, machine-readable code. Branch on this, not on the message. Codes include invalid_input, unauthenticated, forbidden, environment_mismatch, not_found, rate_limited, idempotency_key_reused, request_in_flight, limits_missing, limits_unusable, tier_ineligible, transaction_limit_exceeded, daily_limit_exceeded, monthly_limit_exceeded, business_suspended, business_deactivated, environment_unknown, duplicate_reference, provider_error, provider_timeout, destination_not_verified, destination_verification_unavailable, upstream_timeout and internal.
messagestringrequiredReadable detail for a person. For any 5xx it is always the fixed text internal server error.
Something failed on our side. The message is fixed. If the request was a POST, retry with the same Idempotency-Key and body.
errorobjectrequiredShow propertiesHide properties
codestringrequiredA stable, machine-readable code. Branch on this, not on the message. Codes include invalid_input, unauthenticated, forbidden, environment_mismatch, not_found, rate_limited, idempotency_key_reused, request_in_flight, limits_missing, limits_unusable, tier_ineligible, transaction_limit_exceeded, daily_limit_exceeded, monthly_limit_exceeded, business_suspended, business_deactivated, environment_unknown, duplicate_reference, provider_error, provider_timeout, destination_not_verified, destination_verification_unavailable, upstream_timeout and internal.
messagestringrequiredReadable detail for a person. For any 5xx it is always the fixed text internal server error.
A service behind the API did not answer usably. If the request was a POST, retry with the same Idempotency-Key and body. A party lookup the provider rejects is provider_error.
errorobjectrequiredShow propertiesHide properties
codestringrequiredA stable, machine-readable code. Branch on this, not on the message. Codes include invalid_input, unauthenticated, forbidden, environment_mismatch, not_found, rate_limited, idempotency_key_reused, request_in_flight, limits_missing, limits_unusable, tier_ineligible, transaction_limit_exceeded, daily_limit_exceeded, monthly_limit_exceeded, business_suspended, business_deactivated, environment_unknown, duplicate_reference, provider_error, provider_timeout, destination_not_verified, destination_verification_unavailable, upstream_timeout and internal.
messagestringrequiredReadable detail for a person. For any 5xx it is always the fixed text internal server error.
The API is temporarily unable to tell which environment it serves (environment_unknown), utility purchases are not available right now (utilities_unavailable), a settlement destination could not be name-checked just now (destination_verification_unavailable; retry the same request), or hosted checkout is not set up on this deployment (checkout_unavailable). Retry shortly, except for checkout_unavailable, which lasts until the deployment is configured.
errorobjectrequiredShow propertiesHide properties
codestringrequiredA stable, machine-readable code. Branch on this, not on the message. Codes include invalid_input, unauthenticated, forbidden, environment_mismatch, not_found, rate_limited, idempotency_key_reused, request_in_flight, limits_missing, limits_unusable, tier_ineligible, transaction_limit_exceeded, daily_limit_exceeded, monthly_limit_exceeded, business_suspended, business_deactivated, environment_unknown, duplicate_reference, provider_error, provider_timeout, destination_not_verified, destination_verification_unavailable, upstream_timeout and internal.
messagestringrequiredReadable detail for a person. For any 5xx it is always the fixed text internal server error.
The request took too long. If it was a POST, its outcome is unknown: retry with the same Idempotency-Key and body, or read it back by reference. A party lookup the provider does not answer is provider_timeout: check again before relying on it.
errorobjectrequiredShow propertiesHide properties
codestringrequiredA stable, machine-readable code. Branch on this, not on the message. Codes include invalid_input, unauthenticated, forbidden, environment_mismatch, not_found, rate_limited, idempotency_key_reused, request_in_flight, limits_missing, limits_unusable, tier_ineligible, transaction_limit_exceeded, daily_limit_exceeded, monthly_limit_exceeded, business_suspended, business_deactivated, environment_unknown, duplicate_reference, provider_error, provider_timeout, destination_not_verified, destination_verification_unavailable, upstream_timeout and internal.
messagestringrequiredReadable detail for a person. For any 5xx it is always the fixed text internal server error.