Aircraft Intelligence API reference

Grizzly Bulls Aircraft Intelligence API v1.0.0. This page is generated from the same OpenAPI contract linked below.
Contract

Version 1.0.0

Versioned U.S. aircraft registry API with exact N-number and ICAO24 / Mode-S lookup, evidence-backed N-number lifecycle status, bounded exact current-registry discovery including serial/year/status filters, flexible allowlisted current-registry querying, retained observed registration history, a bounded registry-wide observed change feed, paid asynchronous CSV/JSON/XLSX exports with saved report definitions, and paid N-number watch lists with signed webhook delivery. Aircraft data routes require a Grizzly Bulls API key; request reads, exports, saved reports, and webhook watches use code-owned plan limits.

Base URL
https://api.grizzlybulls.com/v1
Authentication
Bearer API key
Operations
21
Schemas
53
GET/aircraft

Search the current aircraft registry with bounded exact filters

Authenticated current-registry discovery. At least one of manufacturer, model, state, serialNumber, manufactureYear, or registrationStatus is required. Filters use exact normalized matching and combine with AND semantics. Results use opaque filter-bound keyset pagination; totals, owner-name search, historical search, fuzzy matching, arbitrary sorting, and bulk enumeration are not provided.

Authentication required. Operation ID: searchAircraftRegistry.

Parameters

NameLocationRequiredDetails
manufacturerqueryNo

Exact manufacturer name after trim/case normalization. At least one reviewed discovery filter is required.

{
  "type": "string",
  "minLength": 1,
  "maxLength": 100
}
modelqueryNo

Exact aircraft model after trim/case normalization. At least one reviewed discovery filter is required.

{
  "type": "string",
  "minLength": 1,
  "maxLength": 100
}
statequeryNo

Exact two-letter registrant state code. At least one reviewed discovery filter is required.

{
  "type": "string",
  "pattern": "^[A-Za-z]{2}$",
  "example": "FL"
}
serialNumberqueryNo

Exact aircraft serial number after trim/case normalization. At least one reviewed discovery filter is required.

{
  "type": "string",
  "minLength": 1,
  "maxLength": 100
}
manufactureYearqueryNo

Exact four-digit aircraft manufacture year. At least one reviewed discovery filter is required.

{
  "type": "integer",
  "minimum": 1900,
  "maximum": 2100,
  "example": 2024
}
registrationStatusqueryNo

Exact FAA source registration-status code after trim/case normalization. At least one reviewed discovery filter is required.

{
  "type": "string",
  "minLength": 1,
  "maxLength": 100
}
limitqueryNo

Maximum current aircraft records returned.

{
  "type": "integer",
  "minimum": 1,
  "maximum": 50,
  "default": 25
}
cursorqueryNo

Opaque keyset cursor returned by the previous page. It is valid only with the same normalized discovery filters.

{
  "type": "string",
  "minLength": 1,
  "maxLength": 1024
}

Responses

200Bounded current-registry discovery results. A valid search with no matches returns an empty data array.
Headers
  • X-Aircraft-Plan: Resolved aircraft API plan for the authenticated account.
  • X-Aircraft-Rate-Limit: Maximum requests permitted per minute for the resolved aircraft API plan.
  • X-Aircraft-Quota-Limit: Monthly request quota for the resolved aircraft API plan.
  • X-Aircraft-Quota-Remaining: Monthly requests remaining after the current operation was reserved.
  • X-Aircraft-Quota-Reset: UTC timestamp when the current monthly quota window resets.
{
  "$ref": "#/components/schemas/AircraftDiscoveryResponse"
}
400The aircraft identifier, change-feed window/filter/cursor, discovery filters, cursor, or pagination parameters are invalid.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "invalid_request",
    "message": "At least one reviewed aircraft discovery filter is required."
  }
}
401A valid Grizzly Bulls API key is required.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
405The HTTP method is not supported by this endpoint.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "method_not_allowed",
    "message": "Method not allowed."
  }
}
429The short-window request rate or monthly aircraft API quota was exceeded.
Headers
  • X-Aircraft-Plan: Resolved aircraft API plan for the authenticated account.
  • X-Aircraft-Rate-Limit: Maximum requests permitted per minute for the resolved aircraft API plan.
  • X-Aircraft-Quota-Limit: Monthly request quota for the resolved aircraft API plan.
  • X-Aircraft-Quota-Remaining: Monthly requests remaining after the current operation was reserved.
  • X-Aircraft-Quota-Reset: UTC timestamp when the current monthly quota window resets.
  • Retry-After: Seconds until the request may be retried under the limiting policy.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "rate_limited",
    "message": "Aircraft API usage limit exceeded."
  }
}
500The request failed without exposing provider or server internals.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "internal_error",
    "message": "The request could not be completed."
  }
}
503The aircraft read model, authentication authority, entitlement authority, or durable usage meter is temporarily unavailable. Use bounded backoff rather than a tight retry loop.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "service_unavailable",
    "message": "Aircraft data is temporarily unavailable."
  }
}
GET/aircraft/query

Query the current FAA registry with bounded flexible filters

Authenticated AIR15B current-registry query over the same reviewed aircraft_public discovery projection as the legacy exact-filter route. At least one filter is required. Supported operators are column-specific and include exact/in matching, prefix matching, contains for reviewed manufacturer/model keys, and bounded manufacture-year ranges. Response projection and sorting are allowlisted. Owner or registrant-name filters, unfiltered registry walking, offset pagination, arbitrary SQL, regex, totals, and historical search are not provided.

Authentication required. Operation ID: queryAircraftRegistry.

Parameters

NameLocationRequiredDetails
filterqueryYes

Repeatable field:operator:value filter. Repeated filters combine with AND. Use /aircraft/columns to discover supported columns and operators.

{
  "type": "array",
  "minItems": 1,
  "maxItems": 8,
  "items": {
    "type": "string",
    "minLength": 3,
    "maxLength": 1200
  }
}
columnsqueryNo

Comma-separated allowlisted response columns. Defaults to all reviewed AIR15B columns.

{
  "type": "string",
  "example": "nNumber,manufacturer,model,manufactureYear"
}
sortqueryNo

One allowlisted column plus asc/desc. Non-N-number sorts must also be constrained by a filter on that column.

{
  "type": "string",
  "pattern": "^[A-Za-z][A-Za-z0-9]*(?::asc|:desc)$",
  "example": "manufacturer:asc",
  "default": "nNumber:asc"
}
limitqueryNo

Maximum current registry records returned.

{
  "type": "integer",
  "minimum": 1,
  "maximum": 50,
  "default": 25
}
cursorqueryNo

Opaque keyset cursor bound to the normalized filters, selected columns, and sort.

{
  "type": "string",
  "minLength": 1,
  "maxLength": 4096
}

Responses

200Bounded current-registry query results with an optional opaque continuation cursor.
Headers
  • X-Aircraft-Plan: Resolved aircraft API plan for the authenticated account.
  • X-Aircraft-Rate-Limit: Maximum requests permitted per minute for the resolved aircraft API plan.
  • X-Aircraft-Quota-Limit: Monthly request quota for the resolved aircraft API plan.
  • X-Aircraft-Quota-Remaining: Monthly requests remaining after the current operation was reserved.
  • X-Aircraft-Quota-Reset: UTC timestamp when the current monthly quota window resets.
{
  "$ref": "#/components/schemas/AircraftRegistryQueryResponse"
}
400The aircraft identifier, change-feed window/filter/cursor, discovery filters, cursor, or pagination parameters are invalid.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "invalid_request",
    "message": "At least one reviewed aircraft discovery filter is required."
  }
}
401A valid Grizzly Bulls API key is required.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
405The HTTP method is not supported by this endpoint.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "method_not_allowed",
    "message": "Method not allowed."
  }
}
429The short-window request rate or monthly aircraft API quota was exceeded.
Headers
  • X-Aircraft-Plan: Resolved aircraft API plan for the authenticated account.
  • X-Aircraft-Rate-Limit: Maximum requests permitted per minute for the resolved aircraft API plan.
  • X-Aircraft-Quota-Limit: Monthly request quota for the resolved aircraft API plan.
  • X-Aircraft-Quota-Remaining: Monthly requests remaining after the current operation was reserved.
  • X-Aircraft-Quota-Reset: UTC timestamp when the current monthly quota window resets.
  • Retry-After: Seconds until the request may be retried under the limiting policy.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "rate_limited",
    "message": "Aircraft API usage limit exceeded."
  }
}
500The request failed without exposing provider or server internals.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "internal_error",
    "message": "The request could not be completed."
  }
}
503The aircraft read model, authentication authority, entitlement authority, or durable usage meter is temporarily unavailable. Use bounded backoff rather than a tight retry loop.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "service_unavailable",
    "message": "Aircraft data is temporarily unavailable."
  }
}
GET/aircraft/columns

List reviewed current-registry query columns and operators

Authenticated metadata for the AIR15B query grammar. This route does not read registry rows or consume registry_search quota.

Authentication required. Operation ID: getAircraftRegistryQueryColumns.

Responses

200Allowlisted query columns, supported operators, sortability, and grammar limits.
{
  "$ref": "#/components/schemas/AircraftRegistryColumnsResponse"
}
401A valid Grizzly Bulls API key is required.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
405The HTTP method is not supported by this endpoint.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "method_not_allowed",
    "message": "Method not allowed."
  }
}
500The request failed without exposing provider or server internals.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "internal_error",
    "message": "The request could not be completed."
  }
}
503The aircraft read model, authentication authority, entitlement authority, or durable usage meter is temporarily unavailable. Use bounded backoff rather than a tight retry loop.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "service_unavailable",
    "message": "Aircraft data is temporarily unavailable."
  }
}
GET/aircraft/changes

Get bounded observed aircraft registry changes

Authenticated registry-wide change feed over Grizzly Bulls observation time, not inferred legal transaction time. since is required, until is optional, and each window is limited to 7 days. Results use the existing reviewed history-event vocabulary plus privacy-safe before/after diffs where retained public versions support those values. Registrant names, addresses, aliases, owner-search semantics, unbounded registry export, and legal ownership-transfer claims are not provided.

Authentication required. Operation ID: getAircraftObservedChanges.

Parameters

NameLocationRequiredDetails
sincequeryYes

Inclusive Grizzly Bulls observation-time lower bound. Must be an ISO 8601 date-time with an explicit timezone.

{
  "type": "string",
  "format": "date-time"
}
untilqueryNo

Exclusive observation-time upper bound. Defaults to the first request time and is frozen inside any returned cursor. The since/until window may not exceed 7 days.

{
  "type": "string",
  "format": "date-time"
}
eventTypequeryNo

Optional exact reviewed history-event type.

{
  "type": "string",
  "enum": [
    "registration_added",
    "registration_removed",
    "registration_record_changed",
    "aircraft_assignment_changed",
    "status_changed",
    "registrant_changed",
    "registrant_pii_withheld",
    "registrant_pii_released"
  ]
}
limitqueryNo

Maximum observed change events returned.

{
  "type": "integer",
  "minimum": 1,
  "maximum": 50,
  "default": 25
}
cursorqueryNo

