Create or reuse your Grizzly Bulls account
The same account API key can authenticate aircraft requests. New users are sent directly to the Developer API section after signup.
Create a free account โU.S. aircraft data for developers
/v1/aircraft/n-number/{nNumber}/statusstateavailabilityobservedAtsourceEnter 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.
The same account API key can authenticate aircraft requests. New users are sent directly to the Developer API section after signup.
Create a free account โOpen My Account โ Developer API and generate a key. You can issue least-privilege Aircraft scopes when a credential should only read, query, or inspect usage.
Keep the key in your server environment, then copy the exact N-number lookup below. If you need an N-number first, expand the optional discovery example.
Set your API key locally (Bash/zsh)export GRIZZLY_BULLS_API_KEY="your-key"
Bash/zsh. Replace the placeholder with your own API key. This California-filtered read returns reviewed records, not an N-number availability decision.
export GRIZZLY_BULLS_API_KEY="your-key"
curl --fail-with-body \
-H "Authorization: Bearer $GRIZZLY_BULLS_API_KEY" \
"https://api.grizzlybulls.com/v1/aircraft?state=CA&limit=3"Swipe the code sideways to see the full request.
Use the same Bearer API key from your Grizzly Bulls account in server-side code. Replace N_NUMBER with a valid U.S. N-number. Browser CORS is not enabled for the machine API, so the JavaScript example is for Node.js 18+ or another server runtime.
Bash or zsh. Set GRIZZLY_BULLS_API_KEY in your environment before running.
curl --fail-with-body \
-H "Authorization: Bearer $GRIZZLY_BULLS_API_KEY" \
"https://api.grizzlybulls.com/v1/aircraft/N_NUMBER"Swipe the code sideways to see the full request.
Python 3 standard library. Reads your API key from the environment.
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"])Swipe the code sideways to see the full request.
Server-side Node.js 18+. Browser CORS is not enabled for this API.
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);Swipe the code sideways to see the full request.
Already have a reliable FAA lookup? You may not need to replace it. The more useful question is whether you are building a new data workflow or need to maintain registration-change evidence for aircraft you already track.
Run the small-fleet onboarding example. Start offline, then use a Free key for live reads.
Review a known fleet's observed history offline first, or make bounded reads with a Free key.
Check a known fleet for identity drift. Compare up to ten supplied N-numbers against current FAA manufacturer, model, and serial fields, plus a bounded observed-change sample. Conflicts require manual review. No fleet records are changed.
Test a signed webhook receiver locally with synthetic notifications. Live watches require a paid plan.
$0 / month
$49 / month
$199 / month
Sign in or create an account before paid checkout. Already subscribed? Manage your Aircraft plan in Account.
Validate identifiers, query reviewed registry fields, and integrate against a stable contract instead of parsing and joining raw FAA files yourself.
Use bounded aircraft, registration, document-index, report, and export workflows for operational data tasks without owner-name reverse search or title inference.
Combine retained observations, privacy-safe changes, named watch lists, alert history, and signed delivery when a workflow needs more than a one-time snapshot.
The FAA remains the upstream authority. Grizzly Bulls operates the ingestion, validation, normalization, history, authentication, quota, and API-contract layers that application developers would otherwise need to build around the FAA releasable aircraft database.
Daily FAA releasable files are retrieved, checked, and normalized.
Accepted snapshots preserve what was observed about reviewed registrations.
Privacy-safe differences are available on Free; paid plans add watches and signed delivery.
These are observation stages, not a historical event timeline. They do not prove ownership transfers, legal effective dates, or N-number availability.
Need a filtered CSV, JSON, or XLSX extract? Follow the registry export API guide โ The Free plan can preview the same filter before a paid export run.
Retained history records what Grizzly Bulls observed in accepted source snapshots. It is not presented as a complete legal ownership history or as proof of the exact date an underlying real-world change occurred. For an example of the underlying source tradeoffs, see the Python FAA download and update guide.
Choose a capability and expand its details for example requests, limitations, and relevant guides.
Filter, project, sort and page reviewed FAA records.
Discover supported columns, then combine reviewed exact, prefix, contains, set, and manufacture-year range filters with allowlisted projection, sorting, and opaque cursor pagination. At least one filter is always required.
curl --fail-with-body \
-H "Authorization: Bearer $GRIZZLY_BULLS_API_KEY" \
"https://api.grizzlybulls.com/v1/aircraft/query?filter=manufacturer%3Acontains%3ACESSNA&columns=nNumber%2Cmanufacturer%2Cmodel%2CmanufactureYear&sort=manufacturer%3Aasc&limit=3"Save report definitions and export bounded results.
Paid plans can retain normalized current-registry or observed-change report definitions and run bounded CSV, JSON, and XLSX exports asynchronously. Completed artifacts are private, integrity-checked, and expire on the plan's retention window.
Watch N-numbers and deliver signed change notifications.
Developer and Business can monitor named groups of exact N-numbers, retain alert history and read state, and choose none, realtime, daily, or weekly delivery. Outbound requests use signed webhook delivery rather than a second change-event model.
Read the changes and webhooks guide โBefore upgrading, test a signed synthetic notification locally without an account or API key. Real watch delivery requires a paid plan.
Inspect bounded FAA document-index metadata for an N-number.
Retrieve bounded FAA document-index evidence for one N-number, including reviewed document types and receipt, processing, and correction dates. An indexed document is not presented as proof of beneficial ownership, title status, lien priority, or transfer.
Retrieve reviewed aircraft and registration attributes by N-number.
Retrieve the current reviewed registration record, aircraft attributes, currently releasable registrant fields, source snapshot information, and a compact history summary.
Copy an exact lookup request โRead the N-number lookup API guide โResolve an ICAO24 / Mode S address to a current registry record.
Resolve one six-digit ICAO24 address to its matching current FAA registration. This is registry identity resolution, not live ADS-B position data.
curl --fail-with-body \
-H "Authorization: Bearer $GRIZZLY_BULLS_API_KEY" \
"https://api.grizzlybulls.com/v1/aircraft/icao24/A12239"Read the ICAO24 lookup API guide โInspect registered, reserved, deregistered and unknown state evidence.
Resolve reviewed registered, reserved, deregistered, or unknown evidence without treating an unknown result as an availability determination.
curl --fail-with-body \
-H "Authorization: Bearer $GRIZZLY_BULLS_API_KEY" \
"https://api.grizzlybulls.com/v1/aircraft/n-number/N172SP/status"Read the N-number status API guide โRead privacy-safe field differences by observation time.
Query a bounded observation-time change feed with reviewed privacy-safe field diffs and opaque cursor pagination.
curl --fail-with-body \
-H "Authorization: Bearer $GRIZZLY_BULLS_API_KEY" \
"https://api.grizzlybulls.com/v1/aircraft/changes?since=2026-09-29T00%3A00%3A00.000Z&until=2026-09-30T00%3A00%3A00.000Z&limit=20"Read the changes and webhooks guide โInspect retained versions and observed changes for an N-number.
Retrieve bounded historical versions and PII-free change events observed by Grizzly Bulls. Observation boundaries are not represented as FAA legal effective dates.
curl --fail-with-body \
-H "Authorization: Bearer $GRIZZLY_BULLS_API_KEY" \
"https://api.grizzlybulls.com/v1/aircraft/N_NUMBER/history"Read the registration history API guide โScope credentials and inspect usage against your plan.
Shared Grizzly Bulls API keys can be scoped to Aircraft read, query, and usage operations. The authenticated usage endpoint reports the effective plan, current monthly request count, remaining quota, reset time, and effective Aircraft scopes without consuming Aircraft monthly data-plane quota.
The canonical server base is https://api.grizzlybulls.com/v1. Aircraft routes use Bearer authentication, bounded request shapes, stable error envelopes, and explicit plan/rate/quota headers where the operation is metered.
Want to explore the requests in Postman? Open the public Aircraft API collection โ Use your Grizzly Bulls API key for authenticated requests.
Automated source checks run nightly after the FAA's daily registry refresh. Each accepted snapshot is validated before promotion and normalized into a provider-independent public contract. Response provenance identifies the source provider, retrieval time, source-contract version, source URL, and archive hash; current publication remains governed by the latest releasable source state.
Historical retention is not used to restore owner or address fields that the current public FAA source no longer releases. Owner-name reverse search, bulk owner enumeration, and unfiltered registry walking are not supported.
400 invalid_request means an identifier, filter, cursor, report, or pagination shape is invalid. 401 unauthenticated means the Bearer key is missing or no longer valid. 403 forbidden can indicate that a scoped key lacks the required Aircraft operation.
Successful metered requests return X-Aircraft-Plan, X-Aircraft-Rate-Limit, X-Aircraft-Quota-Limit, X-Aircraft-Quota-Remaining, and X-Aircraft-Quota-Reset. On 429 rate_limited, wait for Retry-After before retrying.
503 service_unavailable is temporary. Use bounded exponential backoff. A valid request may reserve monthly usage before a downstream aircraft read fails, so repeated immediate retries can consume additional quota.
Contact Grizzly Bulls with the endpoint path, UTC time, HTTP status, and error code. Never include your API key or non-public registry information in a support message.
Use the task pages when you are integrating an endpoint. These deeper guides explain the source, identifier, and temporal decisions behind the API contract.
Read the FAA's comma-delimited MASTER file from its ZIP archive, compare two observations by N-number, and choose between a local pipeline and a maintained API.
Read the runnable Python guide โWhy validation, normalization, atomic promotion, provenance, and privacy controls matter beyond CSV-to-JSON conversion.
Read the production pipeline guide โHow registration identity, surveillance addresses, and physical-airframe identity relate without becoming interchangeable keys.
Read the identifier guide โHow observed intervals, change events, effective-date uncertainty, and current-withholding suppression shape historical use.
Read the history evidence guide โCreate one account key, make a bounded registry request, and upgrade to Developer or Business when your integration needs saved reports, exports, or watch automation.