Dokumentation — Tennis API
Anmelden API-Schlüssel holen

Tennis API Dokumentation

Einfache REST API. API-Schlüssel als Query-Parameter übergeben — keine Header erforderlich.

Basis-URL: https://live-tennis-api.com/api/v1

Authentifizierung

Fügen Sie api_key jeder Anfrage-URL hinzu. Erstellen Sie ein kostenloses Konto, um einen Schlüssel zu erhalten.

https://live-tennis-api.com/api/v1/matches?api_key=YOUR_KEY
Geben Sie Ihren API-Schlüssel nicht in öffentlichem Client-Code oder öffentlichen Repos preis.

Guthaben

Jeder API-Aufruf verbraucht Guthaben. Guthaben verfällt nie. Neue Konten erhalten 100 kostenlose Credits.

EndpunktKosten
GET /matches1 Credit pro Aufruf
GET /match/scores1 Credit pro Aufruf
GET /match/statistics1 Credit pro Aufruf
GET /match/h2h1 Credit pro Aufruf
GET /match/trackerKostenlos — kein API-Key erforderlich
GET /rankings1 Credit pro Aufruf
GET /tournament/details1 Credit pro Aufruf
GET /tournament/bracket1 Credit pro Aufruf
GET /tournament/results1 Credit pro Aufruf
GET /player/profile1 Credit pro Aufruf
GET /player/matches1 Credit pro Aufruf
GET /player/statistics1 Credit pro Aufruf
GET /webhook/registerKostenlos — kein API-Key erforderlich
GET /webhook/listKostenlos — kein API-Key erforderlich
GET /webhook/deleteKostenlos — kein API-Key erforderlich

Das verbleibende Guthaben wird in jeder Antwort unter credits_remaining und im X-Credits-Remaining-Header zurückgegeben.

Fehler

Alle Fehler geben JSON mit code und message zurück:

{ "error": "Invalid API key.", "code": 401 }
CodeBedeutung
401Fehlender oder ungültiger api_key
402Unzureichendes Guthaben
400Ungültiger Parameter (z.B. falsches Datumsformat)
503Upstream-Datenquelle nicht verfügbar

GET /matches

Gibt Tennisspiele für ein bestimmtes Datum zurück. Team- und Liganamen können optional übersetzt werden.

GET /api/v1/matches 1 credit

Parameter

ParameterErforderlichStandardBeschreibung
api_keyJaIhr API-Schlüssel
dateNeinHeuteSpieldatum im Format YYYY-MM-DD
langNeinenAntwortsprache: en tr de ru

Beispielanfragen

# 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
curl "https://live-tennis-api.com/api/v1/matches?api_key=YOUR_KEY&date=2026-06-29&lang=en"
const res = await fetch( 'https://live-tennis-api.com/api/v1/matches' + '?api_key=YOUR_KEY&date=2026-06-29&lang=en' ); const data = await res.json(); console.log(data.matches);
<?php $url = 'https://live-tennis-api.com/api/v1/matches' . '?api_key=YOUR_KEY&date=2026-06-29&lang=en'; $data = json_decode(file_get_contents($url), true); var_dump($data['matches']);
import requests data = requests.get( 'https://live-tennis-api.com/api/v1/matches', params={ 'api_key': 'YOUR_KEY', 'date': '2026-06-29', 'lang': 'en', } ).json() print(data['matches'])

Antwort

{
  "status": "ok",
  "date":   "2026-07-13",
  "count":  87,
  "matches": [
    {
      "id":              16495405,
      "start_timestamp": 1783950600,
      "status":          "finished",
      "player1": {
        "id":      244420,
        "name":    "Jesper De Jong",
        "country": "NL",
        "ranking": 73
      },
      "player2": {
        "id":      322022,
        "name":    "Vilius Gaubas",
        "country": "LT",
        "ranking": 128
      },
      "tournament": {
        "id":      2413,
        "name":    "Bastad",
        "tour":    "ATP",
        "surface": "Red clay"
      },
      "round":  "Round of 32",
      "score": {
        "sets_won": [2, 0],
        "s1":       [7, 6],
        "s1_tb":    [7, 1],
        "s2":       [7, 5]
      },
      "winner": "player1"
    }
  ],
  "credits_remaining": 49
}

Feldreferenz

FeldTypBeschreibung
idintegerMatch ID
start_timestampintegerScheduled start time as a Unix timestamp (UTC)
statusstringRaw match status — notstarted, inprogress, finished, postponed, cancelled, walkover, retired
player1 / player2objectPlayer id, name, country (ISO-2), ranking (integer|null), photo (proxied image URL)
tournament.idinteger|nullTournament ID
tournament.namestring|nullTournament name
tournament.tourstring|nullTour name — ATP, WTA, ITF, etc.
tournament.surfacestring|nullCourt surface — e.g. Red clay, Grass, Hard
roundstring|nullRound label — e.g. Final, Semifinal, Round of 32
score.sets_wonarray[player1_sets, player2_sets]
score.s1–s5array[player1_games, player2_games] per set; only present if the set was played
score.s1_tb–s5_tbarray[player1_points, player2_points] tiebreak score; only present if a tiebreak was played in that set
winnerstring|null"player1", "player2", or null if the match is not finished
credits_remaininginteger|stringCredits left after this call. "unlimited" for subscription users

GET /match/scores

Gibt den aktuellen Spielstand, die Satzübersicht und den Live-Spielstand für ein bestimmtes Spiel zurück. Cache 30 Sekunden für laufende Spiele.

GET /api/v1/match/scores 1 credit

Parameter