Opaque keyset cursor returned by the previous page. It is bound to the same since/until/eventType window.

{
  "type": "string",
  "minLength": 1,
  "maxLength": 2048
}

Responses

200Bounded observed change events. A valid window with no events returns an empty data array.
Headers
  • X-Aircraft-Plan: Resolved aircraft API plan for the authenticated account.
  • X-Aircraft-Rate-Limit: Maximum requests permitted per minute for the resolved aircraft API plan.
  • X-Aircraft-Quota-Limit: Monthly request quota for the resolved aircraft API plan.
  • X-Aircraft-Quota-Remaining: Monthly requests remaining after the current operation was reserved.
  • X-Aircraft-Quota-Reset: UTC timestamp when the current monthly quota window resets.
{
  "$ref": "#/components/schemas/AircraftChangeFeedResponse"
}
400The aircraft identifier, change-feed window/filter/cursor, discovery filters, cursor, or pagination parameters are invalid.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "invalid_request",
    "message": "At least one reviewed aircraft discovery filter is required."
  }
}
401A valid Grizzly Bulls API key is required.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
405The HTTP method is not supported by this endpoint.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "method_not_allowed",
    "message": "Method not allowed."
  }
}
429The short-window request rate or monthly aircraft API quota was exceeded.
Headers
  • X-Aircraft-Plan: Resolved aircraft API plan for the authenticated account.
  • X-Aircraft-Rate-Limit: Maximum requests permitted per minute for the resolved aircraft API plan.
  • X-Aircraft-Quota-Limit: Monthly request quota for the resolved aircraft API plan.
  • X-Aircraft-Quota-Remaining: Monthly requests remaining after the current operation was reserved.
  • X-Aircraft-Quota-Reset: UTC timestamp when the current monthly quota window resets.
  • Retry-After: Seconds until the request may be retried under the limiting policy.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "rate_limited",
    "message": "Aircraft API usage limit exceeded."
  }
}
500The request failed without exposing provider or server internals.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "internal_error",
    "message": "The request could not be completed."
  }
}
503The aircraft read model, authentication authority, entitlement authority, or durable usage meter is temporarily unavailable. Use bounded backoff rather than a tight retry loop.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "service_unavailable",
    "message": "Aircraft data is temporarily unavailable."
  }
}
GET/aircraft/reports

List saved Aircraft report definitions

Lists this account's retained saved definitions. Definitions reuse the AIR15B current-registry query grammar or AIR14C bounded observed-change grammar; they are not a second query language.

Authentication required. Operation ID: listAircraftSavedReports.

Responses

200Saved report definitions and the current plan limit.
Headers
  • X-Aircraft-Plan: Resolved Aircraft API plan for the authenticated account.
  • X-Aircraft-Saved-Report-Limit: Maximum saved Aircraft report definitions permitted by the current plan.
  • X-Aircraft-Monthly-Export-Run-Limit: Maximum asynchronous export runs per UTC calendar month.
  • X-Aircraft-Export-Row-Limit: Maximum rows permitted in one completed export.
  • X-Aircraft-Export-Retention-Hours: Hours a completed export remains downloadable.
{
  "$ref": "#/components/schemas/AircraftSavedReportListResponse"
}
401A valid Grizzly Bulls API key is required.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
405The HTTP method is not supported by this endpoint.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "method_not_allowed",
    "message": "Method not allowed."
  }
}
500The request failed without exposing provider or server internals.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "internal_error",
    "message": "The request could not be completed."
  }
}
503The aircraft read model, authentication authority, entitlement authority, or durable usage meter is temporarily unavailable. Use bounded backoff rather than a tight retry loop.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "service_unavailable",
    "message": "Aircraft data is temporarily unavailable."
  }
}
POST/aircraft/reports

Create a paid saved Aircraft report definition

Creates a named reusable Developer or Business report definition over AIR15B current-registry filters/projection/sort or AIR14C observed-change windows. Owner-name search, unfiltered registry enumeration, and private fields remain unsupported.

Authentication required. Operation ID: createAircraftSavedReport.

Request body

{
  "$ref": "#/components/schemas/AircraftSavedReportInput"
}

Responses

201Saved report created.
Headers
  • X-Aircraft-Plan: Resolved Aircraft API plan for the authenticated account.
  • X-Aircraft-Saved-Report-Limit: Maximum saved Aircraft report definitions permitted by the current plan.
  • X-Aircraft-Monthly-Export-Run-Limit: Maximum asynchronous export runs per UTC calendar month.
  • X-Aircraft-Export-Row-Limit: Maximum rows permitted in one completed export.
  • X-Aircraft-Export-Retention-Hours: Hours a completed export remains downloadable.
{
  "$ref": "#/components/schemas/AircraftSavedReportResponse"
}
400The aircraft identifier, change-feed window/filter/cursor, discovery filters, cursor, or pagination parameters are invalid.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "invalid_request",
    "message": "At least one reviewed aircraft discovery filter is required."
  }
}
401A valid Grizzly Bulls API key is required.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
403The current Aircraft API plan does not include the requested paid Aircraft capability.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "not_entitled",
    "message": "This Aircraft capability requires a Developer or Business plan."
  }
}
405The HTTP method is not supported by this endpoint.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "method_not_allowed",
    "message": "Method not allowed."
  }
}
409The saved-report mutation conflicts with an existing name or the current plan saved-report ceiling.
Headers
  • X-Aircraft-Plan: Resolved Aircraft API plan for the authenticated account.
  • X-Aircraft-Saved-Report-Limit: Maximum saved Aircraft report definitions permitted by the current plan.
  • X-Aircraft-Monthly-Export-Run-Limit: Maximum asynchronous export runs per UTC calendar month.
  • X-Aircraft-Export-Row-Limit: Maximum rows permitted in one completed export.
  • X-Aircraft-Export-Retention-Hours: Hours a completed export remains downloadable.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "conflict",
    "message": "A saved report with that name already exists."
  }
}
500The request failed without exposing provider or server internals.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "internal_error",
    "message": "The request could not be completed."
  }
}
503The aircraft read model, authentication authority, entitlement authority, or durable usage meter is temporarily unavailable. Use bounded backoff rather than a tight retry loop.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "service_unavailable",
    "message": "Aircraft data is temporarily unavailable."
  }
}
PUT/aircraft/reports/{reportId}

Replace a paid saved Aircraft report definition

Authentication required. Operation ID: updateAircraftSavedReport.

Parameters

NameLocationRequiredDetails
reportIdpathYes

Aircraft saved report identifier.

{
  "type": "string",
  "pattern": "^arp_[a-f0-9]{24}$"
}

Request body

{
  "$ref": "#/components/schemas/AircraftSavedReportInput"
}

Responses

200Saved report replaced.
Headers
  • X-Aircraft-Plan: Resolved Aircraft API plan for the authenticated account.
  • X-Aircraft-Saved-Report-Limit: Maximum saved Aircraft report definitions permitted by the current plan.
  • X-Aircraft-Monthly-Export-Run-Limit: Maximum asynchronous export runs per UTC calendar month.
  • X-Aircraft-Export-Row-Limit: Maximum rows permitted in one completed export.
  • X-Aircraft-Export-Retention-Hours: Hours a completed export remains downloadable.
{
  "$ref": "#/components/schemas/AircraftSavedReportResponse"
}
400The aircraft identifier, change-feed window/filter/cursor, discovery filters, cursor, or pagination parameters are invalid.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "invalid_request",
    "message": "At least one reviewed aircraft discovery filter is required."
  }
}
401A valid Grizzly Bulls API key is required.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
403The current Aircraft API plan does not include the requested paid Aircraft capability.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "not_entitled",
    "message": "This Aircraft capability requires a Developer or Business plan."
  }
}
404No matching current or retained registration was found.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "not_found",
    "message": "No current aircraft registration was found for that N-number."
  }
}
405The HTTP method is not supported by this endpoint.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "method_not_allowed",
    "message": "Method not allowed."
  }
}
409The requested Aircraft control-plane mutation conflicts with retained state or a plan-owned limit.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "conflict",
    "message": "An equivalent Aircraft webhook watch already exists."
  }
}
500The request failed without exposing provider or server internals.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "internal_error",
    "message": "The request could not be completed."
  }
}
503The aircraft read model, authentication authority, entitlement authority, or durable usage meter is temporarily unavailable. Use bounded backoff rather than a tight retry loop.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "service_unavailable",
    "message": "Aircraft data is temporarily unavailable."
  }
}
DELETE/aircraft/reports/{reportId}

Delete a saved Aircraft report definition

Deletes an owned definition. Existing export runs retain the immutable definition captured when they were queued.

Authentication required. Operation ID: deleteAircraftSavedReport.

Parameters

NameLocationRequiredDetails
reportIdpathYes

Aircraft saved report identifier.

{
  "type": "string",
  "pattern": "^arp_[a-f0-9]{24}$"
}

Responses

204Saved report deleted.
400The aircraft identifier, change-feed window/filter/cursor, discovery filters, cursor, or pagination parameters are invalid.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "invalid_request",
    "message": "At least one reviewed aircraft discovery filter is required."
  }
}
401A valid Grizzly Bulls API key is required.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
404No matching current or retained registration was found.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "not_found",
    "message": "No current aircraft registration was found for that N-number."
  }
}
405The HTTP method is not supported by this endpoint.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "method_not_allowed",
    "message": "Method not allowed."
  }
}
500The request failed without exposing provider or server internals.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "internal_error",
    "message": "The request could not be completed."
  }
}
503The aircraft read model, authentication authority, entitlement authority, or durable usage meter is temporarily unavailable. Use bounded backoff rather than a tight retry loop.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "service_unavailable",
    "message": "Aircraft data is temporarily unavailable."
  }
}
GET/aircraft/exports

List recent asynchronous Aircraft exports

Authentication required. Operation ID: listAircraftExports.

Parameters

NameLocationRequiredDetails
limitqueryNo

Maximum recent export runs returned.

{
  "type": "integer",
  "minimum": 1,
  "maximum": 50,
  "default": 20
}

Responses

200Recent export-run status for the authenticated account.
Headers
  • X-Aircraft-Plan: Resolved Aircraft API plan for the authenticated account.
  • X-Aircraft-Saved-Report-Limit: Maximum saved Aircraft report definitions permitted by the current plan.
  • X-Aircraft-Monthly-Export-Run-Limit: Maximum asynchronous export runs per UTC calendar month.
  • X-Aircraft-Export-Row-Limit: Maximum rows permitted in one completed export.
  • X-Aircraft-Export-Retention-Hours: Hours a completed export remains downloadable.
{
  "$ref": "#/components/schemas/AircraftExportRunListResponse"
}
400The aircraft identifier, change-feed window/filter/cursor, discovery filters, cursor, or pagination parameters are invalid.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "invalid_request",
    "message": "At least one reviewed aircraft discovery filter is required."
  }
}
401A valid Grizzly Bulls API key is required.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
405The HTTP method is not supported by this endpoint.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "method_not_allowed",
    "message": "Method not allowed."
  }
}
500The request failed without exposing provider or server internals.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "internal_error",
    "message": "The request could not be completed."
  }
}
503The aircraft read model, authentication authority, entitlement authority, or durable usage meter is temporarily unavailable. Use bounded backoff rather than a tight retry loop.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "service_unavailable",
    "message": "Aircraft data is temporarily unavailable."
  }
}
POST/aircraft/exports

