NOAA Essential Fish Habitat Screener — EFH Consultation Check avatar

NOAA Essential Fish Habitat Screener — EFH Consultation Check

Pricing

from $5.50 / 1,000 results

Go to Apify Store
NOAA Essential Fish Habitat Screener — EFH Consultation Check

NOAA Essential Fish Habitat Screener — EFH Consultation Check

Screen coastal & offshore coordinates against live NOAA Essential Fish Habitat (EFH) polygons. Per point: designated species/sites, life stages, fishery-management council, acres, state-waters flag, and a Magnuson-Stevens EFH consultation flag. Batch, MCP-ready. $0.01 per asset check.

Pricing

from $5.50 / 1,000 results

Rating

0.0

(0)

Developer

Kyle Maloney

Kyle Maloney

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 days ago

Last modified

Share

NOAA Essential Fish Habitat Consultation Screener

Batch EFH screening by coordinate. Give it a list of lat/lon sites and it returns, per site, whether the point falls inside NOAA Essential Fish Habitat, which managed species and life stages are designated there, which fishery management council and FMP amendment designated it, whether the point also falls inside a Habitat Area of Particular Concern (with its CFR citation), and a plain-language audit trail explaining the result.

Screened live against the NOAA national EFH inventory (737 designation polygons) and the national HAPC layer (237 polygons). One billable row per EFH overlap; a clear site gets one billable row that says why it is clear.

Screening aid, not a legal determination. Whether a federal action requires EFH consultation under Magnuson-Stevens Act section 305(b)(2) is decided by the action agency and NOAA Fisheries, not by this screen. EFH boundaries are council-scale and generalized. Confirm with the regional NOAA Fisheries Habitat Conservation Division (habitat.noaa.gov).

Who it is for

  • Offshore wind, marine construction and dredging developers who need an early read on whether a site will pull an EFH consultation.
  • NEPA and permitting consultants assembling the aquatic-resources section of an EA or EIS.
  • Ports, cable and pipeline routing teams comparing candidate alignments before spending on survey.
  • Environmental due-diligence firms adding a marine-habitat check to a coastal property screen.
  • Fisheries and marine-spatial-planning analysts who want the designation metadata, not a map tile.

What changed in v1.1 (2026-08-01)

Every existing field is preserved with its original meaning (append-only).

1. The HAPC distinction the actor advertised could never be made. v1.0 derived is_hapc from the EFH layer TYPE column. A live returnDistinctValues over all 737 EFH features returns exactly one value: EFH. There are zero HAPC records on that layer, so is_hapc was structurally false on every row ever emitted. HAPCs live on a separate NOAA layer in the same organisation, which v1.1 now queries: Flower Garden Banks (27.8756, -93.8158) returns 2 HAPCs (West Flower Garden Bank coral, Bluefin Tuna); Cape Cod (41.6, -70.7) returns 2; Denver returns 0. HAPC results are reported as fields on the existing rows, not as extra billable rows, so the cost per site is unchanged.

2. A failed lookup used to assert that no consultation was needed. The old row template initialised in_efh: false, is_hapc: false and nmfs_efh_consultation_likely: false, and the only failure path nulled in_efh. An asset whose NOAA lookup failed was therefore emitted as a billable row reading "EFH consultation not likely" for a site that had never been checked - the most expensive wrong answer this actor can give. Now every derived answer starts null, each of the four upstream sources reports its own status field, and a verdict is null, never false, when any contributing source did not answer.

3. The PHMS council code was missing from the lookup. FMC is a closed vocabulary of ten codes live, and it includes PHMS (Pacific Highly Migratory Species), which the v1.0 map did not have - so every Pacific HMS row silently carried fmc_name: null. Added, and the vocabulary is now asserted at runtime: an unknown council code fails the run rather than emitting a null name.

4. An inland clear is now explicitly labelled as valid. EFH is designated in coastal and marine waters only, so an inland zero is a legitimate answer, not a service failure. v1.1 adds a context-radius probe and a coastal_context field that distinguishes inside EFH from coastal but just outside a boundary from nothing within 25 miles, consistent with an inland site. Denver returns 0 EFH at the point and 0 within 25 miles; the Gulf canary returns 13 at the point and 29 within 25 miles.

5. Nine columns were being fetched on every request and thrown away. Recovered: FMP_REPORT (the amendment that designated the habitat), LTTD_LINK_ (the species life-stage map PDF, with a page anchor), DATACAVEAT (the NOAA caveat, populated on 634 of 737 features), DDBOX / LTTD_TIT_1 (species common name), FMC_REPORT, LTTD_TITLE, Shape__Area and OBJECTID.

