← Developer blog

Tennis scores API: live ATP & WTA scores (free)

A free tennis scores API for live ATP, WTA, Challenger and ITF matches. Poll live matches and per-match scores with one header, X-API-Key.

· · By the Live Tennis API team

Tennis scores API: live ATP & WTA scores

A tennis scores API returns the current state of play: which matches are live and what the score is right now. With Live Tennis API you list live matches at GET /matches?status=live and read one match's score at GET /matches/{id}/score, across ATP, WTA, Challenger and ITF. Both are on the free tier.

The base URL is https://api.livetennisapi.com/api/public/v1 and every request authenticates with an X-API-Key header. You can get a free API key without a card. The free tier allows 30 requests/minute and 100 requests/day, which is enough to poll a live scoreboard.

What the free tier covers

The free tier is built for the current state of play:

Completed-match history and the point-by-point tape start on Basic. See tennis point-by-point data.

For the full surface and tiers, read the tennis API developer guide.

Get live tennis scores (curl)

List what's live right now:

curl -s "https://api.livetennisapi.com/api/public/v1/matches?status=live&tour=atp" \
  -H "X-API-Key: $LIVETENNIS_API_KEY"

Then read one match's score by its id:

curl -s "https://api.livetennisapi.com/api/public/v1/matches/12345/score" \
  -H "X-API-Key: $LIVETENNIS_API_KEY"

/matches/{id}/score is the lowest-overhead read. Use it when you already know the match id and only need the score to tick over.

Poll a live scoreboard in Python

import os, time, requests

BASE = "https://api.livetennisapi.com/api/public/v1"
HEADERS = {"X-API-Key": os.environ["LIVETENNIS_API_KEY"]}

def live_scoreboard(tour="wta"):
    r = requests.get(f"{BASE}/matches",
                     params={"status": "live", "tour": tour},
                     headers=HEADERS, timeout=10)
    r.raise_for_status()
    for m in r.json().get("matches", []):
        print(m["id"], "-", m.get("score"))

# Refresh every 20s to stay well inside the free 30 req/min limit
while True:
    live_scoreboard()
    time.sleep(20)

Prefer not to hand-roll HTTP? The official SDK wraps the same endpoints: pip install livetennisapi.

JavaScript / Node

const BASE = "https://api.livetennisapi.com/api/public/v1";
const headers = { "X-API-Key": process.env.LIVETENNIS_API_KEY };

async function liveScores(tour = "atp") {
  const res = await fetch(`${BASE}/matches?status=live&tour=${tour}`, { headers });
  if (!res.ok) throw new Error(`HTTP ${res.status}`);
  const { matches } = await res.json();
  return matches.map((m) => ({ id: m.id, score: m.score }));
}

liveScores().then(console.log);

There's a JavaScript SDK too (npm i livetennisapi), plus an OpenAPI spec and an MCP server at mcp.livetennisapi.com if you're wiring scores into an AI agent.

How often should I poll?

The free tier is 30 requests/minute and 100 requests/day. A single scoreboard call every ~20 seconds fits comfortably and keeps scores fresh. If you're tracking many matches independently, poll the lightweight /matches/{id}/score per match instead of re-listing everything, and mind the daily cap. Push instead of polling, meaning the WebSocket live stream and live per-point events, is on the Ultra tier (WS /ws).

Full endpoint reference and response fields live at docs.livetennisapi.com.

Frequently asked questions

Is there a free tennis scores API?

Yes. Live Tennis API's free tier needs no card. It gives you live matches (`GET /matches?status=live`) and per-match scores (`GET /matches/{id}/score`) for ATP, WTA, Challenger and ITF, singles and doubles. The limits are 30 requests/minute and 100 per day. That is the current state of play: what is on court now, the running score, and who is serving. It does not include completed-match history, the point-by-point tape, market prices or the WebSocket stream. Those begin at Basic ($9.99/mo) and above. Grab a key at livetennisapi.com/subscribe/free and you can make your first call immediately.

How do I get live ATP and WTA scores from the API?

Call `GET /matches?status=live` with an `X-API-Key` header to list in-progress matches, filtering with `tour=atp` or `tour=wta`. For a single known match, `GET /matches/{id}/score` is the lowest-latency read. The base URL is `https://api.livetennisapi.com/api/public/v1`. One thing to know before you parse the response: every score array is player-major. So `"sets": [1,0]` means player one leads by a set, `"games": [[6,3],[4,4]]` is 6-4 then 3-4, and `"server": 1` means player one is serving. Both endpoints work on the free key.

What tours does the scores API cover?

ATP, WTA, Challenger and ITF, singles and doubles, including the lower tiers many feeds skip. Use the `tour` query parameter to filter live matches to one circuit. Coverage is the same on every tier. What changes between tiers is the depth of data per match, not which matches you can see. There is no table tennis coverage. The two get confused in search, so we say it plainly. You can verify the coverage yourself with a free key by calling `GET /matches?status=live` and reading the tours that come back.

How fast can I poll live scores on the free tier?

Up to 30 requests per minute and 100 per day. Polling one scoreboard call roughly every 20 seconds stays well inside those limits. For real-time push instead of polling, the WebSocket stream (WS /ws) is available on the Ultra tier.

Do I need a credit card to start?

No. The free key at livetennisapi.com/subscribe/free requires no card and no trial period. It is a permanent tier, so there is nothing to cancel and nothing that expires. It covers live matches and scores, fixtures, players with their current ranking and Elo, and your own usage. The limits are 30 requests/minute and 100 per day. You only add a card if you need what the paid tiers carry. That is completed-match history and the point-by-point tape at Basic, market prices at Pro, or win-probability, live per-point events and the WebSocket stream at Ultra.

Built with the Live Tennis API, which serves real-time scores, players, odds and model win-probability for ATP, WTA, Challenger and ITF.

API reference SDKs on GitHub Plans from $9.99/mo