ParameterErforderlichStandardBeschreibung
api_keyJaIhr API-Schlüssel
match_idJaMatch ID from GET /matches (id field)
langNeinenAntwortsprache: en tr de ru

Beispielanfragen

https://live-tennis-api.com/api/v1/match/scores?api_key=YOUR_KEY&match_id=16498578
curl "https://live-tennis-api.com/api/v1/match/scores?api_key=YOUR_KEY&match_id=16498578"
const res = await fetch( 'https://live-tennis-api.com/api/v1/match/scores' + '?api_key=YOUR_KEY&match_id=16498578' ); const data = await res.json(); console.log(data.score);
<?php $url = 'https://live-tennis-api.com/api/v1/match/scores' . '?api_key=YOUR_KEY&match_id=16498578'; $data = json_decode(file_get_contents($url), true); var_dump($data['score']);
import requests data = requests.get( 'https://live-tennis-api.com/api/v1/match/scores', params={'api_key': 'YOUR_KEY', 'match_id': 16498578} ).json() print(data['score'])

Antwort

{
  "status":      "ok",
  "match_id":    16498578,
  "tracker_url": "https://live-tennis-api.com/api/v1/match/tracker?match_id=16498578&lang=en",
  "match": {
    "status":          "inprogress",
    "status_detail":   "3rd set",
    "start_timestamp": 1783967700,
    "player1": { "id": 217464, "name": "Rio Noguchi",    "country": "JP", "ranking": 222, "photo": "https://live-tennis-api.com/image/players/217464.png" },
    "player2": { "id": 202181, "name": "Charles Broom", "country": "GB", "ranking": 283, "photo": "https://live-tennis-api.com/image/players/202181.png" },
    "tournament": { "id": 23140, "name": "ATP Challenger Lincoln", "tour": "Challenger", "surface": "Hardcourt outdoor" },
    "round": "Round of 32"
  },
  "score": {
    "sets_won":    [1, 1],
    "s1":          [6, 2],
    "s2":          [4, 6],
    "s3":          [6, 5],
    "current_game": { "player1": "A", "player2": "40" },
    "serving":     "player1"
  },
  "winner":            null,
  "credits_remaining": 49
}

Feldreferenz

FeldTypBeschreibung
match_idintegerThe requested match ID
tracker_urlstringReady-to-embed URL for GET /match/tracker — no API key required, safe to use as iframe src
match.statusstringnotstarted, inprogress, finished, postponed, cancelled
match.status_detailstring|nullHuman-readable detail — e.g. "3rd set", "Ended"
match.start_timestampintegerMatch start as a Unix timestamp (UTC)
match.player1 / player2objectid, name, country (ISO-2), ranking (integer|null), photo (proxied image URL)
match.tournamentobjectid, name, tour, surface
match.roundstring|nullRound label — e.g. "Final", "Round of 32"
score.sets_wonarray[player1_sets, player2_sets]
score.s1–s5array[player1_games, player2_games] per set; only present if the set was played
score.s1_tb–s5_tbarrayTiebreak score for that set; only present if a tiebreak was played
score.current_gameobject|—Live game score {player1, player2} — values: "0" "15" "30" "40" "A". Only present when status is inprogress
score.servingstring|—"player1" or "player2" — who is currently serving. Only present when status is inprogress
winnerstring|null"player1", "player2", or null
credits_remaininginteger|stringCredits left after this call. "unlimited" for subscription users

GET /match/statistics

Gibt vollständige Matchstatistiken nach Periode (GESAMT + je Satz) zurück. Enthält Aufschlag-, Return-, Punkt-, Spiel- und sonstige Statistiken für beide Spieler.

GET /api/v1/match/statistics 1 credit

Parameter

ParameterErforderlichStandardBeschreibung
api_keyJaIhr API-Schlüssel
match_idJaMatch ID from GET /matches
langNeinenAntwortsprache: en tr de ru

Beispielanfragen

https://live-tennis-api.com/api/v1/match/statistics?api_key=YOUR_KEY&match_id=16498578
curl "https://live-tennis-api.com/api/v1/match/statistics?api_key=YOUR_KEY&match_id=16498578"
const res = await fetch( 'https://live-tennis-api.com/api/v1/match/statistics' + '?api_key=YOUR_KEY&match_id=16498578' ); const data = await res.json(); console.log(data.statistics);
<?php $url = 'https://live-tennis-api.com/api/v1/match/statistics' . '?api_key=YOUR_KEY&match_id=16498578'; $data = json_decode(file_get_contents($url), true); var_dump($data['statistics']);
import requests data = requests.get( 'https://live-tennis-api.com/api/v1/match/statistics', params={'api_key': 'YOUR_KEY', 'match_id': 16498578} ).json() print(data['statistics'])

Antwort

{
  "status":   "ok",
  "match_id": 16498578,
  "statistics": [
    {
      "period": "ALL",
      "groups": [
        {
          "name": "Service",
          "stats": [
            { "key": "aces",                "label": "Aces",               "player1": "0",              "player2": "2",              "player1_value": 0,   "player2_value": 2   },
            { "key": "double_faults",       "label": "Double faults",      "player1": "5",              "player2": "4",              "player1_value": 5,   "player2_value": 4   },
            { "key": "first_serve_accuracy", "label": "First serve",        "player1": "66/105 (63%)", "player2": "47/86 (55%)", "player1_value": 66,  "player2_value": 47  },
            { "key": "break_points_saved",   "label": "Break points saved", "player1": "3/7 (42%)",    "player2": "3/9 (33%)",    "player1_value": 3,   "player2_value": 3   }
          ]
        },
        {
          "name": "Points",
          "stats": [
            { "key": "points_total",           "label": "Total",                   "player1": "103", "player2": "87", "player1_value": 103, "player2_value": 87 },
            { "key": "service_points_scored",  "label": "Service points won",  "player1": "63",  "player2": "46", "player1_value": 63,  "player2_value": 46 },
            { "key": "receiver_points_scored", "label": "Receiver points won", "player1": "40",  "player2": "42", "player1_value": 40,  "player2_value": 42 }
          ]
        }
      ]
    },
    { "period": "1ST", "groups": [ /* same structure */ ] },
    { "period": "2ND", "groups": [ /* same structure */ ] },
    { "period": "3RD", "groups": [ /* same structure */ ] }
  ],
  "credits_remaining": 49
}

