Object
The event object
Fields
idstringrequiredUnique; receivers deduplicate on it.
Starts with
evt_.objectstringrequiredtypestringrequiredClients must accept types they do not recognise.
Type Object Fired when user.createdUserA user is created user.kyc_status_changedUserkyc_statuschangesuser.terms_status_changedUserterms_statuschangesuser.deactivatedUserA user is deactivated transfer.createdTransferA transfer is created, including one created by a deposit transfer.state_changedTransferAny state change deposit.receivedTransferFiat arrives for an on-ramp deposit.returnedTransferFiat is sent back to the sender payout.returnedTransferThe rail returns or rejects a payout deposit_account.deactivatedDepositAccountA deposit account is deactivated webhook_endpoint.testWebhookEndpointTest delivery api_versionstringrequiredcreated_attimestamprequiredWhen the change happened. Not the delivery time.
object_typestringrequiredOne of
user,transfer,deposit_account,webhook_endpoint.object_versionintegerrequiredThe snapshot's
version. Discard a delivery whose version is lower than one already processed.previous_attributesobjectFor change events, the prior values of the fields that changed.
dataUser | Transfer | DepositAccount | WebhookEndpointrequiredSnapshot of the object after the change.
data.idstringrequiredStarts with
usr_.data.objectstringrequireddata.external_referencestringrequireddata.emailstring | nulldata.phonestring | nulldata.first_namestring | nulldata.last_namestring | nulldata.business_namestring | nulldata.countrystring | nulldata.statusstringrequiredOne of
active,deactivated.data.kyc_statusstringrequiredOne of
not_started,under_review,incomplete,approved,rejected.data.terms_statusstringrequiredOne of
pending,approved.data.rejection_reasonsarray of objectrequiredPopulated when
kyc_statusisrejectedorincomplete.data.metadataobjectIntegrator key-value data, returned unchanged. Up to 50 keys; keys up to 40 characters, values up to 500.
data.versionintegerrequireddata.created_attimestamprequireddata.updated_attimestamprequireddata.idstringrequiredStarts with
trf_.data.objectstringrequireddata.kindstringrequiredOne of
user_to_user,conversion,onramp,offramp.data.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.data.state_reasonobject | nullWhy the transfer is in an exception state (
in_review,failed,returned,undeliverable,refunded,canceled).data.sourceobjectrequiredA resolved source or destination, as returned on a transfer.
data.source.wallet_idstringStarts with
wal_.data.source.payout_account_idstringStarts with
pa_.data.source.user_idstringOwner of the wallet or payout account. Absent for a fiat source.
Starts with
usr_.data.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.
data.source.currencystringLower-case ISO 4217 fiat currency code.
data.source.railstringA payment rail code, published by
GET /routes. Not an enum by design.data.destinationobjectrequiredA resolved source or destination, as returned on a transfer.
data.destination.wallet_idstringStarts with
wal_.data.destination.payout_account_idstringStarts with
pa_.data.destination.user_idstringOwner of the wallet or payout account. Absent for a fiat source.
Starts with
usr_.data.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.
data.destination.currencystringLower-case ISO 4217 fiat currency code.
data.destination.railstringA payment rail code, published by
GET /routes. Not an enum by design.data.amountstringrequiredAs requested, in the source's unit.
data.deposit_account_idstringSet when the on-ramp was created by a deposit to a standing deposit account.
Starts with
da_.data.deposit_instructionsDepositInstructions | nullOne-off on-ramps only.
data.receiptReceipt | nullPresent once funds have moved.
data.integrator_referencestring | nulldata.metadataobjectIntegrator key-value data, returned unchanged. Up to 50 keys; keys up to 40 characters, values up to 500.
data.versionintegerrequireddata.created_attimestamprequireddata.updated_attimestamprequireddata.idstringrequiredStarts with
da_.data.objectstringrequireddata.user_idstringrequiredStarts with
usr_.data.statusstringrequiredOne of
active,deactivated.data.sourceobjectrequireddata.source.currencystringrequiredLower-case ISO 4217 fiat currency code.
data.source.railstringrequiredA payment rail code, published by
GET /routes. Not an enum by design.data.destinationobjectrequireddata.destination.wallet_idstringrequiredStarts with
wal_.data.destination.assetstringrequiredA 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.
data.deposit_instructionsDepositInstructionsrequireddata.metadataobjectIntegrator key-value data, returned unchanged. Up to 50 keys; keys up to 40 characters, values up to 500.
data.versionintegerrequireddata.created_attimestamprequireddata.idstringrequiredStarts with
we_.data.objectstringrequireddata.urlstringrequireddata.statusstringrequiredOne of
enabled,disabled.data.event_typesarray of stringrequireddata.descriptionstring | nulldata.public_key_pemstringrequiredEd25519 public key (SPKI, PEM) that verifies this endpoint's deliveries.
data.versionintegerrequireddata.created_attimestamprequired
{
"id": "evt_01JA8ZH3WR2T7D0B8A5Z4Y3X2W",
"object": "event",
"type": "transfer.state_changed",
"api_version": "v1",
"created_at": "2026-10-16T09:30:00Z",
"object_type": "transfer",
"object_version": 2,
"previous_attributes": {
"state": "pending"
},
"data": {
"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"
}
}