curl --request GET \
--url https://data.flightportrait.com/v1/airframes/{hex}import requests
url = "https://data.flightportrait.com/v1/airframes/{hex}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://data.flightportrait.com/v1/airframes/{hex}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://data.flightportrait.com/v1/airframes/{hex}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://data.flightportrait.com/v1/airframes/{hex}"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://data.flightportrait.com/v1/airframes/{hex}")
.asString();require 'uri'
require 'net/http'
url = URI("https://data.flightportrait.com/v1/airframes/{hex}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"hex": "76cd06",
"reg": "9V-SHF",
"type": "A359",
"type_name": "Airbus A350-900",
"category": "wide",
"operator": "Singapore Airlines",
"operator_icao": "SIA",
"year": 2019,
"country": "SG",
"source": "tar1090",
"airline": {
"icao": "SIA",
"iata": "SQ",
"name": "Singapore Airlines",
"palette": [
"#1D4886",
"#FCB130"
],
"alliances": []
},
"legs": [
{
"date": "2026-08-27",
"org": "SIN",
"dst": "LHR",
"dep_ts": 1787800000,
"arr_ts": 1787845000,
"max_alt": 41000,
"callsign": "SQ322"
}
],
"window_days": 60,
"coverage": "observed",
"history": {
"airframe_id": 4211,
"first_observed": "2025-08-28",
"last_observed": "2026-09-21",
"hexes": [
{
"hex": "76cd06",
"from": "2025-08-28",
"to": "2026-09-21",
"legs": 812,
"source": "observed"
}
],
"registrations": [
{
"reg": "9V-SHF",
"from": "2025-08-28",
"to": "2026-09-21",
"legs": 812,
"source": "observed"
}
],
"operators": [
{
"icao": "SIA",
"name": "Singapore Airlines",
"from": "2025-08-28",
"to": "2026-09-21",
"legs": 809,
"source": "observed"
}
],
"events": [
{
"kind": "not_observed",
"at": "2026-02-03T00:00:00+00:00",
"detail": {
"last_seen": "2026-02-02",
"seen_again": "2026-03-10",
"days": 35
},
"source": "observed"
}
]
}
}{
"error": "<string>",
"detail": "<string>"
}{
"error": "<string>",
"detail": "<string>"
}{
"error": "rate_limited",
"detail": "slow down"
}{
"error": "<string>",
"detail": "<string>"
}Airframe
One aircraft: registry identity and the observed flight log, newest first. legs is null when the log artifact is not loaded, empty when the aircraft was not seen in the window. Observation, not a registry of record. 404 if nothing is known. Rate: 300 per 600 s (bucket airframe). Cache: 1 h edge.
curl --request GET \
--url https://data.flightportrait.com/v1/airframes/{hex}import requests
url = "https://data.flightportrait.com/v1/airframes/{hex}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://data.flightportrait.com/v1/airframes/{hex}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://data.flightportrait.com/v1/airframes/{hex}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://data.flightportrait.com/v1/airframes/{hex}"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://data.flightportrait.com/v1/airframes/{hex}")
.asString();require 'uri'
require 'net/http'
url = URI("https://data.flightportrait.com/v1/airframes/{hex}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"hex": "76cd06",
"reg": "9V-SHF",
"type": "A359",
"type_name": "Airbus A350-900",
"category": "wide",
"operator": "Singapore Airlines",
"operator_icao": "SIA",
"year": 2019,
"country": "SG",
"source": "tar1090",
"airline": {
"icao": "SIA",
"iata": "SQ",
"name": "Singapore Airlines",
"palette": [
"#1D4886",
"#FCB130"
],
"alliances": []
},
"legs": [
{
"date": "2026-08-27",
"org": "SIN",
"dst": "LHR",
"dep_ts": 1787800000,
"arr_ts": 1787845000,
"max_alt": 41000,
"callsign": "SQ322"
}
],
"window_days": 60,
"coverage": "observed",
"history": {
"airframe_id": 4211,
"first_observed": "2025-08-28",
"last_observed": "2026-09-21",
"hexes": [
{
"hex": "76cd06",
"from": "2025-08-28",
"to": "2026-09-21",
"legs": 812,
"source": "observed"
}
],
"registrations": [
{
"reg": "9V-SHF",
"from": "2025-08-28",
"to": "2026-09-21",
"legs": 812,
"source": "observed"
}
],
"operators": [
{
"icao": "SIA",
"name": "Singapore Airlines",
"from": "2025-08-28",
"to": "2026-09-21",
"legs": 809,
"source": "observed"
}
],
"events": [
{
"kind": "not_observed",
"at": "2026-02-03T00:00:00+00:00",
"detail": {
"last_seen": "2026-02-02",
"seen_again": "2026-03-10",
"days": 35
},
"source": "observed"
}
]
}
}{
"error": "<string>",
"detail": "<string>"
}{
"error": "<string>",
"detail": "<string>"
}{
"error": "rate_limited",
"detail": "slow down"
}{
"error": "<string>",
"detail": "<string>"
}Path Parameters
ICAO 24-bit address, 6 hex chars. Case-insensitive.
Response
OK
Observed legs, newest first, up to 200 (the most recent when an airframe has more). Empty array = not seen in the window; null = the log artifact is not loaded.
Show child attributes
Show child attributes
Days of history the log covers. Null when the log artifact is not loaded.
Always "observed": evidence from our receivers and open trace archives, never a published schedule or registry.
"observed"Registration.
ICAO type designator.
Type category (narrow, wide, ...).
Operator name.
Observed operator: majority callsign prefix.
Build year.
State of registration, ISO 3166-1 alpha-2, from the ICAO address block the hex belongs to. Null for unallocated and ICAO blocks.
Registry row provenance.
Operator airline when resolved.
The lifetime record behind this hex: airframe_id, msn, built_year, manufacturer, registry (what a registry states, newest per field: model, engine, certificate_date, airworthiness_date, registry_status, owner, registration, source; null without one), first_observed, last_observed, and dated spells (hexes, registrations, operators; each with from, to, legs, source) plus public events, newest first (kind, at, lat, lon, detail, source). Observed spells and events come from the network's own evidence and say what it saw: first_observed is when the network first heard the airframe, not a delivery; not_observed is our silence, not storage. Null when no record exists.