Developer Docs · REST + WebSocket

The API Reference for every sport we cover

One consistent resource model — fixtures, live scores, results, standings, statistics, odds, teams, players and history — repeated identically across 12+ sports. Learn it once, use it everywhere.

Base URL https://api.orbistats.com Format JSON over HTTPS Auth Bearer API key Current version v1
Core resources

Eight endpoint families, one shape

Every sport exposes the same building blocks. Jump to any resource below, or use the sidebar for the full reference.

Getting started

Authentication

Every request needs an API key. Pass it as a Bearer token in the Authorization header for production traffic, or as an api_key query parameter while testing in a browser. Keys are scoped to a plan and can be rotated at any time from your dashboard without downtime — issue a new key, update your app, then revoke the old one.

curl https://api.orbistats.com/v1/football/fixtures \ -H "Authorization: Bearer YOUR_API_KEY"
const res = await fetch("https://api.orbistats.com/v1/football/fixtures", { headers: { Authorization: `Bearer ${process.env.ORBISTATS_KEY}` } }); const data = await res.json();
import requests resp = requests.get( "https://api.orbistats.com/v1/football/fixtures", headers={"Authorization": f"Bearer {ORBISTATS_KEY}"} ) data = resp.json()

Base URL & versioning

All endpoints are served from https://api.orbistats.com and prefixed with a version segment. The current stable version is v1. We never introduce breaking changes inside a version — new fields are additive, and breaking changes ship as a new version with a migration guide and an overlap window.

https://api.orbistats.com/v1/{sport}/{resource}

Rate limits

Limits are enforced per API key and returned on every response so you can back off before hitting them.

PlanRequests / minRequests / monthConcurrent WebSocket
Free10050,0001
Starter6001,000,0005
Growth3,00010,000,00025
EnterpriseCustomCustomCustom
Response headers
X-RateLimit-Limit: 100 X-RateLimit-Remaining: 87 X-RateLimit-Reset: 1756384800

Response format

Every response — success or failure — shares the same envelope, so your parsing code doesn't branch per endpoint.

{ "data": {}, "meta": { "pagination": {}, "generated_at": "2026-08-28T10:00:00Z" }, "errors": [] }

Errors

Errors return the matching HTTP status code and a structured body describing what went wrong and how to fix it.

StatusMeaningTypical fix
400Bad Request — malformed or invalid parameterCheck parameter types and required fields against the table for that endpoint.
401Unauthorized — missing or invalid API keyConfirm the Authorization header is present and the key hasn't been revoked.
403Forbidden — plan doesn't include this resourceUpgrade your plan or remove the field/endpoint from the request.
404Not Found — resource or ID doesn't existVerify the sport slug and ID; IDs are sport-scoped.
429Too Many Requests — rate limit exceededBack off using the Retry-After header, or upgrade your plan.
500 / 503Server error — retry with backoffSafe to retry with exponential backoff; check status.orbistats.com.
{ "data": null, "errors": [ { "code": "invalid_parameter", "message": "'league' must be a known competition slug.", "field": "league" } ] }
GET/v1/{sport}/fixtures

Upcoming fixtures for a sport, filterable by league, team or date range. Powers schedule pages, "next match" widgets and fixture-list views.

PaginatedCacheableAll plans
Query parameters
ParameterTypeRequiredDescription
leaguestringNoCompetition slug, e.g. premier-league.
teamstringNoTeam slug or ID to filter fixtures for one club.
date_fromdateNoISO 8601 date. Defaults to today.
date_todateNoISO 8601 date. Defaults to +14 days.
page / per_pageintegerNoStandard pagination, see above.
Example request
curl "https://api.orbistats.com/v1/football/fixtures?league=premier-league" \ -H "Authorization: Bearer YOUR_API_KEY"
const fixtures = await orbistats.football.fixtures({ league: "premier-league" });
fixtures = client.football.fixtures(league="premier-league")
Example response
{ "data": [ { "fixture_id": "fx_884213", "league": "Premier League", "home_team": "Manchester City", "away_team": "Arsenal", "kickoff": "2026-08-30T15:00:00Z", "venue": "Etihad Stadium", "status": "scheduled" } ], "meta": { "pagination": { "page": 1, "per_page": 25, "total": 10 } } }
GET/v1/{sport}/fixtures/{fixture_id}

A single fixture with full detail — venue, officials, broadcast info and links to its lineups, events and odds once available.

Path parameters
ParameterTypeRequiredDescription
fixture_idstringYesUnique fixture identifier returned by the fixtures list.
Example request
curl https://api.orbistats.com/v1/football/fixtures/fx_884213 \ -H "Authorization: Bearer YOUR_API_KEY"
GET/v1/{sport}/matches/live

Every match currently in play, with the live score, clock, period and the most recent event. Poll every 5–10 seconds, or switch to the WebSocket API for push updates.

Real-timeNot cachedAll plans
Query parameters
ParameterTypeRequiredDescription
leaguestringNoRestrict to a single competition.
Example response
{ "data": [ { "fixture_id": "fx_884213", "match": "Man City vs Arsenal", "score": "2-1", "minute": 67, "period": "2nd_half", "last_event": { "type": "goal", "team": "Arsenal", "minute": 65 } } ] }
GET/v1/{sport}/results

Completed matches with the final score, filterable the same way as fixtures. Use it to build results grids, form guides and head-to-head history.

