Official Python client for the Live Tennis API.
Real-time tennis scores, players, rankings, match-winner market prices and model win-probability — for ATP, WTA, Challenger and ITF, over REST and WebSocket.
pip install livetennisapi # REST client + CLI
pip install "livetennisapi[all]" # + WebSocket feed and rich CLI tablesfrom livetennisapi import LiveTennisAPI
with LiveTennisAPI(api_key="twjp_…") as client: # or set LIVETENNISAPI_KEY
for match in client.list_matches(status="live"):
print(match.tournament, match.p1.name, "vs", match.p2.name, match.score.sets)Async is the same API, awaited:
from livetennisapi import AsyncLiveTennisAPI
async with AsyncLiveTennisAPI() as client:
match = await client.get_match(18953)The package ships a livetennis command:
$ livetennis live
Live matches (3)
ID Tournament Rd Players Score
18953 ATP Wimbledon R16 *Alcaraz / Sinner 6-4 3-6 2-1 (40-30)
$ livetennis match 18953
$ livetennis players djokovic
$ livetennis watch --match 18953 # live WebSocket streamfrom livetennisapi import LiveScoreStream
with LiveScoreStream() as stream:
for update in stream:
print(update.match_id, update.score.sets)Reconnects automatically with backoff and re-subscribes. Heartbeats are consumed internally, so you only see real score changes. It deliberately does not reconnect on a bad key or an insufficient tier — those raise immediately rather than retry forever.
| FREE | BASIC | PRO | ULTRA | |
|---|---|---|---|---|
list_matches get_match get_match_score |
✅ | ✅ | ✅ | ✅ |
search_players get_player list_fixtures |
✅ | ✅ | ✅ | ✅ |
list_completed_matches (history) |
— | ✅ | ✅ | ✅ |
list_match_events list_markets get_market_prices |
— | — | ✅ | ✅ |
get_match_analysis, win_probability_p1 / danger, WebSocket |
— | — | — | ✅ |
Calling above your tier raises UpgradeRequired, which tells you which tier you need:
from livetennisapi import UpgradeRequired
try:
client.get_match_analysis(18953)
except UpgradeRequired as exc:
print(exc.required_tier) # 'ULTRA'| Exception | When |
|---|---|
Unauthorized |
401 — key missing, unknown, or disabled |
UpgradeRequired |
403 — valid key, tier too low (carries .required_tier) |
NotFound |
404 — no such resource, or no data yet |
RateLimited |
429 — carries .retry_after in seconds |
ServerError / ServiceUnavailable |
5xx |
APIConnectionError / APITimeoutError |
never reached the API |
All inherit from LiveTennisAPIError.
Requests retry automatically on 429 and 5xx only, honouring Retry-After
with exponential backoff and jitter. Other 4xx are never retried — a bad key or
an unentitled tier cannot start working, and retrying only burns rate limit.
limit defaults to 50; the API rejects anything above 200. To walk everything —
paginate() clamps the page size for you:
for player in client.paginate("search_players", search="nadal"):
print(player.name)The API ships additive changes within v1, so this client never rejects a
field it doesn't recognise. Unknown fields stay reachable:
match = client.get_match(18953)
match.raw["some_new_field"] # present if the server sent it
match.some_new_field # also worksThat means a new server-side field is usable without upgrading this package.
games is player-major, not set-major:
score.games # [[6, 3, 2], [4, 6, 1]] -> 6-4, 3-6, 2-1
# ^p1 per set ^p2 per set
score.sets # [1, 1] -> one set each
score.server # 1 or 2Indexing it the other way is the most common mistake made against this API, so there's a helper:
score.games_for_set(0) # (6, 4)LiveTennisAPI(
api_key="twjp_…", # or $LIVETENNISAPI_KEY
base_url=None, # or $LIVETENNISAPI_BASE_URL
timeout=30.0,
max_retries=2,
auth_header="bearer", # or "x-api-key"
)Issues and pull requests welcome at livetennisapi/livetennisapi-python.
pip install -e ".[dev]"
pytest -m "not contract" # unit tests, offline
LIVETENNISAPI_KEY=twjp_… pytest -m contract # verify against the live APIThe contract tests assert that the live API's real responses match these models. If the API and the spec disagree, that's a bug worth reporting.
Everything in the Live Tennis API developer surface:
| Install | Source | Package | |
|---|---|---|---|
| Python client (this repo) | pip install livetennisapi |
— | package |
| JavaScript / TypeScript client | npm install livetennisapi |
repo | package |
| MCP server for LLM agents | npx livetennisapi-mcp |
repo | package |
- API reference — https://docs.livetennisapi.com (plain-HTML version, no JavaScript required)
- OpenAPI 3.1 specification — livetennisapi/openapi
- Website and plans — https://livetennisapi.com
MIT — see LICENSE. Use of the API service is governed by the Terms of Service.