Skip to main content

Aero Reg REST API · v1

API reference

The Aero Reg API is a thin, versioned wrapper over the registry adapter layer. Every endpoint reads the same adapters that power the member-facing aircraft-detail, reports, and changes browsers, so payloads are consistent across surfaces and across all four registries.

Look up individual aircraft by ICAO24 hex code or registration mark, query full snapshot datasets with flexible column and filter controls, subscribe to change feeds, and automate exports and webhooks — all against daily-refreshed data from the FAA (United States), CCAR (Canada), CASA (Australia), and FOCA (Switzerland).

API status
Stable · v1
Base URL
https://aeroreg.co.uk/api/v1
Registries
FAA, CCAR, CASA, FOCA
Format
JSON
Auth
X-API-Key / Bearer
Version
v1 — stable

Authentication

API keys

Every endpoint requires an API key. There is no anonymous access and no dev-mode bypass on the API key path. Supply your key using one of the two accepted header forms:

X-API-Key header

Example: X-API-Key request header
X-API-Key: aeroreg_live_a1b2c3d4e5f6g7h8

Authorization: Bearer header

Example: Authorization Bearer request header
Authorization: Bearer aeroreg_live_a1b2c3d4e5f6g7h8

Both forms are equivalent; use whichever fits your HTTP client or framework conventions. Keys are minted per member account, are bcrypt-hashed at rest, and carry an explicit scope set (see Scopes). Manage and rotate your keys from the member dashboard.

Environments

Live and test keys

Every API key is either live or test, distinguished by its prefix:

  • aeroreg_live_… — live key
  • aeroreg_test_… — test key

In v1 this is a label and usage-segregation distinction only. Both key types hit real, production data. Live and test keys share one rate-limit pool per member — requests made with a test key count against the same hourly window as live requests. Sandbox semantics (synthetic data, unlimited rate) are deferred to a future version.

Rate limits

Rate limits

Requests are counted in hourly windows, per member, by subscription tier. Limits reset at the top of each UTC hour.

Per-tier request limits
Tier Per hour Approx. per day
Basic 42 ~1,000
Pro 417 ~10,000
Enterprise 4,167 ~100,000

Rate-limit response headers

Every API response carries the following headers so your client can track its current standing without polling a separate endpoint:

  • X-RateLimit-Limit — your tier's hourly ceiling
  • X-RateLimit-Remaining — requests remaining in the current window
  • X-RateLimit-Reset — ISO-8601 UTC timestamp when the window resets

When the window is exhausted the API returns 429 Too Many Requests with a Retry-After header (value in seconds) indicating how long to wait before retrying.

Tier gating

Registry access by tier

Access to each registry is gated by a subscription feature ({registry}_data_access). A request for a registry that your tier cannot access returns 403 Forbidden.

Which registries each tier can access
Registry Basic Pro Enterprise
faa
ccar
casa
foca

Watch-list and export endpoints additionally require their respective tier features (watch_list_enabled, {registry}_data_access). Webhook endpoints require the Enterprise-only webhooks_enabled feature.

Authorization

API key scopes

Each API key carries a set of scopes that enforce least-privilege access. A request is permitted only when both conditions are met:

  • The key's scope set contains the endpoint's required scope, and
  • The member's subscription tier grants the underlying feature.

Effective permission = key.scopes ∩ tier.features. Out-of-scope returns 403; out-of-tier returns 403. A key can never exceed its member's tier.

Available scopes (11 total)
Scope Grants
aircraft:read Hex/registration lookups
query:read Snapshot query /{registry}/aircraft
changes:read /{registry}/changes/{type} change-feed browsing
columns:read /{registry}/columns discovery (always allowed — never returns 403 on scope)
usage:read /usage aggregates
watchlists:read List watch-lists and read alerts
watchlists:write Create/rename/delete lists; add/remove aircraft; mark-read
exports:read List runs, status, download, quota, list saved reports
exports:write Enqueue export; create/update/delete saved reports
webhooks:read List subscriptions and delivery log
webhooks:write Create/update/delete/test/rotate webhook subscriptions

Default scope set for new keys

New keys are issued with the least-privilege read set: aircraft:read, query:read, changes:read, columns:read, usage:read. Members opt into write, exports, and webhooks scopes explicitly from the key management dashboard.

Query grammar

Query grammar

The snapshot-query and changes endpoints share one URL grammar with the member-facing reports and changes browsers (powered by the same ColumnQueryParser). All parameters are optional.

Column selection

cols=id1,id2,… — comma-separated column ids (machine-stable identifiers; see the Column vocabulary freeze note in the spec). Omitting cols returns the standard field set. Discover valid column ids at runtime from GET /{registry}/columns.

Filters

Filters are repeatable triples using array-bracket notation:

Example: repeatable filter triples in URL query string
f[0][c]=country&f[0][o]=equals&f[0][v]=CA
f[1][c]=model_name&f[1][o]=contains&f[1][v]=Cessna

Each triple specifies a column id (c), an operator (o), and a value (v). The index ([N]) is zero-based and must be sequential. For the in operator, v accepts a comma-separated list.

Available operators: equals, contains, starts_with, in, gte, lte, between. Which operators a given column accepts is registry- and column-specific — discover it at runtime from GET /{registry}/columns.

Sorting

sort=col&order=asc|desc — sort by a column id. order defaults to asc when omitted.

Pagination

