Sport events content API
The Sport events content API provides per-event content for sport events: fixture templates, market templates, settlement rules, and statistics. Currently it serves the events of the predictions feed. The feed carries everything you need to offer and accept bets - identity, English display strings, odds, statuses, and timings. Content that is localized or display-enriching is fetched from this API on demand. This API is the source of localized fixture templates, prediction market templates, and settlement rules, and it never carries betting state: odds, market statuses, and bet stop signals are delivered only by the feed.
Authorization
The same credentials as for the Odds Feed are used: an OAuth 2.0 Bearer token, or the X.509 client certificate (deprecated). See Authorization.
Conventions
- Every route is prefixed with
/feeds/{feed_id}, wherefeed_idis1for the predictions feed. Sport event ids are unique within a feed: the pair offeed_idandsport_event_ididentifies a sport event globally. - Localizations are keyed by RFC 5646 locale codes. All locales are returned in one response. The
enlocale is always present; fall back toenfor missing locales. - Any display string present in the feed equals its
enlocalization in this API. - Fixture and market templates may contain competitor placeholders
{$competitorN}, whereNis the competitor'stemplate_positionin the feed; resolve them the same way asfixture.templatein the feed - see Competitor strategy. For example, the fixture template{$competitor1} IPO by __?renders asAnthropic IPO by __?, and a market template can be just{$competitorN}, which renders as the competitor's name. - Timestamps use RFC 3339 (
2026-07-31T12:00:00Z). Monetary and decimal values are strings.
Sport event localizations
To fetch the localizations of a sport event - its fixture and every market - in one call, send GET /feeds/{feed_id}/sport-events/{sport_event_id}. This is the primary read; the response carries content only, and statistics are served by the statistics endpoint. Fetch it right after a new sport event arrives in the sport_event_added feed event: the content is available immediately in en, and other locales may appear a bit later - see Caching and change detection.
The en value of the fixture template equals fixture.template in the feed.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | |
Market localizations
To fetch the localizations of all markets of a sport event, send GET /feeds/{feed_id}/sport-events/{sport_event_id}/markets.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
To fetch a single market - for example, right after a new market arrives in the markets_updated feed event - send GET /feeds/{feed_id}/sport-events/{sport_event_id}/markets/{market_id}.
Content is available as soon as the market appears in the feed
Any market delivered by the feed is immediately available in this API in en, so you can fetch its content right after receiving the feed event. Other locales may appear a bit later. A 404 response with the code market_not_found means the market id is unknown - do not retry.
Statistics
To fetch the traded volume and liquidity of a sport event, send GET /feeds/{feed_id}/sport-events/{sport_event_id}/stats.
1 2 3 4 5 6 7 8 9 10 11 12 | |
Statistics are for display only and are never a betting limit. Only restrictions returned by the Managed trading services API are authoritative.
Caching and change detection
Content responses include an ETag header. Revalidate with If-None-Match to receive 304 Not Modified when nothing changed. The ETag of a sport event changes when its fixture or any of its markets changes. Locales other than en may appear a bit later than the content itself, and fixture templates, market templates, and settlement rules can be corrected after creation - revalidating open sport events once every 5 minutes is enough to pick up these changes. The updated_at field of the fixture and of each market shows what changed; the root updated_at of a sport event is the latest of them. Statistics responses also include an ETag header and are cached for 30 seconds.
For the initial synchronization of the whole feed, request each sport event with up to 8 parallel requests.