Live Tennis API — Full Reference

Version 1.0 · OpenAPI 3.1.0 · Interactive reference · OpenAPI spec · livetennisapi.com

Real-time tennis scores, player data, match-winner market prices, and model-driven match analysis. Read-only.

Access is tiered (BASIC / PRO / ULTRA): match events and market prices need PRO; model analysis, live model fields (win_probability_p1, danger) and the WebSocket feed need ULTRA. A call above your tier returns 403 {"error":"upgrade_required"}.

All timestamps are UTC ISO 8601 with a Z suffix. List endpoints return {data, meta}; single resources return the object directly. Ignore unknown fields — additive changes land within v1.

A native WebSocket live feed (ULTRA) exists at /ws under the same base URL — see the API documentation for the frame protocol (subscribe with {"action":"subscribe","topics":["live-scores"]}; server pushes score frames + ping heartbeats).

Base URL

https://api.livetennisapi.com/api/public/v1

Authentication

Send your API key as a bearer token or in the X-API-Key header — either works. The /health endpoint needs no key.

Authorization: Bearer twjp_...
X-API-Key: twjp_...

Plans

PlanUnlocksRate limitPrice
BASICMatches, scores, players, fixtures, history60/min · 10,000/day$9.99/mo
PROAdds match events and market prices300/min · 100,000/day$29.99/mo
ULTRAAdds model analysis, win_probability_p1, danger, and the WebSocket feed600/min · 500,000/day$99.99/mo

Calling an endpoint above your plan returns 403 {"error":"upgrade_required"} — never a silent empty result. See pricing.

Official client libraries

LanguageInstallSource
Pythonpip install livetennisapilivetennisapi-python
JavaScript / TypeScriptnpm install livetennisapilivetennisapi-js
MCP server (LLM agents)npx livetennisapi-mcplivetennisapi-mcp

Conventions

Endpoints

GET /health

Liveness probe (no auth)

Plan required: · operationId: healthCheck

Responses

StatusMeaning
200OK

Response fields

FieldTypeDescription
statusstring
versionstring

Example

curl https://api.livetennisapi.com/api/public/v1/health

GET /matches

List matches by lifecycle status (BASIC)

Plan required: BASIC · operationId: listMatches

Parameters

NameInTypeRequiredNotes
statusquerystring (live, upcoming, completed)no Default live.
limitqueryintegerno Default 50.
offsetqueryintegerno Default 0.

Responses

StatusMeaning
200Matches with latest score
400Bad query parameter
401Missing, unknown, or disabled credentials
403Your tier doesn't unlock this endpoint
429Rate limit exceeded (Retry-After header present)

Response fields

FieldTypeDescription
dataarray of object
metaobject

Example

curl https://api.livetennisapi.com/api/public/v1/matches \
  -H "Authorization: Bearer twjp_..."

GET /matches/{matchId}

Full match detail (BASIC; +market PRO, +analysis ULTRA)

Plan required: ULTRA · operationId: getMatch

Parameters

NameInTypeRequiredNotes
matchIdpathintegeryes

Responses

StatusMeaning
200Match with score; market embed at PRO+, analysis embed at ULTRA
401Missing, unknown, or disabled credentials
403Your tier doesn't unlock this endpoint
404No such resource, or no data yet
429Rate limit exceeded (Retry-After header present)

Response fields

FieldTypeDescription
idinteger
tournamentstring
surfacestring or null (hard, clay, grass, null)
indoorboolean
formatstring or null (BO3, BO5, null)
roundstring or null
statusstring (upcoming, live, completed, cancelled)
event_statusstring or null
is_doublesboolean
scheduled_timestring or null
playersobject
scoreobject or null
winnerinteger or nullCompleted matches only — derived from final sets
analysisobjectULTRA only (absent below)
marketobject or nullPRO+ only (absent below)

Example

curl https://api.livetennisapi.com/api/public/v1/matches/18953 \
  -H "Authorization: Bearer twjp_..."

GET /matches/{matchId}/score

Current score only — lowest-latency REST read (BASIC)

Plan required: BASIC · operationId: getMatchScore

Parameters

NameInTypeRequiredNotes
matchIdpathintegeryes

Responses

StatusMeaning
200Current score (ULTRA adds win_probability_p1 + danger)
401Missing, unknown, or disabled credentials
404No such resource, or no data yet
429Rate limit exceeded (Retry-After header present)

Response fields

