Save up to 17% with yearly billing

See pricing

Детали отдельного рейса

Получите полные метаданные и весь трек позиций конкретного архивного рейса. Оба эндпоинта требуют UUID flight_id из поиска по истории рейсов — это второй шаг того же рабочего процесса. Уровни тарифов: раздел «Исторические данные ADS-B».

Требования

Авторизация
x-api-key в каждом запросе (прямая подписка). Подробнее →
Тариф

Pro, Ultra или Mega — используйте префикс пути, соответствующий нужному временному окну.

Подробнее →

Детали отдельного рейса

Возвращает расширенные метаданные сверх результатов поиска — время отхода от стоянки и прибытия на стоянку (off-block/on-block), близость к аэропорту прибытия и служебные временные метки. Блочное время — время от стоянки до стоянки, включая руление; off-block — уход от гейта, on-block — прибытие к гейту. Взлёт и посадка — моменты отрыва и касания колёс, отличные от off-block/on-block.

Запрос

GEThttps://data.skylinkapi.com/v3.1/ultra/history/flight/{flight_id}
ПараметрТипОбязательныйОписание
flight_idstringДаUUID рейса из поиска по истории рейсов
Путь MEGA (`/mega/history/...`)Развернуть раздел
GEThttps://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_timestring | nullНетДаВремя отхода от стоянки, если известно (ISO 8601)
on_block_timestring | nullНетДаВремя прибытия на стоянку, если известно (ISO 8601)
duration_sourcestring | nullНетДаСпособ вычисления длительности — при значении "estimated" блочное время выведено из данных о позициях, а не из зарегистрированных событий у гейта (важно для процессов ESG-отчётности или учёта задержек)
arrival_distance_nmnumber | nullНетДаРасстояние от последней позиции до аэропорта прибытия (nm)
created_atstring | nullНетДаВремя создания архивной записи (ISO 8601)
updated_atstring | 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, данные за пределами срока хранения или опечатка). Повторите поиск с более узким временным окном — см. поиск по истории рейсов.

GET
/ultra/history/flight/{flight_id}
x-api-key<token>

Your SkyLink licence key, for keys bought direct from skylinkapi.com.

In: header

Path Parameters

flight_id*Flight Id

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": {}
    }
  ]
}
GET
/mega/history/flight/{flight_id}
x-api-key<token>

Your SkyLink licence key, for keys bought direct from skylinkapi.com.

In: header

Path Parameters

flight_id*Flight Id

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 из поиска и нужна траектория без самостоятельного расчёта временного окна.

Запрос

GEThttps://data.skylinkapi.com/v3.1/ultra/history/flight/{flight_id}/track
ПараметрТипОбязательныйПо умолчаниюОписание
flight_idstringДа-UUID рейса из поиска
limitintegerНет2000Максимальное число строк позиций (не более 5000 для пути ULTRA)
Путь MEGA (`/mega/history/...`)Развернуть раздел
GEThttps://data.skylinkapi.com/v3.1/mega/history/flight/{flight_id}/track
ПараметрТипОбязательныйПо умолчаниюОписание
flight_idstringДа-UUID рейса
limitintegerНет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_idstringДаНикогдаUUID рейса
icao24string | nullНетДаШестнадцатеричный код ВС
callsignstring | nullНетДаПозывной ADS-B
registrationstring | nullНетДаБортовой номер, если известен
aircraft_type_icaostring | nullНетДаКод типа ICAO
departure_airport_icaostring | nullНетДаКод ICAO аэропорта вылета
departure_airport_iatastring | nullНетДаКод IATA аэропорта вылета
arrival_airport_icaostring | nullНетДаКод ICAO аэропорта прибытия
arrival_airport_iatastring | nullНетДаКод IATA аэропорта прибытия
takeoff_timestring | nullНетДаВремя взлёта, ограничивающее трек (ISO 8601)
landing_timestring | nullНетДаВремя посадки, ограничивающее трек (ISO 8601)
countintegerДаНикогдаКоличество элементов в positions
positionsarrayДаНикогдаСнимки позиций (сначала самые новые)

Снимок позиции (positions[])

Те же имена полей, что и у позиций ADS-B в реальном времени. Путь в JSON: positions[].

ПолеТипОбязательныйNull?Описание
timestampstringДаНикогдаВремя наблюдения (ISO 8601)
icao24stringДаНикогдаШестнадцатеричный код ВС
latitudenumberДаНикогдаШирота WGS-84 (десятичные градусы)
longitudenumberДаНикогдаДолгота WGS-84 (десятичные градусы)
altitude_baronumber | nullНетДаБарометрическая высота в футах над MSL
ground_speednumber | nullНетДаПутевая скорость в узлах
tracknumber | nullНетДаПутевой угол в градусах (истинный)
vertical_ratenumber | nullНетДаВертикальная скорость в футах в минуту
callsignstring | nullНетДаПозывной ADS-B в момент снимка
is_on_groundbooleanДаНикогдаtrue, если ВС находилось на земле
registrationstring | nullНетДаБортовой номер, если известен
aircraft_typestring | nullНетДаКод типа ICAO, если известен
gps_spoofedboolean | 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 точек; для веб-карт прореживайте данные.

GET
/ultra/history/flight/{flight_id}/track
x-api-key<token>

Your SkyLink licence key, for keys bought direct from skylinkapi.com.

In: header

Path Parameters

flight_id*Flight Id

Query Parameters

limit?Limit

Max position rows (default 2000, max 5000)

Default2000
Range1 <= value <= 5000

Response 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": {}
    }
  ]
}
GET
/mega/history/flight/{flight_id}/track
x-api-key<token>

Your SkyLink licence key, for keys bought direct from skylinkapi.com.

In: header

Path Parameters

flight_id*Flight Id

Query Parameters

limit?Limit

Max position rows (default 5000, max 10000)

Default5000
Range1 <= value <= 10000

Response 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": {}
    }
  ]
}