FAA Drone Airspace Checker - Batch LAANC & No-Fly Verdicts
Pricing
from $11.00 / 1,000 results
FAA Drone Airspace Checker - Batch LAANC & No-Fly Verdicts
Batch lat/lon to FAA UAS airspace verdicts: LAANC ceilings AND whether LAANC is actually offered, charted Class B/C/D/E surface areas, prohibited areas, national-defense TFR areas, special use airspace, NSUFR, stadium TFRs. Verdict is gated - it never reads clear when a layer did not answer.
Pricing
from $11.00 / 1,000 results
Rating
0.0
(0)
Developer
Kyle Maloney
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
a day ago
Last modified
Share
Give it a list of coordinates. Get back one row per point telling you whether that flight needs FAA airspace authorization, how to get it, and what is in the way - built entirely on the FAA's own public Aeronautical Information Services data.
Designed for batch work: 5 sites or 5,000, one call, one row each.
Safety notice - read this first. This is a screening tool built on FAA AIS GIS data. It is not an authorization, a LAANC approval, or legal clearance. It does not cover NOTAMs, active or temporary flight restrictions (VIP, disaster, sporting), local or state ordinances, Remote ID / FRIA requirements, obstacles, terrain or weather. It does not replace LAANC, a NOTAM/TFR check, or FAA DroneZone. The pilot in command remains solely responsible for the legality and safety of every flight (14 CFR 107.19). Always confirm with an approved LAANC provider, FAA B4UFLY and current NOTAMs before you fly.
Who it is for
| You are | You use it to |
|---|---|
| Part 107 remote pilot | Pre-qualify a job list before you quote. Know which sites are LAANC-instant, which need a 30-90 day DroneZone request, and which are a hard no. |
| Drone service provider / fleet ops | Batch-screen a week of scheduled jobs overnight and route crews around the authorization bottlenecks. |
| Surveying, inspection, roofing, solar, construction | Screen a property portfolio for aerial-survey feasibility before mobilising. |
| Drone insurers and risk teams | Score a policyholder's operating area, or reconstruct the airspace context of a claim. |
| AI agents (MCP) | A clean, chainable airspace tool: pass coordinates, get a structured, explicitly-gated verdict. |
What changed in v1.1 (2026-08-01)
Three defects were found by testing the shipped v1.0 against live FAA data. Each produced a billable row that reported SUCCESS while giving a confident wrong answer. All three are fixed, with live drift assertions and mutation-verified regression tests.
1. "LAANC available" where LAANC is not offered.
22,492 UAS Facility Map grid cells (7.3% of the 308,823 cells with a non-zero
ceiling) sit at facilities where FAA publishes APT1_LAANC = 0. v1.0 classified
every one of them CONTROLLED_LAANC - "auto-authorization possible up to ceiling".
It is not: those facilities do not participate in LAANC at all, and the only
pathway is a manual FAA DroneZone request. Verified live at Westover ARB (KCEF,
Class D, ceiling 400 ft), Patrick Space Force Base (KCOF, ceiling 200 ft), Laughlin
AFB (KDLF) and Crater Lake/Klamath Regional (KLMT). These now return
CONTROLLED_NO_LAANC with authorization_pathway: FAA_DRONEZONE_MANUAL.
2. "Uncontrolled" inside a Class D surface area.
There are 1,669 surface-area controlled airspace polygons in the US (B 66,
C 139, D 589, E 875). A 120-polygon sample found 2.5% have no UAS Facility Map
grid cell at all - and v1.0 read "no grid cell" as "likely Class G, uncontrolled".
Verified false clears: MCOLF Oak Grove NC (35.0336, -77.2497), Sault Ste
Marie MI (46.4492, -84.5091), Lynden WA (48.9844, -122.4250) and Bryant
AAF, Anchorage AK (61.2657, -149.6828). All four now return CONTROLLED_NO_GRID.
v1.1 cross-checks every point against the FAA charted Class_Airspace layer. The
fix is deliberately selective, not blanket: Altus AFB (Class D floor 2,500 ft
MSL) and the Chicago Loop (under a Class B shelf based at 3,000 ft MSL) correctly
still return UNCONTROLLED_CHECK_LOCAL, because neither is a surface area, and a
Class E5 shelf with a 700 or 1,200 ft AGL floor never counts.
3. A failed layer could still produce a "clear to fly".
v1.0 isolated a failed layer into layer_errors and computed the verdict from
whatever survived. Seven of eight layers could fail and the actor would still emit
a billable clear. v1.1 gives every layer a <layer>_status and gates the
verdict: if any queried layer did not answer, flight_category is INCONCLUSIVE
and requires_faa_authorization is null, never false. If every layer fails for
every point, the run fails and nothing is billed.
Also in v1.1: all five airport slots per grid cell are read (3,649 cells have more
than one airport and 846 disagree on LAANC participation between slot 1 and
slot 2, so reading slot 1 alone made the answer depend on FAA's listing order);
the -9998 "unlimited" altitude sentinel is decoded rather than printed; the
exceededTransferLimit truncation flag is read; and 57 new output fields carry
data that was already being fetched with outFields=* and thrown away.
Nothing was removed or renamed. Every v1.0 field keeps its exact meaning, and the price is unchanged.
How it decides
PROHIBITED <- inside a prohibited area or a national-defense airspace TFR areaRESTRICTED <- inside a Restricted Area or a part-time NSUFR(both stand on their own evidence, even if another layer failed)...otherwise, if ANY queried layer did not answer -> INCONCLUSIVE(no absence is ever asserted from a source that was not read)CONTROLLED_LAANC_0 <- UASFM grid cell, ceiling 0 ftCONTROLLED_LAANC <- ceiling > 0 AND every controlling facility offers LAANCCONTROLLED_NO_LAANC <- ceiling > 0 but the facility does NOT offer LAANCCONTROLLED_NO_GRID <- inside Class B/C/D/E surface area, no grid publishedUNCONTROLLED_CHECK_LOCAL <- no grid cell AND no surface-area controlled airspaceERROR <- every queried layer failed for this point
Every run begins with a live drift preflight that fails the whole run - before a single billable row - if the FAA sources no longer look like the ones this actor was validated against:
- all eight layers resolve with the expected layer name, geometry type and a
geographic spatial reference, and the service's own
maxRecordCountstill covers the page this actor requests; - feature counts sit in measured bands (UASFM 380,644; charted airspace 6,061; SUA 1,542; prohibited 13; stadiums 203; recreational sites 2,172; national defense TFR areas 8; part-time NSUFR 5);
- the
AIRSPACE_1{B, C, D, E} and SUATYPE_CODE{P, R, MOA} vocabularies are intact; - at least one grid cell still matches
CEILING>0 AND APT1_LAANC=0- if that ever reaches zero, the LAANC participation flag has been flattened and every facility would silently start looking LAANC-enabled; - the UAS Facility Map effective date is recent (it is republished on the 56-day aeronautical chart cycle);
- five positive canaries hit - P-56 over the White House, the KDEN 0 ft grid cell, R-4808N, Yankee Stadium inside the 3 NM buffer, the Denver Class B surface area;
- and a negative control at 47.2, -108.6 in rural Montana comes back clear, which is what catches a query that has silently stopped matching anything.
Per point, every query carries inSR=4326 and outSR=4326, reads the service's
own exceededTransferLimit flag, and screens returned coordinates for Web Mercator
by magnitude rather than by distance from the query point (airspace polygons
are legitimately enormous, so a distance test would hard-fail the largest and most
important features).
Example input
{"points": [{ "lat": 39.86, "lon": -104.67, "label": "Denver Intl (KDEN)" },{ "lat": 40.8296, "lon": -73.9262, "label": "Yankee Stadium NYC" },{ "lat": 42.1708, "lon": -72.6375, "label": "Westover ARB (KCEF)" },{ "lat": 38.8977, "lon": -77.0365, "label": "White House DC" },"47.2,-108.6"],"maxPoints": 500}
Points also accept {latitude, longitude}, [lat, lon], or a "lat,lon" string.
layers is optional and defaults to all eight.
Example output (abridged)
{"label": "Westover ARB (KCEF)","lat": 42.1708, "lon": -72.6375,"flight_category": "CONTROLLED_NO_LAANC","requires_faa_authorization": true,"authorization_pathway": "FAA_DRONEZONE_MANUAL","verdict_basis": "laanc_grid: 1 UASFM cell(s), lowest ceiling 400 ft AGL at KCEF","max_laanc_ceiling_ft": 400,"laanc_available": false,"controlled_airspace_class": "D","controlled_airspace_name": "SPRINGFIELD/CHICOPEE CLASS D","in_surface_area_controlled_airspace": true,"uasfm_effective_date": "7/9/2026","partial_result": false,"laanc_grid_status": "ok","class_airspace_status": "ok"}
Output fields
One row per point. Every field below is declared in the dataset schema and every
one is emitted. null always means not checked; false always means checked
and negative.
Identity and verdict
| Field | Type | Meaning |
|---|---|---|
label | string | null |
lat | number | null |
lon | number | null |
flight_category | string | null |
requires_faa_authorization | boolean | null |
authorization_pathway | string | null |
verdict_basis | string | null |
verdict_gated | boolean | null |
verdict_gate_reason | string | null |
LAANC / UAS Facility Map
| Field | Type | Meaning |
|---|---|---|
max_laanc_ceiling_ft | number | null |
laanc_grids_hit | integer | null |
laanc_available | boolean | null |
laanc_operations | string | null |
any_grid_facility_laanc_enabled | boolean | null |
all_grid_facilities_laanc_enabled | boolean | null |
laanc_enabled | boolean | null |
nearest_airport | string | null |
nearest_airport_name | string | null |
controlling_facility_id | string | null |
airspace_class | string | null |
grid_airport_count | integer | null |
grid_airports | array | null |
grid_airspace_classes | array | null |
grid_airspace_class_most_restrictive | string | null |
laanc_ceiling_grid_lat | number | null |
laanc_ceiling_grid_lon | number | null |
uasfm_effective_date | string | null |
uasfm_last_edit_date | string | null |
uasfm_region | string | null |
Charted controlled airspace (14 CFR 107.41)
| Field | Type | Meaning |
|---|---|---|
in_surface_area_controlled_airspace | boolean | null |
controlled_airspace_class | string | null |
controlled_airspace_name | string | null |
controlled_airspace_names | array | null |
controlled_airspace_types | array | null |
controlled_airspace_count | integer | null |
controlled_airspace_ceiling_ft_msl | number | null |
controlling_atc_facility | string | null |
Restrictions and advisories
| Field | Type | Meaning |
|---|---|---|
restriction_count | integer | null |
restrictions | array | null |
restriction_names | array | null |
highest_restriction_severity | string | null |
prohibited_area_names | array | null |
restricted_area_names | array | null |
moa_names | array | null |
warning_alert_danger_area_names | array | null |
national_defense_tfr_names | array | null |
stadium_names | array | null |
stadium_count | integer | null |
nsufr_names | array | null |
nsufr_contact | string | null |
recreational_site_name | string | null |
recreational_site_ceiling_ft | number | null |
restrictions_reaching_surface | integer | null |
lowest_restriction_floor_ft | number | null |
Per-layer outcome contract
| Field | Type | Meaning |
|---|---|---|
laanc_grid_status | string | null |
class_airspace_status | string | null |
prohibited_areas_status | string | null |
national_defense_tfr_status | string | null |
special_use_airspace_status | string | null |
part_time_nsufr_status | string | null |
stadiums_status | string | null |
recreational_flyer_sites_status | string | null |
layers_requested | integer | null |
layers_ok | integer | null |
layers_failed | integer | null |
layers_failed_names | array | null |
layers_truncated_names | array | null |
partial_result | boolean | null |
layer_errors | array | null |
Provenance
| Field | Type | Meaning |
|---|---|---|
checked_at | string | null |
disclaimer | string | null |
coverage_note | string | null |
Data sources
All keyless, all from the FAA Aeronautical Information Services public ArcGIS org
(services6.arcgis.com/ssFJjBXIUyZDrSYZ). Unversioned service aliases are pinned
because the versioned names rotate.
| Layer key | FAA service | What it contributes |
|---|---|---|
laanc_grid | FAA_UAS_FacilityMap_Data | LAANC ceiling in ft AGL, controlling facility, LAANC participation and operation types, airspace class, map effective date |
class_airspace | Class_Airspace | Charted Class A/B/C/D/E boundaries with floors and ceilings - the 14 CFR 107.41 cross-check. Always queried. |
prohibited_areas | Prohibited_Areas | P-areas (P-56, P-40 Camp David, ...) |
national_defense_tfr | National_Defense_Airspace_TFR_Areas | National defense airspace TFR areas, activated by NOTAM |
special_use_airspace | Special_Use_Airspace | Restricted (R), Prohibited (P), MOA, Warning (W), Alert (A), Danger (D) |
part_time_nsufr | Part_Time_National_Security_UAS_Flight_Restrictions | 14 CFR 99.7 part-time national security restrictions, with the FAA point of contact |
stadiums | Stadiums | Game-day TFR proximity, 3 NM radius |
recreational_flyer_sites | Recreational_Flyer_Fixed_Sites | FAA-listed fixed flying fields (advisory) |
Use as an MCP tool
This Actor is callable directly by any MCP-compatible AI agent through Apify's hosted MCP server. There is no server to run and no integration code to write - the tool schema an agent sees is generated from this Actor's own input and dataset schemas.
Endpoint
https://mcp.apify.com?tools=malonestar/faa-drone-airspace-checker
Claude Desktop, Claude Code or Cursor - add to claude_desktop_config.json,
.mcp.json or .cursor/mcp.json respectively:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=malonestar/faa-drone-airspace-checker","headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }}}}
Get a token at https://console.apify.com/settings/integrations. Claude Desktop can
also authenticate interactively via OAuth against https://mcp.apify.com with no
headers block. Full reference: https://docs.apify.com/platform/integrations/mcp
Try asking your agent
Check these five job-site coordinates for Part 107 airspace restrictions and tell me which ones can use LAANC auto-authorization.
Chains well with - expose these alongside it by comma-separating the tools
parameter, and the agent can carry results from one into the next:
malonestar/site-due-diligence-bundlemalonestar/fema-nri-county-risk-profile
https://mcp.apify.com?tools=malonestar/faa-drone-airspace-checker,malonestar/site-due-diligence-bundle,malonestar/fema-nri-county-risk-profile
Billing is unchanged when called as an MCP tool: this Actor is Pay-Per-Event and an agent pays the same per-result price a human does. A run that cannot answer fails without billing rather than returning an unverified negative.
Use in n8n
This Actor is published as an n8n community node, so it can be dropped into a workflow without writing an HTTP request by hand.
- npm: https://www.npmjs.com/package/n8n-nodes-faa-drone-airspace-checker
- source: https://github.com/malonestar/n8n-nodes-faa-drone-airspace-checker
Install from Settings > Community Nodes > Install in any self-hosted n8n
instance, enter n8n-nodes-faa-drone-airspace-checker, then add your Apify API key as an
Apify API credential. The node calls this Actor through the Apify API, so there
is no extra infrastructure to run and billing is identical to a normal run.
Use in n8n
This Actor is published as an n8n community node, so it can be dropped into a workflow without writing an HTTP request by hand.
- npm: https://www.npmjs.com/package/n8n-nodes-faa-drone-airspace-checker
- source: https://github.com/malonestar/n8n-nodes-faa-drone-airspace-checker
Install from Settings > Community Nodes > Install in any self-hosted n8n
instance, enter n8n-nodes-faa-drone-airspace-checker, then add your Apify API key as an
Apify API credential. The node calls this Actor through the Apify API, so there
is no extra infrastructure to run and billing is identical to a normal run.
Pricing
Pay per result: $20 per 1,000 rows ($0.02 per point checked). One row and one Result event per point. Graduated discounts apply on paid Apify plans.
Nothing is billed when the run fails: the live drift preflight runs before any row
is pushed, rows are buffered and the billing gate is applied before pushData, and
a run in which every point failed emits zero rows and fails loudly.
FAQ
Is a UNCONTROLLED_CHECK_LOCAL result permission to fly?
No. It means the FAA data shows no UAS Facility Map grid cell and no surface-area
controlled airspace at that coordinate. NOTAMs, temporary flight restrictions,
local ordinances, Remote ID rules and the rest of Part 107 still apply. Always
check NOTAMs and B4UFLY before flying.
Why does a site with a 400 ft LAANC ceiling say CONTROLLED_NO_LAANC?
Because FAA publishes a grid ceiling for that facility but the facility does not
participate in LAANC, so no LAANC provider can authorize it. You need a manual
FAA DroneZone airspace authorization, which typically takes 30-90 days. 22,492
grid cells nationwide are in this state.
Why is a rural point flagged with a MOA?
Military Operations Areas are advisory for a typical sub-400 ft AGL Part 107
flight, and many are based well above the surface. Check
lowest_restriction_floor_ft and restrictions[].details.lower_datum - a MOA with
a 500 ft AGL or 11,000 ft MSL floor is above you.
Does this check TFRs? No. It checks charted, standing airspace: prohibited areas, national defense airspace TFR areas (the published geography, not an active NOTAM), special use airspace, part-time NSUFR geography and stadium locations. It is not a NOTAM or active-TFR service. Check NOTAMs separately, every time.
What if a FAA service is down?
The run either fails outright (drift preflight, or every point failing) or emits
rows marked partial_result: true with flight_category: "INCONCLUSIVE" and
requires_faa_authorization: null. It will not quietly tell you a site is clear.
Can I check thousands of points?
Yes. maxPoints caps a run at 5,000. Layers fan out in parallel per point.
How fresh is the data?
uasfm_effective_date on every row is the FAA chart cycle the LAANC grid was
published for (56-day cycle). The run fails if it goes stale.
Related actors
- NHTSA VIN Decoder - fleet and vehicle identity in batch.
- FEMA NRI County Risk Profile and Wildfire Asset Exposure Screener - for the same coordinates, natural-hazard context for aerial survey and inspection.
- Site Due Diligence Bundle - a 20-layer environmental and regulatory screen on one coordinate, for when the drone job is part of a property assessment.
Column coverage (how every field is proven live)
68 of the 72 declared fields populate across two live runs: the schema prefill (5 points) plus this recorded coverage input.
{ "points": [{ "lat": 38.8977, "lon": -77.0365, "label": "P-56 White House DC" },{ "lat": 37.235, "lon": -115.811, "label": "R-4808N Nevada" },{ "lat": 39.9703, "lon": -74.5323, "label": "A-220 Alert Area NJ" },{ "lat": 31.2797, "lon": -100.3761, "label": "San Angelo NDA TFR TX" },{ "lat": 38.0192, "lon": -122.02, "label": "MOTCO Concord CA (NSUFR)" },{ "lat": 33.690372, "lon": -84.326204, "label": "Atlanta RC Club Field GA" },{ "lat": 31.6136, "lon": -106.4537, "label": "Ciudad Juarez TCA border airspace" }] }
The remaining four - layer_errors, verdict_gate_reason, layers_failed_names
and layers_truncated_names - populate only when a layer fails or truncates.
Empty is the correct, healthy value; they are pinned by offline fixtures so they
cannot rot.