6. 22 live drift assertions run before any billable row. Layer names, geometry types and field sets on both layers; feature counts inside measured bands; the closed FMC and TYPE vocabularies; positive canaries on both layers and a negative control on both; and a coordinate-magnitude check on the published centroids. Any failure stops the run and bills nothing.

7. Truncation is now detectable. Every read is cross-checked against an exact server-side count, and the rollups are nulled rather than published over an arbitrary subset if a read came up short.

8. The run fails instead of billing when every asset errors, and that gate runs before pushData.

Two things the source does not publish, stated plainly

  • in_state_waters is always null. NOAA publishes the INSTATEWAT column blank on all 737 national EFH features. Blank means not published, never not in state waters, so it is emitted as null rather than guessed.
  • acres is always 0. NOAA publishes ACRES as 0 on all 737 features. It is preserved exactly as published; use designation_area_sq_m instead, which v1.1 computes from Shape__Area with the Web Mercator latitude correction.

A candidate new field was also dropped before release rather than shipped empty: ZONE is blank on 737 of 737 features and is structurally impossible to populate, so no zone column is emitted.

Example input

{
"assets": [
{ "lat": 27.8756, "lon": -93.8158, "label": "Flower Garden Banks (EFH + coral HAPC)" },
{ "lat": 28.5, "lon": -91.0, "label": "Gulf of Mexico offshore Louisiana" },
{ "lat": 39.7392, "lon": -104.9903, "label": "Denver CO (inland control)" }
],
"radiusMiles": 0,
"contextRadiusMiles": 25,
"includeHapc": true,
"maxAssets": 500
}

Input fields

FieldTypeDescription
assetsarrayPoints to screen: { "lat": number, "lon": number, "label": string } in WGS84 decimal degrees.
radiusMilesnumberBuffer around each point, 0-25 statute miles. 0 (default) is a pure point-in-polygon intersect.
contextRadiusMilesintegerRadius, 0-200 miles (default 25), used to answer why a clear point is clear. 0 skips the probe and coastal_context says so.
includeHapcbooleanDefault true. Query the separate NOAA HAPC layer as well as EFH.
maxAssetsintegerSafety cap on assets per run (default 500, max 2000).

Output fields

Every field the actor declares is listed below.

Site identity and provenance

FieldTypeDescription
asset_labelstringnull
asset_latnumbernull
asset_lonnumbernull
radius_milesnumbernull
checked_atstringnull
source_urlstringnull
hapc_source_urlstringnull
screen_basisstringnull
disclaimerstringnull
errorstringnull

Verdict and audit trail

FieldTypeDescription
in_efhbooleannull
nmfs_efh_consultation_likelybooleannull
coastal_contextstringnull
context_radius_milesnumbernull
efh_within_context_radius_countintegernull
hapc_within_context_radius_countintegernull
consultation_basisstringnull

This EFH designation (one row per species/life-stage overlap)

FieldTypeDescription
efh_site_namestringnull
efh_species_common_namestringnull
life_stagestringnull
designation_typestringnull
is_hapcbooleannull
fmc_codestringnull
fmc_namestringnull
fmc_reportstringnull
regionstringnull
fmp_amendmentstringnull
council_text_urlstringnull
lifestage_map_titlestringnull
lifestage_map_urlstringnull
data_caveatstringnull
acresnumbernull
designation_area_sq_mnumbernull
centroid_latnumbernull
centroid_lonnumbernull
in_state_watersbooleannull
efh_objectidintegernull

All EFH at this point (rollup, repeated on every row)

FieldTypeDescription
efh_overlap_countintegernull
efh_species_countintegernull
efh_species_liststringnull
efh_lifestagesstringnull
efh_councilsstringnull
efh_council_countintegernull
efh_regionsstringnull
efh_fmp_amendmentsstringnull

Habitat Areas of Particular Concern (separate NOAA layer)

FieldTypeDescription
hapc_overlapbooleannull
hapc_overlap_countintegernull
hapc_site_namesstringnull
hapc_species_liststringnull
hapc_habitatsstringnull
hapc_fishery_management_plansstringnull
hapc_cfr_citationsstringnull
hapc_regulation_urlsstringnull
hapc_publication_datesstringnull
hapc_data_caveatsstringnull

Per-source outcome (null means NOT CHECKED)

FieldTypeDescription
efh_statusstringnull
hapc_statusstringnull
efh_context_statusstringnull
hapc_context_statusstringnull
sources_attemptedintegernull
sources_okintegernull
sources_failedintegernull
sources_failed_namesstringnull
partial_resultbooleannull

Coverage, truncation and upstream health

FieldTypeDescription
efh_features_matchedintegernull
efh_features_exact_countintegernull
efh_read_truncatedbooleannull
hapc_features_matchedintegernull
hapc_features_exact_countintegernull
hapc_read_truncatedbooleannull
service_max_record_countintegernull
drift_checks_passedintegernull
drift_checks_totalintegernull

