Integration EssentialsWebhooksReference

Webhook event reference

Field-level reference for the payment webhook payload: the envelope, the payment snapshot, and each stage object.

This page is the field-level reference for the payment webhook payload, api_version 2026-05-18. It documents every field, its type and nullability, and which stage objects are populated for each event type. For endpoint setup, signature verification, and delivery guarantees, see Webhooks.

The contract is additive-only. Within this api_version, fields are never removed or renamed, and types and nullability never change. New optional fields and new values for extensible strings (such as fee.kind) can be added at any time. Ignore fields you don't recognize, and never validate payloads with a schema that rejects unknown fields; strict validation will break your integration.

All timestamps in the payload are ISO 8601 UTC strings.

The event envelope

Every event has the same top-level shape.

FieldTypeDescription
idstringUnique event identifier, prefixed evt_. The deduplication key: delivery is at-least-once, so the same id can arrive more than once. Do not deduplicate by payment_id; one payment emits multiple events.
typestringThe event type. One of the seven payment.* event types; see the matrix below.
api_versionstringThe payload contract version, 2026-05-18. Changes within a version are additive-only.
created_atstringWhen the event occurred, not when it was delivered.
dataobjectThe payment snapshot at event time.

The payment snapshot (data)

data is always a full snapshot of the payment at the moment the event occurred, never a delta. Every event type carries the same field set; what varies is status and which stage objects are non-null.

FieldTypeDescription
payment_idstringPayment identifier, the same id used across the Merchant API.
merchant_idstringMerchant identifier, the same external merchant id used across the Merchant API.
livebooleanWhether this is a live payment. Test-mode payments carry false and are only delivered to test-mode endpoints. Verify live is true before driving real fulfillment.
payment_state_versionintegerMonotonic per-payment version, starting at 0 on the first event. The ordering guard: ignore any event whose version is lower than or equal to one already processed for the same payment_id. See Out-of-order delivery.
reference_idstringThe merchant-provided order reference attached at payment creation. Primary reconciliation key against your own records. Not unique: a new payment for the same order (for example a checkout retry) carries the same reference.
statusstringPayment status at event time: requires_action, processing, succeeded, failed, expired, or cancelled. There is no settled status; settlement is a stage of a succeeded payment.
amountAmountThe requested payment amount.
created_atstringWhen the payment was created.
expires_atstringWhen the payment stops accepting buyer action.
processingProcessing | nullPopulated once the buyer has committed to a payment option.
successSuccess | nullPopulated once the payment succeeded.
failedFailed | nullPopulated once the payment failed.
cancelledCancelled | nullPopulated once the payment was cancelled.
expiredExpired | nullPopulated once the payment expired.
settledSettled | nullPopulated once merchant settlement completed.

Stage objects by event type

Which stage objects are non-null depends on the event type. Each event type's page carries a full example, taken verbatim from the golden fixtures the payload contract is tested against.

Event typestatusprocessingsuccessfailedcancelledexpiredsettled
payment.createdrequires_actionnullnullnullnullnullnull
payment.processingprocessingpresentnullnullnullnullnull
payment.succeededsucceededpresentpresentnullnullnullusually null
payment.failedfailedmay be presentnullpresentnullnullnull
payment.expiredexpiredmay be presentnullnullnullpresentnull
payment.cancelledcancellednullnullnullpresentnullnull
payment.settledsucceededpresentpresentnullnullnullpresent

"May be present" means the payment can fail or expire either before or after processing started: processing is null when the buyer never committed to a payment option, and populated otherwise. Cancellation is only possible while the payment awaits buyer action, so payment.cancelled always carries processing: null. On payment.succeeded, settled is null unless settlement had already completed at snapshot time; settlement completion is carried by payment.settled.

Objects

Amount

An asset amount. Used for data.amount and inside the Processing, Fee, and Settled objects.

FieldTypeDescription
unitstringThe asset: iso4217/XXX for fiat currencies (for example iso4217/USD) or caip19/... for on-chain assets.
valuestringInteger string in the smallest unit of the asset: minor units for fiat, raw base units for tokens. Token decimals are not included in the payload.

Fee

Fee applied to the payment, inside Processing.

FieldTypeDescription
kindstringExtensible string. The only value at launch is base_plus_percent. Do not switch exhaustively on it; new kinds can be added within this api_version. Whatever the kind, total_amount is always present.
base_amountAmountThe fixed component of the fee.
percentobjectThe percentage as an exact rational: numerator and denominator, both integer strings. For example 29/1000 is 2.9%.
percent_amountAmountThe percentage component of the fee.
total_amountAmountThe total fee charged. base_amount and percent_amount break it down.

Processing

Present once the buyer has committed to a payment option.

FieldTypeDescription
processing_atstringWhen the buyer committed to the payment option.
option_amountAmountWhat the buyer pays gross, in the asset of the payment option they selected.
feeFee | nullFee applied to this payment, or null when no fee is configured.
settlement_amountAmountWhat the merchant is expected to receive, net of fee.
buyer_caip10string | nullThe buyer's on-chain account (CAIP-10), or null when the payment has no on-chain buyer (for example, payments settled inside an exchange).
chain_caip2stringThe chain the payment executes on (CAIP-2). Needed to interpret transaction ids.

Success

Present once the payment succeeded.

FieldTypeDescription
succeeded_atstringWhen the payment succeeded.
tx_idstring | nullOn-chain transaction id, or null when there is no on-chain transaction. Format is chain-specific; interpret with processing.chain_caip2.

Failed

Present once the payment failed.

FieldTypeDescription
failed_atstringWhen the payment failed.
failure_reasonstring | nullHuman-readable diagnostic, or null. Not machine-parseable: values may change without notice. Display it if useful, but never branch on it.

Cancelled

Present once the payment was cancelled.

FieldTypeDescription
cancelled_atstringWhen the payment was cancelled.
cancellation_reasonstring | nullHuman-readable diagnostic, or null. Not machine-parseable: values may change without notice. Display it if useful, but never branch on it.

Expired

Present once the payment expired.

FieldTypeDescription
expired_atstringWhen the payment expired.

Settled

Present once merchant settlement completed.

FieldTypeDescription
settled_atstringWhen settlement completed.
tx_idstring | nullSettlement transaction id, or null when there is no on-chain settlement transaction. Format is chain-specific; interpret with processing.chain_caip2.
amountAmountWhat actually settled to the merchant, as opposed to processing.settlement_amount, which is the expected net amount at processing time.

Next steps

On this page