page=N&per_page=Nper_page defaults to 50, maximum 500. Values outside the allowed range are clamped silently; the effective value is echoed back in the meta block of list responses.

Response format

Errors & response envelopes

All responses use a consistent JSON envelope — both success and error payloads follow the same outer shape.

Success envelope

Single-item responses:

Example JSON success response (single item)
{
  "status": "success",
  "data":   { /* resource object */ }
}

List responses additionally include a meta block:

Example JSON success response (list with meta)
{
  "status": "success",
  "data":   [ /* array of resource objects */ ],
  "meta":  {
    "total":    4218,
    "page":     1,
    "per_page": 50
  }
}

Field names inside data rows are the canonical adapter column ids — the same ids accepted by cols, sort, and filter parameters, and emitted by the JSON export writer.

Error envelope

Example JSON error response
{
  "status": "error",
  "error":  "Invalid ICAO24 hex code.",
  "code":   400
}

HTTP status codes

Status codes returned by the API
Code Meaning
400 Bad Request A parameter is missing, malformed, or out of range.
401 Unauthorized No API key supplied, or the key is invalid or expired.
403 Forbidden Key lacks the required scope, or the member's tier does not grant the requested registry or feature.
404 Not Found The requested resource does not exist.
405 Method Not Allowed The HTTP method is not supported for this endpoint.
409 Conflict Export not yet ready (poll again) or a conflicting resource already exists.
410 Gone Export artifact has expired and can no longer be downloaded.
422 Unprocessable Entity The request body is structurally valid JSON but fails semantic validation.
429 Too Many Requests Hourly rate limit exhausted. Check Retry-After (seconds) before retrying.

Lookup

Single-aircraft lookup by transponder hex or registration.

Lookup

Look up an aircraft by transponder hex (ICAO24)

GET /aircraft/hex/{hex}

Scope aircraft:read

Resolves a 6-hex-digit ICAO24 transponder code to the aircraft that is currently registered under it, querying the most likely registry first (by ICAO 24-bit allocation) and falling back to the others the caller's tier can access. Deregistered aircraft are not returned (404) — their history lives in the changes endpoint. Requires scope aircraft:read.

Parameters

hex

string path REQUIRED e.g. A004B3

6-digit hexadecimal ICAO24 code (case-insensitive), e.g. A004B3.
include

string query OPTIONAL values: lifecycle, owners, documents, import_export, airframe e.g. lifecycle,owners

Comma-separated optional enrichment blocks to attach to the lookup response. Registry adapter blocks are gated by supported tabs; the opt-in airframe block reads the published canonical graph and is separately gated by the Phase 2 API publication flag and registry entitlements. An unavailable block is omitted and described in meta. An unknown token yields 400.

Responses

200
The currently-registered aircraft for the identifier.
400
Malformed request — invalid parameter, unknown column/operator, or empty filter value.
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
404
Unknown registry/endpoint, or no currently-registered aircraft for the identifier.
429
Hourly rate limit exceeded.
Code sample: GET /aircraft/hex/{hex} in cURL, JavaScript, Python, and PHP
GET /aircraft/hex/{hex}
curl \
  "http://127.0.0.1/aeroreg/api/v1/aircraft/hex/A004B3" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx"

Lookup

Look up an aircraft by registration (tail number / mark)

GET /aircraft/registration/{registration}

Scope aircraft:read

Resolves a registration / tail number / mark to the currently-registered aircraft. The registration prefix routes the lookup to candidate registries (e.g. N…→FAA, C-…→CCAR, VH-…→CASA, HB-…→FOCA). Deregistered aircraft return 404. Requires scope aircraft:read.

Parameters

registration

string path REQUIRED e.g. N100

Aircraft registration, e.g. N100, C-AAC, VH-22A (case-insensitive; prefix punctuation optional).
include

string query OPTIONAL values: lifecycle, owners, documents, import_export, airframe e.g. lifecycle,owners

Comma-separated optional enrichment blocks to attach to the lookup response. Registry adapter blocks are gated by supported tabs; the opt-in airframe block reads the published canonical graph and is separately gated by the Phase 2 API publication flag and registry entitlements. An unavailable block is omitted and described in meta. An unknown token yields 400.

Responses

200
The currently-registered aircraft for the identifier.
400
Malformed request — invalid parameter, unknown column/operator, or empty filter value.
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
404
Unknown registry/endpoint, or no currently-registered aircraft for the identifier.
429
Hourly rate limit exceeded.
Code sample: GET /aircraft/registration/{registration} in cURL, JavaScript, Python, and PHP
GET /aircraft/registration/{registration}
curl \
  "http://127.0.0.1/aeroreg/api/v1/aircraft/registration/N100" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx"

Query

Paginated snapshot queries over a registry's current state.

Query

Query a registry's current-state snapshot

GET /{registry}/aircraft

Scope query:read

Paginated query over the registry's current registered fleet. Choose columns, apply filters, sort, and page using the shared query grammar. total in meta is the full match count (ignoring pagination). Requires scope query:read.

Parameters

registry

string path REQUIRED values: faa, ccar, casa, foca e.g. faa

Registry namespace.
cols

string query OPTIONAL e.g. registration,manufacturer,model,year_manufactured

Comma-separated list of column ids to return, e.g. cols=registration,manufacturer,model. Unknown ids are rejected with 400. When omitted, a registry/context-specific default set is returned. Valid ids are frozen per registry/context — see the *Columns schemas.
f