Queue a paid asynchronous Aircraft export

Queues a bounded CSV, JSON, or XLSX export from exactly one saved report or one inline definition. Registry exports reuse AIR15B query semantics; change exports reuse AIR14C observation-window and privacy-safe event semantics. A run that exceeds its plan row ceiling fails rather than returning a silently truncated file.

Authentication required. Operation ID: createAircraftExport.

Request body

{
  "$ref": "#/components/schemas/AircraftExportCreateInput"
}

Responses

202Export queued for asynchronous generation.
Headers
  • X-Aircraft-Plan: Resolved Aircraft API plan for the authenticated account.
  • X-Aircraft-Saved-Report-Limit: Maximum saved Aircraft report definitions permitted by the current plan.
  • X-Aircraft-Monthly-Export-Run-Limit: Maximum asynchronous export runs per UTC calendar month.
  • X-Aircraft-Export-Row-Limit: Maximum rows permitted in one completed export.
  • X-Aircraft-Export-Retention-Hours: Hours a completed export remains downloadable.
{
  "$ref": "#/components/schemas/AircraftExportCreateResponse"
}
400The aircraft identifier, change-feed window/filter/cursor, discovery filters, cursor, or pagination parameters are invalid.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "invalid_request",
    "message": "At least one reviewed aircraft discovery filter is required."
  }
}
401A valid Grizzly Bulls API key is required.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
403The current Aircraft API plan does not include the requested paid Aircraft capability.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "not_entitled",
    "message": "This Aircraft capability requires a Developer or Business plan."
  }
}
404No matching current or retained registration was found.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "not_found",
    "message": "No current aircraft registration was found for that N-number."
  }
}
405The HTTP method is not supported by this endpoint.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "method_not_allowed",
    "message": "Method not allowed."
  }
}
429The monthly asynchronous Aircraft export-run allowance for the current plan is exhausted.
Headers
  • X-Aircraft-Plan: Resolved Aircraft API plan for the authenticated account.
  • X-Aircraft-Saved-Report-Limit: Maximum saved Aircraft report definitions permitted by the current plan.
  • X-Aircraft-Monthly-Export-Run-Limit: Maximum asynchronous export runs per UTC calendar month.
  • X-Aircraft-Export-Row-Limit: Maximum rows permitted in one completed export.
  • X-Aircraft-Export-Retention-Hours: Hours a completed export remains downloadable.
  • Retry-After: Seconds until the next UTC calendar-month export allowance begins.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "limit_reached",
    "message": "Monthly Aircraft export run limit reached for this plan."
  }
}
500The request failed without exposing provider or server internals.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "internal_error",
    "message": "The request could not be completed."
  }
}
503The aircraft read model, authentication authority, entitlement authority, or durable usage meter is temporarily unavailable. Use bounded backoff rather than a tight retry loop.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "service_unavailable",
    "message": "Aircraft data is temporarily unavailable."
  }
}
GET/aircraft/exports/{exportId}

Get one asynchronous Aircraft export status

Authentication required. Operation ID: getAircraftExport.

Parameters

NameLocationRequiredDetails
exportIdpathYes

Aircraft export run identifier.

{
  "type": "string",
  "pattern": "^aex_[a-f0-9]{24}$"
}

Responses

200Current export-run status.
Headers
  • X-Aircraft-Plan: Resolved Aircraft API plan for the authenticated account.
  • X-Aircraft-Saved-Report-Limit: Maximum saved Aircraft report definitions permitted by the current plan.
  • X-Aircraft-Monthly-Export-Run-Limit: Maximum asynchronous export runs per UTC calendar month.
  • X-Aircraft-Export-Row-Limit: Maximum rows permitted in one completed export.
  • X-Aircraft-Export-Retention-Hours: Hours a completed export remains downloadable.
{
  "$ref": "#/components/schemas/AircraftExportRunResponse"
}
400The aircraft identifier, change-feed window/filter/cursor, discovery filters, cursor, or pagination parameters are invalid.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "invalid_request",
    "message": "At least one reviewed aircraft discovery filter is required."
  }
}
401A valid Grizzly Bulls API key is required.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
404No matching current or retained registration was found.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "not_found",
    "message": "No current aircraft registration was found for that N-number."
  }
}
405The HTTP method is not supported by this endpoint.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "method_not_allowed",
    "message": "Method not allowed."
  }
}
500The request failed without exposing provider or server internals.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "internal_error",
    "message": "The request could not be completed."
  }
}
503The aircraft read model, authentication authority, entitlement authority, or durable usage meter is temporarily unavailable. Use bounded backoff rather than a tight retry loop.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "service_unavailable",
    "message": "Aircraft data is temporarily unavailable."
  }
}
GET/aircraft/exports/{exportId}/download

Download one completed retained Aircraft export

Downloads a completed file only after its byte length and retained SHA-256 evidence match. Completed files expire after the plan retention window.

Authentication required. Operation ID: downloadAircraftExport.

Parameters

NameLocationRequiredDetails
exportIdpathYes

Aircraft export run identifier.

{
  "type": "string",
  "pattern": "^aex_[a-f0-9]{24}$"
}

Responses

200Completed CSV, JSON, or XLSX export.
Headers
  • X-Aircraft-Plan: Resolved Aircraft API plan for the authenticated account.
  • X-Aircraft-Saved-Report-Limit: Maximum saved Aircraft report definitions permitted by the current plan.
  • X-Aircraft-Monthly-Export-Run-Limit: Maximum asynchronous export runs per UTC calendar month.
  • X-Aircraft-Export-Row-Limit: Maximum rows permitted in one completed export.
  • X-Aircraft-Export-Retention-Hours: Hours a completed export remains downloadable.
{
  "type": "string",
  "format": "binary"
}
400The aircraft identifier, change-feed window/filter/cursor, discovery filters, cursor, or pagination parameters are invalid.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "invalid_request",
    "message": "At least one reviewed aircraft discovery filter is required."
  }
}
401A valid Grizzly Bulls API key is required.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
404No matching current or retained registration was found.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "not_found",
    "message": "No current aircraft registration was found for that N-number."
  }
}
405The HTTP method is not supported by this endpoint.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "method_not_allowed",
    "message": "Method not allowed."
  }
}
409The requested asynchronous Aircraft export is not yet completed.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "not_ready",
    "message": "Aircraft export is not ready for download."
  }
}
410The requested retained export has expired.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "expired",
    "message": "Aircraft export has expired."
  }
}
500The request failed without exposing provider or server internals.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "internal_error",
    "message": "The request could not be completed."
  }
}
503The aircraft read model, authentication authority, entitlement authority, or durable usage meter is temporarily unavailable. Use bounded backoff rather than a tight retry loop.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "service_unavailable",
    "message": "Aircraft data is temporarily unavailable."
  }
}
GET/aircraft/watches

List configured Aircraft webhook watches

Lists this account's configured N-number watches. Free accounts may inspect or delete watches retained after a paid-plan downgrade, but only Developer and Business plans can create watches or queue test deliveries.

Authentication required. Operation ID: listAircraftWebhookWatches.

Responses

200Configured webhook watches and the current plan watch limit.
Headers
  • X-Aircraft-Plan: Resolved Aircraft API plan for the authenticated account.
  • X-Aircraft-Webhook-Watch-Limit: Maximum configured Aircraft webhook watches permitted by the current plan.
{
  "$ref": "#/components/schemas/AircraftWebhookWatchListResponse"
}
401A valid Grizzly Bulls API key is required.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
405The HTTP method is not supported by this endpoint.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "method_not_allowed",
    "message": "Method not allowed."
  }
}
500The request failed without exposing provider or server internals.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "internal_error",
    "message": "The request could not be completed."
  }
}
503The aircraft read model, authentication authority, entitlement authority, or durable usage meter is temporarily unavailable. Use bounded backoff rather than a tight retry loop.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "service_unavailable",
    "message": "Aircraft data is temporarily unavailable."
  }
}
POST/aircraft/watches

Create a paid N-number webhook watch

Creates one exact N-number watch for a Developer or Business account. endpointUrl must be an HTTPS URL on the public Internet and must resolve only to public addresses at creation time; delivery re-resolves and pins a reviewed public address before every attempt. eventTypes may contain only AIR14C reviewed change-event types. The signing secret is returned only in this successful creation response. Equivalent watches are rejected rather than silently changing event filters.

Authentication required. Operation ID: createAircraftWebhookWatch.

Request body

{
  "$ref": "#/components/schemas/AircraftWebhookWatchCreateInput"
}

Responses

201Webhook watch created. Store the returned signingSecret securely; it is not returned by later reads.
Headers
  • X-Aircraft-Plan: Resolved Aircraft API plan for the authenticated account.
  • X-Aircraft-Webhook-Watch-Limit: Maximum configured Aircraft webhook watches permitted by the current plan.
{
  "$ref": "#/components/schemas/AircraftWebhookWatchCreateResponse"
}
400The aircraft identifier, change-feed window/filter/cursor, discovery filters, cursor, or pagination parameters are invalid.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "invalid_request",
    "message": "At least one reviewed aircraft discovery filter is required."
  }
}
401A valid Grizzly Bulls API key is required.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
403The current Aircraft API plan does not include the requested paid Aircraft capability.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "not_entitled",
    "message": "This Aircraft capability requires a Developer or Business plan."
  }
}
405The HTTP method is not supported by this endpoint.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "method_not_allowed",
    "message": "Method not allowed."
  }
}
409The requested Aircraft control-plane mutation conflicts with retained state or a plan-owned limit.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "conflict",
    "message": "An equivalent Aircraft webhook watch already exists."
  }
}
500The request failed without exposing provider or server internals.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "internal_error",
    "message": "The request could not be completed."
  }
}
503The aircraft read model, authentication authority, entitlement authority, or durable usage meter is temporarily unavailable. Use bounded backoff rather than a tight retry loop.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "service_unavailable",
    "message": "Aircraft data is temporarily unavailable."
  }
}
DELETE/aircraft/watches/{watchId}

Delete an Aircraft webhook watch

Deletes an owned watch and its retained delivery troubleshooting records. This remains available after a paid-plan downgrade.

Authentication required. Operation ID: deleteAircraftWebhookWatch.

Parameters

NameLocationRequiredDetails
watchIdpathYes

Aircraft webhook watch identifier.

{
  "type": "string",
  "pattern": "^aw_[a-f0-9]{24}$"
}

Responses

204Webhook watch deleted.
400The aircraft identifier, change-feed window/filter/cursor, discovery filters, cursor, or pagination parameters are invalid.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "invalid_request",
    "message": "At least one reviewed aircraft discovery filter is required."
  }
}
401A valid Grizzly Bulls API key is required.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
404No matching current or retained registration was found.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "not_found",
    "message": "No current aircraft registration was found for that N-number."
  }
}
405The HTTP method is not supported by this endpoint.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "method_not_allowed",
    "message": "Method not allowed."
  }
}
500The request failed without exposing provider or server internals.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "internal_error",
    "message": "The request could not be completed."
  }
}
503The aircraft read model, authentication authority, entitlement authority, or durable usage meter is temporarily unavailable. Use bounded backoff rather than a tight retry loop.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "service_unavailable",
    "message": "Aircraft data is temporarily unavailable."
  }
}
POST/aircraft/watches/{watchId}/test

