Skip to main content

Overview

Predexon separates sports market discovery from live game state. Market discovery answers: what can I trade? Live state answers: what is happening in the underlying game? That separation keeps identifiers clear: Live state is keyed by game_id, not event_id, because future spreads, totals, and props can all share the same live score while using different market/question IDs.
predexon_id is now canonical. It identifies one Predexon outcome across matched venues; it is not a venue-native token ID, ticker, condition ID, or legacy per-venue identifier.

Availability

If live state is not yet available for a game, REST can return the game shell with reliability.state = "no_data" and null score fields. For an application that displays sports markets with live score context:
Do not use live state as a tradable identifier. Trading and routing continue to use outcome-level predexon_id.

Canonical predexon_id

For sports, predexon_id lives at the canonical outcome layer:
Example:
If Kalshi, Polymarket, and Predict.fun all list “Arizona Diamondbacks win” for that game, each matched venue listing returns the same canonical predexon_id. Use predexon_id for routing, positions, orderbook subscriptions, and GET /v2/sports/outcomes/{predexon_id}. Use venue-native identifiers only when executing directly on a specific venue.

Data Sources

Sports live state v1 sources data from Polymarket and Kalshi. Predexon normalizes those updates into one stable game-state object keyed by game_id. We are integrating with additional sports data providers soon to expand coverage and improve source redundancy.

Game Coverage

Sports live state covers Predexon’s matched canonical sports games: the same game universe exposed by GET /v2/sports/games. Use the discovery endpoints to get the current event list:
The websocket all-games subscription follows that same matched sports coverage:
Current sports market coverage follows the venue coverage matrix. Live-state data is available when one of the live-state sources has data for that covered game.

Key Incidents and Event Lists

The live-state object includes a normalized event list in significant_events[]. significant_events[] is for key incidents, not full box-score or every vendor-specific stat. When source data is available, events can include: Example:
Incident availability is source- and sport-dependent. Kalshi can provide detailed game-stat/play-by-play data for supported milestones. In the current Kalshi feed, soccer commonly includes goals, cards, substitutions, period events, and game-end events; basketball can include made shots/free throws and period boundaries; baseball play-by-play is available for some games but is not always returned as typed key incidents. Polymarket’s sports websocket primarily provides score, period, status, clock, and game-level state. If no key incidents are available for a game, significant_events is returned as an empty array.

Aggregate State

The aggregate state is the primary client object.

Field Semantics

Reliability

reliability is not a model confidence score. It is a data-quality summary based on direct source names, source agreement, and freshness. The boolean fields make the state easy to consume: For normal product surfaces, use the aggregate fields and reliability. For debugging or auditing, request source rows with include_sources=true.

Source Snapshots

REST can include source-level rows:
Source snapshots are intended for audit/debug, not primary UI rendering.

WebSocket

The websocket streams aggregate changes, not every raw upstream source message. This keeps client integrations simple and avoids making consumers reconcile Polymarket/Kalshi differences themselves. Endpoint:
Authentication uses the same data key as REST, passed in the websocket URL:

Subscription Messages

Subscribe to all matched sports games Predexon currently covers:
Subscribe by league:
Subscribe by explicit games:
Filters: Exactly one of game_ids, leagues, or sports is required. Unsubscribe:

Server Messages

Subscription acknowledgement:
Aggregate update:
Error:

Heartbeats and Reconnects

The gateway uses websocket ping/pong frames for connection liveness. Clients should respond to ping frames according to their websocket library’s normal behavior. If the connection drops, clients should reconnect and resubscribe. The REST endpoint should be used to rehydrate current state after reconnect:
The websocket version does not require clients to track replay cursors. If replay is added later, it should be additive through a field such as since_sequence.

Update Policy

The websocket emits an update when the aggregate changes materially:
  • Score changed
  • Period changed
  • Clock changed
  • Key incidents changed
  • live or ended changed
  • Winner changed
  • Reliability changed
  • Source conflict appeared or resolved
  • Stale state appeared or resolved
The websocket does not emit every upstream heartbeat or duplicate source message.

Sports-Specific Notes

Non-Goals

The live-state API is not intended to expose every possible vendor-specific stat. The stable public contract is:
  • Current score
  • Period/clock/status
  • Winner/end state
  • Significant events when available
  • Source reliability
  • Optional source snapshots for audit/debug
Full play-by-play, detailed box scores, and sport-specific stat feeds may be added later as separate endpoints if needed.