Common event envelope
Every event — regardless of type — shares the same top-level envelope structure. Thedata object contains the full checkout session at the time the event was generated.
| Field | Type | Description |
|---|---|---|
id | string | Unique event identifier (evt_…). Use this to deduplicate redeliveries. |
type | string | The event type string (see table below) |
livemode | boolean | true for live payments; false for test-mode events |
createdAt | string | ISO 8601 timestamp when the event was created |
data | object | The checkout session object at the time of the event |
Event types
| Event | Trigger |
|---|---|
session.created | A new checkout session is created |
session.detected | Payment detected on-chain (pending required confirmations) |
session.paid | Payment confirmed with the required number of confirmations |
session.paid_late | Payment confirmed after session expiry, within the grace window |
session.expired | Session TTL elapsed with no payment detected |
session.underpaid | Payment received but the amount was less than required |
session.overpaid | Payment received but the amount exceeded what was required |
session.failed | Session encountered a terminal error |
Subscribe to
"*" to receive all event types, including any new ones added in future releases. If you subscribe to specific types, you will need to update your endpoint when new event types are introduced.Example payloads
session.paid
Fired when on-chain confirmations reach the required threshold. This is the primary event to trigger order fulfillment.
session.detected
Fired as soon as the on-chain transfer is seen, before confirmations are complete. Useful for showing a “payment detected, awaiting confirmation” state in your UI — do not fulfil orders based on this event alone.
session.paid_late
Fired when a payment arrives and confirms after the session’s TTL but within the late-payment grace window. The status is paid_late. You can choose to fulfil these orders or flag them for manual review.
session.expired
Fired when the session’s TTL elapses and no payment has been detected. Use this to release any reserved inventory or notify the customer.
session.underpaid and session.overpaid
Fired when the confirmed on-chain amount differs from the session’s required amount. The data.amount reflects the actual amount received; data.fiat reflects the required fiat amount. These sessions require manual resolution — Crypto Checkout does not automatically issue refunds in v1.
The livemode field
Every event carries a livemode boolean:
true— the event was triggered by a real payment on a live network.false— the event was generated in test mode or via the dashboard’s Test button.
livemode and route test events to your test order pipeline rather than triggering live fulfillment.
Idempotency and deduplication
Crypto Checkout guarantees at-least-once delivery. The same event may be delivered more than once if your endpoint fails to return a2xx status code. Always store the id of processed events and skip any delivery whose id you have already handled:
Viewing event history
Every fired event is persisted to the event log and queryable via the API, regardless of delivery success:Events API Reference
Full reference for the Events resource, including filtering, pagination, and response schemas