Tablo API

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

← Главная
АутентификацияВсе запросы к /v1/* требуют заголовок X-API-Key. Получите ключ в личном кабинете.
curl -H "X-API-Key: YOUR_KEY" https://api.tabloapi.ru/v1/flights
Эндпоинты
GET/v1/flights
Список рейсов. Параметры: airport (DME|SVO|...), type (arrival|departure), date (YYYY-MM-DD)Запрос
curl -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/v1/flights/:flight_number
Детали рейса по номеру. Параметры: airport, dateЗапрос
curl -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/v1/webhooks
Подписка на изменения статуса рейса. Body: { flight_name, airport_code, url, secret }Запрос
curl -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
Документация API — Tablo API