Документация — Tennis API
Войти Получить API-ключ

Документация Tennis API

Простой REST API. Передавайте API-ключ как параметр запроса — заголовки не нужны.

Базовый URL: https://live-tennis-api.com/api/v1

Аутентификация

Добавьте api_key к каждому URL запроса. Создайте бесплатный аккаунт, чтобы получить ключ.

https://live-tennis-api.com/api/v1/matches?api_key=YOUR_KEY
Не раскрывайте свой API-ключ в публичном коде или открытых репозиториях.

Кредиты

Каждый вызов API расходует кредиты. Кредиты не истекают. Новые аккаунты получают 100 бесплатных кредитов.

ЭндпоинтСтоимость
GET /matches1 кредит за вызов
GET /match/scores1 кредит за вызов
GET /match/statistics1 кредит за вызов
GET /match/h2h1 кредит за вызов
GET /match/trackerБесплатно — API-ключ не нужен
GET /rankings1 кредит за вызов
GET /tournament/details1 кредит за вызов
GET /tournament/bracket1 кредит за вызов
GET /tournament/results1 кредит за вызов
GET /player/profile1 кредит за вызов
GET /player/matches1 кредит за вызов
GET /player/statistics1 кредит за вызов
GET /webhook/registerБесплатно — API-ключ не нужен
GET /webhook/listБесплатно — API-ключ не нужен
GET /webhook/deleteБесплатно — API-ключ не нужен

Остаток возвращается в каждом ответе в поле credits_remaining и заголовке X-Credits-Remaining.

Ошибки

Все ошибки возвращают JSON с полями code и message:

{ "error": "Invalid API key.", "code": 401 }
КодЗначение
401Отсутствующий или недействительный api_key
402Недостаточно кредитов
400Недопустимый параметр (например, неверный формат даты)
503Источник данных недоступен

GET /matches

Возвращает матчи по Теннису за указанную дату. Названия команд и лиг можно переводить.

GET /api/v1/matches 1 credit

Параметры

ПараметрОбязательныйПо умолчаниюОписание
api_keyДаВаш API-ключ
dateНетСегодняДата матча в формате YYYY-MM-DD
langНетenЯзык ответа: en tr de ru

Примеры запросов

# 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'])

Ответ

{
  "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
}

Справочник полей

ПолеТипОписание
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

Возвращает текущий счёт, детализацию по сетам и живой счёт игры для конкретного матча. Кэш 30 секунд для живых матчей.

GET /api/v1/match/scores 1 credit

Параметры

ПараметрОбязательныйПо умолчаниюОписание
api_keyДаВаш API-ключ
match_idДаMatch ID from GET /matches (id field)
langНетenЯзык ответа: en tr de ru

Примеры запросов

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'])

Ответ

{
  "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
}

Справочник полей

ПолеТипОписание
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

Возвращает полную статистику матча по периодам (ВСЕ + каждый сет). Включает статистику подачи, приёма, очков, геймов и прочее для обоих игроков.

GET /api/v1/match/statistics 1 credit

Параметры

ПараметрОбязательныйПо умолчаниюОписание
api_keyДаВаш API-ключ
match_idДаMatch ID from GET /matches
langНетenЯзык ответа: en tr de ru

Примеры запросов

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'])

Ответ

{
  "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
}

Справочник полей

ПолеТипОписание
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

Возвращает сводку личных встреч, все исторические матчи двух игроков и последние 5 матчей каждого игрока (форма).

GET /api/v1/match/h2h 1 credit

Параметры

ПараметрОбязательныйПо умолчаниюОписание
api_keyДаВаш API-ключ
match_idДаMatch ID from GET /matches
langНетenЯзык ответа: en tr de ru

Примеры запросов

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'])

Ответ

{
  "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
}

Справочник полей

ПолеТипОписание
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

Возвращает live-трекер матча в виде полностью отрендеренной HTML-страницы. API-ключ не нужен — получите tracker_url из GET /match/scores и вставьте его напрямую в iframe. Ваш API-ключ никогда не будет виден конечным пользователям.

GET /api/v1/match/tracker Бесплатно — API-ключ не нужен
Совет: Вызовите GET /match/scores на стороне сервера, получите tracker_url и установите его как src iframe. Тогда ваш API-ключ остаётся на сервере и не виден в исходном коде страницы.

Параметры

ПараметрОбязательныйПо умолчаниюОписание
match_idДаID матча из ответа /matches
langНетenЯзык ответа: en tr de ru

Примеры запросов

# 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)

Ответ

Этот эндпоинт возвращает text/html — полноценную HTML-страницу для вставки в iframe. Ответ не является JSON.

GET /rankings

Возвращает рейтинги игроков ATP, WTA, ATP Live или WTA Live. Полный список до 500 игроков кэшируется на сервере — используйте from и limit для пагинации без дополнительных кредитов.

GET /api/v1/rankings 1 credit

Параметры

ПараметрОбязательныйПо умолчаниюОписание
api_keyДаВаш API-ключ
typeНетatpСписок рейтинга: atp, wta, atp_live или wta_live
fromНет1Начальная позиция (с 1). Например, 51 — начать с 51-го места.
limitНет100Количество возвращаемых игроков (по умолчанию 100, макс. 500).

Примеры запросов

# 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()

Ответ

{
  "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
}

Справочник полей

ПолеТипОписание
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

Возвращает основные метаданные турнира за указанный сезон — название, покрытие, страну, город, призовые, размер сетки и даты. Также содержит массив seasons для навигации по годам и массив info_boxes с дополнительными полями от SofaScore.

GET /api/v1/tournament/details 1 credit

Параметры

ПараметрОбязательныйПо умолчаниюОписание
api_keyДаВаш API-ключ
tournament_idДаID турнира из URL SofaScore (например, 23140 для ATP Challenger Lincoln)
season_idНетпоследнийID сезона — используйте seasons[].id из GET /tournament/results для конкретного года. По умолчанию: последний сезон.
langНетenЯзык ответа: en tr de ru

Примеры запросов

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()

Ответ

{
  "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
}

Справочник полей

ПолеТипОписание
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

Возвращает полную сетку нокаут-турнира для сезона — основная сетка и квалификация. Каждый раунд содержит все матчи с игроками, рейтингами и флагом победителя. Используйте season_id из GET /tournament/results для выбора года.

GET /api/v1/tournament/bracket 1 credit

Параметры

ПараметрОбязательныйПо умолчаниюОписание
api_keyДаВаш API-ключ
tournament_idДаID турнира из URL SofaScore (например, 23140 для ATP Challenger Lincoln)
season_idНетпоследнийID сезона — используйте seasons[].id из GET /tournament/results для конкретного года. По умолчанию: последний сезон.

Примеры запросов

# 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'])

Ответ

{
  "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
}

Справочник полей

ПолеТипОписание
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

Возвращает завершённые и предстоящие матчи турнирного сезона, а также список всех доступных сезонов для выбора года. Включает сеяный номер игрока при наличии.

GET /api/v1/tournament/results 1 credit

Параметры

ПараметрОбязательныйПо умолчаниюОписание
api_keyДаВаш API-ключ
tournament_idДаID турнира из URL SofaScore (например, 23140 для ATP Challenger Lincoln)
season_idНетпоследнийID сезона — используйте seasons[].id из GET /tournament/results для конкретного года. По умолчанию: последний сезон.
langНетenЯзык ответа: en tr de ru

Примеры запросов

# 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'])

Ответ

{
  "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
}

Справочник полей

ПолеТипОписание
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

Возвращает полную биографию игрока — рейтинг, рабочая рука, рост, вес, дата рождения, призовые и фото.

GET /api/v1/player/profile 1 credit

Параметры

ПараметрОбязательныйПо умолчаниюОписание
api_keyДаВаш API-ключ
player_idДаID игрока из URL SofaScore (например, 457262 для Nicolas Arseneault)
langНетenЯзык ответа: en tr de ru