FieldTypeDescription
setsarray of integer
gamesarray of array of integer[games_p1, games_p2]; each a per-set list
pointsarray of string
serverinteger or null (1, 2, null)
is_tiebreakboolean
win_probability_p1number or null
dangernumber or null
timestampstring or null

Example

curl https://api.livetennisapi.com/api/public/v1/matches/18953/score \
  -H "Authorization: Bearer twjp_..."

GET /matches/{matchId}/events

Match events, newest first (PRO)

Plan required: PRO · operationId: listMatchEvents

Parameters

NameInTypeRequiredNotes
matchIdpathintegeryes
limitqueryintegerno Default 50.
offsetqueryintegerno Default 0.

Responses

StatusMeaning
200Events
401Missing, unknown, or disabled credentials
403Your tier doesn't unlock this endpoint
429Rate limit exceeded (Retry-After header present)

Response fields

FieldTypeDescription
dataarray of object
metaobject

Example

curl https://api.livetennisapi.com/api/public/v1/matches/18953/events \
  -H "Authorization: Bearer twjp_..."

GET /matches/{matchId}/analysis

Model analysis for a match (ULTRA)

Plan required: ULTRA · operationId: getMatchAnalysis

Parameters

NameInTypeRequiredNotes
matchIdpathintegeryes

Responses

StatusMeaning
200Thesis + profile (either may be null)
401Missing, unknown, or disabled credentials
403Your tier doesn't unlock this endpoint
404No such resource, or no data yet
429Rate limit exceeded (Retry-After header present)

Response fields

FieldTypeDescription
thesisobject or null
profileobject or null

Example

curl https://api.livetennisapi.com/api/public/v1/matches/18953/analysis \
  -H "Authorization: Bearer twjp_..."

GET /players

Search players by name (BASIC)

Plan required: BASIC · operationId: searchPlayers

Parameters

NameInTypeRequiredNotes
searchquerystringno
limitqueryintegerno Default 50.
offsetqueryintegerno Default 0.

Responses

StatusMeaning
200Players (ranked first; no stats object on the list)
401Missing, unknown, or disabled credentials
429Rate limit exceeded (Retry-After header present)

Response fields

FieldTypeDescription
dataarray of object
metaobject

Example

curl https://api.livetennisapi.com/api/public/v1/players \
  -H "Authorization: Bearer twjp_..."

GET /players/{playerId}

One player's bio + ranking + cached stats (BASIC)

Plan required: BASIC · operationId: getPlayer

Parameters

NameInTypeRequiredNotes
playerIdpathintegeryes

Responses

StatusMeaning
200Player with stats ({ratings, season})
401Missing, unknown, or disabled credentials
404No such resource, or no data yet
429Rate limit exceeded (Retry-After header present)

Response fields

FieldTypeDescription
idinteger
namestring
tourstring or null
countrystring or null
rankinginteger or null
ranking_pointsinteger or null
ranking_movementstring or null (up, down, same, null)
handstring or null (R, L, null)
backhandinteger or null (1, 2, null)
birthdaystring or null
is_doubles_teamboolean
statsobjectSingle-player endpoint only

Example

curl https://api.livetennisapi.com/api/public/v1/players/1104 \
  -H "Authorization: Bearer twjp_..."

GET /markets

Match-winner market(s) for a match (PRO)

Plan required: PRO · operationId: listMarkets

Parameters

NameInTypeRequiredNotes
match_idqueryintegeryes

Responses

StatusMeaning
200Markets
400Bad query parameter
401Missing, unknown, or disabled credentials
403Your tier doesn't unlock this endpoint
429Rate limit exceeded (Retry-After header present)

Response fields

FieldTypeDescription
dataarray of object
metaobject

Example

curl https://api.livetennisapi.com/api/public/v1/markets \
  -H "Authorization: Bearer twjp_..."

GET /markets/{matchId}/prices

Market + recent price ticks per side, newest first (PRO)

Plan required: PRO · operationId: getMarketPrices

Parameters

NameInTypeRequiredNotes
matchIdpathintegeryes
limitqueryintegerno Default 50.

Responses

StatusMeaning
200Market with prices
401Missing, unknown, or disabled credentials
403Your tier doesn't unlock this endpoint
404No such resource, or no data yet
429Rate limit exceeded (Retry-After header present)

Response fields

FieldTypeDescription
idinteger
questionstring or null
statusstring or null (active, resolved, closed, null)
volumenumber or null
liquiditynumber or null
end_datestring or null
pricesarray of objectPrices endpoint / match detail only; newest first

Example

