Поиск в истории полётов
Ищите архивные полёты по бортовому номеру, позывному (позывной рейса, транслируемый по ADS-B, например BAW178), маршруту или hex-коду и получайте список полётов с UUID flight_id. Требуется хотя бы один фильтр. Это обязательный первый шаг в любом сценарии работы с историческими данными ADS-B: без flight_id, полученного из поиска, эндпоинты деталей и трека вызвать невозможно.
Уровни тарифов и правила префиксов пути: раздел «Исторические данные ADS-B».
Требования
x-api-key в каждом запросе (прямая подписка). Подробнее →Pro, Ultra или Mega — используйте префикс пути, соответствующий нужному вам временному окну (см. сравнительную таблицу в обзорном разделе).
Подробнее →Запрос
https://data.skylinkapi.com/v3.1/ultra/history/flights| Параметр | Тип | Обязательный | По умолчанию | Описание |
|---|---|---|---|---|
start | string | Нет | 24 ч назад | Начало окна запроса — дата и время в ISO 8601 |
end | string | Нет | сейчас | Конец окна запроса — дата и время в ISO 8601 |
icao24 | string | Нужен хотя бы один фильтр | - | Hex-адрес ICAO24 (6 символов) |
registration | string | Нужен хотя бы один фильтр | - | Бортовой номер (например, N12345, G-XWBA). Преобразуется в icao24 на стороне сервера |
callsign | string | Нужен хотя бы один фильтр | - | Точное совпадение позывного (например, BAW117) |
departure_icao | string | Нужен хотя бы один фильтр | - | ICAO аэропорта вылета (4 символа) |
arrival_icao | string | Нужен хотя бы один фильтр | - | ICAO аэропорта прилёта (4 символа) |
limit | integer | Нет | 100 | Максимальное число возвращаемых полётов (не более 1000 на пути ULTRA) |
Если переданы и registration, и icao24, они должны относиться к одному и тому же воздушному судну. На пути ULTRA окно запроса не может превышать 90 дней.
Путь MEGA (`/mega/history/...`)Развернуть раздел
https://data.skylinkapi.com/v3.1/mega/history/flights| Параметр | Тип | Обязательный | По умолчанию | Описание |
|---|---|---|---|---|
start | string | Нет | 24 ч назад | Начало окна — ISO 8601 (на пути MEGA охват не более 365 дней) |
end | string | Нет | сейчас | Конец окна — ISO 8601 |
icao24 | string | Нужен хотя бы один фильтр | - | ICAO24 hex (6 символов) |
registration | string | Нужен хотя бы один фильтр | - | Бортовой номер |
callsign | string | Нужен хотя бы один фильтр | - | Точный позывной |
departure_icao | string | Нужен хотя бы один фильтр | - | ICAO аэропорта вылета |
arrival_icao | string | Нужен хотя бы один фильтр | - | ICAO аэропорта прилёта |
limit | integer | Нет | 200 | Максимальное число полётов (не более 2000 на пути MEGA) |
Требуется тариф RapidAPI Ultra или Mega. Параметры и формат ответа такие же, как у ULTRA, — различаются только ограничения окна и лимита. См. сравнительную таблицу в обзорном разделе.
Ответ
{
"filters": {
"icao24": null,
"registration": null,
"resolved_icao24": null,
"callsign": null,
"departure_icao": "EGLL",
"arrival_icao": null
},
"count": 1,
"flights": [
{
"flight_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"icao24": "40621d",
"callsign": "BAW178",
"flight_number": "BAW178",
"tail_number": "G-XWBA",
"aircraft_type_icao": "B77W",
"aircraft_type_name": "Boeing 777-300ER",
"airline_icao": "BAW",
"airline_iata": "BA",
"airline_name": "British Airways",
"departure_airport_icao": "EGLL",
"departure_airport_iata": "LHR",
"departure_airport_name": "London Heathrow Airport",
"arrival_airport_icao": "KJFK",
"arrival_airport_iata": "JFK",
"arrival_airport_name": "John F Kennedy International Airport",
"flight_state": "ARCHIVED",
"flight_start": "2026-05-12T19:42:05Z",
"flight_end": "2026-05-13T03:11:10Z",
"takeoff_time": "2026-05-12T19:45:00Z",
"landing_time": "2026-05-13T03:08:00Z",
"flight_duration_min": 443.0,
"distance_nm": 2998.4,
"confidence": 1.0,
"route_source": "vrs_confirmed",
"gps_spoofing_suspected": false,
"diversion_suspected": false
}
]
}| Поле | Тип | Обязательный | Описание |
|---|---|---|---|
filters | object | Да | Повтор применённых фильтров поиска (см. ниже) |
count | integer | Да | Количество элементов в flights |
flights | array | Да | Сводки подходящих полётов (может быть пустым) |
Применённые фильтры (filters)
| Поле | Тип | Обязательный | Может быть null? | Описание |
|---|---|---|---|---|
icao24 | string | null | Да | Да | Запрошенный ICAO24 hex, если указан |
registration | string | null | Да | Да | Запрошенный бортовой номер, если указан |
resolved_icao24 | string | null | Да | Да | ICAO24, определённый по registration, если он передан |
callsign | string | null | Да | Да | Запрошенный позывной, если указан |
departure_icao | string | null | Да | Да | Запрошенный аэропорт вылета, если указан |
arrival_icao | string | null | Да | Да | Запрошенный аэропорт прилёта, если указан |
Сводка полёта (flights[])
| Поле | Тип | Обязательный | Может быть null? | Описание |
|---|---|---|---|---|
flight_id | string | Да | Никогда | UUID для запросов деталей и трека |
icao24 | string | null | Нет | Да | Hex-адрес воздушного судна, если известен |
callsign | string | null | Нет | Да | Позывной ADS-B во время полёта |
flight_number | string | null | Нет | Да | Нормализованный номер рейса, если определён |
tail_number | string | null | Нет | Да | Бортовой номер, если известен |
aircraft_type_icao | string | null | Нет | Да | Код типа ВС по ICAO (например, B77W) |
aircraft_type_name | string | null | Нет | Да | Тип ВС в удобочитаемом виде |
airline_icao | string | null | Нет | Да | Код авиакомпании ICAO |
airline_iata | string | null | Нет | Да | Код авиакомпании IATA |
airline_name | string | null | Нет | Да | Отображаемое название авиакомпании |
departure_airport_icao | string | null | Нет | Да | ICAO аэропорта вылета, если определён |
departure_airport_iata | string | null | Нет | Да | IATA аэропорта вылета |
departure_airport_name | string | null | Нет | Да | Название аэропорта вылета |
arrival_airport_icao | string | null | Нет | Да | ICAO аэропорта прилёта, если определён |
arrival_airport_iata | string | null | Нет | Да | IATA аэропорта прилёта |
arrival_airport_name | string | null | Нет | Да | Название аэропорта прилёта |
flight_state | string | null | Нет | Да | Состояние в архиве (например, ARCHIVED) |
flight_start | string | Да | Никогда | Первое наблюдение в архиве (ISO 8601) |
flight_end | string | Да | Никогда | Последнее наблюдение в архиве (ISO 8601) |
takeoff_time | string | null | Нет | Да | Расчётное или зафиксированное время взлёта (ISO 8601) |
landing_time | string | null | Нет | Да | Расчётное или зафиксированное время посадки (ISO 8601) |
flight_duration_min | number | null | Нет | Да | Продолжительность от выхода до выхода (gate-to-gate) в минутах |
distance_nm | number | null | Нет | Да | Расстояние по ортодромии в морских милях |
confidence | number | null | Нет | Да | Оценка достоверности маршрута (0–1) |
route_source | string | null | Нет | Да | Непрозрачный enum, описывающий способ определения маршрута, — используйте как отображаемое значение, а не как ключ для сопоставления |
gps_spoofing_suspected | boolean | null | Нет | Да | Был ли для этого полёта отмечен подмен сигнала GPS (спуфинг) |
diversion_suspected | boolean | null | Нет | Да | Было ли для этого полёта отмечено отклонение от маршрута |
Клиентские типы
"""Typed models for Historical ADS-B - matches historical-adsb.mdx field tables."""from __future__ import annotationsfrom dataclasses import dataclassfrom typing import Literal@dataclassclass HistoricalFlightSummary: flight_id: str icao24: str | None callsign: str | None flight_number: str | None tail_number: str | None departure_airport_icao: str | None arrival_airport_icao: str | None flight_start: str flight_end: str takeoff_time: str | None landing_time: str | None flight_duration_min: float | None distance_nm: float | None@dataclassclass HistoricalPosition: timestamp: str icao24: str latitude: float longitude: float altitude_baro: float | None ground_speed: float | None track: float | None vertical_rate: float | None is_on_ground: bool@dataclassclass HistoricalFlightWindow: flight_id: str callsign: str | None departure_airport_icao: str | None arrival_airport_icao: str | None takeoff_time: str | None landing_time: str | None flight_start: str flight_end: str flight_state: str | None@dataclassclass AirportTrafficFlight: flight_id: str icao24: str | None callsign: str | None departure_airport_icao: str | None arrival_airport_icao: str | None takeoff_time: str | None landing_time: str | None flight_duration_min: float | None distance_nm: float | None@dataclassclass AirportTrafficResponse: icao: str direction: Literal["dep", "arr", "both"] count: int flights: list[AirportTrafficFlight]Интеграция
Типичный сценарий — поиск → детали (метаданные) или поиск → трек (воспроизведение на карте). Выполните поиск хотя бы с одним фильтром, возьмите flight_id из результатов, затем вызовите детали или трек.
Пример ниже выполняет поиск по аэропорту вылета, получает полные метаданные для первого совпадения и использует таймауты подключения и чтения, чтобы пакетные задания не могли зависнуть на неопределённое время. На тарифах без доступа к историческим данным ADS-B обрабатывайте 401/403 от шлюза до разбора JSON — см. обзорный раздел → Ответы с ошибками.
import osimport requestsBASE = "https://data.skylinkapi.com/v3.1"HEADERS = { "x-api-key": os.getenv("SKYLINK_API_KEY", "YOUR_API_KEY")}PLAN_GATED = {401, 403}def search_historical_flights( *, registration: str | None = None, callsign: str | None = None, icao24: str | None = None, departure_icao: str | None = None, arrival_icao: str | None = None, start: str | None = None, end: str | None = None, limit: int = 10, tier: str = "ultra",) -> dict: """Search archived flights - at least one aircraft/route filter is required.""" params = {k: v for k, v in { "registration": registration, "callsign": callsign, "icao24": icao24, "departure_icao": departure_icao, "arrival_icao": arrival_icao, "start": start, "end": end, "limit": limit, }.items() if v is not None} r = requests.get( f"{BASE}/{tier}/history/flights", headers=HEADERS, params=params, timeout=(10, 25), ) r.raise_for_status() return r.json()def fetch_historical_flight_detail(flight_id: str, *, tier: str = "ultra") -> dict: """Fetch full metadata for one archived flight by UUID.""" r = requests.get( f"{BASE}/{tier}/history/flight/{flight_id}", headers=HEADERS, timeout=(10, 25), ) r.raise_for_status() return r.json()def search_then_detail( *, departure_icao: str, limit: int = 1, tier: str = "ultra",) -> dict | None: """Search → pick first match → return full flight detail.""" search = search_historical_flights( departure_icao=departure_icao, limit=limit, tier=tier, ) flights = search.get("flights") or [] if not flights: return None return fetch_historical_flight_detail(flights[0]["flight_id"], tier=tier)if __name__ == "__main__": import json detail = search_then_detail(departure_icao="EGLL") print(json.dumps(detail, indent=2, default=str) if detail else "No matching flight found")Примечания по реализации
Выбирайте правильный префикс пути. Используйте /ultra/history/... на Pro и выше, когда достаточно окна в 90 дней. Используйте /mega/history/... на Ultra/Mega, когда нужно до 365 дней или более высокие лимиты на запрос.
Связывайте запросы через flight_id. Никогда не угадывайте временные окна для воспроизведения трека — сначала выполните поиск, затем вызовите /history/flight/{flight_id}/track, чтобы получить путь с автоматически определёнными границами.
Разбивайте большие окна на страницы. Если count равен запрошенному limit, сузьте окно start/end или увеличьте limit (в пределах ограничений уровня) и объединяйте результаты на стороне клиента.
Регистрационный номер или hex. Предпочитайте registration, если ваши пользователи знают бортовые номера; используйте icao24 при приёме «сырых» потоков ADS-B.
Ответы с ошибками
Ограничения тарифа 401/403: раздел «Исторические данные ADS-B». Ошибки, специфичные для эндпоинта:
422 — нет фильтра поиска
Требуется хотя бы один из параметров icao24, registration, callsign, departure_icao или arrival_icao:
{
"detail": [
{
"type": "value_error",
"loc": ["query"],
"msg": "At least one filter (icao24, registration, callsign, departure_icao, arrival_icao) is required"
}
]
}422 — слишком широкое окно
Возвращается, когда охват start/end превышает максимум для пути — 90 дней на /ultra/history/... или 365 дней на /mega/history/...:
{
"detail": "Query window exceeds maximum of 90 days for your plan on /ultra/history/..."
}422 — несоответствие регистрационного номера и ICAO24
Когда переданы оба идентификатора, но они относятся к разным воздушным судам:
{
"detail": "registration and icao24 refer to different aircraft"
}Your SkyLink licence key, for keys bought direct from skylinkapi.com.
In: header
Query Parameters
Start datetime ISO 8601. Defaults to 24 h ago.
End datetime ISO 8601. Defaults to now.
Filter by ICAO24 hex (6 chars)
Filter by aircraft registration / tail number (e.g. 'N12345')
Filter by callsign (exact match, e.g. 'BAW123')
Filter by departure airport ICAO (4 chars)
Filter by arrival airport ICAO (4 chars)
Max records (default 100, max 1000)
1001 <= value <= 1000Response Body
application/json
application/json
curl -X GET "https://data.skylinkapi.com/v3.1/ultra/history/flights"null{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string",
"input": null,
"ctx": {}
}
]
}Your SkyLink licence key, for keys bought direct from skylinkapi.com.
In: header
Query Parameters
Start datetime ISO 8601. Defaults to 24 h ago.
End datetime ISO 8601. Defaults to now.
Filter by ICAO24 hex (6 chars)
Filter by aircraft registration / tail number (e.g. 'N12345')
Filter by callsign (exact match, e.g. 'BAW123')
Filter by departure airport ICAO (4 chars)
Filter by arrival airport ICAO (4 chars)
Max records (default 200, max 2000)
2001 <= value <= 2000Response Body
application/json
application/json
curl -X GET "https://data.skylinkapi.com/v3.1/mega/history/flights"null{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string",
"input": null,
"ctx": {}
}
]
}Исторические данные ADS-B
Поиск архивных рейсов ADS-B, воспроизведение треков, история воздушного судна по hex-коду или бортовому номеру и трафик аэропортов за 90–365 дней.
Детали отдельного рейса
Получение полных архивных метаданных рейса по UUID flight_id — аэропорты, время, расстояние и достоверность маршрута из архива ADS-B.