Skip to main content
A receive payment is accepted when the payer’s funds are verified and succeeded when the net has reached the destination and confirmed. Read the payment, and treat status and operationalState as separate columns.

accepted is not succeeded

Each has its own timestamp, acceptedAt and succeededAt, and its own event, payment.accepted and payment.succeeded. Financial status never regresses once a payment is accepted: if settlement fails afterwards, operationalState moves instead.
A payment can sit at accepted for a long time while settlement retries, and can stay at accepted permanently if settlement stops for a human. Choose deliberately which status releases goods or credits a user in your product, and write it down. Reading accepted as completion is the most expensive mistake available here.

The payment freezes where value lands

Every receive payment carries an immutable settlement snapshot, taken at creation:
  • Changing the account’s profile later cannot redirect value already in flight.
  • settlement is null on payment types that do not use a receive settlement destination, including a send.
  • The amount delivered is fees.merchantNetAmountAtomic on the same payment. See Settlement fees.
  • Settlement is one destination, one chain, one asset. There is no split and no per-currency routing.

Build against what settlement waits on, not a clock

No delivery time is quoted anywhere in the API, and no field returns an estimate. stage narrates the position: settlement_pending, settlement_broadcast, settlement_confirming, and settlement_returned when a broadcast settlement comes back. It is diagnostic and can move backwards, so nothing customer-facing should depend on it. See Status codes.

Read the record that answers your question

GET /v2/accounts/{accountId}/balances is not one of these answers. It returns balanceType: "recorded_activity_projection" with custodyScope: "not_a_custody_balance", and it does not decrease when value settles out to the customer’s own wallet. Do not show it as funds available or gate a spend on it.

A settlement that stalls moves operationalReasonCode, not status

payment.settlement_returned fires when a settlement transfer comes back. A deposit that needs the same attention reports settlement.status: "requires_intervention" with a stable reasonCode. A webhook is a prompt to read the payment, never a substitute for it.

Next: Merchant settlement

Deliver collected value to the destination a merchant chose.