Feldreferenz

FeldTypBeschreibung
statisticsarrayOne entry per period — ALL (full match) + one per set played (1ST, 2ND, 3RD…)
periodstring"ALL", "1ST", "2ND", "3RD", "4TH", "5TH"
groups[].namestringStat group — Service, Points, Games, Return, Miscellaneous
stats[].keystringSnake_case stat key — e.g. aces, first_serve_accuracy, break_points_saved
stats[].labelstringHuman-readable stat name in English
stats[].player1 / player2stringDisplay value — plain number or fraction with % (e.g. "66/105 (63%)")
stats[].player1_value / player2_valueintegerRaw numeric value (numerator for fraction stats)
credits_remaininginteger|stringCredits left after this call. "unlimited" for subscription users

GET /match/h2h

Gibt die H2H-Zusammenfassung, alle bisherigen Duelle der beiden Spieler sowie die letzten 5 Matches (aktuelle Form) zurück.

GET /api/v1/match/h2h 1 credit

Parameter

ParameterErforderlichStandardBeschreibung
api_keyJaIhr API-Schlüssel
match_idJaMatch ID from GET /matches
langNeinenAntwortsprache: en tr de ru

Beispielanfragen

https://live-tennis-api.com/api/v1/match/h2h?api_key=YOUR_KEY&match_id=16498578
curl "https://live-tennis-api.com/api/v1/match/h2h?api_key=YOUR_KEY&match_id=16498578"
const res = await fetch( 'https://live-tennis-api.com/api/v1/match/h2h' + '?api_key=YOUR_KEY&match_id=16498578' ); const data = await res.json(); console.log(data.meetings, data.recent_form);
<?php $url = 'https://live-tennis-api.com/api/v1/match/h2h' . '?api_key=YOUR_KEY&match_id=16498578'; $data = json_decode(file_get_contents($url), true); var_dump($data['summary']);
import requests data = requests.get( 'https://live-tennis-api.com/api/v1/match/h2h', params={'api_key': 'YOUR_KEY', 'match_id': 16498578} ).json() print(data['meetings'])

Antwort

{
  "status":   "ok",
  "match_id": 16498578,
  "player1": { "id": 217464, "name": "Rio Noguchi",    "country": "JP", "ranking": 222, "photo": "https://live-tennis-api.com/image/players/217464.png" },
  "player2": { "id": 202181, "name": "Charles Broom", "country": "GB", "ranking": 283, "photo": "https://live-tennis-api.com/image/players/202181.png" },
  "summary": {
    "player1_wins": 1,
    "player2_wins": 0,
    "total":        1
  },
  "meetings": [
    {
      "id":              16498578,
      "start_timestamp": 1783967700,
      "status":          "finished",
      "player1": { "id": 217464, "name": "Rio Noguchi",    "country": "JP", "ranking": 222, "photo": "..." },
      "player2": { "id": 202181, "name": "Charles Broom", "country": "GB", "ranking": 283, "photo": "..." },
      "tournament": { "id": 23140, "name": "ATP Challenger Lincoln", "tour": "Challenger", "surface": "Hardcourt outdoor" },
      "round": "Round of 32",
      "score": { "sets_won": [2, 1], "s1": [6, 2], "s2": [4, 6], "s3": [7, 5] },
      "winner": "player1",
      "result": "win"
    }
  ],
  "recent_form": {
    "player1": [ /* last 5 matches for Rio Noguchi, same match object structure */ ],
    "player2": [ /* last 5 matches for Charles Broom, same match object structure */ ]
  },
  "credits_remaining": 49
}

Feldreferenz

FeldTypBeschreibung
player1 / player2objectPlayers of the requested match — id, name, country, ranking, photo
summary.player1_winsintegerHead-to-head wins for player1 in all-time meetings
summary.player2_winsintegerHead-to-head wins for player2 in all-time meetings
summary.totalintegerTotal number of H2H meetings ever played
meetings[]arrayHistorical meetings between the two players, most recent first
meetings[].winnerstring|null"player1" or "player2" — refers to the home/away of that specific match
meetings[].resultstring|null"win" or "loss" — from player1's perspective (the home team of the current requested match)
recent_form.player1[]arrayLast 5 matches for player1, excluding the current match. Same object structure as meetings[]
recent_form.player2[]arrayLast 5 matches for player2, excluding the current match
score.sets_wonarray[player1_sets, player2_sets]
score.s1–s5array[player1_games, player2_games] per set
score.s1_tb–s5_tbarrayTiebreak score; only present if a tiebreak was played
credits_remaininginteger|stringCredits left after this call. "unlimited" for subscription users

GET /match/tracker

Gibt den Live-Match-Tracker als vollständig gerenderte HTML-Seite zurück. Kein API-Key erforderlich — holen Sie die tracker_url aus GET /match/scores und betten Sie sie direkt in einen iframe ein. Ihr API-Key wird Endbenutzern nie angezeigt.