Reading the results correctly

  • null is not false. A null verdict means a source did not answer, so nothing was verified. Check partial_result and sources_failed_names before acting on a row.
  • One row per EFH overlap. A single offshore point commonly intersects a dozen overlapping species designations; the Gulf canary returns 13 and Flower Garden Banks returns 17. The asset-level rollups (efh_species_list, efh_councils, hapc_site_names) repeat on every row for that asset so a single row is enough to answer "what is here".
  • is_hapc vs hapc_overlap. is_hapc describes the EFH row itself and is false everywhere, because the EFH layer carries no HAPC records. hapc_overlap is the real answer, from the separate HAPC layer.
  • A clear inland row is the right answer. coastal_context tells you which kind of clear you have. no_efh_within_context_radius_consistent_with_an_inland_or_unmapped_site means EFH simply is not designated on land.
  • hapc_cfr_citations is published on 84 of 237 HAPC features, and hapc_data_caveats on 1 of 237, so nulls there are upstream gaps, not bugs. A verified input that populates the CFR citation: { "lat": 37.0658, "lon": -74.6622 } (Norfolk Canyon, Tilefish HAPC, 50 CFR 648.296).

Use as an MCP tool

This actor is available to AI agents through mcp.apify.com. Every input and output field carries a description, so an agent can call it and reason about the answer directly. It chains cleanly with the other coordinate screeners: pass the same points to the USFWS critical-habitat screener, the NWI wetlands screener and the EPA impaired-waters screener, then join on asset_label.

Typical agent prompt: "Screen these six offshore lease-block centroids for Essential Fish Habitat and tell me which ones also fall in a Habitat Area of Particular Concern, with the CFR citation."

Pricing

Pay per result: $10 per 1,000 result rows ($0.01 per row). A site inside EFH produces one row per species/life-stage overlap; a clear site produces exactly one row. HAPC results are fields on those rows, not extra rows, so adding the HAPC layer did not change what a site costs. Graduated discounts apply on paid Apify plans (Bronze 20% / Silver 30% / Gold 45% / Platinum 60% / Diamond 70%).

A run that cannot verify the upstream is healthy, or in which every asset failed, fails and bills nothing.

FAQ

Does an EFH hit mean I have to consult? No. It means a federal action at that point is likely to trigger EFH consultation under MSA section 305(b)(2). The determination is made by the action agency and NOAA Fisheries. consultation_basis spells out what the row is actually claiming.

Why did my inland site return one row saying nothing? Because that is the correct answer. EFH is designated in coastal and marine waters only. The row carries coastal_context and a consultation_basis that says so explicitly, precisely so a legitimate clear is not mistaken for a service failure.

What is the difference between EFH and a HAPC? A HAPC is a subset of EFH that NOAA has singled out for higher conservation priority - typically rare, ecologically important, or especially vulnerable habitat. HAPCs carry a Code of Federal Regulations citation where one has been published. They live on a different NOAA layer, which is why v1.0 could not see them.

Why is acres always 0 and in_state_waters always null? Because that is exactly what NOAA publishes on all 737 features. Both are preserved verbatim rather than guessed. Use designation_area_sq_m for area.

Why did my run fail with "Upstream drift detected"? A live assertion about the NOAA service failed - a renamed layer, a collapsed feature count, an unknown council code, or a spatial filter that stopped filtering. The alternative would have been to bill you for a confident wrong answer. The message names the exact check.

Can I search near a point rather than at it? Yes. Set radiusMiles up to 25 for a buffered search. That changes what counts as a hit; radius_miles is recorded on every row.

Same coordinate in, same asset_label out:

  • USFWS Critical Habitat Screener - the terrestrial/ESA sibling of this screen.
  • FWS Wetlands Proximity Screener - National Wetlands Inventory.
  • EPA Impaired Waters 303(d) Screener - Clean Water Act listings.
  • NHD Surface Water 404 Screener - Clean Water Act section 404 jurisdiction.
  • BOEM Offshore Wind Lease Tracker - cross-sells directly for offshore siting.
  • Site Due Diligence Bundle - 20 layers in a single call.

Data sources

Both keyless, both on ArcGIS Online organisation FiaPA4ga0iQKduv3 (Federal_User_Community), counts verified live 2026-08-01 and asserted at runtime:

  • nationwide_efh_1/FeatureServer/0 - layer Nationwide_EFH_B, 737 EFH polygons.
  • Habitat_Areas_of_Particular_Concern_1/FeatureServer/0 - layer Nationwide_HAPC_B, 237 HAPC polygons.