ATP + WTA · 1968 → TODAY

Every point since 1968.
One API.

1.7 million matches, 5.5 million ranking weeks, live scores and webhooks — the entire Open Era behind a single key.

Start free Read the docs
tennisapi.dev — bash
0matches
0ranking weeks
0players
0seasons deep
The tennis data stack

Ask fifty-eight years of tennis a question.

Rivalries, ranking runs, surface splits, live scoreboards — normalized, indexed, and one HTTPS call away.

Ask it like a broadcaster

Rivalry records, ranking runs, surface splits — questions your commentary team asks, answered in one HTTPS call.

Open Era archive illustration Live radar illustration Rankings trophy illustration Head to head illustration

Five decades in the deck

Throw a card to shuffle the eras. Main draws, quallies, Challengers and ITF — 1.7M matches with set scores and serve stats.

Hard Clay Grass Carpet Hard Clay Grass Carpet
Grand Slam Masters Challenger ITF Grand Slam Masters Challenger ITF
Finals only Tiebreak sets Five-setters Finals only Tiebreak sets Five-setters

Filter by anything

Surface, tier, round, year, tour — every match is indexed the way tennis people actually ask for it.

ATP
WTA
REST
WS
HOOK
JSON

One key, every orbit

Both tours, REST and WebSocket, webhooks and clean JSON — all circling a single API key on the Cito platform.

Rankings trophy Live radar

Deep data, current data

The archive reaches back to 1968; the live layer lands the moment a set ends. One schema covers both.

For product teams

Ship the tennis features users brag about

The pages fans screenshot — rivalry cards, career arcs, tournament history — are each a single call against data that's already clean.

Rivalry pages: full head-to-head with surface, finals and Slam splits from /tennis/h2h

Career timelines: every ranking Monday of a player's life, ready for a chart

Draw explorers: 58k tournaments with tiers, surfaces and round-by-round results

Stylized tournament scoreboard illustration
For live products

Build the second screen the broadcast can't match

Push, don't poll: scores and match events stream to your app the moment they land, backed by the same archive for instant context.

WebSocket push: subscribe to a match and receive every score change live

Webhooks: match start, set won, final result — delivered to your endpoint with proof rows

Instant context: pair any live match with its players' history in one extra call

Analytics dashboard tiles illustration

Four courts, one racquet.

Everything below ships from the same base URL with the same key — pick the surface your product plays on and serve.

Head-to-Head

Forty-one chapters of Federer–Nadal in one response

Give us two player IDs and get the whole story back: match-by-match history, surface splits, finals record, Grand Slam meetings, and who leads where. Pre-computed for the classic rivalries, computed on demand for everyone else — including the rivalry that hasn't happened yet.

See documentation
Head to head illustration
Rankings

5.5 million Mondays, queryable by date

Ask for any ranking week in history and get the full table — points, movement, tournaments played. Rebuild the week Graf hit No. 1, chart a career from 800 to the top, or just pull the current top ten for your homepage.

See documentation
Rankings trophy illustration
Live Scores

Scores that land before the applause fades

Poll REST for live scoreboards, subscribe over WebSocket for point-level push, or register a webhook and let match start, set won, and final result arrive at your endpoint — with delivery proof rows so you never wonder if you missed one.

See documentation
Live radar illustration
Archive

The Open Era, drawer by drawer

1.7 million matches with set scores, serve stats, seeds, entries and round order — main draws to ITF qualies. Filter by year, surface, tier, round or tour, and page through five decades without a single scrape of your own.

See documentation
Archive drawers illustration
Endpoints

Small surface. Deep water.

GET/tennis/playerssearch & bios, both tours GET/tennis/matches1.7M matches, filterable GET/tennis/h2hany rivalry, resolved GET/tennis/rankingsevery week since the 70s GET/tennis/tournaments58k draws with tiers & surfaces GET/tennis/livescoreboards + WebSocket push GET/tennis/competitionsrecurring events across eras GET/tennis/players/{id}/matchesfull match logs per player GET/tennis/odds/{matchId}h2h · spreads · totals (games)

Game. Set. Data.

Free tier to prove it, production tiers when you ship. Your first call is thirty seconds away.

Get your API key Explore the docs