GET /api/v1/match/tracker Kostenlos — kein API-Key erforderlich
Tipp: Rufen Sie GET /match/scores serverseitig auf, um die tracker_url zu erhalten, und setzen Sie sie als src eines iframes. So bleibt Ihr API-Key auf Ihrem Server und ist im Seitenquelltext nie sichtbar.

Parameter

ParameterErforderlichStandardBeschreibung
match_idJaSpiel-ID aus der /matches-Antwort
langNeinenAntwortsprache: en tr de ru

Beispielanfragen

# 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
curl "https://live-tennis-api.com/api/v1/match/tracker?match_id=16498578&lang=en" \ --output tracker.html
// Step 1: fetch scores (server-side) — get tracker_url const scores = await fetch('/api/scores?match_id=16498578').then(r => r.json()); // Step 2: embed tracker_url — API key never touches the browser const iframe = document.createElement('iframe'); iframe.src = scores.tracker_url; iframe.width = '800'; iframe.height = '600'; document.body.appendChild(iframe);
<?php $url = 'https://live-tennis-api.com/api/v1/match/tracker' . '?api_key=YOUR_KEY&match_id=16498578&lang=en'; $html = file_get_contents($url); echo $html;
import requests resp = requests.get( 'https://live-tennis-api.com/api/v1/match/tracker', params={ 'api_key': 'YOUR_KEY', 'match_id': 16498578, 'lang': 'en', } ) with open('tracker.html', 'w') as f: f.write(resp.text)

Antwort

Dieser Endpunkt gibt text/html zurück — eine vollständige HTML-Seite, bereit zum Einbetten in einen iframe. Keine JSON-Antwort.

GET /rankings

Gibt ATP-, WTA-, ATP-Live- oder WTA-Live-Spielerranglisten zurück. Die vollständige Liste von bis zu 500 Spielern wird serverseitig zwischengespeichert — nutzen Sie from und limit zur Seitennavigation ohne zusätzliche API-Credits.

GET /api/v1/rankings 1 credit

Parameter

ParameterErforderlichStandardBeschreibung
api_keyJaIhr API-Schlüssel
typeNeinatpRangliste: atp, wta, atp_live oder wta_live
fromNein1Startposition (1-basiert). Z.B. 51 beginnt bei Rang 51.
limitNein100Anzahl der zurückgegebenen Spieler (Standard 100, max. 500).

Beispielanfragen

# 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
curl "https://live-tennis-api.com/api/v1/rankings?api_key=YOUR_KEY&type=atp&limit=100"
const res = await fetch( 'https://live-tennis-api.com/api/v1/rankings?api_key=YOUR_KEY&type=atp&limit=100' ); const data = await res.json(); console.log(data.players);
<?php $data = json_decode(file_get_contents( 'https://live-tennis-api.com/api/v1/rankings?api_key=YOUR_KEY&type=atp&limit=100' ), true); var_dump($data['players']);
import requests data = requests.get( 'https://live-tennis-api.com/api/v1/rankings', params={'api_key': 'YOUR_KEY', 'type': 'atp', 'limit': 100} ).json()

Antwort

{
  "ranking_type": {
    "name":       "ATP Rankings",
    "type":       "atp",
    "gender":     "M",
    "updated_at": 1783990841,
    "total":      500
  },
  "from":     1,
  "limit":    100,
  "returned": 100,
  "has_more": true,
  "players": [
    {
      "position":           1,
      "position_change":    0,
      "previous_position":  1,
      "best_position":      1,
      "player_id":         206570,
      "name":              "Jannik Sinner",
      "short_name":        "J. Sinner",
      "country":           "IT",
      "country_name":      "Italy",
      "points":            13450,
      "previous_points":   13450,
      "tournaments_played":19,
      "photo":             "https://live-tennis-api.com/image/players/206570.png"
    },
    /* ... 99 more players */
  ],
  "credits_remaining": 49
}

Feldreferenz

FeldTypBeschreibung
ranking_type.totalintegerTotal players in the full ranking (always 500)
ranking_type.updated_atintegerUnix timestamp of the last rankings update
fromintegerStarting position of this response slice
has_morebooleantrue if more players exist beyond this slice — increment from by limit to paginate
position_changeintegerPositions gained (positive) or lost (negative) since the previous update
best_positionintegerCareer best ranking position
previous_pointsintegerPoints from the previous ranking update
tournaments_playedintegerTournaments counted toward the current ranking
credits_remaininginteger|stringdocs_f_credits_remaining

GET /tournament/details

Gibt die Kernmetadaten eines Turniers für eine bestimmte Saison zurück — Name, Belag, Land, Stadt, Preisgeld, Feldgröße und Termine. Enthält außerdem ein seasons-Array für die Jahresnavigation und ein info_boxes-Array mit zusätzlichen Feldern von SofaScore.

GET /api/v1/tournament/details 1 credit

Parameter

ParameterErforderlichStandardBeschreibung
api_keyJaIhr API-Schlüssel
tournament_idJaTurnier-ID aus der SofaScore-Turnier-URL (z.B. 23140 für ATP Challenger Lincoln)
season_idNeinneuesteSaison-ID — verwenden Sie seasons[].id aus GET /tournament/results für ein bestimmtes Jahr. Standard: neueste Saison.
langNeinenAntwortsprache: en tr de ru

Beispielanfragen