curl https://api.livetennisapi.com/api/public/v1/markets/18953/prices \
  -H "Authorization: Bearer twjp_..."

GET /history/matches

Completed matches, newest first, with derived winner (BASIC)

Plan required: BASIC · operationId: listCompletedMatches

Parameters

NameInTypeRequiredNotes
limitqueryintegerno Default 50.
offsetqueryintegerno Default 0.

Responses

StatusMeaning
200Completed matches (winner = 1|2|null, from final sets)
401Missing, unknown, or disabled credentials
429Rate limit exceeded (Retry-After header present)

Response fields

FieldTypeDescription
dataarray of object
metaobject

Example

curl https://api.livetennisapi.com/api/public/v1/history/matches \
  -H "Authorization: Bearer twjp_..."

GET /fixtures

Upcoming scheduled fixtures, earliest first (BASIC)

Plan required: BASIC · operationId: listFixtures

Parameters

NameInTypeRequiredNotes
limitqueryintegerno Default 50.
offsetqueryintegerno Default 0.

Responses

StatusMeaning
200Name-only fixtures (players not yet resolved to ids)
401Missing, unknown, or disabled credentials
429Rate limit exceeded (Retry-After header present)

Response fields

FieldTypeDescription
dataarray of object
metaobject

Example

curl https://api.livetennisapi.com/api/public/v1/fixtures \
  -H "Authorization: Bearer twjp_..."

WebSocket feed (ULTRA)

A native WebSocket live feed is available at https://api.livetennisapi.com/api/public/v1/ws. Subscribe with {"action":"subscribe","topics":["live-scores"]} or {"action":"subscribe","topics":["match:<id>"]}. The server acknowledges with a subscribed frame, then pushes score frames on every change plus a ping heartbeat roughly every 15 seconds.

Schemas

Error

FieldTypeDescription
errorstring

ListMeta

FieldTypeDescription
limitinteger
offsetinteger
countinteger

Score

ULTRA adds win_probability_p1 + danger.

FieldTypeDescription
setsarray of integer
gamesarray of array of integer[games_p1, games_p2]; each a per-set list
pointsarray of string
serverinteger or null (1, 2, null)
is_tiebreakboolean
win_probability_p1number or null
dangernumber or null
timestampstring or null

Player

FieldTypeDescription
idinteger
namestring
tourstring or null
countrystring or null
rankinginteger or null
ranking_pointsinteger or null
ranking_movementstring or null (up, down, same, null)
handstring or null (R, L, null)
backhandinteger or null (1, 2, null)
birthdaystring or null
is_doubles_teamboolean
statsobjectSingle-player endpoint only

Match

FieldTypeDescription
idinteger
tournamentstring
surfacestring or null (hard, clay, grass, null)
indoorboolean
formatstring or null (BO3, BO5, null)
roundstring or null
statusstring (upcoming, live, completed, cancelled)
event_statusstring or null
is_doublesboolean
scheduled_timestring or null
playersobject
scoreobject or null
winnerinteger or nullCompleted matches only — derived from final sets

MatchDetail

FieldTypeDescription
idinteger
tournamentstring
surfacestring or null (hard, clay, grass, null)
indoorboolean
formatstring or null (BO3, BO5, null)
roundstring or null
statusstring (upcoming, live, completed, cancelled)
event_statusstring or null
is_doublesboolean
scheduled_timestring or null
playersobject
scoreobject or null
winnerinteger or nullCompleted matches only — derived from final sets
analysisobjectULTRA only (absent below)
marketobject or nullPRO+ only (absent below)

Analysis

FieldTypeDescription
thesisobject or null
profileobject or null

Market

FieldTypeDescription
idinteger
questionstring or null
statusstring or null (active, resolved, closed, null)
volumenumber or null
liquiditynumber or null
end_datestring or null
pricesarray of objectPrices endpoint / match detail only; newest first

Price

FieldTypeDescription
sideinteger or null1 = p1's outcome, 2 = p2's
bidnumber or null
asknumber or null
midnumber or null
spreadnumber or null
timestampstring or null

Event

FieldTypeDescription
typestring (break, set_won, game_won, momentum_run)
playerinteger or null (1, 2, null)
timestampstring or null

Fixture

FieldTypeDescription
idinteger
event_datestring or null
tourstring or null
tournamentstring or null
roundstring or null
surfacestring or null
player1_namestring or null
player2_namestring or null
statusstring or null

Generated from openapi.yaml by livetennisapi/openapi. Questions or a spec mismatch? Open an issue.