object query OPTIONAL

Repeatable filter triples using bracket syntax: f[0][c]=manufacturer&f[0][o]=contains&f[0][v]=cessna. c is a column id, o an operator (equals, contains, starts_with, in, gte, lte, between), and v the value (comma-separated list for in). An unknown column, an operator the column does not accept, or an empty value each yields 400. Note: OpenAPI cannot fully model the nested f[N][c|o|v] grammar; treat the example as authoritative.
sort

string query OPTIONAL e.g. registration

Column id to sort by. Must be a valid column for the registry/context. The pseudo-column change_summary is not sortable.
order

string query OPTIONAL default asc values: asc, desc

Sort direction.
page

integer query OPTIONAL default 1

1-based page number.
per_page

integer query OPTIONAL default 50

Rows per page. Clamped silently to [1, 500]; the effective value is echoed in meta.per_page.

Responses

200
A page of snapshot rows.
400
Malformed request — invalid parameter, unknown column/operator, or empty filter value.
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
404
Unknown registry/endpoint, or no currently-registered aircraft for the identifier.
429
Hourly rate limit exceeded.
Code sample: GET /{registry}/aircraft in cURL, JavaScript, Python, and PHP
GET /{registry}/aircraft
curl \
  "http://127.0.0.1/aeroreg/api/v1/faa/aircraft" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx"

Changes

Change-feed browsing (additions, modifications, deletions, …) within a date window.

Changes

Browse a registry's change feed for a given type and date window

GET /{registry}/changes/{type}

Scope changes:read

Returns change records of one type within a date window. Each row carries a stable change_id. modifications rows expose a derived change_summary; request include=diffs to attach the full per-field old→new decomposition (one batch lookup per page). The virtual type rereg selects re-registrations (it resolves to the additions base type with a structural filter applied; meta.base_type reports the resolved base). Requires scope changes:read.

Parameters

registry

string path REQUIRED values: faa, ccar, casa, foca e.g. faa

Registry namespace.
type

string path REQUIRED values: additions, modifications, deletions, import_export, rereg e.g. additions

Change type. Common to all registries: additions, modifications, deletions. CCAR additionally supports import_export. The virtual type rereg (re-registrations) is available on all registries and resolves to an additions-based query.
win

string query OPTIONAL default 7d values: 7d, 30d, 90d

Relative window shorthand, counting back from today (UTC). Ignored if since/until are supplied. Defaults to 7d.
since

string query OPTIONAL e.g. 2026-06-05

Inclusive window start (UTC, YYYY-MM-DD). Presence of since or until switches to a custom window. Reversed ranges are auto-corrected.
until

string query OPTIONAL e.g. 2026-06-12

Inclusive window end (UTC, YYYY-MM-DD).
include

string query OPTIONAL values: diffs e.g. diffs

Comma-separated optional blocks. Only diffs is supported, and only for type=modifications; requesting it for any other type is ignored and reported in meta.unsupported_includes.
cols

string query OPTIONAL e.g. registration,manufacturer,model,year_manufactured

Comma-separated list of column ids to return, e.g. cols=registration,manufacturer,model. Unknown ids are rejected with 400. When omitted, a registry/context-specific default set is returned. Valid ids are frozen per registry/context — see the *Columns schemas.
f

object query OPTIONAL

Repeatable filter triples using bracket syntax: f[0][c]=manufacturer&f[0][o]=contains&f[0][v]=cessna. c is a column id, o an operator (equals, contains, starts_with, in, gte, lte, between), and v the value (comma-separated list for in). An unknown column, an operator the column does not accept, or an empty value each yields 400. Note: OpenAPI cannot fully model the nested f[N][c|o|v] grammar; treat the example as authoritative.
sort

string query OPTIONAL e.g. registration

Column id to sort by. Must be a valid column for the registry/context. The pseudo-column change_summary is not sortable.
order

string query OPTIONAL default asc values: asc, desc

Sort direction.
page

integer query OPTIONAL default 1

1-based page number.
per_page

integer query OPTIONAL default 50

Rows per page. Clamped silently to [1, 500]; the effective value is echoed in meta.per_page.

Responses

200
A page of change rows for the requested type and window.
400
Malformed request — invalid parameter, unknown column/operator, or empty filter value.
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
404
Unknown registry/endpoint, or no currently-registered aircraft for the identifier.
429
Hourly rate limit exceeded.
Code sample: GET /{registry}/changes/{type} in cURL, JavaScript, Python, and PHP
GET /{registry}/changes/{type}
curl \
  "http://127.0.0.1/aeroreg/api/v1/faa/changes/additions" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx"

Discovery

Column-vocabulary discovery for the query and changes endpoints.

Discovery

Discover the column vocabulary for a registry/context

GET /{registry}/columns

Scope columns:read

Returns the available columns — id, label, type, group, and the operators each accepts — for the snapshot query (type=snapshot, the default) or for a specific change type. This is the live mirror of the frozen *Columns enum schemas in this document; use it to build valid cols/sort/f[...] parameters at runtime. Requires scope columns:read. Discovery is always allowed; this endpoint never 403s on scope.

Parameters

registry

string path REQUIRED values: faa, ccar, casa, foca e.g. faa

Registry namespace.
type

string query OPTIONAL default snapshot values: snapshot, additions, modifications, deletions, import_export, rereg

