Base URL
GET /sports resolves to GET https://passthrough.sportrix.ai/v1/pinnacle/sports.
Endpoint quick reference
How to use it
The REST catalog and the stream are meant to be used together:1
Discover matches over REST
Call
GET /sports for the sport ids you hold, then GET /leagues?sport=<id>, then GET /matches?sport=<id> to find the match ids you care about. sport is required on /matches. These endpoints return metadata only — no prices. /matches also includes each game’s in-play derivatives by default; pass &include=specials to fetch the whole catalog.2
Open the WebSocket and subscribe
Connect to
WS /data and send a subscribe message per match id. The server replies with a full snapshot of that match’s selections, then pushes only what changes.3
Apply updates by market version
Every selection carries a
version, cutoff_at, and limit. Ignore any selection whose version is not newer than the one you hold for that market_key, and cap the risk stake at the current limit.GET /odds?match=<id> returns the same selections as a WebSocket snapshot. Use it for one-off reads and for reconciling after a gap; do not poll it as a substitute for the stream.
Prices and market versions
Odds are passed through as selections — one bettable outcome, already resolved to a human-readable market name and bet name, with American and decimal prices, an RFC3339 betting cutoff, and the market’s maximum accepted risk stake in the account’s currency. See the Selection object for the full schema. Limits are market-specific. They can differ across markets in the same match, so always readlimit from the current selection instead of assuming one match-wide or sport-wide value.
Every selection carries the version of the market it came from. Versions are monotonic per market, so:
- Dedup: discard an incoming selection whose
versionis not greater than the version you already hold for thatmarket_key. - Staleness: a market whose version stops advancing while the feed is healthy is genuinely quiet, not lost.
ts — the epoch-millisecond timestamp stamped the instant SportriX received the change from the sportsbook, not the moment it was sent to you. Compare it against your own clock to measure end-to-end latency.
Response conventions
All responses are JSON. Unlike the SportriX API, list endpoints here return a bare JSON array — there is no pagination envelope, because the in-memory book is small enough to serve whole.Compression
Every REST response —/sports, /leagues, /matches, and /odds — is gzipped when the client sends Accept-Encoding: gzip and the response body is worth compressing (roughly 1 KiB or larger; small responses are sent uncompressed). Compressed responses carry Content-Encoding: gzip and Vary: Accept-Encoding. Most HTTP clients — curl, requests, fetch, Go’s net/http, and so on — negotiate and decompress this automatically; you only need to opt in explicitly if you have disabled the default behavior.
Errors are a JSON object with a single error field:
Identifiers and time
Because this is a passthrough, match, league, and sport ids are the sportsbook’s own ids, unchanged. They do not match the ids used by the SportriX fixture catalog — the two products are not cross-referenced. This includes the sport ids used for per-sport grants on your API key. Timestamps come in two forms:ts,updated_at,last_msg_ms— epoch milliseconds (integer).start_time— ISO 8601 in UTC, as issued by the sportsbook.
Feed health
Sportrix maintains a separate upstream feed per sport, and any one of them can fail on its own. Every WebSocket connection receives aheartbeat frame every 10 seconds carrying a feeds object with per-sport connected and last_msg_ms values, scoped to the sports you are subscribed to, plus a feed_healthy summary of those same sports.