Skip to main content
GET
cURL
One row per game: both sides, the kickoff, the provider’s status, and every linked Polymarket market with its classified moneyline price state. Use this instead of matching team-name strings across market searches and fetching each price separately. The catalog is live. It is built from the same provider-first live and upcoming projections the 0xinsider sports boards use, so a request pays no provider fan-out of its own.

Identity

event_slug is the game’s identity, for example nfl-buf-nyj-2026-09-22. It is the key GET /api/v1/games/{event_slug} takes and the key the live_sports_updated webhook event carries, so a receiver can read the full game straight from a pulse. game_id is the provider’s Gamma gameId. It is absent when the canonical owner has no single value for the slug: the provider stamps one gameId across an event’s derivative markets, so an ambiguous read is reported as unknown rather than resolved by a rule.

Both sides

competitors is the two sides in the provider’s own order. For a team league the provider lists the home side first. score is a string because the provider sends one. A set score, a map score and a run total are not all integers. Read coverage.competitors before you join on anything. provider_ids means every side carries an id. labels means only the provider’s names identify them, so a name join is the only option and it can be wrong. unavailable means the provider identified neither side.

Status

status.state is one of scheduled, live, paused, ended, postponed, cancelled, suspended, delayed or unknown. A postponement, a cancellation and a suspension keep their own state. Folding them into “not live” loses the difference between a game that will be played later and one that never will be. A kickoff in the past is never read as live on its own. status.state stays scheduled until the provider moves it, because that is exactly the case where a guess would invent a live game. status.match_status is the provider status folded onto one vocabulary across leagues. status.provider_status keeps the provider’s own string, verbatim, so match_status: "unknown" still tells you what arrived.

Markets

markets is every market this read linked to the game, ordered by condition_id. draw_offered says whether the game has a draw leg at all. Do not assume a two-outcome moneyline: a soccer 1X2 game has three.

Market prices

markets[].prices.provider.state is paired, incomplete or invalid. A paired state carries competitor_a and competitor_b, each with a price, provider id when available, label and price provenance. binding_provenance says how the board matched those legs to competitors; use that identity instead of reinterpreting YES and NO. An incomplete or invalid state carries reason and any identity facts the provider supplied, with no guessed price pair. prices.observed_at is the board cache vintage for a Gamma-backed projection or the older of the two CLOB leg clocks for a CLOB display pair. prices.observation_source names that basis. A null clock means no reliable observation time, not an observation made now; Gamma does not provide a source-side timestamp for this projection. The game’s freshness block describes the board half that supplied it. Markets with no classified moneyline projection omit prices.

Coverage

Every page carries a top-level coverage with sports, leagues and sources_unavailable. An empty data with a full coverage means no games matched; an empty data with your sport missing from coverage.sports means the sport is not served. A sport or status outside the published vocabulary returns an empty page, never a 400. sources_unavailable names any scope whose source half did not answer this read, as <sport>:<half>.

Ordering and paging

Ordered by kickoff, then by event_slug. Games the provider has published no kickoff for sort last. The gms_v1_ cursor pins the page position, not a snapshot. The catalog is live, so a game added or removed between pages moves with it.

Example

What it does not return

  • Order books, midpoints or a market-specific price history. Use GET /api/v1/market/{condition_id}/snapshot for its fuller market card.
  • Sharp money splits or holder identity. Those stay on GET /api/v1/markets/sharp-money-flows and GET /api/v1/market/{condition_id}/holders under their own access rules.
  • Every Polymarket sports event. coverage.sports and coverage.leagues name what this deployment serves; a game outside them is not in this catalog.
  • A derived or normalized score. Scores are the provider’s strings, and a game with no live-score frame reads coverage.scores: "unavailable" rather than zero.

Authorizations

Authorization
string
header
required

Legacy default or named integration API key, or OAuth 2.1 access token, in the Authorization header as Bearer oxi_sk_live_... or Bearer oxi_at_.... Default keys retain full access; integration keys are limited to their approved read, webhooks, export and usage scopes and expire within 90 days. All credentials share the owner's account limits. Data calls require an active Pro subscription and return live data. A 401 carries WWW-Authenticate: Bearer resource_metadata="https://api.0xinsider.com/.well-known/oauth-protected-resource" (RFC 6750 section 3, RFC 9728).

Headers

X-Query-Validation
enum<string>

Opt into strict query-name validation. The default is compatible: unknown names are ignored and reported in X-Query-Ignored. With strict, an unknown name returns 400 bad_request with error.reason unknown_query_parameter before the handler runs, including when its percent escape is incomplete.

Available options:
strict
If-None-Match
string

Conditional GET using a weak semantic ETag from an earlier response. A matching payload returns 304 with an empty body; request_id, cost and as_of are excluded from the validator, so a rebuilt but unchanged catalog still revalidates.

Query Parameters

sport
string

Canonical sport bucket, case-insensitive, with - and _ read as a space: table-tennis and Table Tennis are the same bucket. Omit for every covered sport. A bucket this deployment does not serve returns an empty page.

league
string

League tag, case-insensitive, as coverage.leagues spells it: nfl, epl, cs2. Omit for every league inside the selected sports.

status
enum<string>

Keep only games in this state. A value outside the enum returns an empty page.

Available options:
scheduled,
live,
paused,
ended,
postponed,
cancelled,
suspended,
delayed,
unknown
starts_after
string<date-time>

RFC 3339 instant. Keep only games whose kickoff is at or after it. Games with no published kickoff are excluded whenever either bound is set.

starts_before
string<date-time>

RFC 3339 instant. Keep only games whose kickoff is at or before it. Must be at or after starts_after.

limit
integer
default:20

Page size.

Required range: 1 <= x <= 100
cursor
string

Opaque gms_v1_ cursor from next_cursor. It pins the page position (kickoff and event_slug), not a snapshot: the catalog is live, so a game added or removed between pages moves with it. A cursor this endpoint did not issue returns 400 with error.param=cursor.

Response

A page of covered games with the deployment's published coverage

object
string
required
Allowed value: "list"
data
object[]
required
has_more
boolean
required
as_of
string<date-time>
required

When this read assembled the catalog. Per-source vintage is on each game's freshness.

coverage
object
required

What this deployment covers, published with every page so a client never has to guess whether an empty list means no games or no coverage.

meta
object
required
next_cursor
string

Pass as cursor for the next page. Present only when has_more is true.