Save up to 17% with yearly billing

See pricing

Доставка колбэков

Когда срабатывает событие, на которое оформлена подписка, SkyLink отправляет HTTP-запрос POST на зарегистрированный вами url с Content-Type: application/json.

Важно: ваш эндпоинт должен ответить 2xx в течение ~30 секунд — медленные обработчики учитываются в пределе автоматического отключения после 10 сбоев подряд, описанном в обзоре вебхуков.

Тело запроса

Полезная нагрузка объединяет метаданные доставки с текущими полями статуса рейса (та же структура departure / arrival):

{
  "event_type": "gate_changed",
  "timestamp": "2026-06-16T14:25:00Z",
  "webhook_id": "00000000-0000-0000-0000-000000000001",
  "flight_number": "BA 123",
  "airline": "British Airways",
  "status": "En Route",
  "departure": {
    "airport": "EGLL",
    "airport_full": "London Heathrow Airport",
    "scheduled_time": "10:30",
    "scheduled_date": "11 Feb",
    "actual_time": "10:35",
    "actual_date": "11 Feb",
    "terminal": "5",
    "gate": "A12",
    "checkin": ""
  },
  "arrival": {
    "airport": "KJFK",
    "airport_full": "John F Kennedy International Airport",
    "scheduled_time": "14:45",
    "scheduled_date": "11 Feb",
    "estimated_time": "14:50",
    "estimated_date": "11 Feb",
    "terminal": "7",
    "gate": "B15",
    "baggage": ""
  }
}
ПолеТипОбязательныйОписание
event_typestringДаКакое из событий подписки сработало — см. Типы событий
timestampstring (ISO 8601)ДаМомент, когда SkyLink обнаружил изменение и поставил доставку в очередь, — используйте для идемпотентности
webhook_idstringДаUUID подписки из ответов create/list
flight_numberstringДаТекущий номер рейса (формат для отображения, может содержать пробел)
airlinestringДаОтображаемое название авиакомпании
statusstringДаТекущая метка статуса — та же семантика, что и в эндпоинте Статус рейса
departureobjectДаБлок вылета — поля полностью совпадают со статусом рейса
arrivalobjectДаБлок прилёта — поля полностью совпадают со статусом рейса

Поля выхода на посадку, терминала и багажа могут быть пустыми строками, если данные не опубликованы, — обрабатывайте их так же, как описано в примечаниях по интеграции статуса рейса.

Клиентские типы

Включает WebhookDelivery и структуры подписок — тот же набор, что и в разделе Подписки:

"""Webhook subscription models."""from __future__ import annotationsfrom dataclasses import dataclass@dataclassclass WebhookCreateRequest:    url: str    event_types: list[str]    filters: dict[str, str]@dataclassclass WebhookSubscription:    id: str    url: str    event_types: list[str]    filters: dict[str, str]    active: bool@dataclassclass WebhookListResponse:    count: int    webhooks: list[WebhookSubscription]@dataclassclass WebhookEventTypesResponse:    event_types: list[str]@dataclassclass WebhookDelivery:    """Inbound POST body SkyLink sends to your callback URL."""    event_type: str    timestamp: str    webhook_id: str    flight_number: str    airline: str    status: str    departure: dict[str, str]    arrival: dict[str, str]

Интеграция

Обработчик вебхуков получает запросы POST от SkyLink, проверяет полезную нагрузку, сохраняет состояние для идемпотентности и быстро возвращает 2xx. Пример ниже реализует минимальный обработчик на Python (FastAPI) и TypeScript (Express), демонстрирует дедупликацию и повторно включает подписку через PATCH после восстановления из автоматического отключения.

"""Minimal webhook payload handler - validates shape and extracts gate changes."""from dataclasses import dataclass@dataclassclass GateChange:    flight_number: str    event_type: str    airport: str    gate: strdef parse_gate_change(payload: dict) -> GateChange | None:    """Return a gate change summary when event_type is gate_changed."""    if payload.get("event_type") != "gate_changed":        return None    dep = payload.get("departure") or {}    arr = payload.get("arrival") or {}    gate = dep.get("gate") or arr.get("gate") or ""    airport = dep.get("airport") or arr.get("airport") or ""    return GateChange(        flight_number=str(payload.get("flight_number", "")),        event_type=str(payload.get("event_type", "")),        airport=airport,        gate=gate,    )SAMPLE_PAYLOAD = {    "event_type": "gate_changed",    "timestamp": "2026-06-16T14:25:00Z",    "webhook_id": "00000000-0000-0000-0000-000000000001",    "flight_number": "BA 123",    "airline": "British Airways",    "status": "En Route",    "departure": {"airport": "EGLL", "gate": "A12"},    "arrival": {"airport": "KJFK", "gate": "B15"},}if __name__ == "__main__":    change = parse_gate_change(SAMPLE_PAYLOAD)    print(change if change else "No gate change in payload")

Примечания по реализации

Важно: выполняйте дедупликацию по flight_number + event_type + timestamp — одно и то же изменение может быть доставлено более одного раза в разных циклах опроса.

Восстановление после автоматического отключения. Исправьте свой эндпоинт, затем отправьте PATCH для подписки с { "active": true } — см. Включение / отключение вебхука. SkyLink не отправляет пропущенные события повторно.

Только HTTPS. URL колбэка должен быть публично доступен по TLS.

Ответы с ошибками

Сбои доставки (ответ не 2xx или тайм-аут) увеличивают счётчик сбоев подряд для подписки. После 10 сбоев SkyLink автоматически отключает подписку — ошибка 403 из-за ограничений тарифа при создании: обзор вебхуков.