NOAA Essential Fish Habitat Screener — EFH Consultation Check
Pricing
from $5.50 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 days ago
Last modified
Categories
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_watersis always null. NOAA publishes theINSTATEWATcolumn 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.acresis always 0. NOAA publishesACRESas 0 on all 737 features. It is preserved exactly as published; usedesignation_area_sq_minstead, which v1.1 computes fromShape__Areawith 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
| Field | Type | Description |
|---|---|---|
assets | array | Points to screen: { "lat": number, "lon": number, "label": string } in WGS84 decimal degrees. |
radiusMiles | number | Buffer around each point, 0-25 statute miles. 0 (default) is a pure point-in-polygon intersect. |
contextRadiusMiles | integer | Radius, 0-200 miles (default 25), used to answer why a clear point is clear. 0 skips the probe and coastal_context says so. |
includeHapc | boolean | Default true. Query the separate NOAA HAPC layer as well as EFH. |
maxAssets | integer | Safety cap on assets per run (default 500, max 2000). |
Output fields
Every field the actor declares is listed below.
Site identity and provenance
| Field | Type | Description |
|---|---|---|
asset_label | string | null |
asset_lat | number | null |
asset_lon | number | null |
radius_miles | number | null |
checked_at | string | null |
source_url | string | null |
hapc_source_url | string | null |
screen_basis | string | null |
disclaimer | string | null |
error | string | null |
Verdict and audit trail
| Field | Type | Description |
|---|---|---|
in_efh | boolean | null |
nmfs_efh_consultation_likely | boolean | null |
coastal_context | string | null |
context_radius_miles | number | null |
efh_within_context_radius_count | integer | null |
hapc_within_context_radius_count | integer | null |
consultation_basis | string | null |
This EFH designation (one row per species/life-stage overlap)
| Field | Type | Description |
|---|---|---|
efh_site_name | string | null |
efh_species_common_name | string | null |
life_stage | string | null |
designation_type | string | null |
is_hapc | boolean | null |
fmc_code | string | null |
fmc_name | string | null |
fmc_report | string | null |
region | string | null |
fmp_amendment | string | null |
council_text_url | string | null |
lifestage_map_title | string | null |
lifestage_map_url | string | null |
data_caveat | string | null |
acres | number | null |
designation_area_sq_m | number | null |
centroid_lat | number | null |
centroid_lon | number | null |
in_state_waters | boolean | null |
efh_objectid | integer | null |
All EFH at this point (rollup, repeated on every row)
| Field | Type | Description |
|---|---|---|
efh_overlap_count | integer | null |
efh_species_count | integer | null |
efh_species_list | string | null |
efh_lifestages | string | null |
efh_councils | string | null |
efh_council_count | integer | null |
efh_regions | string | null |
efh_fmp_amendments | string | null |
Habitat Areas of Particular Concern (separate NOAA layer)
| Field | Type | Description |
|---|---|---|
hapc_overlap | boolean | null |
hapc_overlap_count | integer | null |
hapc_site_names | string | null |
hapc_species_list | string | null |
hapc_habitats | string | null |
hapc_fishery_management_plans | string | null |
hapc_cfr_citations | string | null |
hapc_regulation_urls | string | null |
hapc_publication_dates | string | null |
hapc_data_caveats | string | null |
Per-source outcome (null means NOT CHECKED)
| Field | Type | Description |
|---|---|---|
efh_status | string | null |
hapc_status | string | null |
efh_context_status | string | null |
hapc_context_status | string | null |
sources_attempted | integer | null |
sources_ok | integer | null |
sources_failed | integer | null |
sources_failed_names | string | null |
partial_result | boolean | null |
Coverage, truncation and upstream health
| Field | Type | Description |
|---|---|---|
efh_features_matched | integer | null |
efh_features_exact_count | integer | null |
efh_read_truncated | boolean | null |
hapc_features_matched | integer | null |
hapc_features_exact_count | integer | null |
hapc_read_truncated | boolean | null |
service_max_record_count | integer | null |
drift_checks_passed | integer | null |
drift_checks_total | integer | null |
Reading the results correctly
nullis notfalse. A null verdict means a source did not answer, so nothing was verified. Checkpartial_resultandsources_failed_namesbefore 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_hapcvshapc_overlap.is_hapcdescribes the EFH row itself and is false everywhere, because the EFH layer carries no HAPC records.hapc_overlapis the real answer, from the separate HAPC layer.- A clear inland row is the right answer.
coastal_contexttells you which kind of clear you have.no_efh_within_context_radius_consistent_with_an_inland_or_unmapped_sitemeans EFH simply is not designated on land. hapc_cfr_citationsis published on 84 of 237 HAPC features, andhapc_data_caveatson 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.
Related actors
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- layerNationwide_EFH_B, 737 EFH polygons.Habitat_Areas_of_Particular_Concern_1/FeatureServer/0- layerNationwide_HAPC_B, 237 HAPC polygons.