Do not expose your API key in public client-side code or public repos.
Credits
Each API call consumes credits from your balance. Credits never expire. New accounts get 100 free credits.
Endpoint
Cost
GET /matches
1 credit per call
GET /match/scores
1 credit per call
GET /match/statistics
1 credit per call
GET /match/h2h
1 credit per call
GET /match/tracker
Free โ no API key required
GET /rankings
1 credit per call
GET /tournament/details
1 credit per call
GET /tournament/bracket
1 credit per call
GET /tournament/results
1 credit per call
GET /player/profile
1 credit per call
GET /player/matches
1 credit per call
GET /player/statistics
1 credit per call
GET /webhook/register
Free โ no API key required
GET /webhook/list
Free โ no API key required
GET /webhook/delete
Free โ no API key required
Remaining balance is returned in every response under credits_remaining and the X-Credits-Remaining header.
Errors
All errors return JSON with a code and message:
{ "error": "Invalid API key.", "code": 401 }
Code
Meaning
401
Missing or invalid api_key
402
Insufficient credits
400
Invalid parameter (e.g. bad date format)
503
Upstream data source unavailable
GET /matches
Returns tennis matches for a given date. Optionally translate player and tournament names.
GET/api/v1/matches1 credit
Parameters
Parameter
Required
Default
Description
api_key
Yes
—
Your API key
date
No
Today
Match date in YYYY-MM-DD format
lang
No
en
Response language: entrderu
Example requests
# Today's matches (English)
https://live-tennis-api.com/api/v1/matches?api_key=YOUR_KEY# Specific date
https://live-tennis-api.com/api/v1/matches?api_key=YOUR_KEY&date=2026-07-13
# Turkish translation
https://live-tennis-api.com/api/v1/matches?api_key=YOUR_KEY&lang=tr
# Russian + specific date
https://live-tennis-api.com/api/v1/matches?api_key=YOUR_KEY&date=2026-07-13&lang=ru
id, name, country (ISO-2), ranking (integer|null), photo (proxied image URL)
match.tournament
object
id, name, tour, surface
match.round
string|null
Round label โ e.g. "Final", "Round of 32"
score.sets_won
array
[player1_sets, player2_sets]
score.s1โs5
array
[player1_games, player2_games] per set; only present if the set was played
score.s1_tbโs5_tb
array
Tiebreak score for that set; only present if a tiebreak was played
score.current_game
object|โ
Live game score {player1, player2} โ values: "0""15""30""40""A". Only present when status is inprogress
score.serving
string|โ
"player1" or "player2" โ who is currently serving. Only present when status is inprogress
winner
string|null
"player1", "player2", or null
credits_remaining
integer|string
Credits left after this call. "unlimited" for subscription users
GET /match/statistics
Returns full match statistics broken down by period (ALL + each set). Includes service, return, points, games and miscellaneous stats for both players.
Players of the requested match โ id, name, country, ranking, photo
summary.player1_wins
integer
Head-to-head wins for player1 in all-time meetings
summary.player2_wins
integer
Head-to-head wins for player2 in all-time meetings
summary.total
integer
Total number of H2H meetings ever played
meetings[]
array
Historical meetings between the two players, most recent first
meetings[].winner
string|null
"player1" or "player2" โ refers to the home/away of that specific match
meetings[].result
string|null
"win" or "loss" โ from player1's perspective (the home team of the current requested match)
recent_form.player1[]
array
Last 5 matches for player1, excluding the current match. Same object structure as meetings[]
recent_form.player2[]
array
Last 5 matches for player2, excluding the current match
score.sets_won
array
[player1_sets, player2_sets]
score.s1โs5
array
[player1_games, player2_games] per set
score.s1_tbโs5_tb
array
Tiebreak score; only present if a tiebreak was played
credits_remaining
integer|string
Credits left after this call. "unlimited" for subscription users
GET /match/tracker
Returns a live match tracker as a fully rendered HTML page. No API key required โ get the tracker_url from GET /match/scores and embed it directly in an iframe. Your API key is never exposed to end users.
GET/api/v1/match/trackerFree โ no API key required
Tip: Call GET /match/scores server-side to get the tracker_url, then set it as the src of an iframe. This way your API key stays on your server and is never visible in page source.
Parameters
Parameter
Required
Default
Description
match_id
Yes
—
Match ID from /matches
lang
No
en
Response language: entrderu
Example requests
# Step 1: call match/scores with your API key to get tracker_url
https://live-tennis-api.com/api/v1/match/scores?api_key=YOUR_KEY&match_id=16498578
# Step 2: embed the tracker_url from the response โ no API key exposed
<iframe src="https://live-tennis-api.com/api/v1/match/tracker?match_id=16498578" width="800" height="600"></iframe>
# Direct access also works
https://live-tennis-api.com/api/v1/match/tracker?match_id=16498578&lang=de
This endpoint returns text/html โ a full HTML page ready to embed in an iframe. It is not a JSON response.
GET /rankings
Returns ATP, WTA, ATP Live or WTA Live player rankings. The full list of up to 500 players is cached and sliced server-side โ use from and limit to paginate without extra API credits.
GET/api/v1/rankings1 credit
Parameters
Parameter
Required
Default
Description
api_key
Yes
—
Your API key
type
No
atp
Ranking list: atp, wta, atp_live, or wta_live
from
No
1
Starting rank position (1-based). E.g. 51 to begin at rank 51.
limit
No
100
Number of players to return (default 100, max 500).
Example requests
# ATP top 100
https://live-tennis-api.com/api/v1/rankings?api_key=YOUR_KEY&type=atp&limit=100
# WTA positions 51โ100
https://live-tennis-api.com/api/v1/rankings?api_key=YOUR_KEY&type=wta&from=51&limit=50
true if more players exist beyond this slice โ increment from by limit to paginate
position_change
integer
Positions gained (positive) or lost (negative) since the previous update
best_position
integer
Career best ranking position
previous_points
integer
Points from the previous ranking update
tournaments_played
integer
Tournaments counted toward the current ranking
credits_remaining
integer|string
docs_f_credits_remaining
GET /tournament/details
Returns core tournament metadata for a given season โ name, surface, country, city, prize money, draw size, and dates. Also includes a full seasons array for year navigation and a raw info_boxes array with any extra fields SofaScore provides.
GET/api/v1/tournament/details1 credit
Parameters
Parameter
Required
Default
Description
api_key
Yes
—
Your API key
tournament_id
Yes
—
Tournament ID from the SofaScore tournament URL (e.g. 23140 for ATP Challenger Lincoln)
season_id
No
latest
Season ID โ use seasons[].id from GET /tournament/results for a specific year. Defaults to the latest season.
Returns the full knockout draw for a tournament season โ main draw and qualifying bracket. Each round lists all matches with players, rankings, and the winner flag. Use season_id from GET /tournament/results for year selection.
GET/api/v1/tournament/bracket1 credit
Parameters
Parameter
Required
Default
Description
api_key
Yes
—
Your API key
tournament_id
Yes
—
Tournament ID from the SofaScore tournament URL (e.g. 23140 for ATP Challenger Lincoln)
season_id
No
latest
Season ID โ use seasons[].id from GET /tournament/results for a specific year. Defaults to the latest season.
Example requests
# Latest season (auto-detected)
https://live-tennis-api.com/api/v1/tournament/bracket?api_key=YOUR_KEY&tournament_id=23140
# Specific season
https://live-tennis-api.com/api/v1/tournament/bracket?api_key=YOUR_KEY&tournament_id=23140&season_id=89928
All available seasons โ id, year, name. Use season_id param to switch year.
draws[].type
string
"main" or "qualifying"
draws[].rounds[].name
string
Round label โ e.g. "Round of 32", "Quarterfinal", "Final"
draws[].rounds[].order
integer
Round order starting from 1 (1 = earliest round)
matches[].event_id
integer|null
Match ID โ use with GET /match/scores; null if not yet scheduled
matches[].finished
boolean
Whether the match has been played
matches[].player1 / player2
object|null
id, name, ranking, photo, winner (boolean); null if slot is empty (BYE or not yet filled)
credits_remaining
integer|string
Credits left after this call
GET /tournament/results
Returns completed and upcoming matches for a tournament season, plus a full list of all available seasons for year selection. Includes player seeding when available.
GET/api/v1/tournament/results1 credit
Parameters
Parameter
Required
Default
Description
api_key
Yes
—
Your API key
tournament_id
Yes
—
Tournament ID from the SofaScore tournament URL (e.g. 23140 for ATP Challenger Lincoln)
season_id
No
latest
Season ID โ use seasons[].id from GET /tournament/results for a specific year. Defaults to the latest season.
lang
No
en
Response language: entrderu
Example requests
# Current season results (auto-detected)
https://live-tennis-api.com/api/v1/tournament/results?api_key=YOUR_KEY&tournament_id=23140
# Specific season + language
https://live-tennis-api.com/api/v1/tournament/results?api_key=YOUR_KEY&tournament_id=23140&season_id=89928&lang=tr
The year the statistics are filtered to (defaults to current year)
singles.by_surface
object
W/L breakdown per surface โ keys: hardcourt, clay, grass, carpet
recent_form
string[]
Last 10 singles match results, newest first โ "W" or "L"
credits_remaining
integer|string
docs_f_credits_remaining
GET /webhook/register
Registers a new webhook endpoint. When a subscribed event fires, your URL receives a POST request with a JSON payload. Up to 10 active webhooks per account. Free โ does not consume credits.
GET/api/v1/webhook/registerFree โ no API key required
Parameters
Parameter
Required
Default
Description
api_key
Yes
—
Your API key
url
Yes
—
A publicly reachable http or https URL that will receive POST requests
events
No
all
Comma-separated list of event types to subscribe to (e.g. match.start,score.update). Leave empty to subscribe to all events.
secret
No
—
Optional secret string โ when set, each request includes an X-Webhook-Signature: sha256=<hmac> header for verification
Available events
Event
Description
match.start
Match begins (status changed from notstarted to inprogress)
match.finish
Match is complete with final score
match.postponed
Match has been postponed
match.cancelled
Match has been cancelled
score.update
Set score changed, or current game score updated (15 / 30 / 40 / A). Includes current_game field when a point is in progress.
Your endpoint receives a POST request with Content-Type: application/json and the following body:
Every event follows the same envelope: event, timestamp, a match object (always present), and an event-specific data object.
Click an event below to see its example response.
โ ๏ธ Important Security Notice Webhook notifications are sent from our system via the IP address 45.94.4.69. For added security, you can restrict incoming requests to your webhook endpoint on your server (at the firewall level) to only allow this IP address.
GET /webhook/list
Returns all active webhooks registered to your API key. Free โ does not consume credits.
GET/api/v1/webhook/listFree โ no API key required