Skip to main content
The lifecycle channel ("lifecycle") delivers three event types: condition_prepared, token_registered, and condition_resolution.
V1 vs V2: condition_prepared fires for both V1 and V2 markets (new market signal from ConditionalTokens). token_registered is V1-only - V2 exchanges no longer emit it. Use condition_prepared as your “new market” signal to cover both. See the V2 Migration Guide.

condition_prepared

Emitted when a new condition is created on the shared ConditionalTokens contract. Fires for both V1 and V2 markets. For binary markets (outcome_slot_count === 2), token IDs are derived deterministically from (condition_id, is_neg_risk) using the CTF Gnosis formula and included in the tokens array. For non-binary markets, tokens is null - query Gamma or CLOB by condition_id to resolve them.
  • Metadata fields (title, market_slug, market_id, image) are always null at prepare time.
  • tokens is populated for binary markets (outcome_slot_count === 2) with derived token IDs. null otherwise.
  • Token labels ("Yes" / "No") are placeholders - clients should resolve canonical labels via Gamma/CLOB once market metadata is indexed.
  • is_neg_risk is derived from the oracle address (true if oracle = NegRiskAdapter).
  • outcome_slot_count is the number of outcomes for the condition (typically 2).

token_registered

V1 only. V2 exchanges no longer emit TokenRegistered. Use condition_prepared above for new market signals that cover both V1 and V2.
Emitted when a new V1 market’s outcome tokens are registered on-chain. Metadata fields (title, market_slug, etc.) may be null for brand-new markets since off-chain metadata may not yet be available.

condition_resolution

Emitted when a market resolves. The tokens array includes a won field indicating which outcome won. For voided or non-standard resolutions, the is_invalid field is set to true and all token won fields are false.

is_invalid behavior

When Polymarket resolves a market with a non-standard payout vector (anything other than [0,1] or [1,0]), the event includes is_invalid: true and all token won fields are set to false. This covers voided markets, split resolutions (e.g. 50/50 refunds), and other non-standard outcomes.
Breaking semantic change: Previously, voided markets showed won: true on both tokens. Now they show won: false on both tokens with is_invalid: true. Clients that relied on the old behavior should update to check is_invalid.

Field Reference

Example: Monitoring Resolutions