ICAO24 / Mode S Aircraft Lookup API

Start with an aircraft Mode S address and retrieve its current U.S. FAA registration record, without downloading and normalizing the registry yourself.
Current registry identity, not flight tracking

GET https://api.grizzlybulls.com/v1/aircraft/icao24/{hex} accepts one exact six-digit hex address and returns the same reviewed current-aircraft response as N-number lookup. It does not return ADS-B positions, flight data, transponder-assignment history, or global aircraft coverage.

Try it before writing code

The open-source Aircraft Registry Explorer includes an ICAO24 lookup form. The hosted demo uses a separate server credential with abuse limits, so you do not need to enter a customer API key in your browser.

Use an exact six-character hex address

Accepted input

A12239 is an example request shape. The API accepts exactly six hexadecimal characters (0โ€“9 and Aโ€“F), trims surrounding whitespace, accepts lowercase, and normalizes to uppercase.

A 0x prefix, octal values, wildcards, partial addresses, ranges, and fuzzy lookups are not accepted.

Different from an N-number

An N-number identifies a U.S. registration; ICAO24 / Mode S is an assigned surveillance address. Neither is a permanent physical-airframe identity. A current registry match is not proof of beneficial economic ownership.

How the identifiers relate โ†’

Query the versioned API from your server

Keep GRIZZLY_BULLS_API_KEY in your trusted command-line or server environment and send it using Bearer authentication. Browser CORS is not enabled. These examples use cURL, Python 3, or server-side Node.js 18+.

cURL
curl --fail-with-body \
  -H "Authorization: Bearer $GRIZZLY_BULLS_API_KEY" \
  "https://api.grizzlybulls.com/v1/aircraft/icao24/A12239"
Python 3
import json
import os
import urllib.request

request = urllib.request.Request(
    "https://api.grizzlybulls.com/v1/aircraft/icao24/A12239",
    headers={"Authorization": f"Bearer {os.environ['GRIZZLY_BULLS_API_KEY']}"},
)
with urllib.request.urlopen(request) as response:
    record = json.load(response)["data"]
print(record["registration"]["nNumber"])
print(record["aircraft"]["modeSCodeHex"])
print(record["source"]["retrievedAt"])
JavaScript ยท Node.js 18+
const response = await fetch(
  "https://api.grizzlybulls.com/v1/aircraft/icao24/A12239",
  { headers: { Authorization: "Bearer " + process.env.GRIZZLY_BULLS_API_KEY } },
);
if (!response.ok) throw new Error("Aircraft lookup failed: " + response.status);
const { data } = await response.json();
console.log(data.registration.nNumber, data.aircraft.modeSCodeHex);
console.log(data.source.retrievedAt);

The example address illustrates request syntax, not a guaranteed permanent current match. A valid hex address missing from the reviewed current FAA registry returns 404 not_found.

Interpreting the current-record response

Identity and aircraft

data.registration.nNumber, data.aircraft.modeSCodeHex, manufacturer, model and serial number come from the existing AircraftCurrentResponse schema, not a second ICAO24 data model.

Source and observed history

data.source.retrievedAt tells you which accepted FAA snapshot supplied the answer. data.history summarizes retained observations, not the legal time of a registration or ownership transfer.

Public-data privacy

Registrant details are subject to current FAA releasability. Retained history cannot restore names or addresses now withheld by the public source.

Errors and usage limits

Invalid hex input returns 400 invalid_request before usage reservation. A missing or invalid key returns 401 unauthenticated. A valid address without a current match returns 404 not_found. Like N-number lookup, this uses the current_lookup request quota. Respect Retry-After on 429 rate_limited and use bounded retries on temporary 503 service_unavailable responses.

Free includes 1,000 requests per month and 30 requests per minute.

Try ICAO24 lookup with a free key

Make an exact lookup from your server and inspect the returned N-number, aircraft fields and accepted source timestamp before choosing a paid plan.