Skip to content
Loading keys…

Transfers

Send funds to a Mobile Money wallet, a Djamo wallet or another Wajub account via the Transfers API.

A Transfer is an outgoing payout from the balance held by our licensed payment partner, to a Mobile Money wallet, a phone-addressed wallet such as Djamo, or another Wajub account. A bank payout goes only through a payout account added in the Dashboard, which this API cannot pay. Transfers are asynchronous, listen to transfer.succeeded and transfer.failed.

private key required

Transfers require the private key (sk...) in the Authorization header.

Marketplaces: acting on behalf of a subaccount

Platforms can pay out on behalf of a connected subaccount by sending an X-Sync header alongside their own key (requires the withdrawals capability). See Subaccounts for the full contract and error cases.

Endpoints

MethodPathDescription
POST/transfersCreate a transfer
POST/transfers/batchCreate up to 500 transfers in a call
GET/transfersList transfers
GET/transfers/{id}Retrieve a transfer

The Transfer object

A transfer is read by its id. Its reference is yours and never checked for uniqueness, so GET /transfers/{id} does not accept it. The Transfers guide shows a full example.

idstringoptional
The identifier for every other call: po_… in live, po_test_… in sandbox.
referencestring?optional
Your own reference, as sent on creation, or the line reference on a batch. Not unique.
provider_referencestring?optional
The operator's own reference, once the payout reaches it.
amountnumberoptional
Amount in the major unit of the currency.
currencystringoptional
ISO 4217 code.
descriptionstring?optional
Descriptive label.
reasonstring?optional
The free-text reason you sent on creation. Not a failure code: see failure_reason.
statusenumoptional
processing, review, succeeded, failed or cancelled. pending lasts only an instant in sandbox; in live, only an older Dashboard payout still awaiting your confirmation reads it, until you confirm or reject it in the Dashboard. cancelled is a payout cancelled before it was sent, from API version 2026-10-12: earlier versions read it failed. A payout the operator cancels on its side ends failed.
completebooleanoptional
true only once the transfer has succeeded. It stays false on failed and cancelled: read status to know whether a transfer is finished.
sourcestringoptional
api for a payout your integration created, dashboard or recurring for one started from the Konsole.
failure_reasonstringoptional
The failure code, present only when status is failed or cancelled.
failure_messagestringoptional
The failure in one sentence, present only when status is failed or cancelled.
metadataobjectoptional
Your own key-value data. Some keys are reserved by Wajub.
ledger_balance_currencystring?optional
The sandbox wallet that was debited. Null on a live payout.
sandboxbooleanoptional
true for a sandbox payout.
providerobject?optional
slug and name of the provider that carries the payout. null on a sandbox payout at creation.
beneficiaryobjectoptional
id, name, phone, email and deleted. A beneficiary deleted since stays here, with deleted: true.
payment_methodobjectoptional
id, account_number and phone of the destination.
succeeded_atdatetime?optional
ISO 8601 timestamp of completion.
created_atdatetimeoptional
ISO 8601 creation timestamp (UTC).
updated_atdatetimeoptional
ISO 8601 timestamp of the last change.

Accounts pinned to an API version before 2026-09-01 also receive ledger_balance_before and ledger_balance_after.

Lifecycle

A live payout is created processing, or review when it is held. A payout created today is never pending in live: only an older Dashboard payout still awaiting your confirmation reads it. Confirmed, it is checked like a new payout, its funds are held, and it may be held for review (review) on the same grounds as a new payout, or leaves as processing; rejected, it ends cancelled (failed before API version 2026-10-12). In sandbox, pending lasts only an instant.

Events

EventTrigger
transfer.createdTransfer created
transfer.processingTransfer submitted to the operator
transfer.succeededTransfer successfully executed
transfer.failedTransfer failed
transfer.cancelledStopped before it was sent. Sent once API version 2026-10-12 is current, as transfer.failed until then

What did you think of this content?