# Обработка ошибок

Обработка ошибок данных о полётах в продакшне — отсутствующие рейсы, некорректные номера и повторные попытки.



Кэширование и квоты: [Кэширование и мониторинг](/docs/v31/flight-operations-integration-production).

**Ошибки платформы** (401, 403, 422, 429, 5xx): [Обработка ошибок](/docs/errors).

### Статус рейса [#flight-status]

`GET /flight_status/{flight_number}` возвращает **404**, когда рейс не опубликован на сегодня, — а не когда в вашем коде ошибка. Параметра даты нет; для данных табло на конкретный день используйте [Расписания](/docs/v31/schedules).

Поля выхода на посадку, терминала, выдачи багажа и регистрации часто содержат пустые строки (`""`) — считайте их неизвестными, а не признаком отсутствующей настройки.

### Расписания [#schedules]

`flights` может быть пустым массивом — это допустимое состояние табло. Ключи строк записаны в **Title Case** (`Flight`, `Time`, `Status`) — ключи в нижнем регистре возвращают `undefined`.

### Расстояние [#distance]

Возвращает **422**, если коды аэропортов не удаётся распознать или координаты выходят за допустимый диапазон.

### Брифинг по полёту [#flight-briefing]

Генерация брифинга выполняется медленно (часто 30–90 с) и под нагрузкой может возвращать **503**. Выполните одну повторную попытку после короткой задержки (backoff); не засыпайте эндпоинт запросами при каждой перерисовке интерфейса.

Структурированный JSON использует `summary`, `origin_briefing` и `destination_briefing` — а не обёртку `sections`.

```python
import os
import time

import requests

HEADERS = {
    "X-RapidAPI-Key": os.getenv("RAPIDAPI_KEY", "YOUR_RAPIDAPI_KEY"),
    "X-RapidAPI-Host": "skylink-api.p.rapidapi.com",
}
BASE = "https://skylink-api.p.rapidapi.com"


def fetch_status(flight: str) -> dict | None:
    r = requests.get(f"{BASE}/flight_status/{flight}", headers=HEADERS, timeout=(10, 15))
    if r.status_code == 404:
        return None
    r.raise_for_status()
    return r.json()


def fetch_briefing(origin: str, destination: str) -> dict | None:
    params = {
        "origin": origin,
        "destination": destination,
        "include_weather": "true",
        "include_notams": "true",
        "format": "json",
    }
    for attempt in range(2):
        r = requests.get(
            f"{BASE}/briefing/flight",
            headers=HEADERS,
            params=params,
            timeout=(10, 90),
        )
        if r.status_code == 404:
            return None
        if r.status_code in (502, 503, 504):
            if attempt == 0:
                time.sleep(8)
                continue
            return None
        r.raise_for_status()
        return r.json()
    return None


if __name__ == "__main__":
    status = fetch_status("BA123")
    print("Status:", status["status"] if status else "not found today")
    print("Briefing smoke test: see flight-briefing-integration (60–90 s generation time)")
```

Для временных сбоев используйте вспомогательную функцию повторных попыток со страницы [Обработка ошибок](/docs/errors#retry-rules).

***

См. также: [Статус рейса](/docs/v31/flight-status-integration) · [Расписания](/docs/v31/schedules-integration) · [Расстояние](/docs/v31/distance-integration) · [Брифинг по полёту](/docs/v31/flight-briefing-integration) · [Кэширование и мониторинг](/docs/v31/flight-operations-integration-production)
