Общие соглашения
Формат успешного ответа
Успешный ответ всегда содержит объект или массив в поле data:
{
"data": { "id": 1978, "name": "..." }
}Списковые методы дополнительно возвращают pagination:
{
"data": [ ... ],
"pagination": {
"limit": 100,
"page": 1,
"count": 37,
"total": 37
}
}Формат ошибки
{
"error": {
"code": "seat_unavailable",
"message": "some seats are not available",
"details": { "seats": [101] }
},
"request_id": "9f2c4e7a1b3d5f60718293a4b5c6d7e8"
}code— машиночитаемый код. Ориентируйтесь на него, а не на текстmessage.message— описание на английском для логов и отладки. Текст может меняться.details— дополнительные данные; присутствует не всегда.
Полный список кодов — в разделе Ошибки.
Пагинация
Методы GET /events и GET /events/{eventID}/items поддерживают постраничную загрузку.
| Параметр | По умолчанию | Описание |
|---|---|---|
limit | 100 | Размер страницы. Максимум 500 — бо́льшие значения молча уменьшаются до 500 |
page | 1 | Номер страницы, начиная с 1 |
Поля pagination в ответе:
| Поле | Описание |
|---|---|
limit | Применённый размер страницы |
page | Номер текущей страницы |
count | Сколько элементов на этой странице |
total | Сколько элементов всего |
Неположительные или нечисловые limit и page дают 400 invalid_pagination.
Пример обхода всех страниц:
let page = 1
const all = []
while (true) {
const res = await fetch(`https://gateway.ticket.kg/api/v1/events?limit=100&page=${page}`, {
headers: { 'X-API-Key': KEY }
}).then(r => r.json())
all.push(...res.data)
if (page * res.pagination.limit >= res.pagination.total) break
page++
}Даты и время
- Все даты — в формате RFC 3339 с часовым поясом Кыргызстана:
2026-11-15T19:00:00+06:00. - В Кыргызстане нет перехода на летнее время, смещение всегда
+06:00. - Даты в параметрах отчёта о продажах передаются как
YYYY-MM-DDи тоже трактуются по времени Бишкека.
Деньги
- Все суммы — целые числа в сомах, валюта
KGS. - Комиссия и сумма к перечислению в отчёте — дробные числа с точностью до двух знаков.
Идентификаторы
| Сущность | Тип | Пример |
|---|---|---|
| Мероприятие, сеанс, категория, место, зона, цена, билет | целое число | 2505 |
Заказ (order.id) | строка UUID | "3f6c2a1e-8b4d-4c7a-9e2f-1a2b3c4d5e6f" |
Ваш номер заказа (partner_order_id) | строка до 255 символов | "ORD-1001" |
Request ID
Каждый ответ содержит заголовок X-Request-ID. Вы можете передать свой X-Request-ID в запросе — шлюз вернёт его же. Иначе шлюз сгенерирует случайный.
В ответах с ошибкой request_id дублируется в теле. Указывайте его, когда обращаетесь в поддержку — по нему мы найдём запрос в логах.
Кэширование каталога
Ответы методов GET /categories, GET /events и GET /events/{eventID} кэшируются на стороне шлюза до 10 минут. Ответ из кэша помечается заголовком X-Cache: HIT.
Это значит, что новое мероприятие или изменение описания может появиться в API с задержкой до 10 минут.
Методы, от которых зависит продажа, не кэшируются и всегда возвращают актуальные данные:
GET /events/{eventID}/items— сеансы;GET /event-items/{eventItemID}/seats— места, зоны, остатки;- все методы заказов и отчётов.
TIP
Перед бронированием всегда запрашивайте /event-items/{id}/seats, а не полагайтесь на данные каталога: сеанс мог закрыться с момента загрузки списка мероприятий.
Таймауты
Шлюз обрабатывает запрос не дольше 5 секунд. Рекомендуем ставить таймаут клиента 10–15 секунд и при сетевой ошибке повторять запрос. Для создания заказа повтор безопасен благодаря partner_order_id.