Using the APIStatuses & Lifecycles

Statuses & Lifecycles

Every state machine in one place: what each status means, which are terminal, and which webhook fires on each transition.

Status values are stable API contract, and the same vocabulary is used everywhere: in GET responses, in webhook payloads, and throughout these docs. Resources progress forward only. Nothing moves backwards through its chain.

This page is the single home for every state diagram. Concept pages link here rather than redrawing one.

Endorsement

The public KYC reading. See Verification & Endorsements.

StatusTerminalMeaningWebhook on entry
incompletenoRequested, but something it needs is outstanding. The missing bucket lists what you owenone
pendingnoUnder review. Nothing is owed right nownone
issuesnoRetryable ask. The buckets name itendorsement.request_for_information
approvedstickyThe currency's features are openendorsement.approved
rejectedyesFinal adverse decisionendorsement.rejected

approved is sticky in the direction that matters: a scoped re-check or a retryable ask never demotes an approved endorsement.

Verification round

One review attempt, listed at GET /api/customers/{id}/verifications.

StatusTerminalMeaning
submittednoSent for review
under_reviewnoUnder review
approvedyesThis round passed
request_for_informationyesThis round asked for something. rejection_reasons names it
rejectedyesThis round refused
expiredyesThe round aged out

Rounds carry no webhooks of their own. Decisions surface on the customer's endorsements, which is the reading to build on.

Customer

StatusTerminalMeaning
pendingnoCreated, not yet active
activenoNormal
rejectedyesRefused
frozennoEvery API call for this customer is refused

Deposit

StatusTerminalMeaningWebhook
detectednoThe bank credit was seendeposit.received
confirmednoFunds confirmed on the railnone
orchestratingnoConversion in progress. Also where a deposit waits when corridor inventory is momentarily shortnone
completedyesConverted and deliverednone
returnedyesSent back to the senderdeposit.returned
failedyesCould not be processed. Contact supportnone
on_holdnoCompliance hold, needs review before it proceedsdeposit.on_hold

Conversion

StatusTerminalMeaningWebhook
creatednoOpened for a depositconversion.created
routingnoRoute and rate being fixednone
executingnoExecuting the conversionnone
settlingnoDelivery in flightnone
completedyesFees and FX settled, delivered_amount finalconversion.completed
failedyesExecution failed. Funds are never lost mid-flightnone
refundingnoReversal path back toward the sendernone
refundedyesReversal completenone
requires_attentionnoParked for operator reviewnone

Payout

StatusTerminalMeaningWebhook
creatednoDelivery preparednone
submittednoBroadcast on chainnone
completedyesConfirmed. tx_hash is the proofpayout.completed
failedyesChain-level failure. Funds return to orchestrationnone
returnedyesDelivery reversednone

Virtual account

StatusTerminalMeaningWebhook
pendingnoProvisioning at the banking railnone
activenoLive. Deposit instructions are validvirtual_account.activated
frozennoTemporarily not accepting depositsnone
closedyesPermanently closednone

Wallet

StatusTerminalMeaning
activenoLive: receives and sends
frozennoBlocked from sending, still receives
closedyesPermanently closed

A send against a non-active wallet returns 400 wallet_not_active.

Wallet operation

The lifecycle of every send from a wallet. There is no other way funds leave.

StatusTerminalMeaningWebhook on entry
authorization_requirednoBuilt, waiting for your signature. Nothing has moved. The authorization and signing objects ride the response only in this statenone
authorizednoYour signature was accepted. Execution beginsnone
signingnoObtaining the signature from the signing networknone
signednoSignature obtainednone
submittingnoAssembling and broadcastingnone
submittednoOn chain, awaiting confirmationnone
confirmedyesLanded. tx_hash is the proofwallet.operation_confirmed
failedyesNothing moved. Creating a replacement is safewallet.operation_failed
expiredyesNot authorized inside the 30-second window. Nothing movednone
returnedyesMoved, then reversed on chain. Reconcile before re-sendingnone

failed and returned are not interchangeable. failed means the money never moved, so a retry is safe. returned means it moved and came back, so retrying blindly can send twice.

Build handlers on two rules. Statuses only move forward through their chain, and every state you must react to has a webhook. Anything without a webhook is an intermediate state you can treat as "in progress".