https://live-tennis-api.com/api/v1/tournament/details?api_key=YOUR_KEY&tournament_id=2413
curl "https://live-tennis-api.com/api/v1/tournament/details?api_key=YOUR_KEY&tournament_id=2413"
const res = await fetch( 'https://live-tennis-api.com/api/v1/tournament/details?api_key=YOUR_KEY&tournament_id=2413' ); const data = await res.json(); console.log(data.name, data.surface, data.prize_money);
<?php $data = json_decode(file_get_contents( 'https://live-tennis-api.com/api/v1/tournament/details?api_key=YOUR_KEY&tournament_id=2413' ), true); echo $data['name'] . ' — ' . $data['surface'];
import requests data = requests.get( 'https://live-tennis-api.com/api/v1/tournament/details', params={'api_key': 'YOUR_KEY', 'tournament_id': 2413} ).json()

Antwort

{
  "status":          "ok",
  "tournament_id":   2413,
  "season_id":       81901,
  "name":            "Bastad",
  "slug":            "bastad",
  "category":        "ATP",
  "gender":          "M",
  "surface":         "Red clay",
  "atp_points":      250,
  "number_of_sets":  3,
  "start_date":      "2026-07-07",
  "end_date":        "2026-07-13",
  "title_holder": {
    "id":      308084,
    "name":    "Luciano Darderi",
    "ranking": 18,
    "country": "IT",
    "photo":   "https://live-tennis-api.com/image/players/308084.png"
  },
  "logo":            "https://live-tennis-api.com/image/tournament/2413.png",
  "primary_color":   "#034ea2",
  "secondary_color": "#ffe37e",
  "seasons": [
    { "id": 81901, "year": "2026", "name": "ATP Bastad, Sweden Men Singles 2026" },
    { "id": 67378, "year": "2025", "name": "ATP Bastad, Sweden Men Singles 2025" }
  ],
  "credits_remaining": 49
}

Feldreferenz

FeldTypBeschreibung
namestringOfficial tournament name
slugstringURL-friendly tournament identifier
categorystringTour category (ATP, WTA, Challenger, etc.)
genderstringM (men) or F (women)
surfacestringCourt surface, translated if lang is set
atp_pointsinteger|nullRanking points awarded for winning this tournament
number_of_setsinteger|nullSets per match (typically 3 for ATP/WTA, 5 for Grand Slams)
start_date / end_datestring|nullTournament dates in YYYY-MM-DD format
title_holderobject|nullDefending champion — id, name, ranking, country, photo
logostringTournament logo image URL
primary_color / secondary_colorstringTournament brand colors as hex values
seasonsarrayAll available seasons — id, year, name
credits_remaininginteger|stringdocs_f_credits_remaining

GET /tournament/bracket

Gibt den vollständigen Auslosungsbaum für eine Turniersaison zurück — Hauptfeld und Qualifikationsfeld. Jede Runde enthält alle Matches mit Spielern, Rankings und dem Gewinner-Flag. Verwenden Sie season_id aus GET /tournament/results für die Jahresauswahl.

GET /api/v1/tournament/bracket 1 credit

Parameter

ParameterErforderlichStandardBeschreibung
api_keyJaIhr API-Schlüssel
tournament_idJaTurnier-ID aus der SofaScore-Turnier-URL (z.B. 23140 für ATP Challenger Lincoln)
season_idNeinneuesteSaison-ID — verwenden Sie seasons[].id aus GET /tournament/results für ein bestimmtes Jahr. Standard: neueste Saison.

Beispielanfragen

# 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
curl "https://live-tennis-api.com/api/v1/tournament/bracket?api_key=YOUR_KEY&tournament_id=23140&season_id=89928"
const res = await fetch( 'https://live-tennis-api.com/api/v1/tournament/bracket' + '?api_key=YOUR_KEY&tournament_id=23140&season_id=89928' ); const data = await res.json(); console.log(data.draws);
<?php $url = 'https://live-tennis-api.com/api/v1/tournament/bracket' . '?api_key=YOUR_KEY&tournament_id=23140&season_id=89928'; $data = json_decode(file_get_contents($url), true); var_dump($data['draws']);
import requests data = requests.get( 'https://live-tennis-api.com/api/v1/tournament/bracket', params={'api_key': 'YOUR_KEY', 'tournament_id': 23140, 'season_id': 89928} ).json() print(data['draws'])

Antwort

{
  "status":        "ok",
  "tournament_id": 23140,
  "season_id":     89928,
  "seasons": [
    { "id": 89928, "year": "2026", "name": "ATP Challenger Lincoln 2026" },
    { "id": 80594, "year": "2025", "name": "ATP Challenger Lincoln 2025" }
  ],
  "draws": [
    {
      "name":   "2026 Lincoln, USA",
      "type":   "main",
      "rounds": [
        {
          "name":    "Round of 32",
          "order":   1,
          "matches": [
            {
              "block_id": 2612048,
              "event_id": 16514881,
              "finished": false,
              "player1":  { "id": 489715, "name": "Matthew Forbes",   "ranking": 939, "photo": "https://live-tennis-api.com/image/players/489715.png", "winner": false },
              "player2":  { "id": 408344, "name": "Sebastian Gorzny", "ranking": 966, "photo": "https://live-tennis-api.com/image/players/408344.png", "winner": false }
            }
          ]
        },
        { "name": "Round of 16", "order": 2, "matches": [/* 8 matches */] },
        { "name": "Quarterfinal",  "order": 3, "matches": [/* 4 matches */] },
        { "name": "Semifinal",     "order": 4, "matches": [/* 2 matches */] },
        { "name": "Final",         "order": 5, "matches": [/* 1 match  */] }
      ]
    },
    { "name": "2026 Lincoln, USA, Qualifying", "type": "qualifying", "rounds": [/* same structure */] }
  ],
  "credits_remaining": 49
}

