---
id: api-menu
title: Метод `menu` — меню спортивной линии
description: Описание метода menu, который возвращает структуру видов спорта, стран и турниров доступной спортивной линии.
version: v1
language: ru
---

# Метод `menu` — меню спортивной линии


## Для чего нужен метод

Метод `menu` возвращает структуру доступной спортивной линии:

```text
вид спорта → страна → турнир
```

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

Самих матчей и коэффициентов в ответе `menu` нет. Для их получения используется метод
`events`.

## Запрос

```http
GET https://YOUR_API_DOMAIN/v1/menu/{type}/{lang}
```

API-ключ необходимо передавать в HTTP-заголовке:

```http
Package: YOUR_API_KEY
```

### Параметры пути

| Параметр | Тип | Обязательный | Описание |
|---|---|---:|---|
| `type` | string | да | Тип спортивной линии: `live` или `line` |
| `lang` | string | да | Язык названий. Язык должен поддерживаться API и входить в тариф клиента |

Значения параметра `type`:

| Значение | Какие данные возвращаются |
|---|---|
| `live` | Меню матчей, которые доступны в режиме Live |
| `line` | Меню предстоящих матчей Prematch |

### Необязательные query-параметры

| Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
| `cybersport` | boolean | `false` | Переключает метод на меню киберспорта |

Параметры добавляются после `?`, например:

```http
GET https://YOUR_API_DOMAIN/v1/menu/live/ru?cybersport=true
```

Сохранённые в этой документации полные ответы получены без query-параметров, то есть
при `cybersport=false`.

## Пример запроса Live

```bash
curl --request GET \
  --url 'https://YOUR_API_DOMAIN/v1/menu/live/ru' \
  --header 'Package: YOUR_API_KEY'
```

Для Prematch измените `live` на `line`:

```bash
curl --request GET \
  --url 'https://YOUR_API_DOMAIN/v1/menu/line/ru' \
  --header 'Package: YOUR_API_KEY'
```

## Сокращённый пример ответа Live

Ниже показан фрагмент реального ответа. Значения сохранены без изменений, но массивы
сокращены до одного вида спорта, одной страны и одного турнира.

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

Этот фрагмент также взят из реального ответа. Массивы сокращены.

```json
{
  "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`:

```text
https://cdn.sportapi.net/sports/v1/color/{sportId}.webp
```

Например, для вида спорта с `id: 1`:

[https://cdn.sportapi.net/sports/v1/color/1.webp](https://cdn.sportapi.net/sports/v1/color/1.webp)

### Иконка страны

Используйте `id` страны из `body[].sub[].id`:

```text
https://cdn.sportapi.net/flags/v1/color/{countryId}.webp
```

Например, для страны с `id: 218`:

[https://cdn.sportapi.net/flags/v1/color/218.webp](https://cdn.sportapi.net/flags/v1/color/218.webp)

### Иконка турнира

Используйте `id` турнира из `body[].sub[].sub[].id`:

```text
https://cdn.sportapi.net/tournaments/v1/color/{tournamentId}.webp
```

Например, для турнира с `id: 118737`:

[https://cdn.sportapi.net/tournaments/v1/color/118737.webp](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.

Полные ответы без сокращений:

- [Live, русский язык](../examples/json-responses/menu.live.ru.json)
- [Prematch, русский язык](../examples/json-responses/menu.line.ru.json)
- [Live, английский язык](../examples/json-responses/menu.live.en.json)
- [Prematch, английский язык](../examples/json-responses/menu.line.en.json)

Файлы содержат только тело ответа API. API-ключ в них не сохраняется.

## Как использовать метод

Обычная последовательность работы:

1. Запросите `menu` для нужного типа линии и языка.
2. Покажите пользователю доступные виды спорта из массива `body`.
3. После выбора спорта откройте страны из его массива `sub`.
4. После выбора страны откройте турниры из её массива `sub`.
5. Передайте выбранные `sportId` и `tournamentId` в метод `events`, чтобы получить матчи.
6. При следующем обновлении меню учитывайте, что разделы и значения `counter` могли
   измениться.

### Используйте только актуальные ID из меню

`menu` возвращает только виды спорта, страны и турниры, в которых сейчас есть матчи
выбранного типа линии. Не храните их ID как постоянный список доступных разделов.

Если в турнире закончился или исчез его единственный матч, турнир перестанет
возвращаться в следующем ответе. Если после этого у вида спорта не осталось других
матчей, из меню исчезнет и сам вид спорта.

Перед запросом `events` проверяйте, что выбранные `sportId` и `tournamentId` присутствуют
в актуальном `menu` для того же типа `live` или `line`.

## Частота обновления

Рекомендуется запрашивать `menu`:

- Live — не чаще одного раза в 20 секунд;
- Prematch (`line`) — не чаще одного раза в 60 секунд.

Подробнее: [«Рекомендации по обновлению данных»](../getting-started/update-guidelines.md).

Ошибки ключа, тарифа и параметров описаны в документе
[«Обработка ошибок»](../getting-started/error-handling.md).