Queue a synthetic signed webhook test

Queues a synthetic test event for an owned watch on a Developer or Business plan. The event is explicitly marked as a test and does not represent an FAA registry observation. Each watch may queue at most one synthetic test in any five-minute window.

Authentication required. Operation ID: queueAircraftWebhookTest.

Parameters

NameLocationRequiredDetails
watchIdpathYes

Aircraft webhook watch identifier.

{
  "type": "string",
  "pattern": "^aw_[a-f0-9]{24}$"
}

Responses

202Synthetic test delivery queued.
Headers
  • X-Aircraft-Plan: Resolved Aircraft API plan for the authenticated account.
  • X-Aircraft-Webhook-Watch-Limit: Maximum configured Aircraft webhook watches permitted by the current plan.
{
  "$ref": "#/components/schemas/AircraftWebhookTestResponse"
}
400The aircraft identifier, change-feed window/filter/cursor, discovery filters, cursor, or pagination parameters are invalid.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "invalid_request",
    "message": "At least one reviewed aircraft discovery filter is required."
  }
}
401A valid Grizzly Bulls API key is required.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
403The current Aircraft API plan does not include the requested paid Aircraft capability.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "not_entitled",
    "message": "This Aircraft capability requires a Developer or Business plan."
  }
}
404No matching current or retained registration was found.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "not_found",
    "message": "No current aircraft registration was found for that N-number."
  }
}
405The HTTP method is not supported by this endpoint.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "method_not_allowed",
    "message": "Method not allowed."
  }
}
429The short-window request rate or monthly aircraft API quota was exceeded.
Headers
  • X-Aircraft-Plan: Resolved aircraft API plan for the authenticated account.
  • X-Aircraft-Rate-Limit: Maximum requests permitted per minute for the resolved aircraft API plan.
  • X-Aircraft-Quota-Limit: Monthly request quota for the resolved aircraft API plan.
  • X-Aircraft-Quota-Remaining: Monthly requests remaining after the current operation was reserved.
  • X-Aircraft-Quota-Reset: UTC timestamp when the current monthly quota window resets.
  • Retry-After: Seconds until the request may be retried under the limiting policy.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "rate_limited",
    "message": "Aircraft API usage limit exceeded."
  }
}
500The request failed without exposing provider or server internals.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "internal_error",
    "message": "The request could not be completed."
  }
}
503The aircraft read model, authentication authority, entitlement authority, or durable usage meter is temporarily unavailable. Use bounded backoff rather than a tight retry loop.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "service_unavailable",
    "message": "Aircraft data is temporarily unavailable."
  }
}
GET/aircraft/watches/{watchId}/deliveries

List recent webhook delivery attempts

Returns up to 20 recent deliveries and their bounded attempt history for one owned watch. Endpoint URLs, signing secrets, and response bodies are not copied into delivery-attempt history.

Authentication required. Operation ID: listAircraftWebhookDeliveries.

Parameters

NameLocationRequiredDetails
watchIdpathYes

Aircraft webhook watch identifier.

{
  "type": "string",
  "pattern": "^aw_[a-f0-9]{24}$"
}
limitqueryNo

Maximum recent webhook deliveries returned for troubleshooting.

{
  "type": "integer",
  "minimum": 1,
  "maximum": 20,
  "default": 10
}

Responses

200Recent webhook deliveries for troubleshooting.
Headers
  • X-Aircraft-Plan: Resolved Aircraft API plan for the authenticated account.
  • X-Aircraft-Webhook-Watch-Limit: Maximum configured Aircraft webhook watches permitted by the current plan.
{
  "$ref": "#/components/schemas/AircraftWebhookDeliveryListResponse"
}
400The aircraft identifier, change-feed window/filter/cursor, discovery filters, cursor, or pagination parameters are invalid.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "invalid_request",
    "message": "At least one reviewed aircraft discovery filter is required."
  }
}
401A valid Grizzly Bulls API key is required.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
404No matching current or retained registration was found.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "not_found",
    "message": "No current aircraft registration was found for that N-number."
  }
}
405The HTTP method is not supported by this endpoint.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "method_not_allowed",
    "message": "Method not allowed."
  }
}
500The request failed without exposing provider or server internals.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "internal_error",
    "message": "The request could not be completed."
  }
}
503The aircraft read model, authentication authority, entitlement authority, or durable usage meter is temporarily unavailable. Use bounded backoff rather than a tight retry loop.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "service_unavailable",
    "message": "Aircraft data is temporarily unavailable."
  }
}
GET/aircraft/n-number/{nNumber}/status

Resolve reviewed FAA lifecycle status for an N-number

Resolves one evidence-backed state across the current FAA registration, current FAA reservation, and current FAA deregistration authorities. registered takes precedence over reserved, which takes precedence over deregistered. unknown means only that the N-number is absent from all three reviewed authorities in the cited source snapshot; it does not mean the N-number is available, acquirable, or legally assignable. Reservation party names and addresses are never exposed. The service fails closed if the lifecycle projection is not aligned to the current FAA snapshot.

Authentication required. Operation ID: getAircraftNNumberStatus.

Parameters

NameLocationRequiredDetails
nNumberpathYes

U.S. aircraft N-number. Matching is case-insensitive and an optional N- hyphen is normalized.

{
  "type": "string",
  "pattern": "^[Nn]-?(?:[1-9][0-9]{0,4}|[1-9][0-9]{0,3}[A-HJ-NP-Za-hj-np-z]|[1-9][0-9]{0,2}[A-HJ-NP-Za-hj-np-z]{2})$",
  "example": "N100"
}

Responses

200Reviewed lifecycle status. unknown is a successful evidence-backed absence result, not an availability determination.
Headers
  • X-Aircraft-Plan: Resolved aircraft API plan for the authenticated account.
  • X-Aircraft-Rate-Limit: Maximum requests permitted per minute for the resolved aircraft API plan.
  • X-Aircraft-Quota-Limit: Monthly request quota for the resolved aircraft API plan.
  • X-Aircraft-Quota-Remaining: Monthly requests remaining after the current operation was reserved.
  • X-Aircraft-Quota-Reset: UTC timestamp when the current monthly quota window resets.
{
  "$ref": "#/components/schemas/AircraftNNumberStatusResponse"
}
400The aircraft identifier, change-feed window/filter/cursor, discovery filters, cursor, or pagination parameters are invalid.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "invalid_request",
    "message": "At least one reviewed aircraft discovery filter is required."
  }
}
401A valid Grizzly Bulls API key is required.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
405The HTTP method is not supported by this endpoint.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "method_not_allowed",
    "message": "Method not allowed."
  }
}
429The short-window request rate or monthly aircraft API quota was exceeded.
Headers
  • X-Aircraft-Plan: Resolved aircraft API plan for the authenticated account.
  • X-Aircraft-Rate-Limit: Maximum requests permitted per minute for the resolved aircraft API plan.
  • X-Aircraft-Quota-Limit: Monthly request quota for the resolved aircraft API plan.
  • X-Aircraft-Quota-Remaining: Monthly requests remaining after the current operation was reserved.
  • X-Aircraft-Quota-Reset: UTC timestamp when the current monthly quota window resets.
  • Retry-After: Seconds until the request may be retried under the limiting policy.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "rate_limited",
    "message": "Aircraft API usage limit exceeded."
  }
}
500The request failed without exposing provider or server internals.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "internal_error",
    "message": "The request could not be completed."
  }
}
503The aircraft read model, authentication authority, entitlement authority, or durable usage meter is temporarily unavailable. Use bounded backoff rather than a tight retry loop.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "service_unavailable",
    "message": "Aircraft data is temporarily unavailable."
  }
}
GET/aircraft/{nNumber}

Get the current aircraft registration for an N-number

Authentication required. Operation ID: getAircraftByNNumber.

Parameters

NameLocationRequiredDetails
nNumberpathYes

U.S. aircraft N-number. Matching is case-insensitive and an optional N- hyphen is normalized.

{
  "type": "string",
  "pattern": "^[Nn]-?(?:[1-9][0-9]{0,4}|[1-9][0-9]{0,3}[A-HJ-NP-Za-hj-np-z]|[1-9][0-9]{0,2}[A-HJ-NP-Za-hj-np-z]{2})$",
  "example": "N100"
}

Responses

200Current aircraft registration.
Headers
  • X-Aircraft-Plan: Resolved aircraft API plan for the authenticated account.
  • X-Aircraft-Rate-Limit: Maximum requests permitted per minute for the resolved aircraft API plan.
  • X-Aircraft-Quota-Limit: Monthly request quota for the resolved aircraft API plan.
  • X-Aircraft-Quota-Remaining: Monthly requests remaining after the current operation was reserved.
  • X-Aircraft-Quota-Reset: UTC timestamp when the current monthly quota window resets.
{
  "$ref": "#/components/schemas/AircraftCurrentResponse"
}
400The aircraft identifier, change-feed window/filter/cursor, discovery filters, cursor, or pagination parameters are invalid.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "invalid_request",
    "message": "At least one reviewed aircraft discovery filter is required."
  }
}
401A valid Grizzly Bulls API key is required.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
404No matching current or retained registration was found.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "not_found",
    "message": "No current aircraft registration was found for that N-number."
  }
}
405The HTTP method is not supported by this endpoint.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "method_not_allowed",
    "message": "Method not allowed."
  }
}
429The short-window request rate or monthly aircraft API quota was exceeded.
Headers
  • X-Aircraft-Plan: Resolved aircraft API plan for the authenticated account.
  • X-Aircraft-Rate-Limit: Maximum requests permitted per minute for the resolved aircraft API plan.
  • X-Aircraft-Quota-Limit: Monthly request quota for the resolved aircraft API plan.
  • X-Aircraft-Quota-Remaining: Monthly requests remaining after the current operation was reserved.
  • X-Aircraft-Quota-Reset: UTC timestamp when the current monthly quota window resets.
  • Retry-After: Seconds until the request may be retried under the limiting policy.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "rate_limited",
    "message": "Aircraft API usage limit exceeded."
  }
}
500The request failed without exposing provider or server internals.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "internal_error",
    "message": "The request could not be completed."
  }
}
503The aircraft read model, authentication authority, entitlement authority, or durable usage meter is temporarily unavailable. Use bounded backoff rather than a tight retry loop.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "service_unavailable",
    "message": "Aircraft data is temporarily unavailable."
  }
}
GET/aircraft/icao24/{hex}

Get the current aircraft registration for an ICAO24 / Mode-S code

Authenticated exact current-registry lookup by six-hex-digit ICAO24 / Mode-S address. This resolves only the reviewed U.S. FAA current registry and does not provide ADS-B positions, flight data, transponder history, or global coverage.

Authentication required. Operation ID: getAircraftByIcao24.

Parameters

