N-Number Lookup API

Retrieve the current reviewed U.S. FAA aircraft registration for one exact N-number, with normalized fields, source provenance, and stable API error semantics.
One exact integration task, not a registry crawler

The endpoint is GET https://api.grizzlybulls.com/v1/aircraft/{nNumber}. It is designed for applications that already know a U.S. registration identifier and need a current, normalized record. Owner-name reverse search and unfiltered registry walking remain unsupported. Exact Mode S / ICAO24 hex lookup is a separate machine endpoint and is not input to this N-number route.

Try an exact N-number before you integrate

Look up one current U.S. aircraft registration

Enter an exact N-number to preview the same reviewed public read model behind the API. No account or API key is required for this web demo.

The demo deliberately omits registrant names, street addresses, postal codes, aliases, raw provenance hashes, and historical rows. It does not provide owner search, bulk enumeration, or pagination.

Accepted N-number formats

The API normalizes accepted input to uppercase without a dash before lookup. Input may use N or n and may include one optional dash immediately after the prefix.

Accepted shapes

Digits first, with an optional letter suffix

  • N1 through five-digit forms such as N12345
  • Up to four digits plus one letter, such as N1234A
  • Up to three digits plus two letters, such as N123AB
  • Lowercase input and N- input normalize to the canonical uppercase form
Rejected shapes

Invalid identifiers fail before aircraft data is read

  • The numeric portion cannot begin with zero
  • The suffix does not accept the letters I or O
  • Extra punctuation, spaces inside the identifier, and overlong forms are invalid
  • An invalid authenticated request returns 400 invalid_request and is not metered

Make the same request from your server

Replace N_NUMBER with an accepted N-number and send the API key from your Grizzly Bulls account as a Bearer credential. Browser CORS is not enabled for the machine API, so the JavaScript example is for Node.js 18+ or another server runtime.

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

request = urllib.request.Request(
    "https://api.grizzlybulls.com/v1/aircraft/N_NUMBER",
    headers={"Authorization": f"Bearer {os.environ['GRIZZLY_BULLS_API_KEY']}"},
)

with urllib.request.urlopen(request) as response:
    aircraft = json.load(response)

print(aircraft["data"]["registration"]["nNumber"])
print(aircraft["data"]["aircraft"]["manufacturer"])
print(aircraft["data"]["aircraft"]["model"])
JavaScript ยท Node.js 18+
const response = await fetch(
  "https://api.grizzlybulls.com/v1/aircraft/N_NUMBER",
  {
    headers: {
      Authorization: "Bearer " + process.env.GRIZZLY_BULLS_API_KEY,
    },
  },
);

if (!response.ok) {
  throw new Error("Aircraft API request failed: " + response.status);
}

const { data } = await response.json();
console.log(data.registration.nNumber, data.aircraft.manufacturer, data.aircraft.model);

What the current-record response contains

The authenticated endpoint returns the reviewed aircraft-public-v1 current record. These field groups are representative, not a second schema definition. The OpenAPI contract remains the machine-readable authority.

Registration

registration.nNumber, source status, certificate issue and expiration dates, last activity date, and the fractional-ownership flag when reported.

Aircraft & engine

Manufacturer, model, serial number, manufacture year, engine details, seats, airworthiness date, and Mode S octal/hex fields. If your integration starts from the six-digit ICAO24 / Mode-S hex value instead, use the separate versioned machine endpoint documented in OpenAPI; this page remains focused on N-number lookup.

Source & observed history

source.retrievedAt, source-contract metadata, archive provenance, and the compact history.versionCount / history.eventCountsummary.

The fuller authenticated current record can include registrant fields that the current FAA public source releases. Registration data is not proof of beneficial economic ownership, and current FAA withholding controls what Grizzly Bulls publishes.

Errors, metering & retries

400 invalid_request

The N-number does not match the accepted input contract. Validation happens before usage is reserved for an authenticated request.

401 unauthenticated

The Bearer API key is missing or invalid. Fix authentication before retrying.

404 not_found

No current public registration was found for the valid N-number. Once valid input reaches access control, monthly usage is reserved before the aircraft read.

429 rate_limited

The short-window rate or monthly quota was reached. Respect Retry-Afterand the X-Aircraft-Quota-* response headers.

503 service_unavailable

Authentication, usage controls, or the aircraft read model is temporarily unavailable. Retry with bounded exponential backoff.

500 internal_error

The request failed without exposing provider or server internals. Avoid tight retry loops and contact support if the condition persists.

Freshness, provenance & privacy boundaries

Current data is promoted only after validation

Grizzly Bulls runs automated source checks nightly after the FAA's daily registry refresh. An accepted snapshot is validated before promotion, and source.retrievedAt tells you when that source snapshot was retrieved. It does not establish the exact time a real-world registration change occurred.

Current releasability governs public owner data

Historical retention is not used to restore names, addresses, aliases, or other registrant PII that the current public FAA source no longer releases. The free web demo is narrower still and omits registrant names and contact details entirely.

N-number vs. Mode S / ICAO24

Learn why a U.S. registration number and its surveillance address are related but neither is automatic permanent physical-aircraft identity.

Read the identifier guide โ†’

Start with a free key

Free includes 1,000 requests per month and 30 requests per minute. Use the same key if you later upgrade capacity.