Which column set to describe. snapshot (default) describes the query endpoint's columns; a change type (additions, modifications, deletions, CCAR import_export, or the virtual rereg) describes that change feed's columns. rereg resolves to its additions base and reports meta.base_type.

Responses

200
The column vocabulary for the requested registry/context.
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
404
Unknown registry/endpoint, or no currently-registered aircraft for the identifier.
429
Hourly rate limit exceeded.
Code sample: GET /{registry}/columns in cURL, JavaScript, Python, and PHP
GET /{registry}/columns
curl \
  "http://127.0.0.1/aeroreg/api/v1/faa/columns" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx"

Usage

Per-member API usage aggregates and rate-limit window.

Usage

Get per-member API usage aggregates and rate-limit window

GET /usage

Scope usage:read

Returns usage totals and the current rate-limit window for the authenticated member. No tier gate — available to all subscription tiers. Requires scope usage:read.

Parameters

include

string query OPTIONAL values: hourly

When hourly, attach a 24-element hourly_buckets sparkline.

Responses

200
Usage aggregates for the authenticated member.
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
429
Hourly rate limit exceeded.
Code sample: GET /usage in cURL, JavaScript, Python, and PHP
GET /usage
curl \
  "http://127.0.0.1/aeroreg/api/v1/usage" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx"

WatchLists

Member watch-list management and alert feeds.

WatchLists

List all watch-lists for the authenticated member

GET /watch-lists

Scope watchlists:read

Tier feature: watch_list_enabled

Returns the member's watch-lists. Requires tier feature watch_list_enabled; out-of-tier → 403. Requires scope watchlists:read.

Parameters

include

string query OPTIONAL values: aircraft

When aircraft, embed each list's watched aircraft.

Responses

200
The member's watch-lists.
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
429
Hourly rate limit exceeded.
Code sample: GET /watch-lists in cURL, JavaScript, Python, and PHP
GET /watch-lists
curl \
  "http://127.0.0.1/aeroreg/api/v1/watch-lists" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx"

WatchLists

Create a new watch-list

POST /watch-lists

Scope watchlists:write

Tier feature: watch_list_enabled

Creates a new watch-list for the authenticated member. Requires tier feature watch_list_enabled; out-of-tier → 403. Requires scope watchlists:write.

Request body

name

string REQUIRED

description

string OPTIONAL

Optional.
alert_frequency

string OPTIONAL default daily values: none, realtime, daily, weekly

schedule

object OPTIONAL

Schedule specification shared by watch-list and saved-report request bodies.

Responses

201
Watch-list created.
400
Malformed request — invalid parameter, unknown column/operator, or empty filter value.
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
429
Hourly rate limit exceeded.
Code sample: POST /watch-lists in cURL, JavaScript, Python, and PHP
POST /watch-lists
curl \
  -X POST \
  "http://127.0.0.1/aeroreg/api/v1/watch-lists" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"name": "value"}'

WatchLists

Update a watch-list (name, alert frequency, schedule)

PUT /watch-lists/{id}

Scope watchlists:write

Tier feature: watch_list_enabled

Updates the specified watch-list. Requires tier feature watch_list_enabled; out-of-tier → 403. Requires scope watchlists:write.

Parameters

id

integer path REQUIRED e.g. 42

Numeric resource id.

Request body

name

string OPTIONAL

description

string OPTIONAL

alert_frequency

string OPTIONAL values: none, realtime, daily, weekly

schedule

object OPTIONAL

Schedule specification shared by watch-list and saved-report request bodies.

Responses

200
Watch-list updated.
400
Malformed request — invalid parameter, unknown column/operator, or empty filter value.
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
404
Unknown registry/endpoint, or no currently-registered aircraft for the identifier.
429
Hourly rate limit exceeded.
Code sample: PUT /watch-lists/{id} in cURL, JavaScript, Python, and PHP
PUT /watch-lists/{id}
curl \
  -X PUT \
  "http://127.0.0.1/aeroreg/api/v1/watch-lists/42" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx"

WatchLists

Delete a watch-list

DELETE /watch-lists/{id}

Scope watchlists:write

Tier feature: watch_list_enabled

Deletes the specified watch-list and all its aircraft entries and alerts. Requires tier feature watch_list_enabled; out-of-tier → 403. Requires scope watchlists:write.

Parameters

id

integer path REQUIRED e.g. 42

Numeric resource id.

Responses

200
Watch-list deleted.
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
404
Unknown registry/endpoint, or no currently-registered aircraft for the identifier.
429
Hourly rate limit exceeded.
Code sample: DELETE /watch-lists/{id} in cURL, JavaScript, Python, and PHP
DELETE /watch-lists/{id}
curl \
  -X DELETE \
  "http://127.0.0.1/aeroreg/api/v1/watch-lists/42" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx"

WatchLists

Add an aircraft to a watch-list

POST /watch-lists/{id}/aircraft

Scope watchlists:write

Tier feature: watch_list_enabled

Adds an aircraft to the specified watch-list by identifier. Serial-number lookups are not supported in v1 (→ 422). Requires tier feature watch_list_enabled; out-of-tier → 403. 403 is also returned when the list's aircraft cap has been reached. Requires scope watchlists:write.

Parameters

id

integer path REQUIRED e.g. 42

Numeric resource id.

Request body

data_source

string REQUIRED values: faa, ccar, casa, foca

identifier_type

