$ curl "https://api.citoapi.com/api/v1/tennis/h2h?player1_id=atp_103819&player2_id=atp_104745" \
-H "x-api-key: YOUR_API_KEY"
{ "player1": { "name": "Roger Federer", "wins": 17 },
"player2": { "name": "Rafael Nadal", "wins": 24 },
"summary": { "total_matches": 41, "grand_slam_matches": 14 } }What counts as complete tennis data?
Most tennis data APIs start at whatever season their scraper was born in. This one starts at Wimbledon 1968 — the beginning of the Open Era — and runs to the match that finished today. That depth changes what you can build: a rivalry page that includes the whole rivalry, a ranking chart that shows the entire career, a draw explorer that works for 1975 as well as it works for this week.
Built for product work, not just research
Responses are clean JSON with stable IDs, cursorless paging, and filters that match how tennis people think: surface, tier, round, tour, year. Player search is autocomplete-fast. Head-to-heads for classic rivalries are pre-computed. The archive and the live layer share one schema, so the code that renders a 1980 final renders this afternoon's quarterfinal.
The parts most APIs make you assemble
Head-to-head splits by surface and Slams. Multi-player H2H matrices for group stages. Career ranking trajectories ready for a chart. Historical draw brackets, edition by edition. Season calendars. They're endpoints here, not weekend projects.
The dataset behind it
Frequently asked
How far back does the tennis data go?
To 1968, the start of the Open Era, for both ATP and WTA — including qualifying, Challenger, and ITF matches.
Is there a free tier?
Yes — 500 requests/month free to evaluate, with paid tiers for production use.
What formats are supported?
REST endpoints returning JSON, with WebSocket and webhook delivery for live data.
Your first call is thirty seconds away
Free tier to prove it, production tiers when you ship.