Feldreferenz

FeldTypBeschreibung
seasonsarrayAll available seasons — id, year, name. Use season_id param to switch year.
draws[].typestring"main" or "qualifying"
draws[].rounds[].namestringRound label — e.g. "Round of 32", "Quarterfinal", "Final"
draws[].rounds[].orderintegerRound order starting from 1 (1 = earliest round)
matches[].event_idinteger|nullMatch ID — use with GET /match/scores; null if not yet scheduled
matches[].finishedbooleanWhether the match has been played
matches[].player1 / player2object|nullid, name, ranking, photo, winner (boolean); null if slot is empty (BYE or not yet filled)
credits_remaininginteger|stringCredits left after this call

GET /tournament/results

Gibt abgeschlossene und bevorstehende Matches einer Turniersaison sowie eine Liste aller verfügbaren Saisons zurück. Enthält die Setzlisten-Nummer der Spieler, wenn verfügbar.

GET /api/v1/tournament/results 1 credit

Parameter

ParameterErforderlichStandardBeschreibung
api_keyJaIhr API-Schlüssel
tournament_idJaTurnier-ID aus der SofaScore-Turnier-URL (z.B. 23140 für ATP Challenger Lincoln)
season_idNeinneuesteSaison-ID — verwenden Sie seasons[].id aus GET /tournament/results für ein bestimmtes Jahr. Standard: neueste Saison.
langNeinenAntwortsprache: en tr de ru

Beispielanfragen

# 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
curl "https://live-tennis-api.com/api/v1/tournament/results?api_key=YOUR_KEY&tournament_id=23140&season_id=89928&lang=en"
const res = await fetch( 'https://live-tennis-api.com/api/v1/tournament/results' + '?api_key=YOUR_KEY&tournament_id=23140&season_id=89928&lang=en' ); const data = await res.json(); console.log(data.seasons, data.past_matches, data.upcoming_matches);
<?php $url = 'https://live-tennis-api.com/api/v1/tournament/results' . '?api_key=YOUR_KEY&tournament_id=23140&season_id=89928&lang=en'; $data = json_decode(file_get_contents($url), true); var_dump($data['past_matches']);
import requests data = requests.get( 'https://live-tennis-api.com/api/v1/tournament/results', params={'api_key': 'YOUR_KEY', 'tournament_id': 23140, 'season_id': 89928, 'lang': 'en'} ).json() print(data['seasons'])

Antwort

{
  "status":        "ok",
  "tournament_id": 23140,
  "season_id":     89928,
  "seasons": [
    { "id": 89928, "year": "2026", "name": "ATP Challenger Lincoln (NE), USA Men Singles 2026" },
    { "id": 80594, "year": "2025", "name": "ATP Challenger Lincoln (NE), USA Men Singles 2025" },
    { "id": 64754, "year": "2024", "name": "ATP Challenger Rome, USA Men Singles 2024" }
  ],
  "past_matches": [
    {
      "id":              16498578,
      "start_timestamp": 1783967700,
      "status":          "finished",
      "player1": { "id": 217464, "name": "Rio Noguchi", "country": "JP", "ranking": 222, "seed": null, "photo": "https://live-tennis-api.com/image/players/217464.png" },
      "player2": { "id": 202181, "name": "Charles Broom", "country": "GB", "ranking": 283, "seed": null, "photo": "https://live-tennis-api.com/image/players/202181.png" },
      "round":  "Round of 32",
      "surface": "Hardcourt outdoor",
      "score":  { "sets_won": [2, 1], "s1": [6, 2], "s2": [4, 6], "s3": [7, 5] },
      "winner": "player1"
    }
  ],
  "upcoming_matches": [ /* same structure, score will be empty */ ],
  "credits_remaining": 49
}

Feldreferenz

FeldTypBeschreibung
seasonsarrayAll available seasons for this tournament — use id as season_id for year selection
seasons[].yearstringYear string — e.g. "2026", "2025"
past_matchesarrayCompleted matches, most recent first
upcoming_matchesarrayScheduled but not yet played matches
player1/2.seedinteger|nullPlayer seeding in this tournament; null for unseeded players
roundstring|nullRound label — e.g. "Round of 32", "Final"
surfacestring|nullCourt surface
credits_remaininginteger|stringCredits left after this call

GET /player/profile

Gibt die vollständige Spielerbiografie zurück — Ranking, Spielhand, Größe, Gewicht, Geburtsdatum, Preisgeld und Foto.

GET /api/v1/player/profile 1 credit

Parameter

ParameterErforderlichStandardBeschreibung
api_keyJaIhr API-Schlüssel
player_idJaSpieler-ID aus der SofaScore-Spieler-URL (z.B. 457262 für Nicolas Arseneault)
langNeinenAntwortsprache: en tr de ru

Beispielanfragen

https://live-tennis-api.com/api/v1/player/profile?api_key=YOUR_KEY&player_id=457262
curl "https://live-tennis-api.com/api/v1/player/profile?api_key=YOUR_KEY&player_id=457262"
const res = await fetch( 'https://live-tennis-api.com/api/v1/player/profile?api_key=YOUR_KEY&player_id=457262' ); const data = await res.json(); console.log(data.player);
<?php $data = json_decode(file_get_contents( 'https://live-tennis-api.com/api/v1/player/profile?api_key=YOUR_KEY&player_id=457262' ), true);
import requests data = requests.get( 'https://live-tennis-api.com/api/v1/player/profile', params={'api_key': 'YOUR_KEY', 'player_id': 457262} ).json()

Antwort

