Table tennis data API
Table tennis data, live through one keyProfessional table tennis: events and their draws, results with every game score, live scores, players and head to head.
Endpoints
Everything table tennis answers
Each one opens in the docs with a live console, your key already filled in.
| Method | Address | What it gives | Free key | |
|---|---|---|---|---|
| GET | /v1/table-tennis/live | Every match in play now, game by game | Plan | Try it |
| GET | /v1/table-tennis/fixtures | Upcoming matches by date | Plan | Try it |
| GET | /v1/table-tennis/results | Finished matches by date, with every game score | Yesterday | Try it |
| GET | /v1/table-tennis/matches/{id} | One match in full, with every game | Yesterday | Try it |
| GET | /v1/table-tennis/matches/{id}/stats | The statistics of a match, game by game | Yesterday | Try it |
| GET | /v1/table-tennis/tournaments | Every tournament or competition held | Yesterday | Try it |
| GET | /v1/table-tennis/rankings | The current ranking list | Not held | Try it |
| GET | /v1/table-tennis/players/{id} | A player and their record | Yesterday | Try it |
| GET | /v1/table-tennis/head-to-head | Every meeting between two players | Yesterday | Try it |
| GET | /v1/table-tennis/search | Players and tournaments by name | Yesterday | Try it |
A real answer
What comes back
Kept from the API each night, exactly as a caller receives it, lists cut to a few rows.
{
"data": [],
"meta": {
"sport": "table-tennis",
"endpoint": "/results",
"count": 0,
"page": 1,
"per_page": 50,
"total": 0,
"total_pages": 1,
"next_cursor": null,
"next_page": null,
"prev_page": null,
"cached": false,
"age_seconds": 0
}
}{
"data": [
{
"id": "tt_95wpr4gac7",
"name": "Finals Hong Kong 2027",
"start_date": "2027-12-07",
"end_date": "2027-12-12",
"venue": null,
"city": null,
"country": "HKG",
"tier": 1,
"utc_offset_min": 480,
"matches": 0
},
{
"id": "tt_p7bdwkzz7b",
"name": "Youth Contender Gaborone 2027",
"start_date": "2027-12-06",
"end_date": "2027-12-09",
"venue": "Gaborone International Commerce Park, Choppies Building",
"city": "Gaborone",
"country": "BOT",
"tier": 4,
"utc_offset_min": null,
"matches": 0
}
],
"meta": {
"sport": "table-tennis",
"endpoint": "/tournaments",
"count": 50,
"page": 1,
"per_page": 50,
"total": 657,
"total_pages": 14,
"next_cursor": "eyJvIjo1MCwicCI6NTB9",
"next_page": 2,
"prev_page": null,
"cached": false,
"age_seconds": 0
}
}{
"data": {
"id": "tt_vf1pkfwr90",
"event": {
"id": "tt_qhdn2gmfkd",
"name": "Champions Frankfurt 2026"
},
"date": "2026-11-03",
"start_time": "2026-11-03T11:00:00Z",
"discipline": "WS",
"age_group": null,
"para_class": null,
"round": "round_of_32",
"round_name": "Round of 32",
"rubber": null,
"status": "finished",
"best_of": 5,
"points_per_game": 11,
"win_by": 2,
"utc_offset_min": 60,
"sides": [
{
"side": "a",
"name": "Polcanova Sofia",
"country": "AUT",
"players": [
{
"id": "tt_9ephymbdxw",
"name": "Polcanova Sofia",
"country": "AUT"
}
]
},
{
"side": "b",
"name": "Harimoto Miwa",
"country": "JPN",
"players": [
{
"id": "tt_6qcq985bnf",
"name": "Harimoto Miwa",
"country": "JPN"
}
]
}
],
"score": {
"a": 3,
"b": 0
},
"winner": "a",
"result_note": null,
"games": [
{
"a": 11,
"b": 3
},
{
"a": 11,
"b": 1
},
{
"a": 11,
"b": 0
}
],
"duration_s": 457,
"table": 1,
"started_at": "2026-11-03T01:21:29Z",
"timeouts": {
"a": 1,
"b": 1
},
"cards": {
"a": [
"yellow",
"yellow-red",
"yellow-red 2"
],
"b": [
"yellow",
"yellow-red",
"yellow-red 2"
]
},
"video_review": false,
"challenges_each": 99,
"serving": null,
"context": {
"venue": "Süwag Energie Arena",
"city": "Frankfurt",
"country": "GER",
"a": {
"world_rank": {
"rank": 44,
"points": 848,
"week": "2026-44"
},
"form": [
{
"match": "mt_1kd5b5n8",
"date": "2026-10-04",
"won": false
},
{
"match": "mt_5aa76tb5",
"date": "2026-09-10",
"won": false
},
{
"match": "mt_f6ja0jrv",
"date": "2026-09-09",
"won": true
}
]
},
"b": {
"world_rank": {
"rank": 3,
"points": 7009,
"week": "2026-44"
},
"form": [
{
"match": "mt_9g5hn5xq",
"date": "2026-10-31",
"won": false
},
{
"match": "mt_gm2ymbg4",
"date": "2026-10-30",
"won": true
},
{
"match": "mt_z7rffjsd",
"date": "2026-10-29",
"won": true
}
]
}
}
},
"meta": {
"sport": "table-tennis",
"endpoint": "/matches/{id}",
"cached": false,
"age_seconds": 0
}
}Goes well with
Sports often taken with table tennis
Can I try table tennis before I pay?
Yes. The free key reads yesterday's table tennis data on every endpoint except live and fixtures, 50 calls a day, no card.
What does the Table tennis plan include?
Every table tennis endpoint, live and upcoming included, the full history we hold, 120 calls a minute and 250,000 a month, for $19 a month or $190 a year.
Does it answer like the other sports?
Yes. Table tennis answers in the same shape as every other sport, through the same key, so code written for one reads the rest.
Can I use it with Claude?
Yes. The MCP server turns each table tennis endpoint into a tool, on the same key.