Docs/API Reference/Tennis API

Tennis API

The full tennis archive behind one key: 1.78M ATP & WTA matches since 1877, 5.5M weekly ranking rows, head-to-head records, tournament draws, player careers, and live scores.

BASEhttps://api.citoapi.com/api/v1
Tennis API RootAppend any endpoint path below.

58 seasons of history, one date parameter away

Ask /tennis/rankings?date=1990-08-13 for the world as it stood that Monday, or query /tennis/matches by year, surface, round, and tier all the way back to the first Wimbledon in 1877 — with exact days verified against source results pages from 2004 onward. Every response is clean JSON with stable IDs.

GET /api/v1/tennis/h2h?player1_id=atp_103819&player2_id=atp_104745

What tennis data is available?

1,776,000+ matches from 1877 to today: main draws, qualifying, Challengers, and ITF for both tours
5,566,184 weekly ranking rows — every published ATP and WTA ranking Monday, queryable by date
140,000+ player profiles with dob, hand, country, activity status, and career statistics
58,000+ tournament editions with tier, surface, dates, and round-by-round draws
Head-to-head records for any pairing, with surface, level, and year splits — plus multi-player H2H matrices with ranks
Set scores and serve statistics (aces, double faults, break points) on the match archive
Live scoreboards for in-progress matches with per-match detailed state
Career ranking trajectories per player — chart a run from qualifier to world No. 1
Season calendars and historical draw brackets for schedule and bracket UIs
Exact match days verified against source results pages from 2004 onward and for every live-ingested match: ~263,000 rows carry date_source='tennisexplorer-results'. Rows before 2004 carry their tournament's start date (date_is_tournament_start=true) — filter those eras by tournament, not by exact day

Rivalry pages

Use /tennis/h2h for any pairing in history — totals, surface splits, finals, and Slams — or /h2h/matrix for group boards.

Rankings products

Weekly tables by date, top-N snapshots, available-week listings, and per-player career trajectories ready for charts.

Player profiles

Search, bios, and career statistics with surface and year filters for profile screens and scouting tools.

Draws & calendars

Season calendars plus round-by-round draw brackets for 58k tournament editions, including historical editions.

Scores & results

Live scoreboards with per-match detail, and /matches/recent for results feeds the moment matches finish.

No-friction workflow

1Find the players
GET /tennis/players/search?q=federer
2Settle the rivalry
GET /tennis/h2h?player1_id=atp_103819&player2_id=atp_104745
3Pull their matches
GET /tennis/matches?player_id=atp_103819&opponent_id=atp_104745
4Chart the careers
GET /tennis/rankings/history/atp_103819
5Open a draw
GET /tennis/tournaments/{tournamentId}/draw
6Watch it live
GET /tennis/matches/live

Start here for rivalry pages, ranking charts, or draw explorers. All endpoints return clean JSON with stable IDs.

Endpoints

Tennis coverage paths for players, the match archive, head-to-heads, rankings, tournaments, and live scores. Odds endpoints are listed below and launching soon.

GET/api/v1/tennis/players?q=alcaraz&tour=ATP
List PlayersList and filter players across ATP and WTA with pagination and sorting.

Summary

List and filter players across ATP and WTA with pagination and sorting.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/players?q=alcaraz&tour=ATP" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/players/search?q=sinner
SearchAutocomplete search with fuzzy fallback ("alcarez" finds Carlos Alcaraz) and curated nicknames ("Nole").

Summary

Autocomplete search with fuzzy fallback ("alcarez" finds Carlos Alcaraz) and curated nicknames ("Nole").

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/players/search?q=sinner" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/players/batch?ids=atp_207989,atp_206173
BatchFetch up to 50 players in one call for rosters; unresolved ids are listed in `missing`.

Summary

Fetch up to 50 players in one call for rosters; unresolved ids are listed in `missing`.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/players/batch?ids=atp_207989,atp_206173" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/players/{playerId}
PlayerIdPlayer biographical profile: dob, hand, backhand, height, country, current rank, career high.

Summary

Player biographical profile: dob, hand, backhand, height, country, current rank, career high.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/players/{playerId}" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/players/{playerId}/stats
PlayerId StatsCareer statistics with surface, level, and year-range filters. Unknown surfaces return a 422 listing valid values.

Summary

Career statistics with surface, level, and year-range filters. Unknown surfaces return a 422 listing valid values.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/players/{playerId}/stats" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/players/{playerId}/matches
MatchesOne player's full match log, newest first, with the same archive filters.

