Real-time lifecycle events stream for events and markets with resume capability.
Query Parameters:
- since=<uint64> Last applied seq for resume (optional; must be >0; absent or 0 → start from live tail; replay window: 1 hour)
- event_id=<id> Repeatable; filter by event_id (includes all markets of the event)
- market_id=<id> Repeatable; filter by market_id
- lang=<code> Repeatable; filter by language code (en, pt, id). Filters LocalizedText fields in payloads. If omitted, all available locales are included.
Resume Semantics:
- Client connects with since=S (last applied seq)
- Server replays frames with seq >= S in order
- Sends backlog_end (last_seq = current max)
- Continues live streaming If S > current max → no replay frames, then backlog_end (last_seq = current max), then live streaming Replay is limited to messages from the preceding one hour. If S refers to data older than one hour (or otherwise no longer retained) → error frame (code=resume_too_old) then close (4009)
Idempotency / Ordering:
- seq is strictly increasing for delivered data frames, but is not guaranteed to be contiguous
- Gaps are valid (for example, because of stream filters) and do not by themselves indicate data loss
- Client drops any frame with seq <= last_applied_seq
Event Types:
- event.created: New event created with full definition
- event.status_changed: Event status changed (only status fields)
- event.details_changed: Event content changed (title, category, rules_primary)
- event.settled: Event resolved (includes expiration_value; resolved_market_id is deprecated, always null)
- event.voided: Event cancelled (includes void_reason)
- market.created: New market created with full definition
- market.status_changed: Market status changed (only status fields)
- market.details_changed: Full market detail set after a change (titles, strike_type, strikes, bounds)
- market.settled: Market resolved (includes result, settlement_price, expiration_value)
- market.voided: Market cancelled
Market Details At Resolution:
- market.details_changed can arrive on a closed market at resolution, with a new floor_strike
- It always comes before market.settled and event.settled of the same event
- expiration_value in those two events matches the new floor_strike, and can carry more decimals than usual
Details Changes:
- event.details_changed and market.details_changed carry the current values, not the changes: apply the whole payload
- A frame arrives only for what changed: event.details_changed when event fields change, market.details_changed for each changed market. If both change, both frames arrive
- change_reason gives the reason for the change. In market.details_changed it is null when there is no reason
Independent Market Operations:
- market.status_changed, market.settled and market.voided can arrive while the event is still open
- The other markets of that event keep trading, and no event.* frame accompanies these
- market.settled from such a settle carries expiration_value null
Markets Added To An Open Event:
- market.created can arrive while the event is open, with status unopened and status_revision 0
- Its created_at and opens_at are its own, later than the event's; it comes before every market.status_changed of that market
- event.created is not sent again, so its markets list does not include the added market
Heartbeats:
- Sent when no lifecycle_update within configured interval
- Heartbeat does NOT advance seq; only lifecycle_update frames advance seq
- Heartbeat and backlog_end both repeat the last data seq
Flow Control:
- Server may enforce max_pending_frames/bytes and close with code 4008 (flow_control)
Close Codes: 1000 normal 1001 going_away 1011 internal_error 4008 flow_control 4009 resume_too_old / protocol_version 4401 unauthorized
Operation WebSockets-specific information
-
Hide headers attributes Show headers attributes object
-
Broker access key identifier
Format should match the following pattern:
^[A-Za-z0-9._~-]{1,64}$. -
RFC3339 timestamp with milliseconds
-
Keyed BLAKE2b-256 signature hex lowercase
Format should match the following pattern:
^[0-9a-f]{64}$.
-
-
Hide query attributes Show query attributes object
-
Resume from last applied seq (inclusive), within the one-hour replay window. Must be >0. If omitted or 0, start from live tail. A sequence older than the available window causes resume_too_old and close code 4009.
Minimum value is
1. -
Repeatable filter by event_id. Includes all markets of the event. Absent → all events accessible to broker.
-
Repeatable filter by market_id. Absent → all markets accessible to broker.
-
Repeatable filter by language code. Filters localized text fields in payloads. If omitted, all available locales are included in each payload.
Values are
en,pt, orid.
-
Message #1
Event or market lifecycle state change notification
Payload
-
Value is
event_update. -
Monotonic sequence for lifecycle events
Minimum value is
0. -
Timestamp in nanoseconds
-
Event ID (if applicable)
-
Market ID (if applicable)
-
Lifecycle event type
Values are
event.created,event.status_changed,event.details_changed,event.settled,event.voided,market.created,market.status_changed,market.details_changed,market.settled, ormarket.voided. - payload
object Required One of: Hide attributes Show attributes
-
Localized text content. When lang filter is applied, only requested locales are included. When lang filter is omitted, all available locales (en, pt, id) are included.
-
Localized title of the recurring series this event belongs to. Null when the event's template defines no series title. Absent in payloads emitted before this field was introduced.
-
Localized text content. When lang filter is applied, only requested locales are included. When lang filter is omitted, all available locales (en, pt, id) are included.
-
Values are
crypto,forex,stock,commodity,economy,tech,science,culture, orother. -
Event series meta tag. Empty = standalone event. Non-empty values indicate the event belongs to a recurring series with the given interval.
Values are
,30s,1min,5min,15min,1h,4h, or1d. -
- open: event is open, trading on markets is open or will be open (market statuses: unopened, pre-open, active, or suspended)
- closed: event is closed, trading stopped, markets awaiting resolution and settlement
- settled: all markets resolved and payouts completed
- voided: event cancelled, all markets voided, contracts refunded
Values are
open,closed,settled, orvoided. -
Array of market_ids belonging to this event
Hide attributes Show attributes
-
- open: event is open, trading on markets is open or will be open (market statuses: unopened, pre-open, active, or suspended)
- closed: event is closed, trading stopped, markets awaiting resolution and settlement
- settled: all markets resolved and payouts completed
- voided: event cancelled, all markets voided, contracts refunded
Values are
open,closed,settled, orvoided. -
- open: event is open, trading on markets is open or will be open (market statuses: unopened, pre-open, active, or suspended)
- closed: event is closed, trading stopped, markets awaiting resolution and settlement
- settled: all markets resolved and payouts completed
- voided: event cancelled, all markets voided, contracts refunded
Values are
open,closed,settled, orvoided.
Content of an event after a change. Every property is the current value, not a delta. Lifecycle timestamps and settlement sources do not change.
Hide attributes Show attributes
-
Localized text content. When lang filter is applied, only requested locales are included. When lang filter is omitted, all available locales (en, pt, id) are included.
-
Localized text content. When lang filter is applied, only requested locales are included. When lang filter is omitted, all available locales (en, pt, id) are included.
-
Values are
crypto,forex,stock,commodity,economy,tech,science,culture, orother. -
Reason for the change
Hide attributes Show attributes
-
Final asset value as string. Not necessarily a price, and not always numeric: it carries whatever value the settlement source publishes for the outcome.
nullif the resolution source publishes no closing value, in which case the outcome is carried by the per-marketresult. An event can end with several winning markets, which have no single closing value between them. -
Deprecated: use the per-market
result. This field carries a single winner and cannot express an event with several winning markets, so it is alwaysnull. -
Actual resolution timestamp
Hide attributes Show attributes
-
Market ID
-
Index of the market within the event
-
Localized text content. When lang filter is applied, only requested locales are included. When lang filter is omitted, all available locales (en, pt, id) are included.
-
Localized text content. When lang filter is applied, only requested locales are included. When lang filter is omitted, all available locales (en, pt, id) are included.
-
Localized text content. When lang filter is applied, only requested locales are included. When lang filter is omitted, all available locales (en, pt, id) are included.
-
Lower boundary for strike range (NULL for first market)
-
Upper boundary for strike range (NULL for last market)
-
Whether lower_bound is inclusive in the range
-
Whether upper_bound is inclusive in the range
-
- unopened: created, not initialized in CLOB
- pre-open: loaded in CLOB (MM can already place liquidity)
- suspended: market open, but new orders are temporarily declined
- active: market open for order acceptance
- closed: closed, awaiting resolution; trading stopped, orders no longer accepted
- settled: market resolved, payouts completed
- voided: market cancelled, contracts refunded
Values are
unopened,pre-open,active,suspended,closed,settled, orvoided. -
Monotonic revision of the market status from Event Service
-
Written when the event resolves, so it appears before the market reaches settled. Several markets of one event can win.
- yes: YES is the winner
- no: NO is the winner
- empty: no result yet, or the market was voided
Values are
yes,no, or. -
Values are
greater,greater_or_equal,less,less_or_equal,between, orcustom. -
Minimum expiration value that leads to a YES settlement
-
Maximum expiration value that leads to a YES settlement
-
Expiration value that leads to a YES settlement when strike_type=custom
Hide attributes Show attributes
-
Monotonic revision of the market status from Event Service
-
- unopened: created, not initialized in CLOB
- pre-open: loaded in CLOB (MM can already place liquidity)
- suspended: market open, but new orders are temporarily declined
- active: market open for order acceptance
- closed: closed, awaiting resolution; trading stopped, orders no longer accepted
- settled: market resolved, payouts completed
- voided: market cancelled, contracts refunded
Values are
unopened,pre-open,active,suspended,closed,settled, orvoided. -
- unopened: created, not initialized in CLOB
- pre-open: loaded in CLOB (MM can already place liquidity)
- suspended: market open, but new orders are temporarily declined
- active: market open for order acceptance
- closed: closed, awaiting resolution; trading stopped, orders no longer accepted
- settled: market resolved, payouts completed
- voided: market cancelled, contracts refunded
Values are
unopened,pre-open,active,suspended,closed,settled, orvoided.
Full detail set of a market after a change. Every frame contains every property, whatever caused the change, and every property is the current value, not a delta.
Hide attributes Show attributes
-
Localized text content. When lang filter is applied, only requested locales are included. When lang filter is omitted, all available locales (en, pt, id) are included.
-
Localized text content. When lang filter is applied, only requested locales are included. When lang filter is omitted, all available locales (en, pt, id) are included.
-
Localized text content. When lang filter is applied, only requested locales are included. When lang filter is omitted, all available locales (en, pt, id) are included.
-
Lower boundary for strike range (NULL for first market)
-
Upper boundary for strike range (NULL for last market)
-
Whether lower_bound is inclusive in the range. Never null; false when strike_type=custom
-
Whether upper_bound is inclusive in the range. Never null; false when strike_type=custom
-
Never null
Values are
greater,greater_or_equal,less,less_or_equal,between, orcustom. -
Minimum expiration value that leads to a YES settlement
-
Maximum expiration value that leads to a YES settlement
-
Expiration value that leads to a YES settlement when strike_type=custom
-
Reason for the change. NULL when there is no reason
-
Monotonic revision of the market status from Event Service
Hide attributes Show attributes
-
Winner (YES or NO)
Values are
yesorno. -
1.0 for YES, 0.0 for NO
-
Final asset value as string. Not necessarily a price, and not always numeric: it carries whatever value the settlement source publishes for the outcome.
nullif the resolution source publishes no closing value, in which case the outcome is carried byresult. It is alsonullwhen an operator settles this market alone, while the event is still open. -
Monotonic revision of the market status from Event Service
Hide attributes Show attributes
-
Reason for voiding the market. A void of the whole event copies the reason of the event. A void of this market alone carries the reason the operator gave for this market.
-
Monotonic revision of the market status from Event Service
{
"type": "event_update",
"seq": 42,
"ts_ns": 42,
"event_id": "string",
"market_id": "string",
"event_type": "event.created",
"payload": {
"event_id": "string",
"title": {
"en": "string",
"pt": "string",
"id": "string"
},
"series_title": {
"en": "string",
"pt": "string",
"id": "string"
},
"rules_primary": {
"en": "string",
"pt": "string",
"id": "string"
},
"category": "crypto",
"image_url": "string",
"series": "",
"status": "open",
"void_reason": "string",
"created_at": "2026-05-04T09:42:00Z",
"opens_at": "2026-05-04T09:42:00Z",
"closes_at": "2026-05-04T09:42:00Z",
"settlement_sources": [
{
"name": "string",
"url": "string",
"underlying": {
"base_currency": "string",
"quote_currency": "string"
}
}
],
"markets": [
"string"
]
}
}
{
"type": "heartbeat",
"seq": 42,
"ts_ns": 42,
"payload": {
"interval_sec": 42
}
}
{
"type": "backlog_end",
"seq": 42,
"ts_ns": 42,
"payload": {
"last_seq": 42
}
}