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
| Method | Path | Description |
|---|---|---|
POST | /transfers | Create a transfer |
POST | /transfers/batch | Create up to 500 transfers in a call |
GET | /transfers | List 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.
idstringoptionalpo_… in live, po_test_… in sandbox.referencestring?optionalprovider_referencestring?optionalamountnumberoptionalcurrencystringoptionaldescriptionstring?optionalreasonstring?optionalfailure_reason.statusenumoptionalprocessing, 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.completebooleanoptionaltrue only once the transfer has succeeded. It stays false on failed and cancelled: read status to know whether a transfer is finished.sourcestringoptionalapi for a payout your integration created, dashboard or recurring for one started from the Konsole.failure_reasonstringoptionalstatus is failed or cancelled.failure_messagestringoptionalstatus is failed or cancelled.metadataobjectoptionalledger_balance_currencystring?optionalsandboxbooleanoptionaltrue for a sandbox payout.providerobject?optionalslug and name of the provider that carries the payout. null on a sandbox payout at creation.beneficiaryobjectoptionalid, name, phone, email and deleted. A beneficiary deleted since stays here, with deleted: true.payment_methodobjectoptionalid, account_number and phone of the destination.succeeded_atdatetime?optionalcreated_atdatetimeoptionalupdated_atdatetimeoptionalAccounts 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
| Event | Trigger |
|---|---|
transfer.created | Transfer created |
transfer.processing | Transfer submitted to the operator |
transfer.succeeded | Transfer successfully executed |
transfer.failed | Transfer failed |
transfer.cancelled | Stopped before it was sent. Sent once API version 2026-10-12 is current, as transfer.failed until then |