string REQUIRED values: hex, registration

Serial not supported in v1 — use hex or registration.
identifier_value

string REQUIRED

notes

string OPTIONAL

Optional.

Responses

201
Aircraft added to watch-list.
400
Malformed request — invalid parameter, unknown column/operator, or empty filter value.
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
404
Unknown registry/endpoint, or no currently-registered aircraft for the identifier.
422
The request was well-formed but semantically rejected (e.g. unsupported registry/identifier, or change-feed export of the virtual rereg type).
429
Hourly rate limit exceeded.
Code sample: POST /watch-lists/{id}/aircraft in cURL, JavaScript, Python, and PHP
POST /watch-lists/{id}/aircraft
curl \
  -X POST \
  "http://127.0.0.1/aeroreg/api/v1/watch-lists/42/aircraft" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"data_source": "faa", "identifier_type": "hex", "identifier_value": "value"}'

WatchLists

Remove an aircraft from a watch-list

DELETE /watch-lists/{id}/aircraft/{aid}

Scope watchlists:write

Tier feature: watch_list_enabled

Removes the specified aircraft-membership entry (by membership row id, not aircraft identifier). Requires tier feature watch_list_enabled; out-of-tier → 403. Requires scope watchlists:write.

Parameters

id

integer path REQUIRED e.g. 42

Numeric resource id.
aid

integer path REQUIRED e.g. 30

Watch-list aircraft-membership row id (NOT the list id).

Responses

200
Aircraft removed from watch-list.
400
Malformed request — invalid parameter, unknown column/operator, or empty filter value.
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
404
Unknown registry/endpoint, or no currently-registered aircraft for the identifier.
429
Hourly rate limit exceeded.
Code sample: DELETE /watch-lists/{id}/aircraft/{aid} in cURL, JavaScript, Python, and PHP
DELETE /watch-lists/{id}/aircraft/{aid}
curl \
  -X DELETE \
  "http://127.0.0.1/aeroreg/api/v1/watch-lists/42/aircraft/30" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx"

WatchLists

List alerts for a watch-list

GET /watch-lists/{id}/alerts

Scope watchlists:read

Tier feature: watch_list_enabled

Returns paginated alerts generated for the specified watch-list. Requires tier feature watch_list_enabled; out-of-tier → 403. Requires scope watchlists:read.

Parameters

id

integer path REQUIRED e.g. 42

Numeric resource id.
page

integer query OPTIONAL default 1

1-based page number.
per_page

integer query OPTIONAL default 50

Rows per page. Clamped to [1, 100].

Responses

200
Paginated alert list.
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
404
Unknown registry/endpoint, or no currently-registered aircraft for the identifier.
429
Hourly rate limit exceeded.
Code sample: GET /watch-lists/{id}/alerts in cURL, JavaScript, Python, and PHP
GET /watch-lists/{id}/alerts
curl \
  "http://127.0.0.1/aeroreg/api/v1/watch-lists/42/alerts" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx"

WatchLists

Mark all alerts on a watch-list as read

POST /watch-lists/{id}/alerts/mark-read

Scope watchlists:write

Tier feature: watch_list_enabled

Marks all unread alerts for the specified watch-list as read. Requires tier feature watch_list_enabled; out-of-tier → 403. Requires scope watchlists:write.

Parameters

id

integer path REQUIRED e.g. 42

Numeric resource id.

Responses

200
Alerts marked as read.
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
404
Unknown registry/endpoint, or no currently-registered aircraft for the identifier.
429
Hourly rate limit exceeded.
Code sample: POST /watch-lists/{id}/alerts/mark-read in cURL, JavaScript, Python, and PHP
POST /watch-lists/{id}/alerts/mark-read
curl \
  -X POST \
  "http://127.0.0.1/aeroreg/api/v1/watch-lists/42/alerts/mark-read" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx"

Exports

Asynchronous data exports and saved-report definitions.

Exports

Enqueue an asynchronous data export

POST /exports

Scope exports:write

Tier feature: {registry}_data_access

Enqueues an asynchronous export of snapshot or change-feed data. The same parameters may alternatively be supplied as a query string (the snapshot/ changes URL grammar — cols, f[N][c|o|v], sort, order, win/ since/until, format, opt[…]); body values win on conflict. Sort/order are validated but do NOT round-trip to async output (registry- default ordering applies); saved reports do persist sort. Requires tier feature {registry}_data_access; out-of-tier → 403. Monthly quota exhaustion also returns 403. The virtual rereg change type cannot be exported in v1 (→ 422). Requires scope exports:write.

Request body

registry

string REQUIRED values: faa, ccar, casa, foca

source

string OPTIONAL default snapshot values: snapshot, changes

ctype

string OPTIONAL

Change type; required when source=changes; e.g. additions, modifications, deletions, ccar import_export. The virtual rereg type is NOT exportable (→ 422).
cols

string OPTIONAL

Comma-separated column ids; defaults to the context default set. May also be a JSON array.
f

object OPTIONAL

Filter triples f[N][c|o|v] — see Query grammar.
sort

string OPTIONAL

order

string OPTIONAL default asc values: asc, desc

format

string OPTIONAL default csv values: csv, json, xlsx

opt

object OPTIONAL

Format-specific options.
win

string OPTIONAL default 7d values: 7d, 30d, 90d

Change-feed relative window.
since

string OPTIONAL

