curl --request GET \
--url https://data.flightportrait.com/v1/gaps/{callsign}import requests
url = "https://data.flightportrait.com/v1/gaps/{callsign}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://data.flightportrait.com/v1/gaps/{callsign}', 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/gaps/{callsign}",
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/gaps/{callsign}"
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/gaps/{callsign}")
.asString();require 'uri'
require 'net/http'
url = URI("https://data.flightportrait.com/v1/gaps/{callsign}")
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{
"callsign": "SIA842",
"side": "dest",
"known": "SIN",
"type": "B78X",
"n_recent": 13,
"last_seen": "2026-09-06",
"last_heard": {
"lat": 12.41,
"lon": 106.92,
"track": 21
},
"rotation_km": 3150,
"suggested": [
"TFU",
"CTU"
],
"answers": []
}{
"error": "<string>",
"detail": "<string>"
}{
"error": "<string>",
"detail": "<string>"
}{
"error": "rate_limited",
"detail": "slow down"
}{
"error": "<string>",
"detail": "<string>"
}One question
The open question for one callsign, the answers on file, and the catalog answer in force if there is one. 404 when observation has no question for it. Rate: 300 per 600 s (bucket gaps). Cache: 10 min edge.
curl --request GET \
--url https://data.flightportrait.com/v1/gaps/{callsign}import requests
url = "https://data.flightportrait.com/v1/gaps/{callsign}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://data.flightportrait.com/v1/gaps/{callsign}', 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/gaps/{callsign}",
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/gaps/{callsign}"
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/gaps/{callsign}")
.asString();require 'uri'
require 'net/http'
url = URI("https://data.flightportrait.com/v1/gaps/{callsign}")
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{
"callsign": "SIA842",
"side": "dest",
"known": "SIN",
"type": "B78X",
"n_recent": 13,
"last_seen": "2026-09-06",
"last_heard": {
"lat": 12.41,
"lon": 106.92,
"track": 21
},
"rotation_km": 3150,
"suggested": [
"TFU",
"CTU"
],
"answers": []
}{
"error": "<string>",
"detail": "<string>"
}{
"error": "<string>",
"detail": "<string>"
}{
"error": "rate_limited",
"detail": "slow down"
}{
"error": "<string>",
"detail": "<string>"
}Path Parameters
Callsign or flight ident, 2-12 alphanumerics.
Response
OK
The missing end: origin or dest.
The settled end, IATA.
The missing end's leading code when observation saw it too rarely to settle it.
Every known stop in order when the callsign is a chain with one end unseen; the missing end goes before or after it. Null for a single leg.
Dominant aircraft type on the leg.
Sightings in the last 90 days.
Last date observed, YYYY-MM-DD.
Where the most recent truncated leg was last heard, with its track in degrees true. Null when unknown.
Show child attributes
Show child attributes
How far the missing end is, from the time the airframe takes to come back. Null until a few rotations were seen.
Airports the evidence allows for the missing end, best first: at the rotation's distance, within the type's range, along the last heard track, ranked by how much the airline is seen flying there. Empty until the rotation is known.
The community answer in force, if any: the whole route, IATA.
Show child attributes
Show child attributes
Answers on file, oldest first, rejected ones left out.
Show child attributes
Show child attributes