Skip to main content
The Game Graph answers two questions with one stable id per game:
  1. Which games are on, and where can I find markets for each? Every game lists the platforms that offer it, including games offered by only one platform.
  2. How do I stream the order books of a game across platforms? One call returns the identifiers and the exact subscribe messages.
All endpoints need an API key (x-api-key or Authorization: Bearer). Responses are JSON, keyset-paginated, and carry ETag so a repeated request can be answered with 304.

Every game of a weekend, with its platforms

day + tz returns a viewer-local day (daylight-saving days are 23 or 25 hours long); use from / to for an explicit UTC window.

Reading platforms and coverage correctly

A platform that is missing from platforms does not automatically mean “not offered”. meta.venues_checked lists the platforms we integrate. A game offered only on a platform outside that list will not show it.

Markets that can be compared

GET /api/v1/games/{id}/markets gives each market a canonical meaning: Only markets with the same (key, period, includes_overtime) are comparable. includes_overtime: null means the rules did not say.

Stream every order book of a game

For each platform the answer has the WebSocket url, the refs (token ids, coins, slugs, market ids), and the subscribe messages to send. Open one socket per platform, not one per outcome.
  • Platforms with book_semantics: yes_book_only_derive_no publish only the YES book of a market. The NO side is derived: price 1 - p, bids and asks swapped.
  • Where socket.auth is set, use your own API key with that platform.
  • Frames are either full book snapshots or level deltas (frames describes which). Replace or apply them to a local book per ref.

Rate limits and caching

Limits apply per API key (not per IP) and are reported in X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. Past the limit you get 429 with Retry-After. Data refreshes about every 15 seconds on our side, so polling faster than that returns the same answer: send If-None-Match and a 304 costs almost nothing.

Errors

Every error has the same shape:
code is one of bad_request, unauthorized, forbidden, not_found, method_not_allowed, rate_limited, unavailable, internal.

Acting on an outcome: the trade object

Every outcome in /games/{id}/markets and /games/{id}/streams carries a trade object with what a frontend needs to build an order on that venue. Vatic gives information only; it never places or signs orders. complement is the opposite outcome of the same market, tradable says whether the venue is accepting orders now, and caveats lists what is not stored or not verified. Fields a venue does not give us are null, never guessed.

Data you may not see yet

Each source of data carries a redistributable flag (yes, no, unknown). Keys only receive data that is cleared for redistribution. When games exist that are not yet cleared, meta.withheld says how many.