Custom window start; YYYY-MM-DD.
until

string OPTIONAL

Custom window end.

Responses

202
Export enqueued. Poll GET /exports/{id} until status=completed, then download.
400
Malformed request — invalid parameter, unknown column/operator, or empty filter value.
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
404
Unknown registry/endpoint, or no currently-registered aircraft for the identifier.
422
The request was well-formed but semantically rejected (e.g. unsupported registry/identifier, or change-feed export of the virtual rereg type).
429
Hourly rate limit exceeded.
Code sample: POST /exports in cURL, JavaScript, Python, and PHP
POST /exports
curl \
  -X POST \
  "http://127.0.0.1/aeroreg/api/v1/exports" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"registry": "faa"}'

Exports

List recent export runs for the authenticated member

GET /exports

Scope exports:read

Returns recent export runs for the authenticated member, optionally filtered by status. No tier gate. Requires scope exports:read.

Parameters

limit

integer query OPTIONAL default 20

Maximum number of runs to return.
status

string query OPTIONAL values: queued, processing, completed, failed

Filter by run status.

Responses

200
Recent export runs.
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
429
Hourly rate limit exceeded.
Code sample: GET /exports in cURL, JavaScript, Python, and PHP
GET /exports
curl \
  "http://127.0.0.1/aeroreg/api/v1/exports" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx"

Exports

Get the member's export quota for the current month

GET /exports/quota

Scope exports:read

Returns quota usage for the current billing month. Requires scope exports:read.

Responses

200
Export quota for the current month.
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
429
Hourly rate limit exceeded.
Code sample: GET /exports/quota in cURL, JavaScript, Python, and PHP
GET /exports/quota
curl \
  "http://127.0.0.1/aeroreg/api/v1/exports/quota" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx"

Exports

List saved report definitions

GET /exports/saved

Scope exports:read

Returns all saved report definitions for the authenticated member. No tier gate. Requires scope exports:read.

Responses

200
Saved report definitions.
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
429
Hourly rate limit exceeded.
Code sample: GET /exports/saved in cURL, JavaScript, Python, and PHP
GET /exports/saved
curl \
  "http://127.0.0.1/aeroreg/api/v1/exports/saved" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx"

Exports

Create a saved report definition

POST /exports/saved

Scope exports:write

Tier feature: {registry}_data_access

Creates a new saved report definition. Requires tier feature {registry}_data_access; out-of-tier → 403. Requires scope exports:write.

Request body

registry

string REQUIRED values: faa, ccar, casa, foca

source

string OPTIONAL default snapshot values: snapshot, changes

ctype

string OPTIONAL

Change type; required when source=changes; e.g. additions, modifications, deletions, ccar import_export. The virtual rereg type is NOT exportable (→ 422).
cols

string OPTIONAL

Comma-separated column ids; defaults to the context default set. May also be a JSON array.
f

object OPTIONAL

Filter triples f[N][c|o|v] — see Query grammar.
sort

string OPTIONAL

order

string OPTIONAL default asc values: asc, desc

format

string OPTIONAL default csv values: csv, json, xlsx

opt

object OPTIONAL

Format-specific options.
win

string OPTIONAL values: 7d, 30d, 90d, custom

Saved reports additionally allow the custom window value.
since

string OPTIONAL

Custom window start; YYYY-MM-DD.
until

string OPTIONAL

Custom window end.
name

string REQUIRED

schedule

object OPTIONAL

Schedule specification shared by watch-list and saved-report request bodies.
deliver_email

boolean OPTIONAL

When true, adds an email destination for digest delivery.

Responses

201
Saved report created.
400
Malformed request — invalid parameter, unknown column/operator, or empty filter value.
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
404
Unknown registry/endpoint, or no currently-registered aircraft for the identifier.
422
The request was well-formed but semantically rejected (e.g. unsupported registry/identifier, or change-feed export of the virtual rereg type).
429
Hourly rate limit exceeded.
Code sample: POST /exports/saved in cURL, JavaScript, Python, and PHP
POST /exports/saved
curl \
  -X POST \
  "http://127.0.0.1/aeroreg/api/v1/exports/saved" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"registry": "faa", "name": "value"}'

Exports

Get a saved report definition

GET /exports/saved/{id}

Scope exports:read

Returns the full detail of a saved report definition. Requires scope exports:read.

Parameters

id

integer path REQUIRED e.g. 42

Numeric resource id.

Responses

200
Saved report definition detail.
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
404
Unknown registry/endpoint, or no currently-registered aircraft for the identifier.
429
Hourly rate limit exceeded.
Code sample: GET /exports/saved/{id} in cURL, JavaScript, Python, and PHP
GET /exports/saved/{id}
curl \
  "http://127.0.0.1/aeroreg/api/v1/exports/saved/42" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx"

Exports

Replace a saved report definition (full replace)

PUT /exports/saved/{id}

Scope exports:write

Tier feature: {registry}_data_access

Performs a full replacement of the saved report definition. Requires tier feature {registry}_data_access; out-of-tier → 403. Requires scope exports:write.

Parameters

id

integer path REQUIRED e.g. 42

Numeric resource id.

Request body

registry

string REQUIRED values: faa, ccar, casa, foca

source

string OPTIONAL default snapshot values: snapshot, changes

ctype

string OPTIONAL

Change type; required when source=changes; e.g. additions, modifications, deletions, ccar import_export. The virtual rereg type is NOT exportable (→ 422).
cols

