AR-1004 · API Specification
Developer API
A public, read-only API that returns registered location preferences as GeoJSON, so drone, AR, and UTM planning tools can surface them for an operating area at planning time.
A preference metadata layer
AirspaceRegistry.org reflects land-owner and place preferences for drones, AR, and eVTOL. Preferences are informational and voluntary — they are not enforceable and are not permissions.
Part of the Airspace Registry document family: Charter (AR-0001) · Architecture Specification (AR-1000) · API Specification (AR-1004, this page).
Base URL
https://airspaceregistry.org/api/v1No API key required. CORS is open. Responses are cacheable (60s). Use of the API and site is governed by the Terms of Use.
Live demo endpoints — three ways to query
The three coverage demos (/demo) are backed by real, callable endpoints — not screenshots. They expose the same read contract at three scales: an area, a point, and a point in time. Every request below is live.
1 · Area — “give me everything here”
GET https://airspaceregistry.org/api/v1/demo/preferences?region=raleighBulk GeoJSON for a whole region — for GIS ingestion and map overlays. Regions: raleigh, times_square, sofi_stadium.
2 · Point — “what’s true right here?”
GET https://airspaceregistry.org/api/v1/demo/resolve?lat=35.8776&lon=-78.7875Resolves the applicable registry preference at an exact coordinate (point-in-polygon; the most specific footprint wins). Informational metadata only.
{
"resolved": true,
"location": "Raleigh-Durham International Airport",
"kind": "airport",
"drone_preference": "sensitive",
"ar_preference": "coordinate",
"categories": [],
"advisory": "Drone-sensitive location — major airport nearby.",
"temporal_rule": null,
"window_active": null
}3 · Point in time — “what’s true here at this moment?”
GET https://airspaceregistry.org/api/v1/demo/resolve
?lat=33.9535&lon=-118.3392
&datetime=2027-02-14T18:30:00-08:00The same point at SoFi Stadium, queried during Super Bowl LXI, shows the registry’s drone-sensitive event window active, and when it ends:
{
"resolved": true,
"location": "SoFi Stadium",
"drone_preference": "sensitive",
"ar_preference": "commercial",
"advisory": "Drone-sensitive during scheduled major events at this venue.",
"temporal_rule": { "active": true, "event": "Super Bowl LXI", "end": "2027-02-15T03:30:00.000Z" },
"window_active": true,
"effective_until": "2027-02-15T03:30:00.000Z",
"note": "A registered drone-sensitive time window is active at the queried time."
}Query that same coordinate off-event and it returns window_active: false plus the next_window — same place, different context by the minute.
Together these show bulk retrieval, point lookup, and time-scoped context. This is an informational metadata layer a planning tool can surface to an operator — the preference/context that isn’t in existing feeds. It does not return a go/no-go and is not permissions; any operational decision stays with the operator’s own systems. The resolve endpoint runs over the demo dataset; the community /preferences endpoints below use the same shapes over live registry data.
Every value is the registry’s own advisory layer: a drone_preference and ar_preference, optional categories, an advisory note, and — where a location declares time-sensitivity — a temporal_rule with window_active. There are no authority or rule fields; the registry never asserts airspace status. Confirm any operational restriction with your own authoritative sources.
Reading the results
resolved: falseis a valid answer, not an error — like a directory lookup that returns no record. It means no footprint contains that point, so this informational layer carries nothing there. The demos model three areas and sample their footprints, so streets, gaps, and points elsewhere correctly return no record; the response’snotesays which case applies.- Always include a timezone offset in
datetime(e.g.-08:00). A naked datetime is parsed as UTC and can miss a local-time window; the response returns awarningwhen that happens. - Region ids use underscores:
raleigh,times_square,sofi_stadium.
Query preferences in an area
GET /preferencesFilter by a bounding box or a point + radius:
bbox | minLng,minLat,maxLng,maxLat — return entries inside this box |
lat, lng | center point for a radius search |
radius_km | radius in km (default 5), used with lat/lng |
verified | true → only document-verified entries |
gers_id | look up records anchored to an Overture Maps GERS ID (stable universal place ID) |
limit | max features (default/max 2000) |
Example — everything within 10 km of lower Manhattan:
GET https://airspaceregistry.org/api/v1/preferences?lat=40.7128&lng=-74.0060&radius_km=10Example — look up a place by its stable Overture GERS ID (no coordinates needed):
GET https://airspaceregistry.org/api/v1/preferences?gers_id=08b2a3a14e1f41b2bc6d88f6a964a2e5Look up one entry
GET /preferences/{location_id} e.g. /preferences/asr_AbC123Response (GeoJSON)
{
"type": "FeatureCollection",
"schema_version": "1.0",
"standards": { "geopose": "OGC GeoPose 1.0 (Basic-YPR)" },
"generated_at": "2026-06-29T21:00:00.000Z",
"count": 1,
"disclaimer": "Preferences are informational and voluntary ...",
"features": [
{
"type": "Feature",
"geometry": { "type": "Point", "coordinates": [-74.0060, 40.7128] },
"properties": {
"location_id": "asr_AbC123",
"title": "Example rooftop",
"drone_preference": "sensitive",
"ar_preference": "welcome",
"source": "community_registry",
"verified": false,
"verification_status": "unverified",
"altitude_floor_ft": 0,
"altitude_ceiling_ft": 400,
"altitude_floor_m": 0,
"altitude_ceiling_m": 122,
"radius_m": 50,
"address": { "city": "New York", "state": "NY", "country": "USA" },
"last_updated": "2026-06-29T18:30:00.000Z",
"geopose": {
"position": { "lat": 40.7128, "lon": -74.0060, "h": 0 },
"angles": { "yaw": 0, "pitch": 0, "roll": 0 }
}
}
}
]
}Field reference
drone_preference | welcome · ask · notify · sensitive |
ar_preference | welcome · coordinate · commercial · sensitive |
source | where the record came from, e.g. community_registry |
verified / verification_status | whether the registrant’s connection to the address was reviewed and approved |
altitude_*_ft / altitude_*_m | the preferred airspace band in feet (and metres) above ground level — default 0–400 ft AGL (the sUAS band) |
overture_gers_id | optional — the Overture Maps GERS ID this record is anchored to (present where matched) |
feature_type | optional — the Overture place/building category (e.g. place_of_assembly) |
is_sample | optional — true for a seeded illustrative placeholder awaiting its owner |
claimable | optional — true if the place has a custodian who can claim and set the real preference |
Fields by context class
Every field on this page belongs to one of the five context classes defined in the Architecture Specification (AR-1000) — the taxonomy that organizes a Location Profile. The classes organize the fields; this specification defines them.
| Spatial | Where a profile appliesgeometry · radius_m · altitude_floor_ft / altitude_ceiling_ft (and _m) · location_id · overture_gers_id · feature_type · geopose |
| Temporal | When it appliestemporal_rule · recurrence · temporary_condition |
| Operational | What is happening and what is preferredmetadata_categories · drone_preference · ar_preference |
| Interaction | How the responsible party prefers to be engagedPlanned — inquiry / notification / contact (see AR-1000 §7). |
| Evaluation | How to weigh a profiledrone_priority / ar_priority · verified / verification_status · source · is_default · claimable · is_sample |
Open AR standard — OGC GeoPose
Every anchor carries a geopose in the OGC GeoPose 1.0 Basic-YPR encoding — the open standard for geospatially anchoring content — so AR and spatial-computing clients (including the Open AR Cloud stack) can consume a place’s preferences directly, without a bespoke shape. Each response also advertises the standard in a top-level standards object.
"geopose": {
"position": { "lat": 40.7128, "lon": -74.0060, "h": 0 }, // h = altitude floor (m)
"angles": { "yaw": 0, "pitch": 0, "roll": 0 } // a place preference has no orientation
}The pose locates the anchor; orientation is identity because a location preference has no inherent facing. The /resolve endpoint returns the GeoPose of the queried point alongside the applicable preference.
Open AR Cloud — Spatial Content Discovery
GET /api/v1/scd?bbox=&|lat=&lng=[&radius_km=] publishes the registry’s preferences at a location as Open AR Cloud OSCP Spatial Content Records — so an AR client can discover a place’s preference through the open spatial stack, not just our API. Returned with media type application/vnd.oscp+json; version=1.0, location-scoped (never a full read).
{
"id": "asr_AbC123",
"type": "scr",
"tenant": "airspaceregistry.org",
"content": {
"id": "asr_AbC123",
"type": "airspace_preference",
"title": "Example venue",
"geopose": {
"position": { "lon": -74.006, "lat": 40.7128, "h": 0 },
"quaternion": { "x": 0, "y": 0, "z": 0, "w": 1 }
},
"refs": [
{ "contentType": "application/geo+json", "url": ".../api/v1/preferences/asr_AbC123" },
{ "contentType": "text/html", "url": ".../claim?id=AbC123" }
],
"definitions": [
{ "type": "drone_preference", "value": "sensitive" },
{ "type": "ar_preference", "value": "coordinate" }
]
}
}Resolve a point — coverage layers
GET /api/v1/resolve?lat=&lng=[&datetime=] answers “what preference applies right here?” by walking two layers in order of precedence:
layer: "owner" | owner-declared — a registered record whose footprint contains the point, carrying the owner’s declared preference (with its verification status, recurrence, and any time window). Takes precedence within the registry over the type-default layer. is_default: false. |
layer: "type_default" | fallback — if no owner record covers the point, the inferred default for the nearest known place (school, hospital, park…). A suggestion by place type, not owner-set: is_default: true and claimable. |
resolved: false | neither exists — this informational layer carries nothing here. |
GET /api/v1/resolve?lat=35.7725&lng=-78.678
{
"resolved": true,
"layer": "type_default",
"is_default": true, // a suggestion by place type — not owner-set
"claimable": true,
"location": "Skema Campus @ NC State",
"bucket": "schools",
"drone_preference": "sensitive",
"ar_preference": "coordinate",
"distance_m": 0,
"geopose": { "position": { "lat": 35.7725, "lon": -78.678, "h": 0 }, "angles": { "yaw": 0, "pitch": 0, "roll": 0 } },
"note": "No owner has set a preference here. This is a suggested default …"
}Optional metadata (next layer)
Records may optionally carry activity categories, a schedule window, and a temporary condition — evolving from a static preference into richer machine-readable metadata for a place. All fields are optional and default to empty.
"metadata_categories": ["drone_filming", "ar_content"],
"temporal_rule": {
"enabled": true,
"start_datetime": "2026-07-04T17:00:00Z", // may be null (open "until")
"end_datetime": "2026-07-04T22:00:00Z" // may be null (open "from")
},
"temporary_condition": { "type": "event", "description": "Large public gathering" }metadata_categories | which activities the preference applies to: drone_filming · drone_delivery · survey_inspection · ar_content · other |
temporal_rule | optional one-off schedule window; start_datetime/end_datetime may be null for an open-ended “from” / “until” |
recurrence | optional recurring weekly exception: on days (0=Sun…6=Sat) + optional start_time/end_time (local HH:MM, timezone IANA), the drone_pref/ar_pref it carries override the defaults (either may be null = unchanged). e.g. AR stays Welcome, drones Sensitive on weekends. /resolve returns the effective drone_preference/ar_preference for the queried moment plus recurrence_active. |
temporary_condition | a short-lived context (type: event / other) with a free-text description |
drone_priority / ar_priority | an ordered precedence list (most-preferred first) for who goes first when more than one operator wants the space — a second dimension distinct from the preference level. Unified vocabulary: public_safety · owner · commercial · recreational. Always returned; defaults to ["public_safety","owner","commercial","recreational"] when the owner hasn’t set one. Advisory, not authority. |
These fields remain informational and advisory — not enforceable and not permissions.
How to use it (operators)
At mission planning, query your operating area, surface any returned preferences to the pilot, and use them for courtesy coordination and conflict reduction. A returned preference is not enforceable and is not a permission; it is a communication signal from the place to the operator.
Roadmap
Planned, not yet available: eVTOL preferences alongside drone and AR, a richer per-activity category taxonomy, parcel-level snapping, and webhook subscriptions for changes within an operating area. Interested in a pilot or integration? ops@airspaceregistry.org.