Table tennis a match API
A matchOne match in full, with every game.
Ask for it by our id, taken from any other table tennis answer. The ids inside the answer each open their own endpoint, so you can follow a record from here to everything it links to.
It needs id. Leave one out and the answer names it, before any data is read.
Try it
Your key stays in this browser and is filled in on every docs page.
{
"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
}
}Parameters
Query values this call takes. Anything else is refused with bad_param and the list it accepts.
| Name | Type | What it does | |
|---|---|---|---|
| id | id | required | The record, by our id, in the path. |
Returns
Each field in data, from a real answer. Every id is ours and opens its own endpoint.
| Field | Type | What it holds |
|---|---|---|
| id | id | Our id for this record |
| event | object | Event |
| date | date | The day, YYYY-MM-DD |
| start_time | datetime | Start time |
| discipline | string | The discipline |
| age_group | null | Age group |
| para_class | null | Para class |
| round | string | The round |
| round_name | string | Round name |
| rubber | null | Rubber |
| status | string | Its state: scheduled, live, finished or similar |
| best_of | integer | Best of |
| points_per_game | integer | Points per game |
| win_by | integer | Win by |
| utc_offset_min | integer | Utc offset in metresin |
| sides | list | Sides |
| score | object | The score |
| winner | string | Who won |
| result_note | null | Result note |
| games | list | Each game |
| duration_s | integer | Length in seconds |
| table | integer | Table |
| started_at | datetime | Started at |
| timeouts | object | Timeouts |
| cards | object | Cards |
| video_review | boolean | Video review |
| challenges_each | integer | Challenges each |
| serving | null | Serving |
| context | object | Context |
| meta | What it holds |
|---|---|
| sport, endpoint | What you asked |
| count | Rows in this answer |
| page, per_page, total, next_cursor | Where you are in a paged list, when it is paged |
| as_of | When the data was built |
| cached, age_seconds | Whether this is a stored copy, and its age |
| access | On the free key: what it reads, and the plan that opens the rest |
Errors
Codes this call can give. Each is explained in Errors.
| Status | Code | When |
|---|---|---|
| 401 | no_key | No key sent, or not in a form we read |
| 401 | bad_key | A key we do not know |
| 403 | plan | The free key asked for a date other than yesterday |
| 404 | not_found | An id we never issued for table tennis |
| 422 | bad_param | A value this call does not take, or a required one missing |
| 429 | rate | Over the calls a minute for your plan |
| 503 | upstream | The data is not answering; retry after Retry-After |
The free key reads yesterday. The Table tennis plan opens live, fixtures and every date held, for $19 a month.
Add Table tennis