Summary

One player's full match log, newest first, with the same archive filters.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/players/{playerId}/matches" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/matches?surface=Clay&year=2024
MatchesQuery the 1.78M-match archive by player, opponent, tour, year, surface, tournament, round, or level.

Summary

Query the 1.78M-match archive by player, opponent, tour, year, surface, tournament, round, or level.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/matches?surface=Clay&year=2024" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/matches/recent?tour=ATP
Recent MatchesMost recent completed tour matches — results feeds and score tickers.

Summary

Most recent completed tour matches — results feeds and score tickers.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/matches/recent?tour=ATP" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/matches/completed?date=YYYY-MM-DD
CompletedFinalised ATP/WTA matches for one calendar day.

Summary

Finalised ATP/WTA matches for one calendar day.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/matches/completed?date=YYYY-MM-DD" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/matches/live
Live MatchesAll currently live matches with scoreboards.

Summary

All currently live matches with scoreboards.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/matches/live" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/matches/live/{matchId}
MatchIdDetailed live state for one match: sets, games, serve, momentum.

Summary

Detailed live state for one match: sets, games, serve, momentum.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/matches/live/{matchId}" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/matches/{matchId}
MatchIdFull match detail and box score, including set-by-set lines.

Summary

Full match detail and box score, including set-by-set lines.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/matches/{matchId}" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/matches/{matchId}/stats
MatchId StatsServing/return statistics slice for one match; gaps carry a machine-readable reason.

Summary

Serving/return statistics slice for one match; gaps carry a machine-readable reason.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/matches/{matchId}/stats" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/matches/{matchId}/timeline
TimelineSet-level match events; `coverage.point_history` states plainly when point-by-point does not exist.

Summary

Set-level match events; `coverage.point_history` states plainly when point-by-point does not exist.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/matches/{matchId}/timeline" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/matches/{matchId}/status
StatusMatch status, source status, and is_final without the full box score.

Summary

Match status, source status, and is_final without the full box score.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/matches/{matchId}/status" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/matches/{matchId}/tournament-link
Tournament LinkResolve any match id dialect to its tournament; un-reconciled live matches report a reason, never a guessed id.

Summary

Resolve any match id dialect to its tournament; un-reconciled live matches report a reason, never a guessed id.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/matches/{matchId}/tournament-link" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/h2h?player1_id=…&player2_id=…
H2hHead-to-head rivalry record with surface, level, and year filters.

Summary

Head-to-head rivalry record with surface, level, and year filters.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/h2h?player1_id=…&player2_id=…" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/h2h/matrix?player_ids=a,b,c
MatrixMulti-player head-to-head grid — with per-player wins, current rank, and career high.

Summary

Multi-player head-to-head grid — with per-player wins, current rank, and career high.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/h2h/matrix?player_ids=a,b,c" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/rankings?tour=ATP&date=1990-08-13
RankingsWeekly ATP/WTA rankings table for any published Monday since the 1970s, with movement vs the previous list.

Summary

Weekly ATP/WTA rankings table for any published Monday since the 1970s, with movement vs the previous list.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/rankings?tour=ATP&date=1990-08-13" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/rankings/top?tour=WTA&top_n=10
TopCompact top-N snapshot of the latest rankings.

Summary

Compact top-N snapshot of the latest rankings.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/rankings/top?tour=WTA&top_n=10" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/rankings/dates?tour=ATP&year=2005
DatesList available ranking weeks — drive date pickers and sliders.

Summary

List available ranking weeks — drive date pickers and sliders.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/rankings/dates?tour=ATP&year=2005" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/rankings/history/{playerId}
PlayerIdOne player's full career ranking trajectory, chart-ready.

Summary

One player's full career ranking trajectory, chart-ready.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/rankings/history/{playerId}" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/rankings/movers?tour=ATP&direction=up
MoversClimbers, fallers, new entries and drop-outs between two published lists.

Summary

Climbers, fallers, new entries and drop-outs between two published lists.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/rankings/movers?tour=ATP&direction=up" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/rankings/{circuit}
CircuitCircuit-style rankings path: atp or wta (singles). Unavailable circuits return a structured 404.

Summary

Circuit-style rankings path: atp or wta (singles). Unavailable circuits return a structured 404.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/rankings/{circuit}" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/standings?tour=ATP&top_n=10
StandingsLatest tour standings (singles).

Summary

Latest tour standings (singles).

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/standings?tour=ATP&top_n=10" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/tournaments?level=G&surface=Grass
List TournamentsList and filter 58k tournament editions by tour, tier, surface, or country.