string OPTIONAL

Comma-separated column ids; defaults to the context default set. May also be a JSON array.
f

object OPTIONAL

Filter triples f[N][c|o|v] — see Query grammar.
sort

string OPTIONAL

order

string OPTIONAL default asc values: asc, desc

format

string OPTIONAL default csv values: csv, json, xlsx

opt

object OPTIONAL

Format-specific options.
win

string OPTIONAL values: 7d, 30d, 90d, custom

Saved reports additionally allow the custom window value.
since

string OPTIONAL

Custom window start; YYYY-MM-DD.
until

string OPTIONAL

Custom window end.
name

string REQUIRED

schedule

object OPTIONAL

Schedule specification shared by watch-list and saved-report request bodies.
deliver_email

boolean OPTIONAL

When true, adds an email destination for digest delivery.

Responses

200
Saved report updated.
400
Malformed request — invalid parameter, unknown column/operator, or empty filter value.
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
404
Unknown registry/endpoint, or no currently-registered aircraft for the identifier.
422
The request was well-formed but semantically rejected (e.g. unsupported registry/identifier, or change-feed export of the virtual rereg type).
429
Hourly rate limit exceeded.
Code sample: PUT /exports/saved/{id} in cURL, JavaScript, Python, and PHP
PUT /exports/saved/{id}
curl \
  -X PUT \
  "http://127.0.0.1/aeroreg/api/v1/exports/saved/42" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"registry": "faa", "name": "value"}'

Exports

Delete a saved report definition

DELETE /exports/saved/{id}

Scope exports:write

Deletes the specified saved report definition. Requires scope exports:write.

Parameters

id

integer path REQUIRED e.g. 42

Numeric resource id.

Responses

200
Saved report deleted.
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
404
Unknown registry/endpoint, or no currently-registered aircraft for the identifier.
429
Hourly rate limit exceeded.
Code sample: DELETE /exports/saved/{id} in cURL, JavaScript, Python, and PHP
DELETE /exports/saved/{id}
curl \
  -X DELETE \
  "http://127.0.0.1/aeroreg/api/v1/exports/saved/42" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx"

Exports

Get the status of an export run

GET /exports/{id}

Scope exports:read

Returns the current status and metadata for an export run. Poll this endpoint until status=completed, then use GET /exports/{id}/download. Requires scope exports:read.

Parameters

id

integer path REQUIRED e.g. 42

Numeric resource id.

Responses

200
Export run status and metadata.
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
404
Unknown registry/endpoint, or no currently-registered aircraft for the identifier.
429
Hourly rate limit exceeded.
Code sample: GET /exports/{id} in cURL, JavaScript, Python, and PHP
GET /exports/{id}
curl \
  "http://127.0.0.1/aeroreg/api/v1/exports/42" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx"

Exports

Download a completed export artifact

GET /exports/{id}/download

Scope exports:read

Streams the completed export artifact as a file download. The run must have status=completed (→ 409 otherwise) and the artifact must not have expired (→ 410 otherwise). Rate-limit headers are omitted from this binary response path. Requires scope exports:read.

Parameters

id

integer path REQUIRED e.g. 42

Numeric resource id.

Responses

200
The export artifact as a file stream.
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
404
Unknown registry/endpoint, or no currently-registered aircraft for the identifier.
409
The export artifact is not ready yet (run not completed).
410
The export artifact has expired or been removed.
429
Hourly rate limit exceeded.
Code sample: GET /exports/{id}/download in cURL, JavaScript, Python, and PHP
GET /exports/{id}/download
curl \
  "http://127.0.0.1/aeroreg/api/v1/exports/42/download" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx"

Webhooks

Outbound webhook subscriptions and delivery log (Enterprise tier).

Webhooks

List webhook subscriptions

GET /webhooks

Scope webhooks:read

Tier feature: webhooks_enabled

Returns all webhook subscriptions for the authenticated member (secrets masked). Requires tier feature webhooks_enabled (Enterprise only); out-of-tier → 403. Requires scope webhooks:read.

Responses

200
Webhook subscriptions (secrets masked).
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
429
Hourly rate limit exceeded.
Code sample: GET /webhooks in cURL, JavaScript, Python, and PHP
GET /webhooks
curl \
  "http://127.0.0.1/aeroreg/api/v1/webhooks" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx"

Webhooks

Create a webhook subscription

POST /webhooks

Scope webhooks:write

Tier feature: webhooks_enabled

Creates a new webhook subscription. The signing secret is returned in full exactly once in the response and is not retrievable later. Requires tier feature webhooks_enabled (Enterprise only); out-of-tier → 403. Requires scope webhooks:write.

Request body

event_type

string REQUIRED values: export_completed, watch_list_alert

target_url

string REQUIRED

Must be https://.
description

string OPTIONAL

Optional.

Responses

201
Webhook subscription created. Store the secret now — it is shown only once.
400
Malformed request — invalid parameter, unknown column/operator, or empty filter value.
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
429
Hourly rate limit exceeded.
Code sample: POST /webhooks in cURL, JavaScript, Python, and PHP
POST /webhooks
curl \
  -X POST \
  "http://127.0.0.1/aeroreg/api/v1/webhooks" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"event_type": "export_completed", "target_url": "value"}'

Webhooks

Get a webhook subscription

GET /webhooks/{id}

Scope webhooks:read