ParameterTypeRequiredDescription
leaguestringNoCompetition slug.
teamstringNoFilter to one team's results.
seasonstringNoe.g. 2025-2026. Defaults to current season.
GET/v1/{sport}/standings

The current league table — played, won, drawn, lost, goal difference and points — updated automatically after every result is confirmed.

ParameterTypeRequiredDescription
leaguestringYesCompetition slug.
seasonstringNoDefaults to the current season.
GET/v1/{sport}/statistics/team/{team_id}

Season-level team statistics — shots, possession, cards and sport-specific metrics. A matching /statistics/player/{player_id} endpoint returns individual player numbers for the same season.

Path & query parameters
ParameterTypeRequiredDescription
team_idstringYesTeam identifier.
seasonstringNoDefaults to current season.
competitionstringNoScope statistics to one competition only.
GET/v1/{sport}/odds

Pre-match and live odds normalized into a single format across sportsbooks, so you compare markets without writing a parser per book.

Real-timeGrowth+ plan
ParameterTypeRequiredDescription
match_idstringYesFixture identifier.
marketstringNoe.g. 1x2, totals, player_props.
bookmakerstringNoRestrict to a single sportsbook.
Example response
{ "data": { "market": "1X2", "home": 1.91, "draw": 3.40, "away": 4.20 } }
GET/v1/{sport}/teams · /v1/{sport}/players

Team and player directories with stable IDs used throughout the rest of the API. /teams/{team_id} and /players/{player_id} return full profiles including current squad, competitions and season stats links.

ParameterTypeRequiredDescription
leaguestringNoFilter teams or players to one competition.
team_idstringNoFilter players to one squad.
searchstringNoFree-text name search.
GET/v1/{sport}/fixtures/{fixture_id}/lineups · /events

Starting lineups, formations and substitutes for a fixture, plus a chronological event feed — goals, cards, substitutions and sport-specific events — as they're confirmed.

GET/v1/{sport}/competitions

Every league and tournament we cover for a sport, with country, tier and current season, so you can build a competition picker without hardcoding a list.

GET/v1/{sport}/history/matches

Season-by-season historical match data for backtesting models, building head-to-head pages and long-run trend analysis. Depth varies by sport and competition — check the coverage matrix below.

ParameterTypeRequiredDescription
leaguestringNoCompetition slug.
season_from / season_tostringNoSeason range, e.g. 2015-2016 to 2025-2026.
cursorstringNoRecommended for large historical pulls.
Starter+ planBulk export available
WEBHOOKfixture.updated · match.live.event · odds.changed

Register an HTTPS endpoint once and Orbistats pushes a payload the moment something changes — no polling loop to maintain. Each payload is signed so you can verify it came from us.

Example payload
{ "event": "match.live.event", "fixture_id": "fx_884213", "type": "goal", "team": "Arsenal", "minute": 65, "signature": "sha256=..." }
WSwss://stream.orbistats.com/v1

A persistent connection for clients that need sub-second updates — live scoreboards, trading desks and in-play odds boards. Subscribe to one or more channels after connecting.

const ws = new WebSocket("wss://stream.orbistats.com/v1?token=YOUR_API_KEY"); ws.onopen = () => ws.send(JSON.stringify({ "subscribe": "football.live" })); ws.onmessage = (msg) => console.log(JSON.parse(msg.data));
Coverage

Sport coverage matrix

Every sport shares the fixtures, results, standings and statistics resources. Odds, lineups/events and full historical depth roll out sport by sport — this table reflects what's live today.

SportFixturesLiveStandingsStatisticsOddsLineupsHistorical
Football
Basketball
American Football
Cricket
Tennis
Baseball
Horse Racing
Golf
Combat Sports
Esports
Client libraries

SDKs & languages

Every endpoint on this page maps directly onto a method in each official SDK — same parameters, same response shape.

Python pip install orbistats
JavaScript npm i orbistats
TypeScript Typed client
PHP composer require
Java Maven / Gradle
C# NuGet
Go go get
Ruby gem install
FAQ

Common questions

Answers to what developers ask most before their first integration.

What format does the Orbistats API return data in?

Every endpoint returns JSON over HTTPS, wrapped in a consistent envelope containing a data object or array, a meta block with pagination and timing details, and an errors array when something goes wrong.

Is the same endpoint structure used for every sport?

Yes. Fixtures, live scores, results, standings, statistics and odds follow the same resource shape for every sport — only the {sport} path segment and sport-specific fields change, so code you write for one sport ports directly to another.

How do I authenticate requests to the Orbistats API?

Send your API key in the Authorization header as a Bearer token, or as an api_key query parameter during local testing. Keys are issued instantly on the free plan from the signup page.

What are the rate limits on the free plan?

The free plan allows 100 requests per minute and 50,000 requests per month. Paid plans raise both limits, and enterprise plans can request dedicated throughput.

Does Orbistats offer real-time data without polling?

Yes. Webhooks push fixture, score and odds changes to your endpoint as they happen, and the WebSocket API offers a persistent low-latency stream for live matches and live odds for clients that need sub-second updates.

See also

Explore more of the platform

Related developer resources, product pages and research.

Get Started

Start free. Upgrade when you need enterprise SLAs.

Self-serve API keys for developers today — dedicated infrastructure, custom feeds and SLAs when you're ready.