NameLocationRequiredDetails
hexpathYes

Six-hex-digit ICAO24 / Mode-S aircraft address. Matching is case-insensitive and normalized to uppercase.

{
  "type": "string",
  "pattern": "^[0-9A-F]{6}$",
  "example": "A00001"
}

Responses

200Current aircraft registration using the same response contract as N-number lookup.
Headers
  • X-Aircraft-Plan: Resolved aircraft API plan for the authenticated account.
  • X-Aircraft-Rate-Limit: Maximum requests permitted per minute for the resolved aircraft API plan.
  • X-Aircraft-Quota-Limit: Monthly request quota for the resolved aircraft API plan.
  • X-Aircraft-Quota-Remaining: Monthly requests remaining after the current operation was reserved.
  • X-Aircraft-Quota-Reset: UTC timestamp when the current monthly quota window resets.
{
  "$ref": "#/components/schemas/AircraftCurrentResponse"
}
400The aircraft identifier, change-feed window/filter/cursor, discovery filters, cursor, or pagination parameters are invalid.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "invalid_request",
    "message": "At least one reviewed aircraft discovery filter is required."
  }
}
401A valid Grizzly Bulls API key is required.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
404No matching current or retained registration was found.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "not_found",
    "message": "No current aircraft registration was found for that N-number."
  }
}
405The HTTP method is not supported by this endpoint.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "method_not_allowed",
    "message": "Method not allowed."
  }
}
429The short-window request rate or monthly aircraft API quota was exceeded.
Headers
  • X-Aircraft-Plan: Resolved aircraft API plan for the authenticated account.
  • X-Aircraft-Rate-Limit: Maximum requests permitted per minute for the resolved aircraft API plan.
  • X-Aircraft-Quota-Limit: Monthly request quota for the resolved aircraft API plan.
  • X-Aircraft-Quota-Remaining: Monthly requests remaining after the current operation was reserved.
  • X-Aircraft-Quota-Reset: UTC timestamp when the current monthly quota window resets.
  • Retry-After: Seconds until the request may be retried under the limiting policy.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "rate_limited",
    "message": "Aircraft API usage limit exceeded."
  }
}
500The request failed without exposing provider or server internals.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "internal_error",
    "message": "The request could not be completed."
  }
}
503The aircraft read model, authentication authority, entitlement authority, or durable usage meter is temporarily unavailable. Use bounded backoff rather than a tight retry loop.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "service_unavailable",
    "message": "Aircraft data is temporarily unavailable."
  }
}
GET/aircraft/{nNumber}/history

Get compact retained registration history and change events for an N-number

Authentication required. Operation ID: getAircraftHistoryByNNumber.

Parameters

NameLocationRequiredDetails
nNumberpathYes

U.S. aircraft N-number. Matching is case-insensitive and an optional N- hyphen is normalized.

{
  "type": "string",
  "pattern": "^[Nn]-?(?:[1-9][0-9]{0,4}|[1-9][0-9]{0,3}[A-HJ-NP-Za-hj-np-z]|[1-9][0-9]{0,2}[A-HJ-NP-Za-hj-np-z]{2})$",
  "example": "N100"
}
versionsLimitqueryNo

Maximum historical versions returned.

{
  "type": "integer",
  "minimum": 1,
  "maximum": 100,
  "default": 50
}
versionsOffsetqueryNo

Historical-version offset.

{
  "type": "integer",
  "minimum": 0,
  "maximum": 10000,
  "default": 0
}
eventsLimitqueryNo

Maximum change events returned.

{
  "type": "integer",
  "minimum": 1,
  "maximum": 100,
  "default": 50
}
eventsOffsetqueryNo

Change-event offset.

{
  "type": "integer",
  "minimum": 0,
  "maximum": 10000,
  "default": 0
}

Responses

200Retained history and PII-free change events.
Headers
  • X-Aircraft-Plan: Resolved aircraft API plan for the authenticated account.
  • X-Aircraft-Rate-Limit: Maximum requests permitted per minute for the resolved aircraft API plan.
  • X-Aircraft-Quota-Limit: Monthly request quota for the resolved aircraft API plan.
  • X-Aircraft-Quota-Remaining: Monthly requests remaining after the current operation was reserved.
  • X-Aircraft-Quota-Reset: UTC timestamp when the current monthly quota window resets.
{
  "$ref": "#/components/schemas/AircraftHistoryResponse"
}
400The aircraft identifier, change-feed window/filter/cursor, discovery filters, cursor, or pagination parameters are invalid.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "invalid_request",
    "message": "At least one reviewed aircraft discovery filter is required."
  }
}
401A valid Grizzly Bulls API key is required.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
404No matching current or retained registration was found.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "not_found",
    "message": "No current aircraft registration was found for that N-number."
  }
}
405The HTTP method is not supported by this endpoint.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "method_not_allowed",
    "message": "Method not allowed."
  }
}
429The short-window request rate or monthly aircraft API quota was exceeded.
Headers
  • X-Aircraft-Plan: Resolved aircraft API plan for the authenticated account.
  • X-Aircraft-Rate-Limit: Maximum requests permitted per minute for the resolved aircraft API plan.
  • X-Aircraft-Quota-Limit: Monthly request quota for the resolved aircraft API plan.
  • X-Aircraft-Quota-Remaining: Monthly requests remaining after the current operation was reserved.
  • X-Aircraft-Quota-Reset: UTC timestamp when the current monthly quota window resets.
  • Retry-After: Seconds until the request may be retried under the limiting policy.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "rate_limited",
    "message": "Aircraft API usage limit exceeded."
  }
}
500The request failed without exposing provider or server internals.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "internal_error",
    "message": "The request could not be completed."
  }
}
503The aircraft read model, authentication authority, entitlement authority, or durable usage meter is temporarily unavailable. Use bounded backoff rather than a tight retry loop.
{
  "$ref": "#/components/schemas/ErrorResponse"
}
Example
{
  "error": {
    "code": "service_unavailable",
    "message": "Aircraft data is temporarily unavailable."
  }
}

Schemas

Reusable definitions exposed by the product OpenAPI contract.

