# DataSportAPI manual

One sports data API for sixteen sports: live scores, fixtures, results, line-ups, racecards and history, through one key and one JSON shape.

- Base address: https://api.datasportapi.com/v1/{sport}/{endpoint}
- Key: header `X-API-Key: <key>` or `Authorization: Bearer <key>`
- Answer: `{"data": ..., "meta": {...}}`; errors `{"error": {"code", "message", "detail"}}`
- Documentation: https://datasportapi.com/documentation
- MCP server: https://api.datasportapi.com/mcp

## Guides

### Quick start

https://datasportapi.com/documentation/quick-start

Three steps: a key, one call, and reading what comes back. Five minutes from here to real data.

### 1. Get a free key

Sign in on [your account page](https://datasportapi.com/account) with Google and a free key is made at once. It starts `ds_live_`. The free key reads yesterday for every sport we serve, 50 calls a day and 10 a minute, so you can try every endpoint against real data before choosing a plan. Your key is saved into these docs as soon as you make it, so the consoles on every page are ready to run.

### 2. Make the first call

Every call is a GET to `https://api.datasportapi.com/v1/{sport}/...` with your key in a header. This one asks for yesterday's football results:

    GET /v1/football/results

```
curl -H "X-API-Key: $KEY" "https://api.datasportapi.com/v1/football/results"
```

### 3. Read the answer

Every answer has the same two parts. `data` holds the rows, or the one record you asked for. `meta` says what you asked (`sport`, `endpoint`), how many rows came back (`count`, and `page`, `total` or `next_cursor` when the list is paged), when the data was built (`as_of`), and whether you were served a stored copy (`cached`, `age_seconds`).

Every id in an answer is one of ours and opens its own endpoint. Take a match id from Results and ask for its line-ups; take a team id and ask for the team. That is the whole API: ask for a list, follow the ids.

### Next

Read [Authentication](https://datasportapi.com/documentation/authentication) for the two ways to send your key, [Plans and limits](https://datasportapi.com/documentation/plans-and-limits) for what each plan reads, and [Ids and records](https://datasportapi.com/documentation/ids) for how records link across a sport.

### Authentication

https://datasportapi.com/documentation/authentication

One key reads every sport on your plan. Send it in a header on every call.

### Two ways to send it

Use whichever your HTTP client makes easiest. Both are read the same way.

```
X-API-Key: ds_live_9f2c...
Authorization: Bearer ds_live_9f2c...
```

Keys start `ds_live_`. One account has one key, and it follows the plan: add a sport and the same key reads it on the next call. A key in the address, as `?api_key=`, is also read, for tools that cannot set headers; prefer a header anywhere else, because addresses end up in logs.

### When a key is refused

No key at all answers `401 no_key`, with the two header forms in `detail`. A key we do not know, or one that was revoked, answers `401 bad_key`. The two cases look the same on purpose.

### Keep it on your server

A key sent from a web page can be read by anyone who opens that page. Call the API from your server and send your own pages what they need. The consoles in these docs are the exception: your key stays in your own browser, under `datasportapi.com.api_key`, and is never sent anywhere but the API.

### Rotating a key

Press Rotate on [your account page](https://datasportapi.com/account). A new key is made at once and the old one keeps working for 24 hours, so you can move your code across without anything stopping. The new key is written into these docs for you.

### Plans and limits

https://datasportapi.com/documentation/plans-and-limits

Every sport is its own plan. Hold one, several, or Complete for all sixteen. One key reads them all.

### The plans

Plan | Reads | Calls a minute | Calls | Free key | Yesterday, every sport, every endpoint but live and fixtures | 10 | 50 a day | A sport plan | That sport in full: live, fixtures, every date held | 120 | 250,000 a month for each sport held | Complete | All sixteen sports in full | 240 | 1,000,000 a month

Sport plans run from $19 to $79 a month. Pay yearly for two months free. Complete is $249 a month. Prices are on [the pricing page](https://datasportapi.com/pricing).

### A sport you do not hold

A key with sport plans reads any other sport the way the free key does: yesterday only, and no live or fixtures. The answer says so in `meta.access`, with the plan that opens the rest.

### The headers on every answer

Header | What it says | X-Rate-Limit | Calls a minute on your plan | X-Rate-Remaining | Calls left this minute | X-Rate-Reset | Seconds until the minute resets | X-Quota-Month, X-Quota-Day | Your monthly calls, or the free key's daily calls | X-Quota-Used | Calls used so far in that period

### Going over

Over the minute answers `429 rate` with `Retry-After` in seconds. Over the month or the day answers `429 quota`, with the time until it resets. Months and days run in UTC. Calls that are refused still count, which keeps a stuck loop from running for free.

### Ids and records

https://datasportapi.com/documentation/ids

Every record has an id of ours. It never changes, and it opens its own endpoint.

### What an id looks like

Two letters for the sport, an underscore, then ten letters and digits: `fb_p04h38sesj` is a football record, `ck_nkqf0zm4cy` a cricket one. The same team, player or match has the same id in every answer, today and in a year.

Fields that hold an id end in `_id`, or are called `id` inside a record. In cricket, records are named by their own field: `match`, `player`, `team`.

### Following ids

Ask for a list, then follow the ids in it. A result carries the match id and both team ids; the match id opens the match, its line-ups and its timeline, and a team id opens the team.

    GET /v1/football/results

    GET /v1/football/events/fb_p04h38sesj/lineups

### An id from another sport

An id only opens records of its own sport. Sending a cricket id to a football endpoint answers `404 not_found` and says so. So does an id we never issued.

### Pagination

https://datasportapi.com/documentation/pagination

Long lists come back a page at a time. meta says where you are and how to get the next one.

### Pages

Send `page` (from 1) and `per_page`. When the list is paged, `meta` carries `page`, `per_page`, and where the sport knows it, `total` and `total_pages`.

    GET /v1/football/results?page=2&per_page=50

### Cursors

Some lists hand back `meta.next_cursor` instead. Send it as `cursor` on the next call and keep going until it comes back empty. Cursors are the steady way to walk a long history, because rows added while you walk never shift your place.

### Counting

`meta.count` is always the number of rows in this answer. Each page is one call against your limits.

### Errors

https://datasportapi.com/documentation/errors

An error answers with an HTTP status and a short code you can switch on, a message for people, and detail where it helps.

```
{
  "error": {
    "code": "plan",
    "message": "The free key reads yesterday (2026-11-01). The Football plan reads every date held.",
    "detail": { "sport": "football", "add": "https://datasportapi.com/account?add=football" }
  }
}
```

### Every code

Status | Code | What to do | 401 | no_key | No key was sent, or not in a form we read. Send X-API-Key or Authorization: Bearer. | 401 | bad_key | The key is not one of ours, or it was revoked. Check it on your account page. | 403 | plan | Your plan does not read this: live or fixtures on the free key, or a date other than yesterday. detail names the plan that does. | 404 | not_found | No record has that id in this sport, or nothing matches. Ids come from our own answers. | 404 | no_route | No endpoint at that path. detail links the sport's endpoint list. | 422 | bad_param | A value this call does not take, a date not written YYYY-MM-DD, or a value it needs is missing. detail lists what it accepts. | 429 | rate | Too many calls this minute. Wait Retry-After seconds. | 429 | quota | The day's or month's calls are used. detail says when they reset. | 500 | server | Something failed our end. Try again shortly; it is logged and looked at. | 501 | not_held | This sport does not have this endpoint. It will not change by retrying. | 503 | upstream | That data is not answering right now. Try again in a minute; Retry-After says when. | 503 | coming | This sport is being connected. It opens to every plan for the sport the moment it does.

### Retrying

Retry `rate`, `upstream` and `server` after the `Retry-After` seconds. Never retry `not_held`, `bad_param`, `not_found` or `plan`: the same call gives the same answer.

## Subjects

### Live scores

https://datasportapi.com/documentation/live-scores

Every match in play now, in one call per sport, refreshed every few seconds.

Live answers list each event in play with its score, its clock or current period, and both sides with their ids. Follow the id to the event, its line-ups or its timeline for more. Live comes with the sport plan; the free key reads yesterday instead.

    GET /v1/football/live

### How often to ask

A live answer is kept for 10 seconds. Asking more often returns the same copy, marked `"cached": true` with its `age_seconds`, and still counts as a call. Every 10 to 15 seconds is right for a scoreboard; every minute for a list of what is on.

### Sports with live scores

Football, cricket (ball by ball), basketball, rugby, darts, volleyball, table tennis and badminton answer `/live`. Racing answers `/cards/today` through the day, and boxing `/fights/upcoming`.

### An empty list

An empty `data` with `count` 0 means nothing is in play right now. It is not an error.

### Fixtures

https://datasportapi.com/documentation/fixtures

What is coming, by date, with the ids to follow it into results the moment it is played.

Fixtures lists upcoming events with their start time in UTC, the competition and both sides. Send `date` for one day; leave it out for what is next. Each fixture keeps its id when it is played, so the same id that was a fixture today is a result tomorrow.

    GET /v1/football/fixtures

    GET /v1/rugby/fixtures

### Racing and boxing

Racing declares by card: `/v1/horses/cards/upcoming` and `/v1/greyhounds/cards/today`. Boxing lists `/v1/boxing/fights/upcoming` with prices.

### Plans

Fixtures come with the sport plan, because they are about what is coming. The free key reads yesterday.

### Results

https://datasportapi.com/documentation/results

Every finished event for a day, with the final score, both sides and the competition. The free key reads it too.

Leave out `date` and you get yesterday, which is what the free key reads. Send `date=YYYY-MM-DD` for any other day the sport holds, on the sport plan. Narrow it with `competition`.

    GET /v1/football/results

    GET /v1/cricket/results

    GET /v1/volleyball/results?date=2026-10-31

### What a result carries

Football gives the full-time and half-time goals and the result letter; cricket each side's score and overs; volleyball, table tennis and badminton every set or game; racing every finisher with its position and starting price. The Returns table on each sport's Results page lists every field.

### From a result to the detail

Each result's id opens the event in full, and from there its line-ups, its timeline and both sides.

### Racecards

https://datasportapi.com/documentation/racecards

Racecards for horses and greyhounds: every meeting, race and runner, as they are declared.

### Horses

Today's cards come grouped by meeting, each with its course, going and surface, and every race in it. The cards ahead list races declared for the coming days. A race id opens the race with every runner: draw, weight, rating, jockey, trainer, form and price.

    GET /v1/horses/cards/today

    GET /v1/horses/cards/upcoming

### Greyhounds

Great Britain, Ireland and Australia. Each race has its track, grade, distance in metres and every trap. A race id opens the field measured runner by runner.

    GET /v1/greyhounds/cards/today

### Results and form

Results carry every finisher with the starting price; a horse id or dog id opens its form, newest run first.

### Line-ups

https://datasportapi.com/documentation/line-ups

Who started, who was on the bench, the formation and every change.

Ask for a match's line-ups by its id. Football gives both formations, the starting elevens, the substitutes and each substitution with its minute. Rugby gives both sides' fifteens and benches, basketball the box score, and volleyball the line-up set by set. Every player has an id that opens the player.

    GET /v1/football/events/fb_p04h38sesj/lineups

### When they arrive

Line-ups are there once announced, usually shortly before the start, and stay with the match for good.

### Racing

For racing, the runners are the line-up: `/v1/horses/races/{id}` gives every runner with its draw, and greyhounds every trap.

### Periods and timelines

https://datasportapi.com/documentation/timelines

How a match unfolded: the score by period and every scoring event in order.

In the team sports, `/events/{id}/periods` gives the timeline. Football lists goals, cards and changes by minute with the half-time score; rugby every try, conversion and penalty by minute; basketball the play by play; volleyball every rally of every set.

    GET /v1/rugby/events/rg_06wazt9zq7/periods

### Cricket, darts and the racket sports

Cricket goes ball by ball with `/matches/{id}/deliveries`. Darts, table tennis and badminton give the match leg by leg or game by game, with statistics where the sport keeps them.

### Standings and rankings

https://datasportapi.com/documentation/standings

League tables by competition and season, and the ranking lists of the individual sports.

### League tables

Take a competition id from `/competitions` and ask for its table. Football also needs the season, by its starting year; rugby the season id from its competition.

    GET /v1/basketball/standings?competition=bb_w24r12xjgq

    GET /v1/football/standings?competition=fb_3ecv7ykzb0&season=2026

### Rankings

Badminton ranks by discipline (`MS`, `WS`, `MD`, `WD`, `XD`); boxing by sanctioning body and division; darts by its rating table.

    GET /v1/badminton/rankings?discipline=WS

### Head to head

https://datasportapi.com/documentation/head-to-head

Every meeting between two sides, with the record between them.

Team sports take `team` and `opponent`; one-against-one sports take `player` and `opponent`. Both are ids from our answers. Leave one out and the answer names it before any data is read.

    GET /v1/rugby/head-to-head?team=rg_tnz71wf1rk&opponent=rg_3wgs9z80xa

    GET /v1/darts/head-to-head?player=dt_6eefhw35y8&opponent=dt_pwtkqmm3fc

### Teams and players

https://datasportapi.com/documentation/teams-and-players

Every side and every competitor has a page of its own, reached by its id.

Team ids come in every result and fixture; player ids in line-ups, search and the individual sports' results. A team gives its record and details; a player their figures; cricket a career by format; boxing a fighter's full record; racing a horse's or dog's form, and each jockey and trainer with their figures.

    GET /v1/cricket/players/ck_yeh6r1hj70

    GET /v1/horses/horses/hr_8cd4wybqgn/form

### Finding the id

Use [search](https://datasportapi.com/documentation/search) to find anyone by name.

### Search

https://datasportapi.com/documentation/search

Find anyone or anything by name, and get the id that opens it.

Every sport has `/search?q=`. Three letters or more works best. Cricket searches players, teams, grounds and competitions together; racing searches horses, people and courses; boxing fighters; the team sports teams and players.

    GET /v1/cricket/search?q=smith

    GET /v1/boxing/search?q=fury

### Historical data

https://datasportapi.com/documentation/history

The full history we hold for each sport comes with its plan, on the same calls as today.

Sport | Goes back | Rugby union | 1871 | Badminton draws | 1899 | Darts results | 1994 | Cricket, ball by ball | 2001 | Horse racing | 2017

Ask Results for any `date` the sport holds, or walk a competition season by season from `/competitions`. Use [cursors](https://datasportapi.com/documentation/pagination) for long walks, and keep what you fetch: old results do not change.

    GET /v1/rugby/results?date=1999-11-06

## Building

### One schema, many sports

https://datasportapi.com/documentation/one-schema

Write your code once. Every sport answers the same way.

- The same address shape: `/v1/{sport}/{endpoint}`.

- The same answer: `data` and `meta`, with the same meta fields.

- The same ids: stable, ours, and opening their own endpoint.

- The same errors and the same limits headers.

- The same paths by kind of sport: team sports share one set, one-against-one sports another, and racing its own.

### Where sports differ

The fields inside a row follow the sport: football has goals, cricket overs and wickets, racing draws and prices. Each endpoint page lists its fields from a real, current answer.

### Sports serving now

Football, horses, greyhounds, cricket, basketball, rugby, darts, boxing, volleyball, table tennis, badminton. Being connected: tennis, ice hockey, baseball, cycling, handball.

### How fresh the data is

https://datasportapi.com/documentation/freshness

Every answer says how fresh it is.

Kind of call | Kept for | Live scores | 10 seconds | Fixtures and cards | 2 minutes | Results | 5 minutes | A record | 30 minutes | Search | 60 minutes | Lists of competitions, courses, tracks | 6 hours

`meta.as_of` is when the data itself was built. `meta.cached` and `meta.age_seconds` say whether you got a stored copy and how old it is, and the `X-Cache` header says `hit`, `miss` or `stale`. A stale copy is served only while fresh data is not answering, so you get the last good answer rather than an error.

Uptime for each sport is on [the status page](https://datasportapi.com/status).

### Caching your calls

https://datasportapi.com/documentation/caching

Call for what changes; keep what does not.

- Finished results, line-ups and timelines do not change once a match is over. Keep them.

- Competitions, courses and tracks change rarely. Fetch them daily.

- Live scores change constantly, and are stored our side for 10 seconds. Asking more often returns the same copy.

- Every answer carries `Cache-Control` with how long it stays fresh, so an HTTP cache in front of your code does the right thing by itself.

### Recipes

https://datasportapi.com/documentation/recipes

Common jobs, each with the calls that do it.

### A live scoreboard
Ask `/live` every 15 seconds for the sports you hold and draw each row. When an id drops out, ask `/events/{id}` once for the final score.

    GET /v1/football/live

### A daily results feed
Once each morning, ask `/results` for every sport you hold and store each row by its id. Nothing in a finished result changes after.

    GET /v1/basketball/results

### A form guide
From today's cards, take each runner's horse id and ask its form. Keep the answers for the day.

    GET /v1/horses/cards/today

### A league page
Ask `/competitions` once, then the table and the results for the competition you show.

    GET /v1/volleyball/competitions

### Changelog

https://datasportapi.com/documentation/changelog

Everything added, changed and fixed, newest first.

2 Nov 2026AddedCricket matches in play answer on the same match address as finished ones, as do their scorecards and ball by ball.2 Nov 2026AddedHead to head takes team and opponent in every team sport, and player and opponent in every one-against-one sport.2 Nov 2026AddedEvery answer carries meta.cached and meta.age_seconds, and the X-Cache header, so you can see how fresh a copy is.2 Nov 2026AddedEleven sports serving: football, horses, greyhounds, cricket, basketball, rugby, darts, boxing, volleyball, table tennis and badminton.2 Nov 2026ChangedThe free key reads yesterday for every sport, 50 calls a day, with every endpoint except live and fixtures.2 Nov 2026ChangedIds are ours: two letters for the sport, an underscore and ten characters. They never change.2 Nov 2026FixedStandings and head to head name the value they need when it is missing, before any data is read.

## More

### MCP server

https://datasportapi.com/documentation/mcp

The MCP server gives your assistant 14 tools covering every endpoint of every sport on your plan.

    GET https://datasportapi.com/mcp

### Claude Code, Cursor and other clients that take a header
Add the server with your key in a header:

```
claude mcp add --transport http datasportapi https://datasportapi.com/mcp --header "X-API-Key: $KEY"
```

In Cursor, add it to `mcp.json` with the address above and `"headers": {"X-API-Key": "your key"}`.

### Claude and ChatGPT connectors
The connectors in Claude and ChatGPT sign you in rather than taking a key:

- In Claude, open Settings, Connectors, Add custom connector. In ChatGPT, add a connector the same way.
- Give it the address `https://datasportapi.com/mcp` and nothing else.

- Sign in with Google when it opens DataSportAPI, and press Allow.

The connector then reads exactly what your key reads, and its calls count towards your plan. It never sees your key. Disconnect it any time from [your account](https://datasportapi.com/account); rotating your key does not disconnect it.

### What it looks like
Ask "Who won at Kempton yesterday?" and the assistant calls `results` for horses, then `get_match` for the race, and answers from your plan. The tools follow the same plans and limits as the API, and each call counts as one.

Every tool is listed on [MCP tools](https://datasportapi.com/documentation/mcp-tools).

### Agent skill

https://datasportapi.com/documentation/agent-skill

One file that teaches an agent to use the API well.

    GET https://datasportapi.com/skill.md

The skill covers the address shape, the two ways to send a key, the ids, the plans and limits, the errors and when to retry, and every sport's endpoints. It is rebuilt from the API each time it is asked for, so it is always current. It is also at `/.well-known/agent-skills/datasportapi/SKILL.md`.

Add it to an agent's skills folder, or give its address to any agent that reads skills.

### The manual

https://datasportapi.com/documentation/manual

The whole API in one file, for agents and for reading offline.

    GET https://datasportapi.com/documentation/manual.md

    GET https://datasportapi.com/llms.txt

The manual holds every guide and every endpoint of every sport, with parameters and fields. `llms.txt` is the short map of these docs. Both are built from the same source as these pages each time they are asked for.

### OpenAPI

https://datasportapi.com/documentation/openapi

Generate a client in any language from one file.

    GET https://datasportapi.com/openapi.json

OpenAPI 3.1, with every path of every sport serving now, its parameters and the shared answer and error shapes. Feed it to any OpenAPI generator, or import it into Postman or Insomnia.

## Endpoints

### Football

Football results and fixtures across leagues worldwide, with live scores, half-time and full-time scores, line-ups with formations and substitutions, match timelines, league tables by season, teams, players and head to head.

- `GET /v1/football/live`: Every match in play now, with the score and the clock. Sport plan. Takes: competition. MCP tool `live_scores`.
- `GET /v1/football/fixtures`: Upcoming matches by date. Sport plan. Takes: date, competition, page, per_page. MCP tool `fixtures`.
  Fields: match_id, league_id, country_name, league_name, season_start_year, kickoff_utc, kickoff_date, kickoff_local_date, kickoff_local_time, match_status, home_team_id, home_team_name, away_team_id, away_team_name, home_goals, away_goals, full_time_result, half_time_home_goals, half_time_away_goals, half_time_result, stoppage_minutes, is_kickoff_rescheduled, elapsed_minutes, home_league_position, away_league_position, away_travel_km, venue_name, city_name, latitude, longitude, location_precision, daylight_minutes, sun_elevation_deg, public_holiday, kickoff_temperature_c, kickoff_rain_mm, kickoff_wind_ms, attendance, referee_name, kickoff_book_pct, regular_time_home_goals, regular_time_away_goals, regular_time_result, extra_time_home_goals, extra_time_away_goals, shootout_home_goals, shootout_away_goals, statistics_status, best_odds, team_figures, statistics_reason
- `GET /v1/football/results`: Finished matches by date, with the final score. Free key reads yesterday. Takes: date, competition, page, per_page. MCP tool `results`.
  Fields: match_id, league_id, country_name, league_name, season_start_year, kickoff_utc, kickoff_date, kickoff_local_date, kickoff_local_time, match_status, home_team_id, home_team_name, away_team_id, away_team_name, home_goals, away_goals, full_time_result, half_time_home_goals, half_time_away_goals, half_time_result, stoppage_minutes, is_kickoff_rescheduled, elapsed_minutes, home_league_position, away_league_position, away_travel_km, venue_name, city_name, latitude, longitude, location_precision, daylight_minutes, sun_elevation_deg, public_holiday, kickoff_temperature_c, kickoff_rain_mm, kickoff_wind_ms, attendance, referee_name, kickoff_book_pct, regular_time_home_goals, regular_time_away_goals, regular_time_result, extra_time_home_goals, extra_time_away_goals, shootout_home_goals, shootout_away_goals, statistics_status, best_odds, team_figures, statistics_reason
- `GET /v1/football/events/{id}`: One match in full: both sides, the score, the venue and the officials. Free key reads yesterday. Needs: id. MCP tool `get_match`.
  Fields: match_id, league_id, country_name, league_name, season_start_year, kickoff_utc, kickoff_date, kickoff_local_date, kickoff_local_time, match_status, home_team_id, home_team_name, away_team_id, away_team_name, home_goals, away_goals, full_time_result, half_time_home_goals, half_time_away_goals, half_time_result, stoppage_minutes, is_kickoff_rescheduled, elapsed_minutes, home_league_position, away_league_position, away_travel_km, venue_name, city_name, latitude, longitude, location_precision, daylight_minutes, sun_elevation_deg, public_holiday, kickoff_temperature_c, kickoff_rain_mm, kickoff_wind_ms, attendance, referee_name, kickoff_book_pct, regular_time_home_goals, regular_time_away_goals, regular_time_result, extra_time_home_goals, extra_time_away_goals, shootout_home_goals, shootout_away_goals, statistics_status, home_formation, away_formation, venue_id, capacity, surface, best_odds, team_figures, statistics_reason, statistics, lineups
- `GET /v1/football/events/{id}/lineups`: Starters, substitutes and formations for both sides. Free key reads yesterday. Needs: id. MCP tool `match_detail`.
  Fields: match_id, home_team_name, away_team_name, kickoff_utc, home_formation, away_formation, lineups, substitutions, appearances
- `GET /v1/football/events/{id}/periods`: The score by half, and every scoring event in order. Free key reads yesterday. Needs: id. MCP tool `match_detail`.
  Fields: match_id, kickoff_date, country_name, league_name, home_team_id, home_team_name, away_team_id, away_team_name, home_goals, away_goals, half_time, stoppage_minutes, has_events, goals, red_cards, timeline
- `GET /v1/football/competitions`: Every competition held, with its seasons. Free key reads yesterday. Takes: season, page, per_page. MCP tool `competitions`.
  Fields: league_id, country_name, league_name, match_count, priced_count, season_first, season_last, coverage
- `GET /v1/football/standings`: A league table for a competition and season. Free key reads yesterday. Needs: competition, season. Takes: page, per_page. MCP tool `standings`.
  Fields: league_id, country_name, league_name, season_start_year, as_of, venue, table
- `GET /v1/football/teams/{id}`: A team and its record. Free key reads yesterday. Needs: id. MCP tool `team`.
  Fields: team_id, team_name, venue_name, city_name, latitude, longitude, match_count
- `GET /v1/football/players/{id}`: A player and their figures. Free key reads yesterday. Needs: id. MCP tool `player`.
- `GET /v1/football/head-to-head`: Every meeting between two teams. Free key reads yesterday. Needs: team, opponent. MCP tool `head_to_head`.
  Fields: team, opponent, record, matches
- `GET /v1/football/search`: Teams, players and competitions by name. Free key reads yesterday. Takes: q, page, per_page. MCP tool `search`.
  Fields: team_id, team_name, venue_name, city_name, latitude, longitude, match_count

### Horses

Horse racing racecards for today and the days ahead, results with every finisher and starting price, horse form, jockeys and trainers with their figures, and every course held, close to 700 of them.

- `GET /v1/horses/cards/today`: Today's racecards with every runner. Sport plan. MCP tool `racecards_today`.
  Fields: meeting_id, course_id, course, country, region, date, going, surface, races
- `GET /v1/horses/cards/upcoming`: Races declared for the coming days. Sport plan. MCP tool `fixtures`.
  Fields: race_id, meeting_id, course, time, off_time, name, run_type, class, distance, going, surface, handicap, runners, result_available, date
- `GET /v1/horses/results`: Results by date with every finisher and starting price. Free key reads yesterday. Takes: date, competition, page, per_page. MCP tool `results`.
  Fields: meeting_id, course_id, course, country, region, date, going, surface, races
- `GET /v1/horses/races/{id}`: One race with every runner, its draw, weight, jockey and price. Free key reads yesterday. Needs: id. MCP tool `get_match`.
  Fields: cloth, draw, horse_id, horse, age, weight, official_rating, form, headgear, owner, owner_id, trainer_id, trainer, jockey_id, jockey, silk, sp, sp_decimal, price_path, favourite, market_position, position, beaten_distance, casualty, run_status, last_run_days, speed_figure, breeding, handicap_mark
- `GET /v1/horses/horses/{id}/form`: A horse's runs, newest first. Free key reads yesterday. Needs: id. MCP tool `racing_profile`.
- `GET /v1/horses/jockeys/{id}`: A jockey and their figures. Free key reads yesterday. Needs: id. MCP tool `racing_profile`.
  Fields: jockey_id, name, record
- `GET /v1/horses/trainers/{id}`: A trainer and their figures. Free key reads yesterday. Needs: id. MCP tool `racing_profile`.
  Fields: trainer_id, name, record
- `GET /v1/horses/courses`: Every course held, with its location. Free key reads yesterday. Takes: season, page, per_page. MCP tool `competitions`.
  Fields: course_id, name, shortcode, country, region, races, meetings, first_meeting, last_meeting, town, county, nation, lat, lng, direction, kinds
- `GET /v1/horses/search`: Horses, jockeys, trainers and courses by name. Free key reads yesterday. Takes: q, page, per_page. MCP tool `search`.
  Fields: type, horse_id, name

### Greyhounds

Greyhound racing in Great Britain, Ireland and Australia: today's cards with every trap, results with sectionals and starting prices, each dog's form and times, trainers, and trap and time statistics for every track.

- `GET /v1/greyhounds/cards/today`: Today's cards with every trap. Sport plan. MCP tool `racecards_today`.
  Fields: race_id, meeting_id, region, track, race_number, grade, class_letter, class_number, distance_m, race_type, is_handicap, going, field_size, scheduled_start, status, off, freshness, runners, result
- `GET /v1/greyhounds/results`: Results with sectionals and starting prices. Free key reads yesterday. Takes: date, competition, page, per_page. MCP tool `results`.
  Fields: race_id, meeting_id, region, track, race_number, grade, class_letter, class_number, distance_m, race_type, is_handicap, going, field_size, scheduled_start, status, off, freshness, result
- `GET /v1/greyhounds/races/{id}`: One race with every trap measured. Free key reads yesterday. Needs: id. MCP tool `get_match`.
  Fields: race_id, region, track, distance_m, grade, is_handicap, scheduled_start, field, runners, thin, form_state_computed_utc, note
- `GET /v1/greyhounds/dogs/{id}/form`: A dog's runs and times, newest first. Free key reads yesterday. Needs: id. MCP tool `racing_profile`.
  Fields: race_id, date_local, track, grade, distance_m, trap, position, sp, sectional_s, run_time_s, weight_kg
- `GET /v1/greyhounds/trainers/{id}`: A trainer and their figures. Free key reads yesterday. Needs: id. MCP tool `racing_profile`.
  Fields: trainer_id, name, slug, regions, stats
- `GET /v1/greyhounds/tracks`: Every track held. Free key reads yesterday. Takes: season, page, per_page. MCP tool `competitions`.
  Fields: track_id, name, slug, region, timezone, active, distances, grades
- `GET /v1/greyhounds/tracks/{id}/stats`: Trap and time statistics for a track. Free key reads yesterday. Needs: id. MCP tool `racing_profile`.
  Fields: track_id, name, trap_stats, records
- `GET /v1/greyhounds/search`: Dogs by name. Free key reads yesterday. Takes: q, page, per_page. MCP tool `search`.
  Fields: dog_id, name, born, age_months, sex, colour, season, sire, dam, career

### Tennis (being connected)

Tennis across the main tours: live scores, draws, results set by set, rankings, players and head to head.

- `GET /v1/tennis/live`: Every match in play now, set by set. Not held for this sport. Takes: season, page, per_page.
- `GET /v1/tennis/fixtures`: Upcoming matches by date. Not held for this sport. Takes: date, competition, page, per_page.
- `GET /v1/tennis/results`: Finished matches by date, with every set score. Not held for this sport. Takes: date, competition, page, per_page.
- `GET /v1/tennis/matches/{id}`: One match in full, with every set. Not held for this sport. Needs: id. Takes: season, page, per_page.
- `GET /v1/tennis/matches/{id}/stats`: The statistics of a match, set by set. Not held for this sport. Needs: id. Takes: season, page, per_page.
- `GET /v1/tennis/tournaments`: Every tournament or competition held. Not held for this sport. Takes: season, page, per_page.
- `GET /v1/tennis/rankings`: The current ranking list. Not held for this sport. Takes: season, page, per_page.
- `GET /v1/tennis/players/{id}`: A player and their record. Not held for this sport. Needs: id. Takes: season, page, per_page.
- `GET /v1/tennis/head-to-head`: Every meeting between two players. Not held for this sport. Takes: season, page, per_page.
- `GET /v1/tennis/search`: Players and tournaments by name. Not held for this sport. Takes: q, page, per_page.

### Cricket

Cricket, every ball since 2001: international, franchise and domestic matches, men and women, with live scores ball by ball, full scorecards, every delivery bowled, competitions and player careers by format.

- `GET /v1/cricket/live`: Matches in play, ball by ball. Sport plan. Takes: competition. MCP tool `live_scores`.
  Fields: match, name, competition, format, state, international, women, status, starts_at, venue, city, teams, innings, ball_by_ball, batting, winner, updated_at
- `GET /v1/cricket/fixtures`: Matches by date, starting today. Sport plan. Takes: date, competition, page, per_page. MCP tool `fixtures`.
- `GET /v1/cricket/results`: Finished matches by date. Free key reads yesterday. Takes: date, competition, page, per_page. MCP tool `results`.
  Fields: match, date, format, gender, coverage, competition, stage, ground, official_number, teams, result
- `GET /v1/cricket/matches/{id}`: One match in full, finished or in play. Free key reads yesterday. Needs: id. MCP tool `get_match`.
  Fields: match, name, competition, format, state, international, women, status, starts_at, venue, city, teams, innings, ball_by_ball, batting, winner, updated_at, toss, scorecard, now, last_ball
- `GET /v1/cricket/matches/{id}/scorecard`: The full scorecard, batting and bowling. Free key reads yesterday. Needs: id. MCP tool `match_detail`.
  Fields: match, name, competition, format, state, international, women, status, starts_at, venue, city, teams, innings, ball_by_ball, batting, winner, updated_at, toss, scorecard, now, last_ball
- `GET /v1/cricket/matches/{id}/deliveries`: Every ball bowled in a match. Free key reads yesterday. Needs: id. MCP tool `match_detail`.
  Fields: match, count, deliveries, next, more
- `GET /v1/cricket/competitions`: Every competition held, over twelve hundred. Free key reads yesterday. Takes: season, page, per_page. MCP tool `competitions`.
  Fields: competition, name, kind, gender, country, matches, first_match, latest_match
- `GET /v1/cricket/players/{id}`: A player's career by format. Free key reads yesterday. Needs: id. MCP tool `player`.
  Fields: player, name, batting, bowling, splits
- `GET /v1/cricket/search`: Players, teams, grounds and competitions by name. Free key reads yesterday. Takes: q, page, per_page. MCP tool `search`.
  Fields: q, players, teams, venues, competitions

### Basketball

Basketball games, scores and standings across more than forty competitions, with box scores, play by play, teams, players and head to head.

- `GET /v1/basketball/live`: Every game in play now, with the score and the clock. Sport plan. Takes: competition. MCP tool `live_scores`.
  Fields: game, status, score, period, periods_ended, clock, periods, last_play, last_change, seconds_behind
- `GET /v1/basketball/fixtures`: Upcoming games by date. Sport plan. Takes: date, competition, page, per_page. MCP tool `fixtures`.
  Fields: id, competition, season, stage, round, date, tip_off, status, home, away, home_score, away_score, attendance, venue, has
- `GET /v1/basketball/results`: Finished games by date, with the final score. Free key reads yesterday. Takes: date, competition, page, per_page. MCP tool `results`.
  Fields: id, competition, season, stage, round, date, tip_off, status, home, away, home_score, away_score, attendance, venue, has
- `GET /v1/basketball/events/{id}`: One game in full: both sides, the score, the venue and the officials. Free key reads yesterday. Needs: id. MCP tool `get_match`.
  Fields: id, competition, season, stage, round, date, tip_off, status, home, away, home_score, away_score, attendance, venue, has, periods, officials
- `GET /v1/basketball/events/{id}/lineups`: Starters, substitutes and formations for both sides. Free key reads yesterday. Needs: id. MCP tool `match_detail`.
  Fields: game, home, away
- `GET /v1/basketball/events/{id}/periods`: The score by quarter, and every scoring event in order. Free key reads yesterday. Needs: id. MCP tool `match_detail`.
  Fields: game, events
- `GET /v1/basketball/competitions`: Every competition held, with its seasons. Free key reads yesterday. Takes: season, page, per_page. MCP tool `competitions`.
  Fields: id, name, slug, country, gender, kind, seasons, first_season, last_season, games, finals, detail, box_score_share, play_by_play_share
- `GET /v1/basketball/standings`: A league table for a competition and season. Free key reads yesterday. Needs: competition. Takes: season, page, per_page. MCP tool `standings`.
  Fields: competition, season, games, through, table, groups
- `GET /v1/basketball/teams/{id}`: A team and its record. Free key reads yesterday. Needs: id. MCP tool `team`.
  Fields: id, name, country, city, arena, arena_capacity, founded, coaches, competitions
- `GET /v1/basketball/players/{id}`: A player and their figures. Free key reads yesterday. Needs: id. MCP tool `player`.
  Fields: id, name, birth_date, height_cm, weight_kg, country, position, games, teams, awards
- `GET /v1/basketball/head-to-head`: Every meeting between two teams. Free key reads yesterday. Needs: team, opponent. MCP tool `head_to_head`.
  Fields: team, opponent, summary, games
- `GET /v1/basketball/search`: Teams, players and competitions by name. Free key reads yesterday. Takes: q, page, per_page. MCP tool `search`.
  Fields: id, name, games, first_date, last_date, last_team

### Ice hockey (being connected)

Ice hockey scores by period, goals, line-ups, league tables, teams and players.

- `GET /v1/ice-hockey/live`: Every game in play now, with the score and the clock. Not held for this sport. Takes: season, page, per_page.
- `GET /v1/ice-hockey/fixtures`: Upcoming games by date. Not held for this sport. Takes: date, competition, page, per_page.
- `GET /v1/ice-hockey/results`: Finished games by date, with the final score. Not held for this sport. Takes: date, competition, page, per_page.
- `GET /v1/ice-hockey/events/{id}`: One game in full: both sides, the score, the venue and the officials. Not held for this sport. Needs: id. Takes: season, page, per_page.
- `GET /v1/ice-hockey/events/{id}/lineups`: Starters, substitutes and formations for both sides. Not held for this sport. Needs: id. Takes: season, page, per_page.
- `GET /v1/ice-hockey/events/{id}/periods`: The score by period, and every scoring event in order. Not held for this sport. Needs: id. Takes: season, page, per_page.
- `GET /v1/ice-hockey/competitions`: Every competition held, with its seasons. Not held for this sport. Takes: season, page, per_page.
- `GET /v1/ice-hockey/standings`: A league table for a competition and season. Not held for this sport. Takes: season, page, per_page.
- `GET /v1/ice-hockey/teams/{id}`: A team and its record. Not held for this sport. Needs: id. Takes: season, page, per_page.
- `GET /v1/ice-hockey/players/{id}`: A player and their figures. Not held for this sport. Needs: id. Takes: season, page, per_page.
- `GET /v1/ice-hockey/head-to-head`: Every meeting between two teams. Not held for this sport. Takes: season, page, per_page.
- `GET /v1/ice-hockey/search`: Teams, players and competitions by name. Not held for this sport. Takes: q, page, per_page.

### Baseball (being connected)

Baseball scores inning by inning, rosters, standings, teams and players.

- `GET /v1/baseball/live`: Every game in play now, with the score and the clock. Not held for this sport. Takes: season, page, per_page.
- `GET /v1/baseball/fixtures`: Upcoming games by date. Not held for this sport. Takes: date, competition, page, per_page.
- `GET /v1/baseball/results`: Finished games by date, with the final score. Not held for this sport. Takes: date, competition, page, per_page.
- `GET /v1/baseball/events/{id}`: One game in full: both sides, the score, the venue and the officials. Not held for this sport. Needs: id. Takes: season, page, per_page.
- `GET /v1/baseball/events/{id}/lineups`: Starters, substitutes and formations for both sides. Not held for this sport. Needs: id. Takes: season, page, per_page.
- `GET /v1/baseball/events/{id}/periods`: The score by inning, and every scoring event in order. Not held for this sport. Needs: id. Takes: season, page, per_page.
- `GET /v1/baseball/competitions`: Every competition held, with its seasons. Not held for this sport. Takes: season, page, per_page.
- `GET /v1/baseball/standings`: A league table for a competition and season. Not held for this sport. Takes: season, page, per_page.
- `GET /v1/baseball/teams/{id}`: A team and its record. Not held for this sport. Needs: id. Takes: season, page, per_page.
- `GET /v1/baseball/players/{id}`: A player and their figures. Not held for this sport. Needs: id. Takes: season, page, per_page.
- `GET /v1/baseball/head-to-head`: Every meeting between two teams. Not held for this sport. Takes: season, page, per_page.
- `GET /v1/baseball/search`: Teams, players and competitions by name. Not held for this sport. Takes: q, page, per_page.

### Rugby

Rugby union since 1871: results and fixtures, live scores, line-ups for both sides, every score by the minute, league tables by season, teams, players and head to head.

- `GET /v1/rugby/live`: Every match in play now, with the score and the clock. Sport plan. Takes: competition. MCP tool `live_scores`.
  Fields: id, date, kickoff_utc, status, competition, season, home, away, live
- `GET /v1/rugby/fixtures`: Upcoming matches by date. Sport plan. Takes: date, competition, page, per_page. MCP tool `fixtures`.
  Fields: id, date, kickoff_utc, status, competition, season, home, away
- `GET /v1/rugby/results`: Finished matches by date, with the final score. Free key reads yesterday. Takes: date, competition, page, per_page. MCP tool `results`.
  Fields: id, date, kickoff_utc, status, competition, season, home, away
- `GET /v1/rugby/events/{id}`: One match in full: both sides, the score, the venue and the officials. Free key reads yesterday. Needs: id. MCP tool `get_match`.
  Fields: id, date, kickoff_utc, status, competition, season, home, away, round, venue, half_time, referee, attendance, context, quality
- `GET /v1/rugby/events/{id}/lineups`: Starters, substitutes and formations for both sides. Free key reads yesterday. Needs: id. MCP tool `match_detail`.
  Fields: match, status, home, away
- `GET /v1/rugby/events/{id}/periods`: The score by half, and every scoring event in order. Free key reads yesterday. Needs: id. MCP tool `match_detail`.
- `GET /v1/rugby/competitions`: Every competition held, with its seasons. Free key reads yesterday. Takes: season, page, per_page. MCP tool `competitions`.
  Fields: id, name, region, country, type, code, seasons, coverage
- `GET /v1/rugby/standings`: A league table for a competition and season. Free key reads yesterday. Needs: season. Takes: page, per_page. MCP tool `standings`.
  Fields: pos, team, p, w, d, l, pf, pa, pd, bp, pts
- `GET /v1/rugby/teams/{id}`: A team and its record. Free key reads yesterday. Needs: id. MCP tool `team`.
  Fields: id, name, short_name, tag, country, type, competitions, squad_size
- `GET /v1/rugby/players/{id}`: A player and their figures. Free key reads yesterday. Needs: id. MCP tool `player`.
  Fields: id, name, first_name, last_name, birth_date, nationality, position, height_cm, weight_kg, team, status
- `GET /v1/rugby/head-to-head`: Every meeting between two teams. Free key reads yesterday. Needs: team, opponent. MCP tool `head_to_head`.
  Fields: id, date, kickoff_utc, status, competition, season, home, away
- `GET /v1/rugby/search`: Teams, players and competitions by name. Free key reads yesterday. Takes: q, page, per_page. MCP tool `search`.
  Fields: type, id, name, team

### Darts

Darts results back to 1994 with averages and match statistics, live scores, fixtures, competitions, player ratings and head to head.

- `GET /v1/darts/live`: Every match in play now, leg by leg. Sport plan. Takes: competition. MCP tool `live_scores`.
- `GET /v1/darts/fixtures`: Upcoming matches by date. Sport plan. Takes: date, competition, page, per_page. MCP tool `fixtures`.
  Fields: fixture_id, competition, round, date, date_confirmed, starts_at, players, price
- `GET /v1/darts/results`: Finished matches by date, with every leg score. Free key reads yesterday. Takes: date, competition, page, per_page. MCP tool `results`.
- `GET /v1/darts/matches/{id}`: One match in full, with every leg. Free key reads yesterday. Needs: id. MCP tool `get_match`.
  Fields: match_id, played_on, round, winner, loser, record, result_status, event, statistics_held
- `GET /v1/darts/matches/{id}/stats`: The statistics of a match, leg by leg. Free key reads yesterday. Needs: id. MCP tool `match_detail`.
  Fields: players
- `GET /v1/darts/tournaments`: Every tournament or competition held. Free key reads yesterday. Takes: season, page, per_page. MCP tool `competitions`.
  Fields: competition_id, name, organiser, tier, editions, first_event, last_event
- `GET /v1/darts/rankings`: The current ranking list. Free key reads yesterday. Takes: season, page, per_page. MCP tool `standings`.
  Fields: rank, player_id, name, country_code, rating, change_30d, matches, last_match, peak
- `GET /v1/darts/players/{id}`: A player and their record. Free key reads yesterday. Needs: id. MCP tool `player`.
  Fields: player_id, name, name_status, country_code, first_year, last_year, matches, record, details
- `GET /v1/darts/head-to-head`: Every meeting between two players. Free key reads yesterday. Needs: player, opponent. MCP tool `head_to_head`.
  Fields: players, meetings, first_meeting, last_meeting, matches
- `GET /v1/darts/search`: Players and tournaments by name. Free key reads yesterday. Takes: q, page, per_page. MCP tool `search`.
  Fields: player_id, name, name_status, country_code, first_year, last_year, matches

### Boxing

Boxing of every kind: fights to come with prices, finished bouts, fighter records, each judge's card round by round, and the world ranking lists.

- `GET /v1/boxing/fights/upcoming`: Fights to come, with prices. Sport plan. MCP tool `fixtures`.
  Fields: id, date, start_time_utc, a, b, books, props, prices_read_at
- `GET /v1/boxing/results`: Finished bouts by date. Free key reads yesterday. Takes: date, competition, page, per_page. MCP tool `results`.
- `GET /v1/boxing/bouts/{id}`: One bout in full. Free key reads yesterday. Needs: id. MCP tool `get_match`.
- `GET /v1/boxing/bouts/{id}/cards`: Each judge's card, round by round. Free key reads yesterday. Needs: id. MCP tool `match_detail`.
- `GET /v1/boxing/fighters/{id}`: A fighter and their record. Free key reads yesterday. Needs: id. MCP tool `player`.
  Fields: id, name, nickname, sex, born, birth_place, country, height_cm, record, bouts, first_bout, last_bout, kinds, rating, suspension
- `GET /v1/boxing/rankings`: The world ranking lists by body and division. Free key reads yesterday. Takes: season, page, per_page. MCP tool `standings`.
  Fields: body, division, women, month, champion, interim, entries
- `GET /v1/boxing/search`: Fighters by name. Free key reads yesterday. Takes: q, page, per_page. MCP tool `search`.
  Fields: id, name, nickname, sex, born, birth_place, country, height_cm, record, bouts, first_bout, last_bout, kinds, rating

### Cycling (being connected)

Road cycling races and stages, stage results, general, points and mountains classifications, riders and teams.

- `GET /v1/cycling/races`: Races by season. Not held for this sport. Takes: season, page, per_page.
- `GET /v1/cycling/races/{id}`: One race and its stages. Not held for this sport. Needs: id.
- `GET /v1/cycling/stages/{id}/results`: The results of one stage. Not held for this sport. Needs: id.
- `GET /v1/cycling/races/{id}/classifications`: General, points and mountains classifications. Not held for this sport. Needs: id.
- `GET /v1/cycling/riders/{id}`: A rider and their results. Not held for this sport. Needs: id.
- `GET /v1/cycling/teams`: Every team held. Not held for this sport. Takes: season, page, per_page.
- `GET /v1/cycling/search`: Riders and races by name. Not held for this sport. Takes: q, page, per_page.

### Volleyball

Indoor and beach volleyball: live scores, results with every set, rally by rally points, line-ups, league tables, teams, players and head to head.

- `GET /v1/volleyball/live`: Every match in play now, with the score and the clock. Sport plan. Takes: competition. MCP tool `live_scores`.
- `GET /v1/volleyball/fixtures`: Upcoming matches by date. Sport plan. Takes: date, competition, page, per_page. MCP tool `fixtures`.
  Fields: id, discipline, gender, status, current_set, date, time_local, start_utc, utc_offset, timezone, competition, round, pool, team_a, team_b, score, winner, sets, sets_complete, duration_s, updated_utc
- `GET /v1/volleyball/results`: Finished matches by date, with the final score. Free key reads yesterday. Takes: date, competition, page, per_page. MCP tool `results`.
  Fields: id, discipline, gender, status, current_set, date, time_local, start_utc, utc_offset, timezone, competition, round, pool, team_a, team_b, score, winner, sets, sets_complete, duration_s, updated_utc
- `GET /v1/volleyball/events/{id}`: One match in full: both sides, the score, the venue and the officials. Free key reads yesterday. Needs: id. MCP tool `get_match`.
  Fields: id, discipline, gender, status, current_set, date, time_local, start_utc, utc_offset, timezone, competition, round, pool, team_a, team_b, score, winner, sets, sets_complete, duration_s, updated_utc, venue, city, country_code, spectators, referees, officials, coaches, weather, detail
- `GET /v1/volleyball/events/{id}/lineups`: Starters, substitutes and formations for both sides. Free key reads yesterday. Needs: id. MCP tool `match_detail`.
  Fields: match, coaches, sets
- `GET /v1/volleyball/events/{id}/periods`: The score by set, and every scoring event in order. Free key reads yesterday. Needs: id. MCP tool `match_detail`.
  Fields: match, sets
- `GET /v1/volleyball/competitions`: Every competition held, with its seasons. Free key reads yesterday. Takes: season, page, per_page. MCP tool `competitions`.
  Fields: id, name, discipline, gender, season, start_date, end_date, country_code
- `GET /v1/volleyball/standings`: A league table for a competition and season. Free key reads yesterday. Needs: competition. Takes: season, page, per_page. MCP tool `standings`.
  Fields: competition, tables
- `GET /v1/volleyball/teams/{id}`: A team and its record. Free key reads yesterday. Needs: id. MCP tool `team`.
  Fields: id, name, discipline, gender, kind, federation, country_code, players
- `GET /v1/volleyball/players/{id}`: A player and their figures. Free key reads yesterday. Needs: id. MCP tool `player`.
- `GET /v1/volleyball/head-to-head`: Every meeting between two teams. Free key reads yesterday. Needs: team, opponent. MCP tool `head_to_head`.
  Fields: team_a, team_b, record, matches
- `GET /v1/volleyball/search`: Teams, players and competitions by name. Free key reads yesterday. Takes: q, page, per_page. MCP tool `search`.
  Fields: id, name, discipline, gender, kind, federation, country_code

### Handball (being connected)

Handball results and history, fixtures, league tables and teams.

- `GET /v1/handball/live`: Every match in play now, with the score and the clock. Not held for this sport. Takes: season, page, per_page.
- `GET /v1/handball/fixtures`: Upcoming matches by date. Not held for this sport. Takes: date, competition, page, per_page.
- `GET /v1/handball/results`: Finished matches by date, with the final score. Not held for this sport. Takes: date, competition, page, per_page.
- `GET /v1/handball/events/{id}`: One match in full: both sides, the score, the venue and the officials. Not held for this sport. Needs: id. Takes: season, page, per_page.
- `GET /v1/handball/events/{id}/periods`: The score by half, and every scoring event in order. Not held for this sport. Needs: id. Takes: season, page, per_page.
- `GET /v1/handball/competitions`: Every competition held, with its seasons. Not held for this sport. Takes: season, page, per_page.
- `GET /v1/handball/standings`: A league table for a competition and season. Not held for this sport. Takes: season, page, per_page.
- `GET /v1/handball/teams/{id}`: A team and its record. Not held for this sport. Needs: id. Takes: season, page, per_page.
- `GET /v1/handball/head-to-head`: Every meeting between two teams. Not held for this sport. Takes: season, page, per_page.
- `GET /v1/handball/search`: Teams, players and competitions by name. Not held for this sport. Takes: q, page, per_page.

### Table tennis

Professional table tennis: events and their draws, results with every game score, live scores, players and head to head.

- `GET /v1/table-tennis/live`: Every match in play now, game by game. Sport plan. Takes: competition. MCP tool `live_scores`.
- `GET /v1/table-tennis/fixtures`: Upcoming matches by date. Sport plan. Takes: date, competition, page, per_page. MCP tool `fixtures`.
  Fields: id, event, date, start_time, discipline, age_group, para_class, round, round_name, rubber, status, best_of, points_per_game, win_by, utc_offset_min, sides, score, winner, result_note, games, duration_s, table, started_at, timeouts, cards, video_review, challenges_each, serving
- `GET /v1/table-tennis/results`: Finished matches by date, with every game score. Free key reads yesterday. Takes: date, competition, page, per_page. MCP tool `results`.
- `GET /v1/table-tennis/matches/{id}`: One match in full, with every game. Free key reads yesterday. Needs: id. MCP tool `get_match`.
  Fields: id, event, date, start_time, discipline, age_group, para_class, round, round_name, rubber, status, best_of, points_per_game, win_by, utc_offset_min, sides, score, winner, result_note, games, duration_s, table, started_at, timeouts, cards, video_review, challenges_each, serving, context
- `GET /v1/table-tennis/matches/{id}/stats`: The statistics of a match, game by game. Free key reads yesterday. Needs: id. MCP tool `match_detail`.
  Fields: id, event, date, start_time, discipline, age_group, para_class, round, round_name, rubber, status, best_of, points_per_game, win_by, utc_offset_min, sides, score, winner, result_note, games, duration_s, table, started_at, timeouts, cards, video_review, challenges_each, serving, context
- `GET /v1/table-tennis/tournaments`: Every tournament or competition held. Free key reads yesterday. Takes: season, page, per_page. MCP tool `competitions`.
  Fields: id, name, start_date, end_date, venue, city, country, tier, utc_offset_min, matches
- `GET /v1/table-tennis/rankings`: The current ranking list. Not held for this sport. Takes: season, page, per_page.
- `GET /v1/table-tennis/players/{id}`: A player and their record. Free key reads yesterday. Needs: id. MCP tool `player`.
  Fields: id, name, country, born, hand, height_cm, record, world_ranks
- `GET /v1/table-tennis/head-to-head`: Every meeting between two players. Free key reads yesterday. Needs: player, opponent. MCP tool `head_to_head`.
- `GET /v1/table-tennis/search`: Players and tournaments by name. Free key reads yesterday. Takes: q, page, per_page. MCP tool `search`.
  Fields: id, name, country

### Badminton

World badminton: results and fixtures, draws back to 1899, players, head to head, world rankings by discipline and live scores.

- `GET /v1/badminton/live`: Every match in play now, game by game. Sport plan. Takes: competition. MCP tool `live_scores`.
- `GET /v1/badminton/fixtures`: Upcoming matches by date. Sport plan. Takes: date, competition, page, per_page. MCP tool `fixtures`.
  Fields: id, tournament, discipline, team_event, start, status, side1, side2, sets, games, winner, match, odds, duration_min
- `GET /v1/badminton/results`: Finished matches by date, with every game score. Free key reads yesterday. Takes: date, competition, page, per_page. MCP tool `results`.
- `GET /v1/badminton/matches/{id}`: One match in full, with every game. Free key reads yesterday. Needs: id. MCP tool `get_match`.
  Fields: id, tournament, discipline, team_event, start, status, side1, side2, sets, games, winner, match, odds, duration_min
- `GET /v1/badminton/matches/{id}/stats`: The statistics of a match, game by game. Free key reads yesterday. Needs: id. MCP tool `match_detail`.
  Fields: event, complete, read, games, totals
- `GET /v1/badminton/tournaments`: Every tournament or competition held. Free key reads yesterday. Takes: season, page, per_page. MCP tool `competitions`.
  Fields: id, series, name, year, level, disciplines, matches
- `GET /v1/badminton/rankings`: The current ranking list. Free key reads yesterday. Takes: season, page, per_page, discipline. MCP tool `standings`.
  Fields: rank, name, players, points
- `GET /v1/badminton/players/{id}`: A player and their record. Free key reads yesterday. Needs: id. MCP tool `player`.
  Fields: id, name, slug, country, gender, first_year, last_year, matches, wins, by_discipline, career_high, number_one, born, hand, height_cm, coach
- `GET /v1/badminton/head-to-head`: Every meeting between two players. Free key reads yesterday. Needs: player, opponent. MCP tool `head_to_head`.
  Fields: player1, player2, meetings, matches
- `GET /v1/badminton/search`: Players and tournaments by name. Free key reads yesterday. Takes: q, page, per_page. MCP tool `search`.
  Fields: kind, id, name, country, gender, years, matches, score

