Детали отдельного рейса
Получите полные метаданные и весь трек позиций конкретного архивного рейса. Оба эндпоинта требуют UUID flight_id из поиска по истории рейсов — это второй шаг того же рабочего процесса. Уровни тарифов: раздел «Исторические данные ADS-B».
Требования
x-api-key в каждом запросе (прямая подписка). Подробнее →Pro, Ultra или Mega — используйте префикс пути, соответствующий нужному временному окну.
Подробнее →Детали отдельного рейса
Возвращает расширенные метаданные сверх результатов поиска — время отхода от стоянки и прибытия на стоянку (off-block/on-block), близость к аэропорту прибытия и служебные временные метки. Блочное время — время от стоянки до стоянки, включая руление; off-block — уход от гейта, on-block — прибытие к гейту. Взлёт и посадка — моменты отрыва и касания колёс, отличные от off-block/on-block.
Запрос
https://data.skylinkapi.com/v3.1/ultra/history/flight/{flight_id}| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
flight_id | string | Да | UUID рейса из поиска по истории рейсов |
Путь MEGA (`/mega/history/...`)Развернуть раздел
https://data.skylinkapi.com/v3.1/mega/history/flight/{flight_id}Те же параметры и та же структура ответа, что и у ULTRA. Требуется тариф Ultra или Mega. Значения flight_id взаимозаменяемы между уровнями.
Ответ
{
"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",
"off_block_time": null,
"on_block_time": null,
"flight_duration_min": 443.0,
"duration_source": "estimated",
"distance_nm": 2998.4,
"arrival_distance_nm": 2.1,
"confidence": 1.0,
"route_source": "vrs_confirmed",
"gps_spoofing_suspected": false,
"diversion_suspected": false,
"created_at": "2026-05-12T19:40:00Z",
"updated_at": "2026-05-13T03:15:00Z"
}Возвращает те же основные поля, что и сводка рейса, а также дополнительные поля, доступные только в детальном ответе, если они есть.
| Поле | Тип | Обязательный | Null? | Описание |
|---|---|---|---|---|
| (все поля сводки рейса) | - | - | - | Та же структура, что и в результатах поиска |
off_block_time | string | null | Нет | Да | Время отхода от стоянки, если известно (ISO 8601) |
on_block_time | string | null | Нет | Да | Время прибытия на стоянку, если известно (ISO 8601) |
duration_source | string | null | Нет | Да | Способ вычисления длительности — при значении "estimated" блочное время выведено из данных о позициях, а не из зарегистрированных событий у гейта (важно для процессов ESG-отчётности или учёта задержек) |
arrival_distance_nm | number | null | Нет | Да | Расстояние от последней позиции до аэропорта прибытия (nm) |
created_at | string | null | Нет | Да | Время создания архивной записи (ISO 8601) |
updated_at | string | null | Нет | Да | Время последнего обновления архивной записи (ISO 8601) |
Клиентские типы
"""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]Интеграция
Получите расширенные метаданные отдельного архивного рейса — время off-block/on-block, близость к аэропорту прибытия и служебные временные метки. Пример ниже продолжает результат поиска рейсов: берёт первый flight_id, запрашивает полные детали, а затем преобразует время у гейта в объект для отображения с запасным вариантом на случай, когда блочное время равно null.
import osimport requestsBASE = "https://data.skylinkapi.com/v3.1"HEADERS = { "x-api-key": os.getenv("SKYLINK_API_KEY") or os.getenv("SKYLINK_API_KEY", "YOUR_API_KEY")}def fetch_flight_detail(flight_id: str, *, tier: str = "ultra") -> dict: r = requests.get( f"{BASE}/{tier}/history/flight/{flight_id}", headers=HEADERS, timeout=(10, 25), ) r.raise_for_status() return r.json()def search_one_flight(*, callsign: str = "BAW178", tier: str = "ultra") -> dict | None: r = requests.get( f"{BASE}/{tier}/history/flights", headers=HEADERS, params={"callsign": callsign, "limit": 1}, timeout=(10, 25), ) r.raise_for_status() flights = r.json().get("flights") or [] return flights[0] if flights else Noneif __name__ == "__main__": import json hit = search_one_flight() if not hit: print("No flight found") else: detail = fetch_flight_detail(hit["flight_id"]) print(json.dumps({"callsign": detail.get("callsign"), "flight_id": detail.get("flight_id"), "route": [detail.get("departure_airport_icao"), detail.get("arrival_airport_icao")]}, indent=2))Примечания по реализации
Начинайте с поиска. Всегда сначала получайте flight_id через поиск по истории рейсов — подбор UUID наугад вернёт 404. Детали и поиск используют один и тот же путь уровня (/ultra/... или /mega/...).
Блочное время и взлёт/посадка. off_block_time и on_block_time — события у гейта; takeoff_time и landing_time — отрыв и касание колёс. Оба значения могут быть null, если покрытие ADS-B у гейта было неполным.
Необработанная история позиций. Для временной шкалы в заданном интервале без разбиения на рейсы см. историю позиций.
Ответы с ошибками
Ошибки 401/403 из-за ограничений тарифа: см. раздел «Исторические данные ADS-B». Ошибки, специфичные для эндпоинта:
404 — рейс не найден
{
"detail": "Flight not found"
}Возвращается, если flight_id отсутствует в архиве (неизвестный UUID, данные за пределами срока хранения или опечатка). Повторите поиск с более узким временным окном — см. поиск по истории рейсов.
Your SkyLink licence key, for keys bought direct from skylinkapi.com.
In: header
Path Parameters
Response Body
application/json
application/json
curl -X GET "https://data.skylinkapi.com/v3.1/ultra/history/flight/00000000-0000-0000-0000-000000000001"null{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string",
"input": null,
"ctx": {}
}
]
}Your SkyLink licence key, for keys bought direct from skylinkapi.com.
In: header
Path Parameters
Response Body
application/json
application/json
curl -X GET "https://data.skylinkapi.com/v3.1/mega/history/flight/00000000-0000-0000-0000-000000000001"null{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string",
"input": null,
"ctx": {}
}
]
}Трек рейса
Возвращает полный трек позиций ADS-B для конкретного рейса, автоматически ограниченный окном от взлёта до посадки (с запасом 5 минут с каждой стороны). Используйте этот эндпоинт, когда у вас есть flight_id из поиска и нужна траектория без самостоятельного расчёта временного окна.
Запрос
https://data.skylinkapi.com/v3.1/ultra/history/flight/{flight_id}/track| Параметр | Тип | Обязательный | По умолчанию | Описание |
|---|---|---|---|---|
flight_id | string | Да | - | UUID рейса из поиска |
limit | integer | Нет | 2000 | Максимальное число строк позиций (не более 5000 для пути ULTRA) |
Путь MEGA (`/mega/history/...`)Развернуть раздел
https://data.skylinkapi.com/v3.1/mega/history/flight/{flight_id}/track| Параметр | Тип | Обязательный | По умолчанию | Описание |
|---|---|---|---|---|
flight_id | string | Да | - | UUID рейса |
limit | integer | Нет | 5000 | Максимальное число позиций (не более 10 000 для пути MEGA) |
Требуется тариф Ultra или Mega. Та же структура ответа, что и у ULTRA.
Ответ
{
"flight_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"icao24": "40621d",
"callsign": "BAW178",
"registration": "G-XWBA",
"aircraft_type_icao": "B77W",
"departure_airport_icao": "EGLL",
"departure_airport_iata": "LHR",
"arrival_airport_icao": "KJFK",
"arrival_airport_iata": "JFK",
"takeoff_time": "2026-05-12T19:45:00Z",
"landing_time": "2026-05-13T03:08:00Z",
"count": 1287,
"positions": [
{
"timestamp": "2026-05-13T03:08:05Z",
"icao24": "40621d",
"latitude": 40.6413,
"longitude": -73.7781,
"altitude_baro": 0,
"ground_speed": 12,
"track": 90,
"vertical_rate": 0,
"callsign": "BAW178",
"is_on_ground": true,
"registration": "G-XWBA",
"aircraft_type": "B77W",
"gps_spoofed": false
}
]
}| Поле | Тип | Обязательный | Null? | Описание |
|---|---|---|---|---|
flight_id | string | Да | Никогда | UUID рейса |
icao24 | string | null | Нет | Да | Шестнадцатеричный код ВС |
callsign | string | null | Нет | Да | Позывной ADS-B |
registration | string | null | Нет | Да | Бортовой номер, если известен |
aircraft_type_icao | string | null | Нет | Да | Код типа ICAO |
departure_airport_icao | string | null | Нет | Да | Код ICAO аэропорта вылета |
departure_airport_iata | string | null | Нет | Да | Код IATA аэропорта вылета |
arrival_airport_icao | string | null | Нет | Да | Код ICAO аэропорта прибытия |
arrival_airport_iata | string | null | Нет | Да | Код IATA аэропорта прибытия |
takeoff_time | string | null | Нет | Да | Время взлёта, ограничивающее трек (ISO 8601) |
landing_time | string | null | Нет | Да | Время посадки, ограничивающее трек (ISO 8601) |
count | integer | Да | Никогда | Количество элементов в positions |
positions | array | Да | Никогда | Снимки позиций (сначала самые новые) |
Снимок позиции (positions[])
Те же имена полей, что и у позиций ADS-B в реальном времени. Путь в JSON: positions[].
| Поле | Тип | Обязательный | Null? | Описание |
|---|---|---|---|---|
timestamp | string | Да | Никогда | Время наблюдения (ISO 8601) |
icao24 | string | Да | Никогда | Шестнадцатеричный код ВС |
latitude | number | Да | Никогда | Широта WGS-84 (десятичные градусы) |
longitude | number | Да | Никогда | Долгота WGS-84 (десятичные градусы) |
altitude_baro | number | null | Нет | Да | Барометрическая высота в футах над MSL |
ground_speed | number | null | Нет | Да | Путевая скорость в узлах |
track | number | null | Нет | Да | Путевой угол в градусах (истинный) |
vertical_rate | number | null | Нет | Да | Вертикальная скорость в футах в минуту |
callsign | string | null | Нет | Да | Позывной ADS-B в момент снимка |
is_on_ground | boolean | Да | Никогда | true, если ВС находилось на земле |
registration | string | null | Нет | Да | Бортовой номер, если известен |
aircraft_type | string | null | Нет | Да | Код типа ICAO, если известен |
gps_spoofed | boolean | null | Нет | Да | Был ли этот снимок помечен как подвергшийся подмене GPS (спуфингу) |
Интеграция трека
Воспроизведите трек позиций от стоянки до стоянки на карте. Пример ниже продолжает результат поиска: берёт flight_id, запрашивает трек с таймаутом чтения 45 секунд (большие треки могут загружаться медленно), прореживает данные до каждой 5-й позиции ради производительности веб-карты и обрабатывает 404, если рейс вышел за пределы срока хранения.
import osimport requestsBASE = "https://data.skylinkapi.com/v3.1"HEADERS = { "x-api-key": os.getenv("SKYLINK_API_KEY") or os.getenv("SKYLINK_API_KEY", "YOUR_API_KEY")}def fetch_flight_track(flight_id: str, *, tier: str = "ultra") -> dict: r = requests.get( f"{BASE}/{tier}/history/flight/{flight_id}/track", headers=HEADERS, timeout=(10, 30), ) r.raise_for_status() return r.json()def search_one_flight(*, callsign: str = "BAW178", tier: str = "ultra") -> dict | None: r = requests.get( f"{BASE}/{tier}/history/flights", headers=HEADERS, params={"callsign": callsign, "limit": 1}, timeout=(10, 25), ) r.raise_for_status() flights = r.json().get("flights") or [] return flights[0] if flights else Noneif __name__ == "__main__": import json hit = search_one_flight() if not hit: print("No flight found") else: track = fetch_flight_track(hit["flight_id"]) print(json.dumps({"count": track.get("count"), "positions": len(track.get("positions") or [])}, indent=2))Важно: трек и история позиций возвращают positions в порядке от новых к старым. Для воспроизведения на карте разверните их в хронологическом порядке. При интервале выборки 5 секунд 10-часовой полёт — это ~7200 точек; для веб-карт прореживайте данные.
Your SkyLink licence key, for keys bought direct from skylinkapi.com.
In: header
Path Parameters
Query Parameters
Max position rows (default 2000, max 5000)
20001 <= value <= 5000Response Body
application/json
application/json
curl -X GET "https://data.skylinkapi.com/v3.1/ultra/history/flight/00000000-0000-0000-0000-000000000001/track"null{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string",
"input": null,
"ctx": {}
}
]
}Your SkyLink licence key, for keys bought direct from skylinkapi.com.
In: header
Path Parameters
Query Parameters
Max position rows (default 5000, max 10000)
50001 <= value <= 10000Response Body
application/json
application/json
curl -X GET "https://data.skylinkapi.com/v3.1/mega/history/flight/00000000-0000-0000-0000-000000000001/track"null{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string",
"input": null,
"ctx": {}
}
]
}Поиск в истории полётов
Поиск архивных полётов ADS-B по бортовому номеру, ICAO24 hex, позывному или маршруту — возвращает UUID flight_id для запросов деталей и трека.
История местоположений
Исторические снимки местоположения ADS-B по hex-коду ICAO24 или бортовому номеру — от новых к старым, с привязкой к окнам рейсов.