{
  "status": "ok",
  "player": {
    "id":             457262,
    "name":           "Nicolas Arseneault",
    "short_name":     "N. Arseneault",
    "country":        { "code": "CA", "name": "Canada" },
    "gender":         "M",
    "ranking":        768,
    "hand":           "left-handed",
    "height":         1.83,
    "weight":         77,
    "birthdate":      "2007-01-18",
    "age":            19,
    "birthplace":     "Richmond Hill, Canada",
    "prize_current":  1505,
    "prize_total":    66695,
    "photo":          "https://live-tennis-api.com/image/players/457262.png"
  },
  "credits_remaining": 49
}

Feldreferenz

FeldTypBeschreibung
player.rankinginteger|nullCurrent ATP/WTA ranking
player.handstring|nullPlaying hand — translated with lang param
player.heightfloat|nullHeight in metres
player.weightinteger|nullWeight in kilograms
player.prize_currentinteger|nullPrize money earned this season (EUR)
player.prize_totalinteger|nullCareer prize money total (EUR)
credits_remaininginteger|stringdocs_f_credits_remaining

GET /player/matches

Gibt die letzten und bevorstehenden Spiele eines Spielers aus allen Turnieren seitenweise zurück. Mit type=singles oder type=doubles filtern.

GET /api/v1/player/matches 1 credit

Parameter

ParameterErforderlichStandardBeschreibung
api_keyJaIhr API-Schlüssel
player_idJaSpieler-ID aus der SofaScore-Spieler-URL (z.B. 457262 für Nicolas Arseneault)
pageNein0Ergebnisseite — 0 = neueste 30 Spiele, 1 = vorherige 30 usw.
typeNeinallNach Spieltyp filtern: all (Standard), singles oder doubles
langNeinenAntwortsprache: en tr de ru

Antwort

{
  "status":     "ok",
  "player_id":  457262,
  "page":          0,
  "has_next_page": true,
  "next_page":     1,
  "past_matches": [
    {
      "id":              14876875,
      "start_timestamp": 1760379000,
      "type":            "singles",
      "status":          "finished",
      "result":          "W",
      "player":   { "id": 457262, "name": "Nicolas Arseneault", "ranking": 780, "country": "CA", "photo": "https://live-tennis-api.com/image/players/457262.png" },
      "opponent": { "id": 95259,  "name": "Strong Kirchheimer",   "ranking": 660,  "country": "US", "photo": "https://live-tennis-api.com/image/players/95259.png" },
      "tournament": { "id": 23140, "name": "ATP Challenger Lincoln (NE)", "category": "Challenger" },
      "season":     { "id": 80594, "year": "2025" },
      "round":      "Qualification Final",
      "surface":    "Hardcourt outdoor",
      "score": { "sets": [2, 0], "s1": [6, 3], "s2": [7, 5] }
    }
  ],
  "upcoming_matches": [],
  "credits_remaining": 49
}

Feldreferenz

FeldTypBeschreibung
pageintegerCurrent page — 30 matches per page
has_next_pagebooleantrue if a next page exists; false when you've reached the last page
next_pageinteger|nullPage number to pass for the next request; null on the last page
typestringall (default), singles, or doubles
resultstring|null"W" (win) or "L" (loss); null for upcoming matches
opponent.membersarray|nullDoubles only — lists both players in the opponent pair
surfacestring|nullTranslated with lang param
roundstring|nullTranslated with lang param
upcoming_matchesarrayOnly populated on page 0
credits_remaininginteger|stringdocs_f_credits_remaining

GET /player/statistics

Gibt Sieg/Niederlage-Statistiken eines Spielers für ein bestimmtes Saisonjahr zurück — gesamt und nach Untergrund aufgeschlüsselt. Deckt bis zu 60 aktuelle Matches ab.

GET /api/v1/player/statistics 1 credit

Parameter

ParameterErforderlichStandardBeschreibung
api_keyJaIhr API-Schlüssel
player_idJaSpieler-ID aus der SofaScore-Spieler-URL (z.B. 457262 für Nicolas Arseneault)
season_yearNeinaktuelles JahrJahr, für das Statistiken berechnet werden sollen (z.B. 2026). Standard: aktuelles Jahr.
langNeinenAntwortsprache: en tr de ru

Antwort

{
  "status":      "ok",
  "player": { /* same as GET /player/profile */ },
  "season_year": "2026",
  "singles": {
    "played":   18,
    "wins":     11,
    "losses":   7,
    "win_rate": 61.1,
    "by_surface": {
      "hardcourt": { "played": 12, "wins": 8, "losses": 4 },
      "clay":      { "played": 4,  "wins": 2, "losses": 2 },
      "grass":     { "played": 2,  "wins": 1, "losses": 1 }
    }
  },
  "doubles": { "played": 6, "wins": 3, "losses": 3, "win_rate": 50.0 },
  "recent_form": ["W", "W", "L", "W", "L", "W", "W", "W", "L", "W"],
  "credits_remaining": 49
}

Feldreferenz

FeldTypBeschreibung
season_yearstringThe year the statistics are filtered to (defaults to current year)
singles.by_surfaceobjectW/L breakdown per surface — keys: hardcourt, clay, grass, carpet
recent_formstring[]Last 10 singles match results, newest first — "W" or "L"
credits_remaininginteger|stringdocs_f_credits_remaining

GET /webhook/register

Registriert einen neuen Webhook-Endpunkt. Wenn ein abonniertes Ereignis eintritt, erhält Ihre URL eine POST-Anfrage mit JSON-Payload. Bis zu 10 aktive Webhooks pro Konto. Kostenlos — verbraucht keine Credits.

