Skip to main content

Channel Name

Channel: lifecycle (Global channel for all markets)

Subscription

Event Types

Critical: When a market closes (indicated by a CLOSE event), all outstanding orders on that market are implicitly cancelled. No individual cancellation messages will be sent for these orders.You must use lifecycle events to manage order state for any open orders in the given market.

Event Liveness: EVENT_GOLIVE and EVENT_UNLIVE

EVENT_GOLIVE and EVENT_UNLIVE are the two edges of a single boolean: whether the event’s status is OPEN_INGAME. They are event-level, so you receive one tick per open market in the event — the market payload tells you which markets are affected, and every tick in the burst carries the same eventId. Why this matters: fees follow liveness. Taker fees are charged only on fills matched while the event is live (OPEN_INGAME). Non-live fills are not charged, and makers are never charged a fee — they may instead earn a Maker Credit. Liveness is resolved at match time from the same event status these ticks announce, so the lifecycle channel is your fee-relevant signal for whether a fill you are about to take will be charged. See Trading Fees for the fee formula itself. On EVENT_GOLIVE, the drain is announced before it is itemized: the EVENT_GOLIVE tick(s) arrive first, followed by an individual CANCEL tick per drained order on the tape and market channels, and on your private channel for your own orders. Markets are not closed by going live — you can immediately re-quote at live prices.
These edges repeat. EVENT_GOLIVE is not a one-time flag. A game that is delayed or suspended mid-play transitions OPEN_INGAME → DELAYED → OPEN_INGAME, which emits EVENT_GOLIVE, then EVENT_UNLIVE, then EVENT_GOLIVE again — and each EVENT_GOLIVE drains every order resting on that event’s markets, including orders you placed during the delay.Treat these ticks as edge-triggered and idempotent: keep a per-event live flag, set it on EVENT_GOLIVE, clear it on EVENT_UNLIVE, and never assume the first EVENT_GOLIVE is terminal. Halftime does not un-live a game; a weather or injury suspension does.
Derive liveness from the tick’s type, not from market.event.status. The event join is a snapshot taken when the market entered the book — it may be absent from tick payloads entirely, and when present its status is not guaranteed to reflect the transition the tick is announcing. For an authoritative status snapshot, use the REST endpoints below.If an event has no open markets left (for example every market has already settled), the terminal EVENT_UNLIVE has no market to name and no tick is sent.
Example burst for an event with two open markets going live:
And the mirror edge when that event is suspended:

Reading Event Status over REST

The WebSocket gives you the transitions; REST gives you the snapshot. Use REST to bootstrap liveness on connect and after any reconnect (you cannot see edges that fired while you were disconnected), then let the lifecycle channel carry you forward. One event by id — read status directly:
status == "OPEN_INGAME" is exactly the condition under which taker fees are charged. Any other value — OPEN_PREGAME, CLOSED_PREGAME, DELAYED, FINAL, CANCELED — is non-live and uncharged. Every live event — filter server-side, and use it as your startup snapshot:
A minimal reconciliation pattern:
Both endpoints are rate limited to 512 requests per second. Poll them only to reconcile — the WebSocket is the low-latency path.

Message Format

Lifecycle ticks arrive as bare payloads — there is no { "event": ..., "data": ... } envelope on this channel (the envelope is only used for subscription acks, errors, and private events):

Market Object

The market object in lifecycle events contains: