Метод menu — меню спортивной линии
Для чего нужен метод
Метод menu возвращает структуру доступной спортивной линии:
вид спорта → страна → турнир
В каждом разделе также возвращается количество доступных матчей. Метод удобно использовать для построения меню сайта и получения идентификаторов, по которым затем можно запросить список матчей.
Самих матчей и коэффициентов в ответе menu нет. Для их получения используется метод
events.
Запрос
GET https://YOUR_API_DOMAIN/v1/menu/{type}/{lang}
API-ключ необходимо передавать в HTTP-заголовке:
Package: YOUR_API_KEY
Параметры пути
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
type | string | да | Тип спортивной линии: live или line |
lang | string | да | Язык названий. Язык должен поддерживаться API и входить в тариф клиента |
Значения параметра type:
| Значение | Какие данные возвращаются |
|---|---|
live | Меню матчей, которые доступны в режиме Live |
line | Меню предстоящих матчей Prematch |
Необязательные query-параметры
| Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
cybersport | boolean | false | Переключает метод на меню киберспорта |
Параметры добавляются после ?, например:
GET https://YOUR_API_DOMAIN/v1/menu/live/ru?cybersport=true
Сохранённые в этой документации полные ответы получены без query-параметров, то есть
при cybersport=false.
Пример запроса Live
curl --request GET \
--url 'https://YOUR_API_DOMAIN/v1/menu/live/ru' \
--header 'Package: YOUR_API_KEY'
Для Prematch измените live на line:
curl --request GET \
--url 'https://YOUR_API_DOMAIN/v1/menu/line/ru' \
--header 'Package: YOUR_API_KEY'
Сокращённый пример ответа Live
Ниже показан фрагмент реального ответа. Значения сохранены без изменений, но массивы сокращены до одного вида спорта, одной страны и одного турнира.
{
"status": 1,
"page": "/v1/menu",
"body": [
{
"id": 1,
"name": "Футбол",
"counter": 53,
"sub": [
{
"id": 208,
"name": "Шри-Ланка",
"counter": 1,
"sport_id": 1,
"sub": [
{
"id": 2217395,
"name": "Чемпионат Шри-Ланки. Суперлига",
"counter": 1,
"sport_id": 1,
"countryId": 208
}
]
}
]
}
]
}
Сокращённый пример ответа Prematch
Этот фрагмент также взят из реального ответа. Массивы сокращены.
{
"status": 1,
"page": "/v1/menu",
"body": [
{
"id": 1,
"name": "Футбол",
"counter": 2565,
"sub": [
{
"id": 1,
"name": "Россия",
"counter": 88,
"sport_id": 1,
"sub": [
{
"id": 176125,
"name": "Кубок России",
"counter": 8,
"sport_id": 1,
"countryId": 1
}
]
}
]
}
]
}
Количество матчей постоянно изменяется. Значения counter в этих примерах показывают
состояние линии только в момент получения ответов.
Верхний уровень ответа
| Поле | Тип | Описание |
|---|---|---|
status | number | Статус выполнения запроса. В успешном ответе возвращается 1 |
page | string | Название метода. Для menu возвращается /v1/menu |
body | array | Массив доступных видов спорта |
Поля вида спорта
Каждый объект верхнего уровня в массиве body описывает один вид спорта.
| Поле | Тип | Описание |
|---|---|---|
id | number | ID вида спорта. Используется как sportId в URL других методов |
name | string | Название вида спорта на языке, указанном в lang |
counter | number | Общее количество доступных матчей этого вида спорта |
sub | array | Массив стран, в которых доступны матчи этого вида спорта |
Поля страны
Каждый объект в body[].sub описывает одну страну.
| Поле | Тип | Описание |
|---|---|---|
id | number | ID страны. Используется как countryId в URL других методов |
name | string | Название страны на языке, указанном в lang |
counter | number | Количество доступных матчей во всех турнирах этой страны |
sport_id | number | ID вида спорта, к которому относится страна |
sub | array | Массив доступных турниров этой страны |
Поля турнира
Каждый объект в body[].sub[].sub описывает один турнир.
| Поле | Тип | Описание |
|---|---|---|
id | number | ID турнира. Используется как tournamentId в URL других методов |
name | string | Название турнира на языке, указанном в lang. Иногда API возвращает пустую строку |
counter | number | Количество доступных матчей этого турнира |
sport_id | number | ID вида спорта, к которому относится турнир |
countryId | number | ID страны, к которой относится турнир |
Обратите внимание на точное написание полей в JSON:
- у страны ID вида спорта называется
sport_id; - у турнира ID страны называется
countryIdс заглавной буквойI.
Не заменяйте countryId на country_id при чтении ответа.
Готовые иконки
Для видов спорта, стран и турниров можно использовать стандартные иконки SportAPI.
Нужный ID берётся из ответа menu и подставляется в соответствующий URL.
Иконка вида спорта
Используйте id вида спорта из body[].id:
https://cdn.sportapi.net/sports/v1/color/{sportId}.webp
Например, для вида спорта с id: 1:
https://cdn.sportapi.net/sports/v1/color/1.webp
Иконка страны
Используйте id страны из body[].sub[].id:
https://cdn.sportapi.net/flags/v1/color/{countryId}.webp
Например, для страны с id: 218:
https://cdn.sportapi.net/flags/v1/color/218.webp
Иконка турнира
Используйте id турнира из body[].sub[].sub[].id:
https://cdn.sportapi.net/tournaments/v1/color/{tournamentId}.webp
Например, для турнира с id: 118737:
https://cdn.sportapi.net/tournaments/v1/color/118737.webp
Как понимать counter
Поле counter показывает количество матчей, доступных в выбранном типе линии на момент
ответа:
- у турнира — количество матчей турнира;
- у страны — количество матчей во всех её турнирах;
- у вида спорта — количество матчей во всех его странах и турнирах.
В сохранённых ответах сумма counter дочерних элементов совпадает со значением
counter родительского элемента. Значение динамическое: оно может измениться при
следующем запросе.
Особенности, которые нужно учитывать
Live и Prematch нужно запрашивать отдельно
Оба типа линии имеют одинаковую структуру ответа, но содержат разные наборы видов спорта,
стран и турниров. Для меню Live используйте type=live, для Prematch — type=line.
Пустое название турнира
Поле name у турнира может содержать пустую строку. В сохранённом Live-ответе было пять
таких турниров, в Prematch-ответе — один.
Интерфейс клиента должен корректно обработать такую запись. Например, можно временно показать ID турнира или не отображать турнир до получения названия. Не следует придумывать название турнира на основании других полей.
Состав меню зависит от доступа
API возвращает только те данные, которые доступны переданному ключу. Состав видов спорта и языков зависит от тарифа клиента.
Снимок русскоязычных ответов
| Тип линии | Виды спорта | Страны | Турниры |
|---|---|---|---|
| Live | 31 | 92 | 200 |
Prematch (line) | 34 | 269 | 783 |
Это статистика конкретных ответов от 21 августа 2026 года, а не постоянный состав API.
Полные ответы без сокращений:
Файлы содержат только тело ответа API. API-ключ в них не сохраняется.
Как использовать метод
Обычная последовательность работы:
- Запросите
menuдля нужного типа линии и языка. - Покажите пользователю доступные виды спорта из массива
body. - После выбора спорта откройте страны из его массива
sub. - После выбора страны откройте турниры из её массива
sub. - Передайте выбранные
sportIdиtournamentIdв методevents, чтобы получить матчи. - При следующем обновлении меню учитывайте, что разделы и значения
counterмогли измениться.
Используйте только актуальные ID из меню
menu возвращает только виды спорта, страны и турниры, в которых сейчас есть матчи
выбранного типа линии. Не храните их ID как постоянный список доступных разделов.
Если в турнире закончился или исчез его единственный матч, турнир перестанет возвращаться в следующем ответе. Если после этого у вида спорта не осталось других матчей, из меню исчезнет и сам вид спорта.
Перед запросом events проверяйте, что выбранные sportId и tournamentId присутствуют
в актуальном menu для того же типа live или line.
Частота обновления
Рекомендуется запрашивать menu:
- Live — не чаще одного раза в 20 секунд;
- Prematch (
line) — не чаще одного раза в 60 секунд.
Подробнее: «Рекомендации по обновлению данных».
Ошибки ключа, тарифа и параметров описаны в документе «Обработка ошибок».