GET /api/v1/webhook/register Kostenlos — kein API-Key erforderlich

Parameter

ParameterErforderlichStandardBeschreibung
api_keyJaIhr API-Schlüssel
urlJaEine öffentlich erreichbare http- oder https-URL, die POST-Anfragen empfängt
eventsNeinallKommagetrennte Liste der Ereignistypen (z.B. match.start,score.update). Leer lassen, um alle Ereignisse zu abonnieren.
secretNeinOptionaler Secret-String — wenn gesetzt, enthält jede Anfrage einen X-Webhook-Signature: sha256=<hmac>-Header zur Verifizierung

Verfügbare Ereignisse

EreignisBeschreibung
match.startSpiel hat begonnen (notstartedinprogress)
match.finishSpiel ist mit Endergebnis abgeschlossen
match.postponedSpiel wurde verschoben
match.cancelledSpiel wurde abgesagt
score.updateSet-Score geändert oder aktueller Spielstand aktualisiert (15 / 30 / 40 / A). Enthält current_game-Feld bei laufendem Spiel.
period.startEin neuer Satz hat begonnen
period.endEin Satz ist beendet

Beispielanfragen

https://live-tennis-api.com/api/v1/webhook/register?api_key=YOUR_KEY&url=https://yourapp.com/hook&events=match.start,match.finish,score.update
curl "https://live-tennis-api.com/api/v1/webhook/register?api_key=YOUR_KEY&url=https://yourapp.com/hook&events=match.start,match.finish"
const res = await fetch( 'https://live-tennis-api.com/api/v1/webhook/register?api_key=YOUR_KEY' + '&url=https://yourapp.com/hook&events=match.start,match.finish' ); const data = await res.json(); console.log(data.webhook_id);
<?php $data = json_decode(file_get_contents( 'https://live-tennis-api.com/api/v1/webhook/register?api_key=YOUR_KEY' . '&url=https://yourapp.com/hook&events=match.start,match.finish' ), true); echo $data['webhook_id'];
import requests data = requests.get( 'https://live-tennis-api.com/api/v1/webhook/register', params={'api_key': 'YOUR_KEY', 'url': 'https://yourapp.com/hook', 'events': 'match.start,match.finish'} ).json()

Antwort

{
  "status":     "ok",
  "webhook_id": 12,
  "url":        "https://yourapp.com/hook",
  "events":     ["match.start", "match.finish", "score.update"],
  "secret":     null,
  "credits_remaining": 49
}

Webhook-Payload

Ihr Endpunkt empfängt eine POST-Anfrage mit Content-Type: application/json und folgendem 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.

⚠️ Wichtiger Sicherheitshinweis Webhook-Benachrichtigungen werden von unserem System über die IP-Adresse 45.94.4.69 gesendet. Für zusätzliche Sicherheit können Sie eingehende Anfragen an Ihren Webhook-Endpunkt auf Ihrem Server (auf Firewall-Ebene) so einschränken, dass nur diese IP-Adresse zugelassen wird.

GET /webhook/list

Gibt alle aktiven Webhooks zurück, die mit Ihrem API-Schlüssel registriert sind. Kostenlos — verbraucht keine Credits.

GET /api/v1/webhook/list Kostenlos — kein API-Key erforderlich

Parameter

ParameterErforderlichStandardBeschreibung
api_keyJaIhr API-Schlüssel

Beispielanfragen

https://live-tennis-api.com/api/v1/webhook/list?api_key=YOUR_KEY
curl "https://live-tennis-api.com/api/v1/webhook/list?api_key=YOUR_KEY"
const data = await (await fetch('https://live-tennis-api.com/api/v1/webhook/list?api_key=YOUR_KEY')).json();
<?php $data = json_decode(file_get_contents('https://live-tennis-api.com/api/v1/webhook/list?api_key=YOUR_KEY'), true);
import requests data = requests.get('https://live-tennis-api.com/api/v1/webhook/list', params={'api_key': 'YOUR_KEY'}).json()

Antwort

{
  "status":   "ok",
  "count":    2,
  "webhooks": [
    {
      "webhook_id": 12,
      "url":        "https://yourapp.com/hook",
      "secret":     null,
      "events":     ["match.start", "score.update"],
      "created_at": "2026-07-14 10:32:00"
    }
  ],
  "credits_remaining": 49
}

GET /webhook/delete

Deaktiviert einen Webhook anhand seiner ID. Kostenlos — verbraucht keine Credits.

GET /api/v1/webhook/delete Kostenlos — kein API-Key erforderlich

Parameter

ParameterErforderlichStandardBeschreibung
api_keyJaIhr API-Schlüssel
webhook_idJaWebhook-ID, die von GET /webhook/register oder GET /webhook/list zurückgegeben wurde

Beispielanfragen

https://live-tennis-api.com/api/v1/webhook/delete?api_key=YOUR_KEY&webhook_id=12
curl "https://live-tennis-api.com/api/v1/webhook/delete?api_key=YOUR_KEY&webhook_id=12"
const data = await (await fetch('https://live-tennis-api.com/api/v1/webhook/delete?api_key=YOUR_KEY&webhook_id=12')).json();
<?php $data = json_decode(file_get_contents('https://live-tennis-api.com/api/v1/webhook/delete?api_key=YOUR_KEY&webhook_id=12'), true);
import requests data = requests.get('https://live-tennis-api.com/api/v1/webhook/delete', params={'api_key': 'YOUR_KEY', 'webhook_id': 12}).json()

Antwort

{
  "status":     "ok",
  "webhook_id": 12,
  "deleted":    true,
  "credits_remaining": 49
}