Object
The transfer object
Fields
idstringrequiredStarts with
trf_.objectstringrequiredkindstringrequiredOne of
user_to_user,conversion,onramp,offramp.statestringrequiredTransfers of every kind share these states. Which states a kind uses, and how it moves between them:
user_to_user:pending→completed; orpending→in_review→completedorfailed;pending→canceledonly before posting.conversion:pending→completed, orpending→failed(quote expired, stock or treasury too low). Settles in one ledger transaction, so it is final in the response.onramp:awaiting_funds→funds_received→completed. Exceptions:in_review(after funds arrive),returned(funds sent back to the sender, final),canceled(fromawaiting_funds, final),failed.offramp:pending→payout_submitted→completed. Exceptions:in_review(before submission),undeliverableandreturned(rail rejected the payout; both move on torefunded),refunded(source wallet credited back, final),failed(refused before the wallet was debited, final).
Final states:
completed,failed,canceled,returned(on-ramp),refunded. Each change emitstransfer.state_changed.One of
pending,awaiting_funds,funds_received,in_review,payout_submitted,completed,failed,canceled,returned,undeliverable,refunded.state_reasonobject | nullWhy the transfer is in an exception state (
in_review,failed,returned,undeliverable,refunded,canceled).state_reason.codestringrequiredstate_reason.messagestringrequiredsourceobjectrequiredA resolved source or destination, as returned on a transfer.
source.typestringrequiredOne of
wallet,fiat,payout_account.source.wallet_idstringStarts with
wal_.source.payout_account_idstringStarts with
pa_.source.user_idstringOwner of the wallet or payout account. Absent for a fiat source.
Starts with
usr_.source.assetstringA wallet asset code. The set is data on
GET /routes. In 1.0 it holds two assets:ndeipi-points: Ndeipi Points, bought with fiat on Absa or PayPal at a fixed price per currency and cashed out the same way. Every user's default asset.ndeipi-coin: NdeipiCoin, opt-in. Its price moves. It is bought and sold only by converting points at a locked quote (POST /quotes), never directly with fiat. A wallet needsacknowledge_price_risk: trueto create.
source.currencystringLower-case ISO 4217 fiat currency code.
source.railstringA payment rail code, published by
GET /routes. Not an enum by design.destinationobjectrequiredA resolved source or destination, as returned on a transfer.
destination.typestringrequiredOne of
wallet,fiat,payout_account.destination.wallet_idstringStarts with
wal_.destination.payout_account_idstringStarts with
pa_.destination.user_idstringOwner of the wallet or payout account. Absent for a fiat source.
Starts with
usr_.destination.assetstringA wallet asset code. The set is data on
GET /routes. In 1.0 it holds two assets:ndeipi-points: Ndeipi Points, bought with fiat on Absa or PayPal at a fixed price per currency and cashed out the same way. Every user's default asset.ndeipi-coin: NdeipiCoin, opt-in. Its price moves. It is bought and sold only by converting points at a locked quote (POST /quotes), never directly with fiat. A wallet needsacknowledge_price_risk: trueto create.
destination.currencystringLower-case ISO 4217 fiat currency code.
destination.railstringA payment rail code, published by
GET /routes. Not an enum by design.amountstringrequiredAs requested, in the source's unit.
deposit_account_idstringSet when the on-ramp was created by a deposit to a standing deposit account.
Starts with
da_.deposit_instructionsDepositInstructions | nullOne-off on-ramps only.
receiptReceipt | nullPresent once funds have moved.
receipt.amount_expectedstringOn-ramp only. The amount from the create request.
receipt.amount_receivedstringOn-ramp only. Fiat that arrived.
receipt.amount_debitedstringDebited from the source wallet.
receipt.amount_creditedstringCredited to the destination wallet.
receipt.earned_amountstringPoints transfers only: the part of the amount that moved as earned points and arrived as earned points. The rest moved as cashable points.
receipt.amount_paid_outstringOff-ramp only. Sent to the payout account, in its currency.
receipt.ratestringConversion rate applied, as destination units per source unit.
receipt.feesarray of objectreceipt.rail_referencestringThe rail's own reference for the deposit or payout.
receipt.initiated_attimestamprequiredreceipt.completed_attimestampintegrator_referencestring | nullmetadataobjectIntegrator key-value data, returned unchanged. Up to 50 keys; keys up to 40 characters, values up to 500.
versionintegerrequiredcreated_attimestamprequiredupdated_attimestamprequired
{
"id": "trf_01JA8ZC4QK7N2Y5W3V0T9S8R6P",
"object": "transfer",
"kind": "user_to_user",
"state": "completed",
"state_reason": null,
"source": {
"type": "wallet",
"wallet_id": "wal_01JA8Z4K2V9QW3H6Y7XKD2M0RS",
"user_id": "usr_01JA8Z2F5G6H7J8K9M0N1P2Q3R",
"asset": "ndeipi-points"
},
"destination": {
"type": "wallet",
"wallet_id": "wal_01JA8Z5B7C1DE2F3G4H5J6K7LM",
"user_id": "usr_01JA8Z3H6J7K8M9N0P1Q2R3S4T",
"asset": "ndeipi-points"
},
"amount": "25.00",
"deposit_instructions": null,
"receipt": {
"amount_debited": "25.00",
"amount_credited": "25.00",
"earned_amount": "0.00",
"fees": [],
"initiated_at": "2026-10-16T09:30:00Z",
"completed_at": "2026-10-16T09:30:00Z"
},
"integrator_reference": "invoice-7781",
"metadata": {
"note": "Lunch"
},
"version": 2,
"created_at": "2026-10-16T09:30:00Z",
"updated_at": "2026-10-16T09:30:00Z"
}