Tier feature: webhooks_enabled

Returns the specified webhook subscription (secret masked). Requires tier feature webhooks_enabled; out-of-tier → 403. Requires scope webhooks:read.

Parameters

id

integer path REQUIRED e.g. 42

Numeric resource id.

Responses

200
Webhook subscription (secret masked).
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
404
Unknown registry/endpoint, or no currently-registered aircraft for the identifier.
429
Hourly rate limit exceeded.
Code sample: GET /webhooks/{id} in cURL, JavaScript, Python, and PHP
GET /webhooks/{id}
curl \
  "http://127.0.0.1/aeroreg/api/v1/webhooks/42" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx"

Webhooks

Update a webhook subscription

PUT /webhooks/{id}

Scope webhooks:write

Tier feature: webhooks_enabled

Updates one or more fields of the specified webhook subscription. Requires tier feature webhooks_enabled; out-of-tier → 403. Requires scope webhooks:write.

Parameters

id

integer path REQUIRED e.g. 42

Numeric resource id.

Request body

event_type

string OPTIONAL values: export_completed, watch_list_alert

target_url

string OPTIONAL

Must be https://.
description

string OPTIONAL

is_active

boolean OPTIONAL

Responses

200
Webhook subscription updated.
400
Malformed request — invalid parameter, unknown column/operator, or empty filter value.
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
404
Unknown registry/endpoint, or no currently-registered aircraft for the identifier.
429
Hourly rate limit exceeded.
Code sample: PUT /webhooks/{id} in cURL, JavaScript, Python, and PHP
PUT /webhooks/{id}
curl \
  -X PUT \
  "http://127.0.0.1/aeroreg/api/v1/webhooks/42" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx"

Webhooks

Delete a webhook subscription

DELETE /webhooks/{id}

Scope webhooks:write

Tier feature: webhooks_enabled

Deletes the specified webhook subscription and stops all future deliveries. Requires tier feature webhooks_enabled; out-of-tier → 403. Requires scope webhooks:write.

Parameters

id

integer path REQUIRED e.g. 42

Numeric resource id.

Responses

200
Webhook subscription deleted.
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
404
Unknown registry/endpoint, or no currently-registered aircraft for the identifier.
429
Hourly rate limit exceeded.
Code sample: DELETE /webhooks/{id} in cURL, JavaScript, Python, and PHP
DELETE /webhooks/{id}
curl \
  -X DELETE \
  "http://127.0.0.1/aeroreg/api/v1/webhooks/42" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx"

Webhooks

Rotate the signing secret for a webhook subscription

POST /webhooks/{id}/rotate

Scope webhooks:write

Tier feature: webhooks_enabled

Rotates the signing secret for the specified webhook subscription. The new secret is returned in full exactly once and is not retrievable later. Requires tier feature webhooks_enabled; out-of-tier → 403. Requires scope webhooks:write.

Parameters

id

integer path REQUIRED e.g. 42

Numeric resource id.

Responses

200
New signing secret (shown once — store it now).
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
404
Unknown registry/endpoint, or no currently-registered aircraft for the identifier.
429
Hourly rate limit exceeded.
Code sample: POST /webhooks/{id}/rotate in cURL, JavaScript, Python, and PHP
POST /webhooks/{id}/rotate
curl \
  -X POST \
  "http://127.0.0.1/aeroreg/api/v1/webhooks/42/rotate" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx"

Webhooks

Fire a test delivery for a webhook subscription

POST /webhooks/{id}/test

Scope webhooks:write

Tier feature: webhooks_enabled

Synchronously fires a test delivery to the subscription's target URL. An SSRF guard still applies to the target. Returns the HTTP status received from the target, or an error message on connection/SSRF failure. Requires tier feature webhooks_enabled; out-of-tier → 403. Requires scope webhooks:write.

Parameters

id

integer path REQUIRED e.g. 42

Numeric resource id.

Responses

200
Test delivery result.
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
404
Unknown registry/endpoint, or no currently-registered aircraft for the identifier.
429
Hourly rate limit exceeded.
Code sample: POST /webhooks/{id}/test in cURL, JavaScript, Python, and PHP
POST /webhooks/{id}/test
curl \
  -X POST \
  "http://127.0.0.1/aeroreg/api/v1/webhooks/42/test" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx"

Webhooks

List delivery log for a webhook subscription

GET /webhooks/{id}/deliveries

Scope webhooks:read

Tier feature: webhooks_enabled

Returns the paginated delivery log for the specified webhook subscription. Requires tier feature webhooks_enabled; out-of-tier → 403. Requires scope webhooks:read.

Parameters

id

integer path REQUIRED e.g. 42

Numeric resource id.
page

integer query OPTIONAL default 1

1-based page number.
per_page

integer query OPTIONAL default 50

Rows per page. Clamped to [1, 100].

Responses

200
Paginated delivery log.
401
Missing, invalid, or revoked API key.
403
The caller's subscription tier does not include the requested registry.
404
Unknown registry/endpoint, or no currently-registered aircraft for the identifier.
429
Hourly rate limit exceeded.
Code sample: GET /webhooks/{id}/deliveries in cURL, JavaScript, Python, and PHP
GET /webhooks/{id}/deliveries
curl \
  "http://127.0.0.1/aeroreg/api/v1/webhooks/42/deliveries" \
  -H "X-API-Key: aeroreg_live_xxxxxxxx"