AircraftChangeDiff
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "field",
    "before",
    "after"
  ],
  "properties": {
    "field": {
      "type": "string",
      "enum": [
        "aircraft_assignment",
        "registration_identifier",
        "aircraft_model",
        "engine_model",
        "manufacture_year",
        "aircraft_type",
        "engine_type",
        "registration_status",
        "mode_s_code",
        "certificate_issue_date",
        "expiration_date",
        "last_activity_date",
        "airworthiness_date",
        "fractional_ownership",
        "registrant_type"
      ]
    },
    "before": {
      "$ref": "#/components/schemas/AircraftChangeDiffSide"
    },
    "after": {
      "$ref": "#/components/schemas/AircraftChangeDiffSide"
    }
  }
}
AircraftChangeDiffSide
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "available",
    "value"
  ],
  "properties": {
    "available": {
      "type": "boolean",
      "description": "Whether a matching retained public version exists on this side of the observed change. false is distinct from an available retained value that is itself null."
    },
    "value": {
      "$ref": "#/components/schemas/AircraftChangeDiffValue"
    }
  }
}
AircraftChangeDiffValue
{
  "oneOf": [
    {
      "type": "string"
    },
    {
      "type": "number"
    },
    {
      "type": "boolean"
    },
    {
      "type": "null"
    },
    {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "modeSCodeOctal",
        "modeSCodeHex"
      ],
      "properties": {
        "modeSCodeOctal": {
          "type": [
            "string",
            "null"
          ]
        },
        "modeSCodeHex": {
          "type": [
            "string",
            "null"
          ]
        }
      }
    }
  ]
}
AircraftChangeFeedItem
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "event",
    "diffs"
  ],
  "properties": {
    "event": {
      "$ref": "#/components/schemas/HistoryEvent"
    },
    "diffs": {
      "type": "array",
      "description": "Privacy-safe before/after values for the subset of changedFields supported by retained public versions. Historical make/model descriptions are intentionally not reconstructed from current reference data, and sensitive registrant values never appear here.",
      "items": {
        "$ref": "#/components/schemas/AircraftChangeDiff"
      }
    }
  }
}
AircraftChangeFeedPagination
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "limit",
    "nextCursor"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 50
    },
    "nextCursor": {
      "type": [
        "string",
        "null"
      ],
      "maxLength": 2048
    }
  }
}
AircraftChangeFeedResponse
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data",
    "window",
    "pagination"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/AircraftChangeFeedItem"
      }
    },
    "window": {
      "$ref": "#/components/schemas/AircraftChangeFeedWindow"
    },
    "pagination": {
      "$ref": "#/components/schemas/AircraftChangeFeedPagination"
    }
  }
}
AircraftChangeFeedWindow
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "since",
    "until",
    "eventType"
  ],
  "properties": {
    "since": {
      "type": "string",
      "format": "date-time"
    },
    "until": {
      "type": "string",
      "format": "date-time"
    },
    "eventType": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "registration_added",
        "registration_removed",
        "registration_record_changed",
        "aircraft_assignment_changed",
        "status_changed",
        "registrant_changed",
        "registrant_pii_withheld",
        "registrant_pii_released",
        null
      ]
    }
  }
}
AircraftChangeReportDefinition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "kind",
    "query"
  ],
  "properties": {
    "kind": {
      "type": "string",
      "const": "change_feed"
    },
    "query": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "since",
        "until",
        "eventType"
      ],
      "properties": {
        "since": {
          "type": "string",
          "format": "date-time"
        },
        "until": {
          "type": "string",
          "format": "date-time"
        },
        "eventType": {
          "type": [
            "string",
            "null"
          ],
          "enum": [
            "registration_added",
            "registration_removed",
            "registration_record_changed",
            "aircraft_assignment_changed",
            "status_changed",
            "registrant_changed",
            "registrant_pii_withheld",
            "registrant_pii_released",
            null
          ]
        }
      }
    }
  }
}
AircraftCurrentRecord
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "contractVersion",
    "aircraftId",
    "registration",
    "aircraft",
    "registrant",
    "source",
    "history"
  ],
  "properties": {
    "contractVersion": {
      "type": "string",
      "const": "aircraft-public-v1"
    },
    "aircraftId": {
      "type": [
        "string",
        "null"
      ],
      "format": "uuid"
    },
    "registration": {
      "$ref": "#/components/schemas/Registration"
    },
    "aircraft": {
      "$ref": "#/components/schemas/CurrentAircraft"
    },
    "registrant": {
      "$ref": "#/components/schemas/Registrant"
    },
    "source": {
      "$ref": "#/components/schemas/SourceSnapshot"
    },
    "history": {
      "$ref": "#/components/schemas/HistorySummary"
    }
  }
}
AircraftCurrentResponse
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data"
  ],
  "properties": {
    "data": {
      "$ref": "#/components/schemas/AircraftCurrentRecord"
    }
  }
}
AircraftDiscoveryPagination
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "limit",
    "nextCursor"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 50
    },
    "nextCursor": {
      "type": [
        "string",
        "null"
      ],
      "maxLength": 1024
    }
  }
}
AircraftDiscoveryRecord
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "contractVersion",
    "aircraftId",
    "nNumber",
    "sourceRegistrationStatusCode",
    "serialNumber",
    "manufactureYear",
    "manufacturer",
    "model",
    "registrantState"
  ],
  "properties": {
    "contractVersion": {
      "type": "string",
      "const": "aircraft-discovery-v1"
    },
    "aircraftId": {
      "type": [
        "string",
        "null"
      ],
      "format": "uuid"
    },
    "nNumber": {
      "type": "string"
    },
    "sourceRegistrationStatusCode": {
      "type": [
        "string",
        "null"
      ]
    },
    "serialNumber": {
      "type": [
        "string",
        "null"
      ]
    },
    "manufactureYear": {
      "type": [
        "integer",
        "null"
      ]
    },
    "manufacturer": {
      "type": [
        "string",
        "null"
      ]
    },
    "model": {
      "type": [
        "string",
        "null"
      ]
    },
    "registrantState": {
      "type": [
        "string",
        "null"
      ]
    }
  }
}
AircraftDiscoveryResponse
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data",
    "pagination"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/AircraftDiscoveryRecord"
      }
    },
    "pagination": {
      "$ref": "#/components/schemas/AircraftDiscoveryPagination"
    }
  }
}
AircraftExportCreateInput
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "format"
  ],
  "properties": {
    "format": {
      "type": "string",
      "enum": [
        "csv",
        "json",
        "xlsx"
      ]
    },
    "reportId": {
      "type": [
        "string",
        "null"
      ],
      "pattern": "^arp_[a-f0-9]{24}$"
    },
    "definition": {
      "oneOf": [
        {
          "$ref": "#/components/schemas/AircraftSavedReportDefinition"
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "description": "Supply exactly one of reportId or definition."
}
AircraftExportCreateResponse
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data",
    "limits"
  ],
  "properties": {
    "data": {
      "$ref": "#/components/schemas/AircraftExportRun"
    },
    "limits": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "monthlyExportRunLimit",
        "exportRowLimit",
        "retentionHours"
      ],
      "properties": {
        "monthlyExportRunLimit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 1000
        },
        "exportRowLimit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 25000
        },
        "retentionHours": {
          "type": "integer",
          "minimum": 1,
          "maximum": 72
        }
      }
    }
  }
}
AircraftExportRun
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "exportId",
    "reportId",
    "kind",
    "format",
    "status",
    "rowLimit",
    "rowCount",
    "storageBytes",
    "storageSha256",
    "errorCode",
    "createdAt",
    "claimedAt",
    "completedAt",
    "expiresAt"
  ],
  "properties": {
    "exportId": {
      "type": "string",
      "pattern": "^aex_[a-f0-9]{24}$"
    },
    "reportId": {
      "type": [
        "string",
        "null"
      ],
      "pattern": "^arp_[a-f0-9]{24}$"
    },
    "kind": {
      "type": "string",
      "enum": [
        "registry_query",
        "change_feed"
      ]
    },
    "format": {
      "type": "string",
      "enum": [
        "csv",
        "json",
        "xlsx"
      ]
    },
    "status": {
      "type": "string",
      "enum": [
        "queued",
        "running",
        "completed",
        "failed",
        "expired"
      ]
    },
    "rowLimit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 25000
    },
    "rowCount": {
      "type": [
        "integer",
        "null"
      ],
      "minimum": 0,
      "maximum": 25000
    },
    "storageBytes": {
      "type": [
        "integer",
        "null"
      ],
      "minimum": 0,
      "maximum": 67108864
    },
    "storageSha256": {
      "type": [
        "string",
        "null"
      ],
      "pattern": "^[a-f0-9]{64}$"
    },
    "errorCode": {
      "type": [
        "string",
        "null"
      ]
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    },
    "claimedAt": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "completedAt": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "expiresAt": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    }
  }
}
AircraftExportRunListResponse
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data",
    "pagination"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/AircraftExportRun"
      }
    },
    "pagination": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "limit"
      ],
      "properties": {
        "limit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 50
        }
      }
    }
  }
}
AircraftExportRunResponse
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data"
  ],
  "properties": {
    "data": {
      "$ref": "#/components/schemas/AircraftExportRun"
    }
  }
}
AircraftHistoryResponse
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data",
    "pagination"
  ],
  "properties": {
    "data": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "nNumber",
        "versions",
        "events"
      ],
      "properties": {
        "nNumber": {
          "type": "string"
        },
        "versions": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/HistoryVersion"
          }
        },
        "events": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/HistoryEvent"
          }
        }
      }
    },
    "pagination": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "versions",
        "events"
      ],
      "properties": {
        "versions": {
          "$ref": "#/components/schemas/PageMeta"
        },
        "events": {
          "$ref": "#/components/schemas/PageMeta"
        }
      }
    }
  }
}
AircraftNNumberStatus
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "contractVersion",
    "nNumber",
    "state",
    "availability",
    "observedAt",
    "source",
    "registered",
    "reserved",
    "deregistered"
  ],
  "properties": {
    "contractVersion": {
      "type": "string",
      "const": "aircraft-n-number-status-v1"
    },
    "nNumber": {
      "type": "string"
    },
    "state": {
      "type": "string",
      "enum": [
        "registered",
        "reserved",
        "deregistered",
        "unknown"
      ]
    },
    "availability": {
      "type": "string",
      "const": "not_determined",
      "description": "AIR14D never infers FAA N-number availability from registry absence or lifecycle state."
    },
    "observedAt": {
      "type": "string",
      "format": "date-time"
    },
    "source": {
      "$ref": "#/components/schemas/SourceSnapshot"
    },
    "registered": {
      "oneOf": [
        {
          "$ref": "#/components/schemas/AircraftCurrentRecord"
        },
        {
          "type": "null"
        }
      ]
    },
    "reserved": {
      "oneOf": [
        {
          "$ref": "#/components/schemas/ReservedNNumberContext"
        },
        {
          "type": "null"
        }
      ]
    },
    "deregistered": {
      "oneOf": [
        {
          "$ref": "#/components/schemas/DeregisteredNNumberContext"
        },
        {
          "type": "null"
        }
      ]
    }
  }
}
AircraftNNumberStatusResponse
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data"
  ],
  "properties": {
    "data": {
      "$ref": "#/components/schemas/AircraftNNumberStatus"
    }
  }
}
AircraftRegistryColumnsResponse
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data",
    "grammar"
  ],
  "properties": {
    "data": {
      "type": "array",
      "minItems": 8,
      "maxItems": 8,
      "items": {
        "$ref": "#/components/schemas/AircraftRegistryQueryColumn"
      }
    },
    "grammar": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "filter",
        "columns",
        "sort",
        "maxFilters",
        "maxInValues"
      ],
      "properties": {
        "filter": {
          "type": "string"
        },
        "columns": {
          "type": "string"
        },
        "sort": {
          "type": "string"
        },
        "maxFilters": {
          "type": "integer",
          "minimum": 1,
          "maximum": 8
        },
        "maxInValues": {
          "type": "integer",
          "minimum": 1
        }
      }
    }
  }
}
AircraftRegistryQueryColumn
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "name",
    "type",
    "filterable",
    "sortable",
    "operators"
  ],
  "properties": {
    "name": {
      "type": "string",
      "enum": [
        "aircraftId",
        "nNumber",
        "sourceRegistrationStatusCode",
        "serialNumber",
        "manufactureYear",
        "manufacturer",
        "model",
        "registrantState"
      ]
    },
    "type": {
      "type": "string",
      "enum": [
        "string",
        "integer",
        "uuid"
      ]
    },
    "filterable": {
      "type": "boolean"
    },
    "sortable": {
      "type": "boolean"
    },
    "operators": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "equals",
          "contains",
          "starts_with",
          "in",
          "gte",
          "lte",
          "between"
        ]
      }
    }
  }
}
AircraftRegistryQueryRecord
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "contractVersion"
  ],
  "properties": {
    "contractVersion": {
      "type": "string",
      "const": "aircraft-query-v1"
    },
    "aircraftId": {
      "type": [
        "string",
        "null"
      ],
      "format": "uuid"
    },
    "nNumber": {
      "type": "string"
    },
    "sourceRegistrationStatusCode": {
      "type": [
        "string",
        "null"
      ]
    },
    "serialNumber": {
      "type": [
        "string",
        "null"
      ]
    },
    "manufactureYear": {
      "type": [
        "integer",
        "null"
      ]
    },
    "manufacturer": {
      "type": [
        "string",
        "null"
      ]
    },
    "model": {
      "type": [
        "string",
        "null"
      ]
    },
    "registrantState": {
      "type": [
        "string",
        "null"
      ]
    }
  }
}
AircraftRegistryQueryResponse
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data",
    "query",
    "pagination"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/AircraftRegistryQueryRecord"
      }
    },
    "query": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "columns",
        "sort"
      ],
      "properties": {
        "columns": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "aircraftId",
              "nNumber",
              "sourceRegistrationStatusCode",
              "serialNumber",
              "manufactureYear",
              "manufacturer",
              "model",
              "registrantState"
            ]
          }
        },
        "sort": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "column",
            "direction"
          ],
          "properties": {
            "column": {
              "type": "string",
              "enum": [
                "aircraftId",
                "nNumber",
                "sourceRegistrationStatusCode",
                "serialNumber",
                "manufactureYear",
                "manufacturer",
                "model",
                "registrantState"
              ]
            },
            "direction": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ]
            }
          }
        }
      }
    },
    "pagination": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "limit",
        "nextCursor"
      ],
      "properties": {
        "limit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 50
        },
        "nextCursor": {
          "type": [
            "string",
            "null"
          ],
          "maxLength": 4096
        }
      }
    }
  }
}
AircraftRegistryReportDefinition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "kind",
    "query"
  ],
  "properties": {
    "kind": {
      "type": "string",
      "const": "registry_query"
    },
    "query": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "filters",
        "columns",
        "sort"
      ],
      "properties": {
        "filters": {
          "type": "array",
          "minItems": 1,
          "maxItems": 8,
          "items": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "column",
              "operator",
              "values"
            ],
            "properties": {
              "column": {
                "type": "string",
                "enum": [
                  "aircraftId",
                  "nNumber",
                  "sourceRegistrationStatusCode",
                  "serialNumber",
                  "manufactureYear",
                  "manufacturer",
                  "model",
                  "registrantState"
                ]
              },
              "operator": {
                "type": "string",
                "enum": [
                  "equals",
                  "contains",
                  "starts_with",
                  "in",
                  "gte",
                  "lte",
                  "between"
                ]
              },
              "values": {
                "type": "array",
                "minItems": 1,
                "maxItems": 10,
                "items": {
                  "oneOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "integer"
                    }
                  ]
                }
              }
            }
          }
        },
        "columns": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "string",
            "enum": [
              "aircraftId",
              "nNumber",
              "sourceRegistrationStatusCode",
              "serialNumber",
              "manufactureYear",
              "manufacturer",
              "model",
              "registrantState"
            ]
          }
        },
        "sort": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "column",
            "direction"
          ],
          "properties": {
            "column": {
              "type": "string",
              "enum": [
                "aircraftId",
                "nNumber",
                "sourceRegistrationStatusCode",
                "serialNumber",
                "manufactureYear",
                "manufacturer",
                "model",
                "registrantState"
              ]
            },
            "direction": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ]
            }
          }
        }
      }
    }
  }
}
AircraftSavedReport
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "reportId",
    "name",
    "kind",
    "definition",
    "createdAt",
    "updatedAt"
  ],
  "properties": {
    "reportId": {
      "type": "string",
      "pattern": "^arp_[a-f0-9]{24}$"
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120
    },
    "kind": {
      "type": "string",
      "enum": [
        "registry_query",
        "change_feed"
      ]
    },
    "definition": {
      "$ref": "#/components/schemas/AircraftSavedReportDefinition"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time"
    }
  }
}
AircraftSavedReportDefinition
{
  "oneOf": [
    {
      "$ref": "#/components/schemas/AircraftRegistryReportDefinition"
    },
    {
      "$ref": "#/components/schemas/AircraftChangeReportDefinition"
    }
  ]
}
AircraftSavedReportInput
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "name",
    "definition"
  ],
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120
    },
    "definition": {
      "$ref": "#/components/schemas/AircraftSavedReportDefinition"
    }
  }
}
AircraftSavedReportListResponse
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data",
    "limits"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/AircraftSavedReport"
      }
    },
    "limits": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "savedReportLimit"
      ],
      "properties": {
        "savedReportLimit": {
          "type": "integer",
          "minimum": 0,
          "maximum": 250
        }
      }
    }
  }
}
AircraftSavedReportResponse
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data",
    "limits"
  ],
  "properties": {
    "data": {
      "$ref": "#/components/schemas/AircraftSavedReport"
    },
    "limits": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "savedReportLimit"
      ],
      "properties": {
        "savedReportLimit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 250
        }
      }
    }
  }
}
AircraftWebhookDelivery
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "deliveryId",
    "eventId",
    "eventKind",
    "eventType",
    "nNumber",
    "observedAt",
    "attemptCount",
    "nextAttemptAt",
    "deliveredAt",
    "terminalAt",
    "terminalReason",
    "createdAt",
    "attempts"
  ],
  "properties": {
    "deliveryId": {
      "type": "string",
      "pattern": "^awd_[a-f0-9]{24}$"
    },
    "eventId": {
      "type": "string",
      "pattern": "^aevt_(?:test_)?[a-f0-9]{24,32}$"
    },
    "eventKind": {
      "type": "string",
      "enum": [
        "change",
        "test"
      ]
    },
    "eventType": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "registration_added",
        "registration_removed",
        "registration_record_changed",
        "aircraft_assignment_changed",
        "status_changed",
        "registrant_changed",
        "registrant_pii_withheld",
        "registrant_pii_released",
        null
      ]
    },
    "nNumber": {
      "type": "string",
      "pattern": "^N(?:[1-9][0-9]{0,4}|[1-9][0-9]{0,3}[A-HJ-NP-Z]|[1-9][0-9]{0,2}[A-HJ-NP-Z]{2})$"
    },
    "observedAt": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "attemptCount": {
      "type": "integer",
      "minimum": 0,
      "maximum": 5
    },
    "nextAttemptAt": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "deliveredAt": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "terminalAt": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "terminalReason": {
      "type": [
        "string",
        "null"
      ]
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    },
    "attempts": {
      "type": "array",
      "maxItems": 5,
      "items": {
        "$ref": "#/components/schemas/AircraftWebhookDeliveryAttempt"
      }
    }
  }
}
AircraftWebhookDeliveryAttempt
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "attemptNumber",
    "attemptedAt",
    "outcome",
    "httpStatus",
    "errorCode",
    "durationMs"
  ],
  "properties": {
    "attemptNumber": {
      "type": "integer",
      "minimum": 1,
      "maximum": 5
    },
    "attemptedAt": {
      "type": "string",
      "format": "date-time"
    },
    "outcome": {
      "type": "string",
      "enum": [
        "delivered",
        "retryable",
        "failed"
      ]
    },
    "httpStatus": {
      "type": [
        "integer",
        "null"
      ],
      "minimum": 100,
      "maximum": 599
    },
    "errorCode": {
      "type": [
        "string",
        "null"
      ]
    },
    "durationMs": {
      "type": "integer",
      "minimum": 0,
      "maximum": 60000
    }
  }
}
AircraftWebhookDeliveryListResponse
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data",
    "watch",
    "pagination"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/AircraftWebhookDelivery"
      }
    },
    "watch": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "watchId",
        "nNumber"
      ],
      "properties": {
        "watchId": {
          "type": "string",
          "pattern": "^aw_[a-f0-9]{24}$"
        },
        "nNumber": {
          "type": "string",
          "pattern": "^N(?:[1-9][0-9]{0,4}|[1-9][0-9]{0,3}[A-HJ-NP-Z]|[1-9][0-9]{0,2}[A-HJ-NP-Z]{2})$"
        }
      }
    },
    "pagination": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "limit"
      ],
      "properties": {
        "limit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 20
        }
      }
    }
  }
}
AircraftWebhookTestResponse
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data"
  ],
  "properties": {
    "data": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "deliveryId",
        "eventId",
        "status",
        "createdAt"
      ],
      "properties": {
        "deliveryId": {
          "type": "string",
          "pattern": "^awd_[a-f0-9]{24}$"
        },
        "eventId": {
          "type": "string",
          "pattern": "^aevt_test_[a-f0-9]{24}$"
        },
        "status": {
          "type": "string",
          "const": "queued"
        },
        "createdAt": {
          "type": "string",
          "format": "date-time"
        }
      }
    }
  }
}
AircraftWebhookWatch
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "watchId",
    "nNumber",
    "endpointUrl",
    "eventTypes",
    "status",
    "createdAt",
    "updatedAt"
  ],
  "properties": {
    "watchId": {
      "type": "string",
      "pattern": "^aw_[a-f0-9]{24}$"
    },
    "nNumber": {
      "type": "string",
      "pattern": "^N(?:[1-9][0-9]{0,4}|[1-9][0-9]{0,3}[A-HJ-NP-Z]|[1-9][0-9]{0,2}[A-HJ-NP-Z]{2})$"
    },
    "endpointUrl": {
      "type": "string",
      "format": "uri",
      "maxLength": 2048
    },
    "eventTypes": {
      "type": "array",
      "minItems": 1,
      "maxItems": 8,
      "uniqueItems": true,
      "items": {
        "type": "string",
        "enum": [
          "registration_added",
          "registration_removed",
          "registration_record_changed",
          "aircraft_assignment_changed",
          "status_changed",
          "registrant_changed",
          "registrant_pii_withheld",
          "registrant_pii_released"
        ]
      }
    },
    "status": {
      "type": "string",
      "const": "active"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time"
    }
  }
}
AircraftWebhookWatchCreated
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "watchId",
    "nNumber",
    "endpointUrl",
    "eventTypes",
    "status",
    "createdAt",
    "updatedAt",
    "signingSecret",
    "signingVersion"
  ],
  "properties": {
    "watchId": {
      "type": "string",
      "pattern": "^aw_[a-f0-9]{24}$"
    },
    "nNumber": {
      "type": "string",
      "pattern": "^N(?:[1-9][0-9]{0,4}|[1-9][0-9]{0,3}[A-HJ-NP-Z]|[1-9][0-9]{0,2}[A-HJ-NP-Z]{2})$"
    },
    "endpointUrl": {
      "type": "string",
      "format": "uri",
      "maxLength": 2048
    },
    "eventTypes": {
      "type": "array",
      "minItems": 1,
      "maxItems": 8,
      "uniqueItems": true,
      "items": {
        "type": "string",
        "enum": [
          "registration_added",
          "registration_removed",
          "registration_record_changed",
          "aircraft_assignment_changed",
          "status_changed",
          "registrant_changed",
          "registrant_pii_withheld",
          "registrant_pii_released"
        ]
      }
    },
    "status": {
      "type": "string",
      "const": "active"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time"
    },
    "signingSecret": {
      "type": "string",
      "pattern": "^whsec_[A-Za-z0-9_-]+$",
      "description": "Returned only once at watch creation. Use it to verify X-Grizzly-Bulls-Signature."
    },
    "signingVersion": {
      "type": "string",
      "const": "v1"
    }
  }
}
AircraftWebhookWatchCreateInput
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "nNumber",
    "endpointUrl"
  ],
  "properties": {
    "nNumber": {
      "type": "string",
      "description": "Canonical or normalizable U.S. N-number. AIR14F intentionally does not support saved searches or aircraftId watches."
    },
    "endpointUrl": {
      "type": "string",
      "format": "uri",
      "maxLength": 2048,
      "description": "HTTPS public-Internet endpoint. Redirects are not followed."
    },
    "eventTypes": {
      "type": "array",
      "minItems": 1,
      "maxItems": 8,
      "uniqueItems": true,
      "description": "Optional exact AIR14C event-type subset. Omit to watch all reviewed event types.",
      "items": {
        "type": "string",
        "enum": [
          "registration_added",
          "registration_removed",
          "registration_record_changed",
          "aircraft_assignment_changed",
          "status_changed",
          "registrant_changed",
          "registrant_pii_withheld",
          "registrant_pii_released"
        ]
      }
    }
  }
}
AircraftWebhookWatchCreateResponse
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data",
    "limits"
  ],
  "properties": {
    "data": {
      "$ref": "#/components/schemas/AircraftWebhookWatchCreated"
    },
    "limits": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "watchLimit"
      ],
      "properties": {
        "watchLimit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 250
        }
      }
    }
  }
}
AircraftWebhookWatchListResponse
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data",
    "limits"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/AircraftWebhookWatch"
      }
    },
    "limits": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "watchLimit"
      ],
      "properties": {
        "watchLimit": {
          "type": "integer",
          "minimum": 0,
          "maximum": 250
        }
      }
    }
  }
}
CurrentAircraft
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "serialNumber",
    "manufactureYear",
    "manufacturer",
    "model",
    "sourceAircraftTypeCode",
    "sourceEngineTypeCode",
    "sourceCategoryCode",
    "sourceWeightClassCode",
    "engineCount",
    "seatCount",
    "airworthinessDate",
    "modeSCodeOctal",
    "modeSCodeHex",
    "typeCertificateDataSheet",
    "typeCertificateHolder",
    "engine"
  ],
  "properties": {
    "serialNumber": {
      "type": [
        "string",
        "null"
      ]
    },
    "manufactureYear": {
      "type": [
        "integer",
        "null"
      ]
    },
    "manufacturer": {
      "type": [
        "string",
        "null"
      ]
    },
    "model": {
      "type": [
        "string",
        "null"
      ]
    },
    "sourceAircraftTypeCode": {
      "type": [
        "string",
        "null"
      ]
    },
    "sourceEngineTypeCode": {
      "type": [
        "string",
        "null"
      ]
    },
    "sourceCategoryCode": {
      "type": [
        "string",
        "null"
      ]
    },
    "sourceWeightClassCode": {
      "type": [
        "string",
        "null"
      ]
    },
    "engineCount": {
      "type": [
        "number",
        "null"
      ]
    },
    "seatCount": {
      "type": [
        "number",
        "null"
      ]
    },
    "airworthinessDate": {
      "type": [
        "string",
        "null"
      ],
      "format": "date"
    },
    "modeSCodeOctal": {
      "type": [
        "string",
        "null"
      ]
    },
    "modeSCodeHex": {
      "type": [
        "string",
        "null"
      ]
    },
    "typeCertificateDataSheet": {
      "type": [
        "string",
        "null"
      ]
    },
    "typeCertificateHolder": {
      "type": [
        "string",
        "null"
      ]
    },
    "engine": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "manufacturer",
        "model",
        "sourceTypeCode",
        "horsepower",
        "thrust"
      ],
      "properties": {
        "manufacturer": {
          "type": [
            "string",
            "null"
          ]
        },
        "model": {
          "type": [
            "string",
            "null"
          ]
        },
        "sourceTypeCode": {
          "type": [
            "string",
            "null"
          ]
        },
        "horsepower": {
          "type": [
            "number",
            "null"
          ]
        },
        "thrust": {
          "type": [
            "number",
            "null"
          ]
        }
      }
    }
  }
}
DeregisteredNNumberContext
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "aircraftId",
    "serialNumber",
    "manufactureYear",
    "sourceRegistrationStatusCode",
    "cancellationDate",
    "exportCountryCode",
    "lastActivityDate",
    "certificateIssueDate",
    "airworthinessDate",
    "modeSCodeOctal",
    "modeSCodeHex",
    "matchingRecordCount"
  ],
  "properties": {
    "aircraftId": {
      "type": [
        "string",
        "null"
      ],
      "format": "uuid"
    },
    "serialNumber": {
      "type": [
        "string",
        "null"
      ]
    },
    "manufactureYear": {
      "type": [
        "integer",
        "null"
      ]
    },
    "sourceRegistrationStatusCode": {
      "type": [
        "string",
        "null"
      ]
    },
    "cancellationDate": {
      "type": [
        "string",
        "null"
      ],
      "format": "date"
    },
    "exportCountryCode": {
      "type": [
        "string",
        "null"
      ]
    },
    "lastActivityDate": {
      "type": [
        "string",
        "null"
      ],
      "format": "date"
    },
    "certificateIssueDate": {
      "type": [
        "string",
        "null"
      ],
      "format": "date"
    },
    "airworthinessDate": {
      "type": [
        "string",
        "null"
      ],
      "format": "date"
    },
    "modeSCodeOctal": {
      "type": [
        "string",
        "null"
      ]
    },
    "modeSCodeHex": {
      "type": [
        "string",
        "null"
      ]
    },
    "matchingRecordCount": {
      "type": "integer",
      "minimum": 1,
      "description": "Number of current DEREG rows observed for this N-number. Context fields come from the deterministic latest reviewed row."
    }
  }
}
ErrorResponse
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "error"
  ],
  "properties": {
    "error": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "string",
          "enum": [
            "invalid_request",
            "unauthenticated",
            "rate_limited",
            "not_entitled",
            "conflict",
            "limit_reached",
            "not_found",
            "not_ready",
            "expired",
            "method_not_allowed",
            "service_unavailable",
            "internal_error"
          ]
        },
        "message": {
          "type": "string"
        }
      }
    }
  }
}
HistoricalAircraft
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "serialNumber",
    "manufactureYear",
    "sourceAircraftTypeCode",
    "sourceEngineTypeCode",
    "airworthinessDate",
    "modeSCodeOctal",
    "modeSCodeHex"
  ],
  "properties": {
    "serialNumber": {
      "type": [
        "string",
        "null"
      ]
    },
    "manufactureYear": {
      "type": [
        "integer",
        "null"
      ]
    },
    "sourceAircraftTypeCode": {
      "type": [
        "string",
        "null"
      ]
    },
    "sourceEngineTypeCode": {
      "type": [
        "string",
        "null"
      ]
    },
    "airworthinessDate": {
      "type": [
        "string",
        "null"
      ],
      "format": "date"
    },
    "modeSCodeOctal": {
      "type": [
        "string",
        "null"
      ]
    },
    "modeSCodeHex": {
      "type": [
        "string",
        "null"
      ]
    }
  }
}
HistoryEvent
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "contractVersion",
    "aircraftId",
    "previousAircraftId",
    "nNumber",
    "eventType",
    "oldSourceRegistrationStatusCode",
    "newSourceRegistrationStatusCode",
    "changedFields",
    "sourceEffectiveDate",
    "observedAt",
    "previousObservedAt",
    "source"
  ],
  "properties": {
    "contractVersion": {
      "type": "string",
      "const": "aircraft-public-v1"
    },
    "aircraftId": {
      "type": [
        "string",
        "null"
      ],
      "format": "uuid"
    },
    "previousAircraftId": {
      "type": [
        "string",
        "null"
      ],
      "format": "uuid"
    },
    "nNumber": {
      "type": "string"
    },
    "eventType": {
      "type": "string",
      "enum": [
        "registration_added",
        "registration_removed",
        "registration_record_changed",
        "aircraft_assignment_changed",
        "status_changed",
        "registrant_changed",
        "registrant_pii_withheld",
        "registrant_pii_released"
      ]
    },
    "oldSourceRegistrationStatusCode": {
      "type": [
        "string",
        "null"
      ]
    },
    "newSourceRegistrationStatusCode": {
      "type": [
        "string",
        "null"
      ]
    },
    "changedFields": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "aircraft_assignment",
          "registration_identifier",
          "aircraft_model",
          "engine_model",
          "manufacture_year",
          "aircraft_type",
          "engine_type",
          "registration_status",
          "mode_s_code",
          "certificate_issue_date",
          "expiration_date",
          "last_activity_date",
          "airworthiness_date",
          "fractional_ownership",
          "registrant_type"
        ]
      }
    },
    "sourceEffectiveDate": {
      "type": [
        "string",
        "null"
      ],
      "format": "date"
    },
    "observedAt": {
      "type": "string",
      "format": "date-time"
    },
    "previousObservedAt": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "source": {
      "$ref": "#/components/schemas/SourceSnapshot"
    }
  }
}
HistorySummary
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "firstObservedAt",
    "lastObservedAt",
    "versionCount",
    "eventCount"
  ],
  "properties": {
    "firstObservedAt": {
      "type": "string",
      "format": "date-time"
    },
    "lastObservedAt": {
      "type": "string",
      "format": "date-time"
    },
    "versionCount": {
      "type": "integer",
      "minimum": 1
    },
    "eventCount": {
      "type": "integer",
      "minimum": 0
    }
  }
}
HistoryVersion
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "contractVersion",
    "aircraftId",
    "registration",
    "aircraft",
    "registrant",
    "sourceProvider",
    "observedFrom",
    "observedThrough"
  ],
  "properties": {
    "contractVersion": {
      "type": "string",
      "const": "aircraft-public-v1"
    },
    "aircraftId": {
      "type": [
        "string",
        "null"
      ],
      "format": "uuid"
    },
    "registration": {
      "$ref": "#/components/schemas/Registration"
    },
    "aircraft": {
      "$ref": "#/components/schemas/HistoricalAircraft"
    },
    "registrant": {
      "$ref": "#/components/schemas/Registrant"
    },
    "sourceProvider": {
      "type": "string",
      "const": "faa-releasable-aircraft-registry"
    },
    "observedFrom": {
      "$ref": "#/components/schemas/ObservationBoundary"
    },
    "observedThrough": {
      "$ref": "#/components/schemas/ObservationBoundary"
    }
  }
}
ObservationBoundary
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "retrievedAt",
    "sourceContractVersion",
    "sourceUrl",
    "archiveSha256"
  ],
  "properties": {
    "retrievedAt": {
      "type": "string",
      "format": "date-time"
    },
    "sourceContractVersion": {
      "type": "string"
    },
    "sourceUrl": {
      "type": "string",
      "format": "uri"
    },
    "archiveSha256": {
      "type": "string",
      "pattern": "^[a-f0-9]{64}$"
    }
  }
}
PageMeta
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "limit",
    "offset",
    "total",
    "hasMore"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "offset": {
      "type": "integer",
      "minimum": 0,
      "maximum": 10000
    },
    "total": {
      "type": "integer",
      "minimum": 0
    },
    "hasMore": {
      "type": "boolean"
    }
  }
}
Registrant
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "sourceTypeCode",
    "name",
    "street1",
    "street2",
    "city",
    "state",
    "postalCode",
    "countyCode",
    "countryCode",
    "otherNames"
  ],
  "properties": {
    "sourceTypeCode": {
      "type": [
        "string",
        "null"
      ]
    },
    "name": {
      "type": [
        "string",
        "null"
      ]
    },
    "street1": {
      "type": [
        "string",
        "null"
      ]
    },
    "street2": {
      "type": [
        "string",
        "null"
      ]
    },
    "city": {
      "type": [
        "string",
        "null"
      ]
    },
    "state": {
      "type": [
        "string",
        "null"
      ]
    },
    "postalCode": {
      "type": [
        "string",
        "null"
      ]
    },
    "countyCode": {
      "type": [
        "string",
        "null"
      ]
    },
    "countryCode": {
      "type": [
        "string",
        "null"
      ]
    },
    "otherNames": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  }
}
Registration
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "nNumber",
    "sourceStatusCode",
    "certificateIssueDate",
    "expirationDate",
    "lastActivityDate",
    "fractionalOwnership"
  ],
  "properties": {
    "nNumber": {
      "type": "string"
    },
    "sourceStatusCode": {
      "type": [
        "string",
        "null"
      ]
    },
    "certificateIssueDate": {
      "type": [
        "string",
        "null"
      ],
      "format": "date"
    },
    "expirationDate": {
      "type": [
        "string",
        "null"
      ],
      "format": "date"
    },
    "lastActivityDate": {
      "type": [
        "string",
        "null"
      ],
      "format": "date"
    },
    "fractionalOwnership": {
      "type": [
        "boolean",
        "null"
      ]
    }
  }
}
ReservedNNumberContext
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "reserveDate",
    "sourceReservationTypeCode",
    "expirationNoticeDate",
    "purgeDate"
  ],
  "properties": {
    "reserveDate": {
      "type": [
        "string",
        "null"
      ],
      "format": "date"
    },
    "sourceReservationTypeCode": {
      "type": [
        "string",
        "null"
      ]
    },
    "expirationNoticeDate": {
      "type": [
        "string",
        "null"
      ],
      "format": "date"
    },
    "purgeDate": {
      "type": [
        "string",
        "null"
      ],
      "format": "date"
    }
  }
}
SourceSnapshot
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "provider",
    "sourceContractVersion",
    "sourceUrl",
    "retrievedAt",
    "archiveSha256"
  ],
  "properties": {
    "provider": {
      "type": "string",
      "const": "faa-releasable-aircraft-registry"
    },
    "sourceContractVersion": {
      "type": "string"
    },
    "sourceUrl": {
      "type": "string",
      "format": "uri"
    },
    "retrievedAt": {
      "type": "string",
      "format": "date-time"
    },
    "archiveSha256": {
      "type": "string",
      "pattern": "^[a-f0-9]{64}$"
    }
  }
}