Примеры запросов

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()

Ответ

{
  "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
}

Справочник полей

ПолеТипОписание
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

Возвращает последние и предстоящие матчи игрока по всем турнирам с пагинацией. Фильтруйте по type=singles или type=doubles.

GET /api/v1/player/matches 1 credit

Параметры

ПараметрОбязательныйПо умолчаниюОписание
api_keyДаВаш API-ключ
player_idДаID игрока из URL SofaScore (например, 457262 для Nicolas Arseneault)
pageНет0Страница результатов — 0 = 30 последних матчей, 1 = предыдущие 30 и т.д.
typeНетallФильтр по типу матча: all (по умолчанию), singles или doubles
langНетenЯзык ответа: en tr de ru

Ответ

{
  "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
}

Справочник полей

ПолеТипОписание
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

Возвращает статистику побед/поражений игрока за указанный сезонный год — общую и с разбивкой по покрытию. Охватывает до 60 последних матчей.

GET /api/v1/player/statistics 1 credit

Параметры

ПараметрОбязательныйПо умолчаниюОписание
api_keyДаВаш API-ключ
player_idДаID игрока из URL SofaScore (например, 457262 для Nicolas Arseneault)
season_yearНеттекущий годГод для подсчёта статистики (например, 2026). По умолчанию: текущий год.
langНетenЯзык ответа: en tr de ru

Ответ

{
  "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
}

Справочник полей

ПолеТипОписание
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

Регистрирует новый webhook-эндпоинт. При наступлении подписанного события ваш URL получит POST-запрос с JSON-телом. Максимум 10 активных вебхуков на аккаунт. Бесплатно — кредиты не тратятся.

GET /api/v1/webhook/register Бесплатно — API-ключ не нужен

Параметры

ПараметрОбязательныйПо умолчаниюОписание
api_keyДаВаш API-ключ
urlДаПублично доступный http или https URL, который будет получать POST-запросы
eventsНетallСписок типов событий через запятую (например, match.start,score.update). Оставьте пустым, чтобы подписаться на все события.
secretНетНеобязательная секретная строка — при наличии каждый запрос содержит заголовок X-Webhook-Signature: sha256=<hmac> для проверки подлинности

Доступные события

СобытиеОписание
match.startМатч начался (notstartedinprogress)
match.finishМатч завершён с финальным счётом
match.postponedМатч перенесён
match.cancelledМатч отменён
score.updateСчёт сета изменился или обновлён текущий счёт игры (15 / 30 / 40 / A). Содержит поле current_game при активном розыгрыше.
period.startНачался новый сет
period.endСет завершился

Примеры запросов

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()

Ответ

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

Payload вебхука

Ваш эндпоинт получает POST-запрос с Content-Type: application/json и следующим телом:

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.

⚠️ Важное уведомление о безопасности Webhook-уведомления отправляются из нашей системы с IP-адреса 45.94.4.69. Для дополнительной безопасности вы можете ограничить входящие запросы к вашему webhook-эндпоинту на вашем сервере (на уровне брандмауэра), разрешив доступ только с этого IP-адреса.

GET /webhook/list

Возвращает все активные вебхуки, зарегистрированные для вашего API-ключа. Бесплатно — кредиты не тратятся.

GET /api/v1/webhook/list Бесплатно — API-ключ не нужен

Параметры

ПараметрОбязательныйПо умолчаниюОписание
api_keyДаВаш API-ключ

Примеры запросов

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()

Ответ

{
  "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

Деактивирует вебхук по его ID. Бесплатно — кредиты не тратятся.

GET /api/v1/webhook/delete Бесплатно — API-ключ не нужен

Параметры

ПараметрОбязательныйПо умолчаниюОписание
api_keyДаВаш API-ключ
webhook_idДаID вебхука, возвращённый GET /webhook/register или GET /webhook/list

Примеры запросов

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()

Ответ

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