FAA Drone Airspace Checker - Batch LAANC & No-Fly Verdicts avatar

FAA Drone Airspace Checker - Batch LAANC & No-Fly Verdicts

Pricing

from $11.00 / 1,000 results

Go to Apify Store
FAA Drone Airspace Checker - Batch LAANC & No-Fly Verdicts

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

Kyle Maloney

Maintained by Community

Actor 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 areYou use it to
Part 107 remote pilotPre-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 opsBatch-screen a week of scheduled jobs overnight and route crews around the authorization bottlenecks.
Surveying, inspection, roofing, solar, constructionScreen a property portfolio for aerial-survey feasibility before mobilising.
Drone insurers and risk teamsScore 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 area
RESTRICTED <- 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 ft
CONTROLLED_LAANC <- ceiling > 0 AND every controlling facility offers LAANC
CONTROLLED_NO_LAANC <- ceiling > 0 but the facility does NOT offer LAANC
CONTROLLED_NO_GRID <- inside Class B/C/D/E surface area, no grid published
UNCONTROLLED_CHECK_LOCAL <- no grid cell AND no surface-area controlled airspace
ERROR <- 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 maxRecordCount still 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 SUA TYPE_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

FieldTypeMeaning
labelstringnull
latnumbernull
lonnumbernull
flight_categorystringnull
requires_faa_authorizationbooleannull
authorization_pathwaystringnull
verdict_basisstringnull
verdict_gatedbooleannull
verdict_gate_reasonstringnull

LAANC / UAS Facility Map

FieldTypeMeaning
max_laanc_ceiling_ftnumbernull
laanc_grids_hitintegernull
laanc_availablebooleannull
laanc_operationsstringnull
any_grid_facility_laanc_enabledbooleannull
all_grid_facilities_laanc_enabledbooleannull
laanc_enabledbooleannull
nearest_airportstringnull
nearest_airport_namestringnull
controlling_facility_idstringnull
airspace_classstringnull
grid_airport_countintegernull
grid_airportsarraynull
grid_airspace_classesarraynull
grid_airspace_class_most_restrictivestringnull
laanc_ceiling_grid_latnumbernull
laanc_ceiling_grid_lonnumbernull
uasfm_effective_datestringnull
uasfm_last_edit_datestringnull
uasfm_regionstringnull

Charted controlled airspace (14 CFR 107.41)

FieldTypeMeaning
in_surface_area_controlled_airspacebooleannull
controlled_airspace_classstringnull
controlled_airspace_namestringnull
controlled_airspace_namesarraynull
controlled_airspace_typesarraynull
controlled_airspace_countintegernull
controlled_airspace_ceiling_ft_mslnumbernull
controlling_atc_facilitystringnull

Restrictions and advisories

FieldTypeMeaning
restriction_countintegernull
restrictionsarraynull
restriction_namesarraynull
highest_restriction_severitystringnull
prohibited_area_namesarraynull
restricted_area_namesarraynull
moa_namesarraynull
warning_alert_danger_area_namesarraynull
national_defense_tfr_namesarraynull
stadium_namesarraynull
stadium_countintegernull
nsufr_namesarraynull
nsufr_contactstringnull
recreational_site_namestringnull
recreational_site_ceiling_ftnumbernull
restrictions_reaching_surfaceintegernull
lowest_restriction_floor_ftnumbernull

Per-layer outcome contract

FieldTypeMeaning
laanc_grid_statusstringnull
class_airspace_statusstringnull
prohibited_areas_statusstringnull
national_defense_tfr_statusstringnull
special_use_airspace_statusstringnull
part_time_nsufr_statusstringnull
stadiums_statusstringnull
recreational_flyer_sites_statusstringnull
layers_requestedintegernull
layers_okintegernull
layers_failedintegernull
layers_failed_namesarraynull
layers_truncated_namesarraynull
partial_resultbooleannull
layer_errorsarraynull

Provenance

FieldTypeMeaning
checked_atstringnull
disclaimerstringnull
coverage_notestringnull

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 keyFAA serviceWhat it contributes
laanc_gridFAA_UAS_FacilityMap_DataLAANC ceiling in ft AGL, controlling facility, LAANC participation and operation types, airspace class, map effective date
class_airspaceClass_AirspaceCharted Class A/B/C/D/E boundaries with floors and ceilings - the 14 CFR 107.41 cross-check. Always queried.
prohibited_areasProhibited_AreasP-areas (P-56, P-40 Camp David, ...)
national_defense_tfrNational_Defense_Airspace_TFR_AreasNational defense airspace TFR areas, activated by NOTAM
special_use_airspaceSpecial_Use_AirspaceRestricted (R), Prohibited (P), MOA, Warning (W), Alert (A), Danger (D)
part_time_nsufrPart_Time_National_Security_UAS_Flight_Restrictions14 CFR 99.7 part-time national security restrictions, with the FAA point of contact
stadiumsStadiumsGame-day TFR proximity, 3 NM radius
recreational_flyer_sitesRecreational_Flyer_Fixed_SitesFAA-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-bundle
  • malonestar/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.

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.

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.


  • 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.