Sports data API documentation
Everything to build with sixteen sports, on one keyDataSportAPI serves live scores, fixtures, results, line-ups, racecards and the history behind them for sixteen sports, through one REST API and one JSON shape. Every record carries a stable id of ours, so a team, a match or a runner links the same way in every sport.
These pages cover all of it: a guide for every subject, one page for every endpoint of every sport with a console you can run, code in cURL, JavaScript, Python and PHP, and the MCP server that puts the API inside Claude, ChatGPT and Cursor. Pick a sport on the bar above and the menu, every example and the code follow it.
Start here
Three steps from nothing to real football data.
Get a free key
Sign in with Google and your key is made at once. It reads yesterday for every sport, 50 calls a day.
Get a free keyMake the first call
Send it as X-API-Key or Authorization: Bearer. Once saved, it is filled in on every console.
Read the answer
Every answer is data and meta: the rows, then paging, freshness and the age of the copy.
{
"data": [
{
"match_id": "fb_3npnahqb09",
"league_id": "fb_9vq1mbqrgz",
"country_name": "Brazil",
"league_name": "Serie B",
"season_start_year": 2026,
"kickoff_utc": "2026-11-02T23:30:00Z",
"kickoff_date": "2026-11-02",
"kickoff_local_date": "2026-11-02",
"kickoff_local_time": "23:30",
"match_status": "finished",
"home_team_id": "fb_mw96mceske",
"home_team_name": "Goias",
"away_team_id": "fb_1cycjasdqh",
"away_team_name": "CRB",
"home_goals": 2,
"away_goals": 1,
"full_time_result": null,
"half_time_home_goals": 1,
"half_time_away_goals": 0,
"half_time_result": null,
"stoppage_minutes": null,
"is_kickoff_rescheduled": false,
"elapsed_minutes": null,
"home_league_position": 17,
"away_league_position": 18,
"away_travel_km": 1662,
"venue_name": "Estádio da Serrinha",
"city_name": "Goiânia",
"latitude": -16.635209,
"longitude": -49.265904,
"location_precision": "ground",
"daylight_minutes": 763,
"sun_elevation_deg": -29.3,
"public_holiday": null,
"kickoff_temperature_c": null,
"kickoff_rain_mm": null,
"kickoff_wind_ms": null,
"attendance": null,
"referee_name": "Felipe Fernandes de Lima",
"kickoff_book_pct": 1.0138,
"regular_time_home_goals": null,
"regular_time_away_goals": null,
"regular_time_result": null,
"extra_time_home_goals": null,
"extra_time_away_goals": null,
"shootout_home_goals": null,
"shootout_away_goals": null,
"statistics_status": null,
"best_odds": {
"home": 2.16,
"draw": 3.8,
"away": 3.55,
"book_pct": 1.0078,
"taken_utc": "2026-11-02T23:25:02Z"
},
"team_figures": null,
"statistics_reason": null
},
{
"match_id": "fb_3mg42m9pyn",
"league_id": "fb_wma271b54d",
"country_name": "Chile",
"league_name": "Primera División",
"season_start_year": 2026,
"kickoff_utc": "2026-11-02T23:30:00Z",
"kickoff_date": "2026-11-02",
"kickoff_local_date": "2026-11-02",
"kickoff_local_time": "23:30",
"match_status": "finished",
"home_team_id": "fb_hny9rc1tkt",
"home_team_name": "Concepción",
"away_team_id": "fb_ws0bbvakw5",
"away_team_name": "Palestino",
"home_goals": 1,
"away_goals": 0,
"full_time_result": null,
"half_time_home_goals": 1,
"half_time_away_goals": 0,
"half_time_result": null,
"stoppage_minutes": null,
"is_kickoff_rescheduled": false,
"elapsed_minutes": null,
"home_league_position": 11,
"away_league_position": 4,
"away_travel_km": 433,
"venue_name": "Estadio Municipal Ester Roa Concepcion",
"city_name": "Concepcion",
"latitude": -36.826944444444,
"longitude": -73.050277777778,
"location_precision": "city",
"daylight_minutes": 819,
"sun_elevation_deg": -1.7,
"public_holiday": null,
"kickoff_temperature_c": null,
"kickoff_rain_mm": null,
"kickoff_wind_ms": null,
"attendance": null,
"referee_name": null,
"kickoff_book_pct": 1.0148,
"regular_time_home_goals": null,
"regular_time_away_goals": null,
"regular_time_result": null,
"extra_time_home_goals": null,
"extra_time_away_goals": null,
"shootout_home_goals": null,
"shootout_away_goals": null,
"statistics_status": null,
"best_odds": {
"home": 2.76,
"draw": 3.5,
"away": 2.74,
"book_pct": 1.013,
"taken_utc": "2026-11-02T23:25:02Z"
},
"team_figures": null,
"statistics_reason": null
}
],
"meta": {
"sport": "football",
"endpoint": "/results",
"count": 100,
"page": 1,
"per_page": 100,
"total": 229,
"total_pages": 3,
"next_cursor": "MTc5MzYzODgwMDoxNTU1MjAw",
"next_page": 2,
"prev_page": null,
"as_of": "2026-11-02T05:16:53Z",
"cached": false,
"age_seconds": 0
}
}Football endpoints
Every football call, one click away. Switch sport on the bar above for another.
Schedule and live
2 endpointsEvents
3 endpointsCompetitions
2 endpointsTeams and players
3 endpointsWhich sport answers what
The shared calls across all sixteen. A filled square answers today; amber is being connected.
| Sport | Live | Fixtures | Results | A match | Line-ups | Timeline | Tables | Search |
|---|---|---|---|---|---|---|---|---|
| Football | ||||||||
| Horses | ||||||||
| Greyhounds | ||||||||
| Tennis | ||||||||
| Cricket | ||||||||
| Basketball | ||||||||
| Ice hockey | ||||||||
| Baseball | ||||||||
| Rugby | ||||||||
| Darts | ||||||||
| Boxing | ||||||||
| Cycling | ||||||||
| Volleyball | ||||||||
| Handball | ||||||||
| Table tennis | ||||||||
| Badminton |
Every subject
A guide for each subject of the data: what it covers, how the records link, and the common jobs.
Live scores
How live answers work, how often to ask, and telling a fresh copy from a stored one.
Read the guide ›Results
Results by day and by competition, final and half-time scores, and walking back through the history.
Read the guide ›Line-ups
Starters, substitutes, formations and minutes, and how players link to their own pages.
Read the guide ›Standings and rankings
League tables by season, ranking lists, and how they tie back to results.
Read the guide ›Racecards
Racecards for horses and greyhounds: runners, draws and traps, results with prices, and form.
Read the guide ›One schema, many sports
How the same code reads every sport you hold, and where sports differ.
Read the guide ›Use with Claude and agents
The whole API as tools, as a skill, and as one file an agent can read.
Give an agent the skill and it knows our calls, ids, plans and limits without reading these pages. Download the skill, then save it as ~/.claude/skills/datasportapi/SKILL.md, or upload it as a skill in Claude's settings. For live answers inside the assistant, add the MCP server.
MCP server
Add it to Claude, ChatGPT, Cursor or Claude Code. Fourteen tools cover every endpoint on your plan.
https://datasportapi.com/mcpAgent skill
One SKILL.md that teaches an agent our calls, ids and limits.
https://datasportapi.com/skill.mdThe manual
The whole API in one Markdown file, current with every page here.
https://datasportapi.com/documentation/manual.mdPlans in short
Every sport is its own plan. The rules are in Plans and limits.
What is new
From the changelog.
The rest
Short answers, each with its full page.
Authentication
Two headers, and keeping your key on your server.
Errors
Every code with what to do about it.
Pagination
Pages with totals, or a cursor.
Rate limits
Headers on every answer show what is left.
Freshness
How old every answer is, and why.
History
Rugby to 1871, badminton to 1899, darts to 1994.
Questions people ask
Answered here in full.
Is the answer the same shape for every sport?
Yes. Every answer is data and meta, ids are ours and stable, and the paths follow one contract for each kind of sport. Where a sport differs, its endpoint pages say so and list every field from a real answer.
Can I try every endpoint before paying?
Yes. The free key reads yesterday on every endpoint of every sport except live and fixtures, 50 calls a day, with no card.
Where does my key go in the consoles?
Paste it once on any docs page and press Save. It stays in this browser and is filled in on every other page. A key made on your account page arrives by itself.
How do I connect Claude or another assistant?
Add the MCP server as a connector and sign in. The MCP guide covers Claude, ChatGPT, Cursor and Claude Code.
How fresh is the data?
Live scores are kept for ten seconds, results for five minutes. Every answer carries its age in meta, so you always know how fresh it is.