rows = fetch_all("/v1/matches", from="2025-01-01") df = pd.DataFrame(rows) df.groupby("discipline").size()
Live scores, every result since December 2024, events, players and head to head, as clean JSON. 15 endpoints, copy-paste code in four languages, and an MCP server so your AI assistant can read it too.
/v1/liveupdated just nowEvery plan uses the same key, the same endpoints and the same code.
While an event is on, /v1/live returns every match in play with the game in progress. This board is drawn from the same data and refreshes on its own.
2 matches in play now. Refreshes every 10 seconds.
Who served, who won the point, every game score, the running momentum and the numbers that decide matches. All of it from the same match id.
Orange fields come with Live, Archive and Complete.
From Grand Smashes to youth and para events: every match, every discipline, the full calendar ahead. One archive, one key, the same shape of JSON.
Grand Smash, Champions, Finals, World Cup
Star Contender and Contender
Feeder series
Youth Star Contender and Contender, U11 to U19
Para events by sport class, and the rest
discipline=MSdiscipline=WSdiscipline=MDdiscipline=WDdiscipline=XDdiscipline=MTdiscipline=WTdiscipline=XTCounted from the database, refreshed every 10 minutes.
Pick an endpoint, change the filters, and watch the request and the code update. Send it to see the exact shape of JSON you will get back.
No SDK to install, no contract to sign. A key, one HTTPS call, and a few lines to draw it.
Sign up with Google. The key appears straight away, with 50 free calls a day.
Send the key as a Bearer token. Yesterday's results work on every plan.
data and metaLoop over data and draw each match. This is what the response turns into.
The same endpoints power very different products. Pick yours and see which calls it takes and which plan fits.
Poll one endpoint and every table at every event is on your screen, with the game in progress.
Every player, their record by discipline, recent form and every meeting between two players.
Every match and every game since December 2024 in one consistent shape. Page through it with cursors and have a dataset in minutes.
rows = fetch_all("/v1/matches", from="2025-01-01") df = pd.DataFrame(rows) df.groupby("discipline").size()
elo = rate(df, k=24) elo.plot(players=["Wang Chuqin", "Lin Shidong"])
Connect our MCP server to Claude, ChatGPT or Cursor and it can look up live scores, results and head to head for itself, with your key.
| Meetings | 9 |
| Wang Chuqin wins | 7 |
| Games won | 27 to 15 |
| Last meeting | Wang 4-2 |
Pull every meeting, recent form and game scores for any two players, and brief your player with facts instead of memory.
Our MCP server lets Claude, ChatGPT, Cursor and any MCP client call the API for you. Ask in plain words; it picks the right tool, calls it with your key and answers from real data.
It is on your dashboard, next to your key.
Paste it where your app adds connectors or MCP servers.
"Who is playing right now?" "How has Lebrun done against Calderano?"
live_matchesMatches being played now
find_matchesMatches on a day, any event
get_matchOne match with every game
results_yesterdayYesterday's finished matches
find_eventsEvents past, running, ahead
world_rankingsThe world rankings, any list
player_rankingsA player's ranking by week
find_playersPlayers by name or country
get_playerA player and their record
player_matchesA player's matches
head_to_headTwo players, every meeting
your own agent?Use the OpenAPI file and llms.txt
The client names are examples of MCP-capable apps; the exact place to add a server differs by app. Your MCP address is issued with your key.
Every meeting between two players since December 2024, with the games, the events and who won. Plus each player's record by discipline.
GET /v1/h2h/{a}/{b}
All figures in the three rivalries are samples for the layout; the built section reads them from /v1/h2h.
Every plan uses the same endpoints and the same code. Change plan at any time and your key keeps working.
Free key $0 forever Try it and build a prototype Get a free key |
RECOMMENDED Live $69 a month Live scores apps and widgets |
Archive $59 a month Research, models, stats sites |
Complete $99 a month Live and the whole archive |
|
|---|---|---|---|---|
| Limits | ||||
| Calls a day | 50 | 20,000 | 20,000 | 50,000 |
| Calls a minute | 10 | 60 | 60 | 120 |
| Dates you can read | ||||
| Match days | Yesterday to the days aheadand today | 1 January this year onwardand the days ahead | Every day since Dec 2024up to yesterday | Every day since Dec 2024and the days ahead |
| Endpoints | ||||
/v1/results/yesterday | ||||
/v1/matches, /v1/matches/{id} | ||||
/v1/events and event matches | ||||
/v1/players, /v1/players/{id} | ||||
/v1/live | ||||
/v1/players/{id}/matches | ||||
/v1/h2h/{a}/{b} | ||||
| Fields | ||||
| Players, score, round, status | ||||
| Every game score | ||||
| Match length and table | ||||
| Point by point, main-draw singles | SOON | SOON | SOON | |
| Tools | ||||
| MCP server for AI assistants | ||||
| OpenAPI, Postman, llms.txt | ||||
| Support | Help centre | Tickets | Tickets | Tickets, first in line |
Straight answers about the data, the plans and the code. Can't find yours? Open a ticket and we'll reply by email.
It is a JSON API for professional table tennis. One key gives you live scores from every table at professional events, every result since December 2024 with the score of each game, the event calendar ahead, player records and head to head. It has 15 endpoints under https://api.tabletennisapi.com/v1/, an MCP server for AI assistants, and ready-to-copy code in curl, PHP, Python and JavaScript.
It is built for developers who want table tennis data in their own product without scraping websites or keeping up with changes to someone else's pages.
Enter your email on the sign-up page and your key arrives straight away. There is no card to enter and no trial that runs out. The free key gives you 50 calls a day and reads yesterday's results, today and the matches scheduled in the days ahead.
Your key starts with tta_live_. It is shown in full once, when it is created, so copy it somewhere safe. If you lose it you can revoke it and make a new one from your dashboard at any time.
Send your key in a header and ask for yesterday's results, which every plan can read:
curl https://api.tabletennisapi.com/v1/results/yesterday \ -H "Authorization: Bearer $TT_KEY"
You get back an object with data (the matches) and meta (counts and paging). The documentation has the same call in PHP, Python and JavaScript, and a console where you can try every endpoint from your browser.
No. The API is plain HTTPS and JSON, so any language that can make a web request can use it: PHP, Python, JavaScript and TypeScript, Go, Ruby, Java, C# and the rest. We publish an OpenAPI file and a Postman collection, so you can generate a typed client in your own language if you prefer one.
We gather results, schedules and live scoring from professional table tennis events as they happen, check them, and store every match in one consistent shape with our own ids, so your code never has to deal with changing formats.
Table Tennis API is an independent service run by DeveloperData.net.
Every professional event from December 2024 onwards, from the top tier (Grand Smash, Champions, Finals and the World Cup) through Star Contender and Contender, the Feeder series, youth events and para events. The event calendar ahead is included too, so you can show what is coming next. Earlier seasons are not in the API yet.
Each event carries a tier from 1 to 5, so you can filter to the level you care about with /v1/events?tier=1.
Yes. Every match has a discipline: men's and women's singles (MS, WS), men's, women's and mixed doubles (MD, WD, XD) and team ties (MT, WT, XT). Doubles sides list both players.
Youth matches carry an age group from U11 to U19, and para matches carry their sport class, such as MS6. You can filter on any of these, or ask for seniors only with age_group=senior.
The event, the local date of play and the start time in UTC, the discipline, the round (both as a code like quarter_final and in words), the status, best-of, both sides with their players and countries, the score in games and the winner.
Live, Archive and Complete add every game score, the length of the match in seconds and the table it was played on. On the free key those three fields come back as null with a note in meta saying which plans include them.
finished means the official result is in. live means the match is being played now. scheduled means it is on the calendar and has not started. unconfirmed means the match was played but no official result has been published yet, which happens occasionally with smaller events; it updates when the result arrives.
Live scores are refreshed about every 10 seconds while play is on. When a match ends its final score is kept straight away, and the official result replaces it as soon as it is confirmed. Full results for the day are complete and checked the next morning, which is why yesterday's results are available on every plan.
Yes. /v1/rankings gives the top 100 of every world ranking list, senior and youth: men's and women's singles, and men's, women's and mixed doubles ranked by pair or by each player, with points and the places moved since the week before. It is on every plan, the free key included.
A new list comes out every week and we keep each one, so ranking history runs from October 2026. /v1/players/{id}/rankings gives a player's ranking week by week on the Live, Archive and Complete plans.
Point by point for main-draw singles is on the way for the Live, Archive and Complete plans: who served, who won each point and the running score, so you can draw momentum charts and serve and return stats. The homepage shows what it will look like. Everything else described on this page is available today.
Call /v1/live every 10 seconds or so. It returns every match being played now, across every table and event, with the score in games and the points in the game in progress. Draw each match, and when one leaves the list it has finished; its final score is in /v1/matches/{id}.
The response meta tells you how many matches are live, how far behind real time the data is and how often to poll.
/v1/live is on the Live and Complete plans. The free key can still see today's matches and their status through /v1/matches, which is enough to build and test your page before you upgrade.
50 calls a day and 10 a minute, reading yesterday, today and the matches scheduled ahead. It covers results, matches, events and players, including /v1/results/yesterday. Game scores, match length and table come back empty, and live scores, a player's full match list and head to head need a paid plan. It is free for as long as you use it.
Live is for live scores apps: live scores, every game score, and every match from 1 January this year onwards, with 20,000 calls a day.
Archive is for research and stats sites: every result since December 2024 up to yesterday, with every game score, player match lists and head to head, also 20,000 calls a day.
Complete is both together, live scores and the whole archive, with higher limits of 50,000 calls a day and 120 a minute.
The call is refused with 429: rate_limited if you went over the per-minute limit, or quota_exceeded if you used the day's allowance. Nothing is charged. Every response carries X-RateLimit-Remaining and X-Quota-Remaining headers, and /v1/usage (which does not count against your allowance) shows your calls today and when the count resets.
Yes, at any time from your dashboard, and your key keeps working throughout. An upgrade takes effect immediately. If you cancel, your plan runs to the end of the period you have paid for and then returns to the free key. Yearly billing costs ten months for twelve.
Payments are processed securely by Stripe, and the charge shows as DEVELOPERDATA.NET. If you have a question about a charge, the billing help page at developerdata.net/support looks it up for you.
Send your key in a header, either Authorization: Bearer <key> or X-API-Key: <key>. Keys in the address are refused on purpose, because addresses end up in logs and browser history. Keep the key on your server rather than in code that runs in a visitor's browser.
Lists return 50 rows by default and up to 200 with per_page. Most lists page with page, and meta tells you the total and the number of pages. Long histories such as a player's matches use a cursor instead: pass meta.next_cursor back as cursor to get the next page. Date ranges on /v1/matches can span up to 31 days a call.
Every id has a prefix that says what it is: ev_ for events, mt_ for matches and pl_ for players, followed by a short code. They never change, so you can store them.
Errors come back as JSON with a short code and a plain message: 400 bad_request for a malformed value, 401 unauthorized for a missing or revoked key, 403 upgrade_required when the data is outside your plan (the message names the plans that include it), 404 not_found, 422 unknown_parameter when a filter name is misspelt, and 429 for limits.
Start times are in UTC, written like 2026-03-14T09:40:00Z. The date of a match is the local day of play at the venue, so a match on the evening of 14 March in Macao is dated 14 March wherever you are. Filters such as ?date= use that local day.
Yes. Our MCP server gives AI assistants 14 tools, from live matches to head to head, that call the API with your key. Add your MCP address, shown on your dashboard, to any app that supports MCP servers or connectors, and ask questions in plain words. Each tool follows your plan, so a free key can answer questions about results and players.
Yes. llms.txt gives language models a short guide to the API, and the OpenAPI file describes every endpoint, filter and field, so you can build your own agent, generate a client or import everything into Postman in one step.
Yes. Every plan lets you use the data inside your own website, app or service and show it to your users. What you cannot do is resell or redistribute the raw data as a feed of your own. If you need that, or limits above the Complete plan, ask us about a data licence.
The documentation covers every endpoint with examples you can run. If you are stuck, open a ticket from the support page and we will reply by email; paid plans can open tickets, and Complete is answered first. Billing questions go to developerdata.net/support.
Free key, no card, 50 calls a day. Build it today, upgrade when your users want live scores and the whole archive.