Доставка колбэков
Когда срабатывает событие, на которое оформлена подписка, 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_type | string | Да | Какое из событий подписки сработало — см. Типы событий |
timestamp | string (ISO 8601) | Да | Момент, когда SkyLink обнаружил изменение и поставил доставку в очередь, — используйте для идемпотентности |
webhook_id | string | Да | UUID подписки из ответов create/list |
flight_number | string | Да | Текущий номер рейса (формат для отображения, может содержать пробел) |
airline | string | Да | Отображаемое название авиакомпании |
status | string | Да | Текущая метка статуса — та же семантика, что и в эндпоинте Статус рейса |
departure | object | Да | Блок вылета — поля полностью совпадают со статусом рейса |
arrival | object | Да | Блок прилёта — поля полностью совпадают со статусом рейса |
Поля выхода на посадку, терминала и багажа могут быть пустыми строками, если данные не опубликованы, — обрабатывайте их так же, как описано в примечаниях по интеграции статуса рейса.
Клиентские типы
Включает 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 из-за ограничений тарифа при создании: обзор вебхуков.