Документация API
← ГлавнаяАутентификацияВсе запросы к
/v1/* требуют заголовок X-API-Key. Получите ключ в личном кабинете.curl -H "X-API-Key: YOUR_KEY" https://api.tabloapi.ru/v1/flightsЭндпоинты
GET
Список рейсов. Параметры: airport (DME|SVO|...), type (arrival|departure), date (YYYY-MM-DD)Запрос/v1/flightscurl -H "X-API-Key: YOUR_KEY" \
"https://api.tabloapi.ru/v1/flights?airport=SVO&type=departure&date=2026-06-24"Ответ{
"data": [
{
"id": 1,
"name": "SU100",
"airport_code": "SVO",
"status": "LANDED",
"subStatus": "ARRIVED",
"date_arrival_plan": "2026-06-24T10:30:00.000Z",
"date_arrival_fact": "2026-06-24T10:28:00.000Z",
"city_arrival": "Москва",
"date_departure_plan": "2026-06-24T07:00:00.000Z",
"date_departure_fact": "2026-06-24T07:05:00.000Z",
"city_departure": "Санкт-Петербург",
"type_aircraft": "Airbus A320",
"timezone_offset": 180,
"airlineId": 3,
"date_create": "2026-06-24T06:00:00.000Z",
"date_update": "2026-06-24T10:28:00.000Z"
}
],
"data_freshness": {
"SVO": "2026-06-24T10:25:00.000Z",
"DME": "2026-06-24T10:20:00.000Z"
},
"_k": "a1b2c3d4"
}GET
Детали рейса по номеру. Параметры: airport, dateЗапрос/v1/flights/:flight_numbercurl -H "X-API-Key: YOUR_KEY" \
"https://api.tabloapi.ru/v1/flights/SU100?airport=SVO"Ответ{
"data": {
"id": 1,
"name": "SU100",
"airport_code": "SVO",
"status": "LANDED",
"subStatus": "ARRIVED",
"date_arrival_plan": "2026-06-24T10:30:00.000Z",
"date_arrival_fact": "2026-06-24T10:28:00.000Z",
"city_arrival": "Москва",
"date_departure_plan": "2026-06-24T07:00:00.000Z",
"date_departure_fact": "2026-06-24T07:05:00.000Z",
"city_departure": "Санкт-Петербург",
"type_aircraft": "Airbus A320",
"timezone_offset": 180,
"airlineId": 3,
"date_create": "2026-06-24T06:00:00.000Z",
"date_update": "2026-06-24T10:28:00.000Z",
"events": [
{
"id": 42,
"flightId": 1,
"field": "status",
"old_value": "IN_FLIGHT",
"new_value": "LANDED",
"changed_at": "2026-06-24T10:28:00.000Z"
}
]
},
"data_freshness": { "SVO": "2026-06-24T10:25:00.000Z" },
"_k": "a1b2c3d4"
}POST
Подписка на изменения статуса рейса. Body: { flight_name, airport_code, url, secret }Запрос/v1/webhookscurl -X POST -H "X-API-Key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"flight_name":"SU100","airport_code":"SVO","url":"https://your.app/webhook","secret":"s3cr3t"}' \
"https://api.tabloapi.ru/v1/webhooks"Ответ{
"data": {
"id": 7,
"flight_name": "SU100",
"airport_code": "SVO",
"url": "https://your.app/webhook"
}
}Лимиты запросовВсе запросы к
/v1/* ограничены скользящим окном: по умолчанию 100 запросов за 10 минут с одного API-ключа.Ошибка 429 — превышен лимит
HTTP/1.1 429 Too Many Requests
Retry-After: 600
{"error": "Rate limit exceeded"}Заголовок Retry-After содержит количество секунд до сброса окна.Что делать при 429
1. Подождать значение из заголовка
Retry-After (обычно 600 секунд).2. Реализовать экспоненциальный backoff: при повторных 429 удваивать задержку.3. Если лимиты систематически не хватает — напишите нам для увеличения.Получение вебхуков
Формат событияПри каждом изменении статуса рейса на ваш URL приходит POST-запрос:
{
"event": "flight.status_changed",
"flight_number": "SU100",
"airport_code": "SVO",
"field": "status",
"old_status": "IN_FLIGHT",
"new_status": "LANDED",
"changed_at": "2026-06-27T10:28:00.000Z"
}Поле field принимает значения status или subStatus. Значения статусов: SCHEDULED, DELAYED, CANCELLED, DEPARTED, IN_FLIGHT, LANDED.Проверка подписиКаждый запрос содержит заголовок
X-Signature — HMAC SHA256 от тела запроса, подписанный вашим secret. Всегда проверяйте подпись перед обработкой события.Пример хендлера (Node.js / Express)const crypto = require('crypto');
// Важно: парсить тело как raw Buffer, не JSON
app.post('/webhook', express.raw({ type: 'application/json' }), (req, res) => {
const sig = req.headers['x-signature'];
const expected = crypto
.createHmac('sha256', process.env.WEBHOOK_SECRET)
.update(req.body)
.digest('hex');
if (sig !== expected) {
return res.status(401).send('Invalid signature');
}
const event = JSON.parse(req.body);
// event.flight_number, event.new_status, event.changed_at
console.log(`${event.flight_number}: ${event.old_status} → ${event.new_status}`);
res.status(200).send('OK');
});Повторные попыткиЕсли ваш сервер вернул ошибку (не 2xx) или не ответил за 10 секунд, доставка будет повторена до 3 раз с экспоненциальным backoff (5 сек → 10 сек → 20 сек). Ваш эндпоинт должен быть идемпотентным: одно событие может прийти несколько раз.
Полная интерактивная документация доступна в Swagger UI
Открыть Swagger UI