Summary

List and filter 58k tournament editions by tour, tier, surface, or country.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/tournaments?level=G&surface=Grass" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/tournaments/calendar?year=2026
CalendarSeason calendar for a year — schedule pages and timelines.

Summary

Season calendar for a year — schedule pages and timelines.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/tournaments/calendar?year=2026" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/tournaments/{tournamentId}
TournamentIdTournament profile with tier, surface, dates, and location.

Summary

Tournament profile with tier, surface, dates, and location.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/tournaments/{tournamentId}" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/tournaments/{tournamentId}/draw
DrawFull draw bracket for a tournament edition, round by round, with seeds and entry designations.

Summary

Full draw bracket for a tournament edition, round by round, with seeds and entry designations.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/tournaments/{tournamentId}/draw" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/tournaments/{tournamentId}/bracket
BracketBracket alias of the draw endpoint.

Summary

Bracket alias of the draw endpoint.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/tournaments/{tournamentId}/bracket" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/tournaments/{tournamentId}/editions/{year}/draw
DrawDraw bracket for a specific historical edition.

Summary

Draw bracket for a specific historical edition.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/tournaments/{tournamentId}/editions/{year}/draw" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/tournaments/{tournamentId}/schedule
ScheduleMatches of one tournament edition in date and round order.

Summary

Matches of one tournament edition in date and round order.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/tournaments/{tournamentId}/schedule" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/competitions?q=wimbledon
CompetitionsRecurring competitions across editions, with edition counts and year spans.

Summary

Recurring competitions across editions, with edition counts and year spans.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/competitions?q=wimbledon" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/leaderboards/aces?tour=ATP
AcesSeason aces leaderboard — one of nine statistical boards.

Summary

Season aces leaderboard — one of nine statistical boards.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/leaderboards/aces?tour=ATP" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/leaderboards/{board}?tour=ATP&year=2025
BoardNine boards: aces, 1st-serve-won, break-conversion, break-points-saved, comeback-wins, deciding-set-record, finals-record, return-games-won, tiebreak-win-pct.

Summary

Nine boards: aces, 1st-serve-won, break-conversion, break-points-saved, comeback-wins, deciding-set-record, finals-record, return-games-won, tiebreak-win-pct.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/leaderboards/{board}?tour=ATP&year=2025" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/schedule?date=YYYY-MM-DD
ScheduleThe day's matches across tours. Start times are best-effort: `start_time_known=false` means the source published no time.

Summary

The day's matches across tours. Start times are best-effort: `start_time_known=false` means the source published no time.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/schedule?date=YYYY-MM-DD" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/coverage
CoveragePer-tour data bounds, match-archive totals, and day-verification counts.

Summary

Per-tour data bounds, match-archive totals, and day-verification counts.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/coverage" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/health
HealthService health. /tennis/health/sync adds sync freshness.

Summary

Service health. /tennis/health/sync adds sync freshness.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/health" \
  -H "x-api-key: YOUR_API_KEY"

Odds

Coming soon

Betting odds endpoints are on the way. Hard rule: spreads and totals will be games, never points or sets.

GET/api/v1/tennis/odds/{matchId}
MatchIdPre-match odds: h2h, spreads, totals in decimal. Spreads and totals are GAMES lines, never points or sets.

Summary

Pre-match odds: h2h, spreads, totals in decimal. Spreads and totals are GAMES lines, never points or sets.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/odds/{matchId}" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/tennis/odds/{matchId}/live
Live MatchesIn-play odds, same shape and rules as pre-match.

Summary

In-play odds, same shape and rules as pre-match.

REST
Bash
curl "https://api.citoapi.com/api/v1/tennis/odds/{matchId}/live" \
  -H "x-api-key: YOUR_API_KEY"

Tell us which markets you need

Sportsbooks like DraftKings or Pinnacle, exchanges, prediction markets like Kalshi. We build what people ask for, and your request goes straight to the team.

Head-to-head example

curl "https://api.citoapi.com/api/v1/tennis/h2h?player1_id=atp_103819&player2_id=atp_104745" \
  -H "x-api-key: YOUR_API_KEY"

# → 41 matches, Nadal 24–17, with surface, finals, and Grand Slam splits

Narrow any head-to-head with surface=Clay, level=G, or year_from / year_to.

Start with a free key

Test tennis endpoints with 500 free requests/month. Scale up for production rivalry pages, ranking charts, or live scoreboards.