A tennis API is an HTTP service that returns tennis data as JSON your code can read. That means live scores, player and ranking data, fixtures, historical match tape and market prices. The Live Tennis API covers ATP, WTA, Challenger and ITF, with a free tier (no card) for live scores, players and fixtures.
This guide is the overview: what the API returns, how the tiers split, and a runnable quickstart in curl, Python and JavaScript. It ends with links to five deep-dives for the surfaces you're most likely to build on.
What the Live Tennis API returns
Every request goes to the base URL https://api.livetennisapi.com/api/public/v1 and authenticates with an X-API-Key header. Responses are JSON. The core surfaces:
GET /matches?status=liveandGET /matches/{id}/scorefor live matches and scoresGET /players/{id}for a player with current ranking and Elo ratingGET /fixturesfor upcoming matchesGET /rankings?system=atp|wta|elo|utrfor the rankings listingGET /matches/{id}/pointsfor the point-by-point tapeGET /matches/{id}/analysisfor match analysis and win probabilityGET /markets/{id}/pricesfor market pricesWS /wsfor the live stream
There is no draws/bracket endpoint. We cover professional tennis tours only (not table tennis).
Tiers and what each includes
Entitlements are cumulative. Each tier includes everything below it.
| Tier | Price | Rate limits | Adds |
|---|---|---|---|
| Free | $0 (no card) | 30/min, 100/day | Live matches & scores, players (ranking + Elo), fixtures, usage |
| Basic | $9.99/mo | 60/min, 1k/day | Completed-match history + point-by-point tape |
| Pro | $29.99/mo | 300/min, 10k/day | Market prices/events, rank-ordered rankings listing |
| Ultra | $99.99/mo | 600/min, 500k/day | Win-probability/analysis, live per-point events, WebSocket stream |
The Free tier gives you the current state of play: live scores, any player's own current ranking and Elo, and upcoming fixtures. Grab a key at livetennisapi.com/subscribe/free.
Quickstart
Set your API key once and pull the current live matches.
curl
export TENNIS_API_KEY="your_key_here"
# Live matches right now
curl -s https://api.livetennisapi.com/api/public/v1/matches?status=live \
-H "X-API-Key: $TENNIS_API_KEY"
# The current score for one match
curl -s https://api.livetennisapi.com/api/public/v1/matches/12345/score \
-H "X-API-Key: $TENNIS_API_KEY"
Python
Authenticate with the X-API-Key header and call the endpoints directly with requests:
import os, requests
BASE = "https://api.livetennisapi.com/api/public/v1"
headers = {"X-API-Key": os.environ["TENNIS_API_KEY"]}
# Every live match across ATP, WTA, Challenger, ITF
r = requests.get(f"{BASE}/matches", params={"status": "live"}, headers=headers)
r.raise_for_status()
for match in r.json().get("matches", []):
print(match["id"], match["status"])
# A player's current ranking and Elo (free tier)
p = requests.get(f"{BASE}/players/4321", headers=headers)
p.raise_for_status()
print(p.json())
An official Python SDK is available too (pip install livetennisapi) and wraps these same endpoints.
JavaScript
Use fetch with the same base URL and header:
const BASE = "https://api.livetennisapi.com/api/public/v1";
const headers = { "X-API-Key": process.env.TENNIS_API_KEY };
const res = await fetch(`${BASE}/matches?status=live`, { headers });
const { matches } = await res.json();
for (const m of matches) {
console.log(m.id, m.status);
}
An official JavaScript SDK (npm i livetennisapi) wrapping the same endpoints is available for Node and modern runtimes.
The full reference lives at docs.livetennisapi.com, with an OpenAPI spec at github.com/livetennisapi/openapi.
There's also an MCP server at mcp.livetennisapi.com if you're wiring the data into an AI agent.
Deep-dives
Each surface has its own guide with worked examples:
- Tennis scores API: live ATP & WTA scores, the free live-score surface.
- Tennis stats API & player database, covering players, rankings and Elo.
- Tennis point-by-point data API, the history tape (Basic) and live per-point events (Ultra).
- Tennis odds & market-prices API, the match-winner market prices (Pro).
- Tennis API comparison for developers (2026), how we sit alongside the alternatives.