Sage-Grouse Habitat Siting Screener — BLM/USFS PHMA/GHMA avatar

Sage-Grouse Habitat Siting Screener — BLM/USFS PHMA/GHMA

Pricing

from $4.40 / 1,000 results

Go to Apify Store
Sage-Grouse Habitat Siting Screener — BLM/USFS PHMA/GHMA

Sage-Grouse Habitat Siting Screener — BLM/USFS PHMA/GHMA

Point-in-polygon screen of coordinates against seven federal Greater Sage-Grouse Habitat Management Area sources (BLM/USFS: WY, UT, NV/CA, CO, ID/MT, OR) for western wind, solar, oil and gas, and transmission siting. Returns habitat tier, managing agency, and permitting stipulation flags.

Pricing

from $4.40 / 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

4 days ago

Last modified

Share

BLM/USFS Greater Sage-Grouse Siting Screener

Batch sage-grouse habitat screening by coordinate. Give it a list of lat/lon sites and it returns, per site, whether the point falls inside a mapped Greater Sage-Grouse Habitat Management Area, which designation tier applies (PHMA / IHMA / GHMA and the rest), the governing Record of Decision or Resource Management Plan Amendment, an auditable explanation of how the most-restrictive-wins rule chose that answer, plain-language developability guidance, and - critically - which of the seven federal sub-region services actually answered and whether the point is even inside a mapped sub-region at all.

There is no single national BLM sage-grouse layer. This actor federates seven authoritative sub-region Record-of-Decision services and rolls them into one verdict.

Informational screen, not a determination. This is not an official BLM or USFS land-use decision. Confirm any siting, right-of-way or permitting decision with the relevant BLM Field Office or USFS Ranger District and the governing Resource Management Plan.

Who it is for

  • Oil, gas and mining operators screening lease blocks and pad locations before a surface-use plan.
  • Wind, solar and transmission developers routing around Priority Habitat before spending on survey.
  • Right-of-way and linear-infrastructure teams comparing candidate alignments across state lines.
  • Environmental and NEPA consultants who need the designation, the tier, and the plan citation in one row.
  • Land and mineral analysts scoring a portfolio for permitting friction.

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

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

1. A "Non-Habitat" polygon was being reported as a habitat HIT. The USFS Nevada/California service publishes a 378-ring polygon whose own category is the literal string Non-Habitat. v1.0 treated any non-null category as a hit, so a point inside it came back in_habitat: true, habitat_type: "Non-Habitat", with an "unrecognized designation" label and an "unknown" stipulation level. Reproducible live at 38.889751, -117.359478. That is a false positive on the flagship flag - it would send a developer into a BLM consultation the source says is not needed. v1.1 treats these as an explicit statement of absence: in_habitat: false, explicit_non_habitat: true.

2. The live Utah designation was not in the vocabulary. USFS Utah publishes Occupied - Anthro Mountain; v1.0 only had the alias Anthro Mtn. The real value was therefore unrecognised, which meant an unknown label, an unknown stipulation level, and - because unknown codes are sent to the back of the priority order - it lost every most-restrictive-wins comparison. Reproducible live at 39.933747, -110.433488. Added, ranked, and the vocabulary is now closed and asserted at runtime: an unknown designation fails the run rather than being silently ranked last.

3. A total outage used to emit a billable prose clear. The old row template initialised in_habitat: false, overlapping_designation_count: 0 and a developability_note that read, in plain English, "No queried Greater Sage-Grouse Habitat Management Area intersects this point." Nothing overwrote them when a source failed, and checked_sources listed all seven regardless of whether any had answered. A run in which every service errored produced seven confident, billable, wrong clears. Now every source carries its own source_status_<key>, checked_sources lists only sources that actually answered, and the verdict is null - never false - when any source did not answer.

4. A clear outside every mapped sub-region is now labelled UNMAPPED. Greater sage-grouse range includes parts of Montana, Washington and the Dakotas that none of these seven services maps. Each source's live WGS84 extent is now measured and asserted, and every row reports coverage_status, sources_covering_point and subregions_covering_point. Denver, the old "clear control", is in fact outside every mapped extent - which is a different and more honest answer than "clear". Given this actor's history (a service described as national turned out to be Colorado-only), knowing which sub-region answered is the whole point.

5. The nearby search was a bounding box capped at 25 records. A bounding box overshoots a circle by up to 27% at the corners, so "habitat within 10 miles" could include habitat 14 miles away, and the 25-record cap truncated silently. v1.1 uses a true circular search (distance + units) with full paging and an exact server-side count, and reports nearby_records_truncated if a read ever comes up short.

6. Nine columns were fetched on every request and thrown away. Recovered: Prioi_Type (Wyoming: proposed vs existing core), EIS, Status and Population (NW Colorado occupancy and population area), Habitat (preliminary PPH/PGH code), EIS_HAB and Source (BLM Colorado Record of Decision lineage), INDICATOR_SCORE, and PLANID (the BLM Oregon plan name).

7. 67 live drift assertions run before any billable row - layer name, geometry type, habitat field, feature count band, closed vocabulary and WGS84 extent for each of the seven services, plus three positive canaries (including one for each defect above) and a negative control. Any failure stops the run and bills nothing.

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

The seven sources, verified live 2026-08-01

KeyLayerFeaturesWGS84 extent (lon / lat)
usfs_wyWyoming 9-Plan4-111.404..-103.999 / 40.556..44.840
usfs_utUtah46-113.579..-108.699 / 37.388..41.961
usfs_nvcaNevada / California4-118.881..-113.811 / 37.654..42.415
usfs_nwcoNW Colorado14-107.219..-106.196 / 39.988..40.974
usfs_idmtIdaho / SW Montana3-116.523..-110.874 / 41.519..46.050
blm_coBLM Greater Sage Grouse HMA4-109.051..-105.643 / 39.200..41.003
blm_orBLM OR GRSG Polygon Hub589-121.323..-117.026 / 41.992..45.188

Feature counts are low because these are dissolved multipart polygons, not parcel-level records. Both counts and extents are asserted at runtime.

Example input

{
"assets": [
{ "lat": 42.985, "lon": -109.865, "label": "Pinedale Anticline, WY (Priority Habitat)" },
{ "lat": 38.889751, "lon": -117.359478, "label": "Nevada mapped Non-Habitat" },
{ "lat": 39.7392, "lon": -104.9903, "label": "Denver CO (outside every mapped sub-region)" }
],
"radiusMiles": 0,
"maxAssets": 25
}

Input fields

FieldTypeDescription
assetsarrayPoints to screen: { "lat": number, "lon": number, "label": string } in WGS84 decimal degrees.
radiusMilesintegerWhen a point is clear, also search this many miles around it (0-50, default 0). True circular search with an exact count.
maxAssetsintegerSafety cap on assets per run (default 25, max 200).

Output fields

Every field the actor declares is listed below.

Site identity and provenance

FieldTypeDescription
asset_labelstringnull
asset_latnumbernull
asset_lonnumbernull
checked_atstringnull
screen_basisstringnull
disclaimerstringnull
errorstringnull

Verdict and audit trail

FieldTypeDescription
in_habitatbooleannull
habitat_typestringnull
habitat_type_labelstringnull
habitat_rankintegernull
stipulation_levelstringnull
developability_notestringnull
primary_selection_basisstringnull
overlapping_designation_countintegernull
overlapping_designationsarraynull
explicit_non_habitatbooleannull
non_habitat_sourcesstringnull

Governing plan and decision document

FieldTypeDescription
managing_sourcestringnull
managing_agencystringnull
managing_source_urlstringnull
applicable_planstringnull
applicable_plan_from_sourcestringnull
record_of_decisionstringnull
plan_source_notestringnull
eis_subregionstringnull
priority_typestringnull
population_areastringnull
occupancy_statusstringnull
preliminary_habitat_codestringnull
indicator_scorenumbernull

Coverage: which sub-region actually maps this point

FieldTypeDescription
coverage_statusstringnull
sources_covering_pointarraynull
sources_covering_point_countintegernull
subregions_covering_pointstringnull

Nearby habitat (when radiusMiles > 0)

FieldTypeDescription
nearby_habitat_checkedbooleannull
nearby_habitat_foundbooleannull
nearby_habitat_typesarraynull
nearby_habitat_count_exactintegernull
nearby_most_restrictive_typestringnull
nearby_most_restrictive_labelstringnull
nearby_sourcesstringnull
radius_miles_usednumbernull

Per-source outcome (null means NOT CHECKED)

FieldTypeDescription
source_status_usfs_wystringnull
source_status_usfs_utstringnull
source_status_usfs_nvcastringnull
source_status_usfs_nwcostringnull
source_status_usfs_idmtstringnull
source_status_blm_costringnull
source_status_blm_orstringnull
checked_sourcesarraynull
source_errorsarraynull
sources_queriedintegernull
sources_answeredintegernull
sources_failedintegernull
sources_failed_namesstringnull
partial_resultbooleannull

Truncation and upstream health

FieldTypeDescription
pip_records_truncatedbooleannull
nearby_records_truncatedbooleannull
drift_checks_passedintegernull
drift_checks_totalintegernull

Reading the results correctly

  • null is not false. A null in_habitat or developability_note means a source did not answer, so nothing was verified. Check partial_result and sources_failed_names before acting on a row.
  • coverage_status is as important as in_habitat. outside_every_mapped_subregion means no federal sub-region service maps that point - it is unmapped, not surveyed and clear. Sage-grouse range extends well beyond the seven mapped sub-regions.
  • explicit_non_habitat: true is stronger than a plain clear. It means a source affirmatively maps the point as outside habitat, rather than simply not covering it.
  • primary_selection_basis shows the work. When several designations overlap, it names the winner, its rank, everything it beat, and the full ranking order, so the most-restrictive-wins rule can be audited rather than trusted.
  • Leks are deliberately not screened. None of these seven federal services publishes lek locations, and state wildlife agencies restrict them. Inventing a lek-proximity field from a source that does not carry one would be a fabricated answer. Lek buffers remain a real permitting factor - get them from the state agency.

Inputs that populate the sparser columns

Several columns come from a single source and are therefore null unless the hit came from that source. Verified live 2026-08-01:

ColumnsPopulating input
priority_type, eis_subregion{ "lat": 42.985, "lon": -109.865 } (Wyoming, Proposed Core)
record_of_decision, plan_source_note, indicator_score{ "lat": 41.0002, "lon": -108.996136 } (BLM Colorado, NWCO_GH_ROD_2020)
occupancy_status, population_area, preliminary_habitat_code{ "lat": 40.15625, "lon": -106.250525 } (NW Colorado, Occupied / Middle Park / PGH)
applicable_plan_from_source{ "lat": 42.5145, "lon": -120.3821 } (BLM Oregon, 2021 Greater Sage-grouse Land Use Plan Amendments)
nearby_*any clear point with radiusMiles above 0, e.g. { "lat": 43.30, "lon": -118.90 } with radiusMiles: 25 (40 polygons within range)
explicit_non_habitat, non_habitat_sources{ "lat": 38.889751, "lon": -117.359478 }

Each of these mappings is pinned by an offline fixture so it cannot silently rot. sources_failed_names, source_errors and error are null on a healthy run - that is good news, not a dead column.

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 result. It chains with the rest of the energy-siting shelf: pass the same coordinates to the BLM mining-claims, energy-corridor, critical-habitat and EPA nonattainment screeners and join on asset_label.

Typical agent prompt: "Screen these eight well-pad locations for Greater Sage-Grouse habitat, tell me which fall in Priority Habitat, and flag any that no federal sub-region maps at all."

Pricing

Pay per result: $8 per 1,000 result rows ($0.008 per screened site). One row per asset, whether flagged, clear or unmapped. Graduated discounts apply on paid Apify plans (Bronze 20% / Silver 30% / Gold 45% / Platinum 60% / Diamond 70%).

A run that cannot verify the seven services are healthy, or in which every asset failed, fails and bills nothing.

FAQ

Why seven services instead of one national layer? Because no national layer exists. Greater Sage-Grouse habitat was designated sub-region by sub-region through separate Records of Decision, and the data is published the same way. A service listed in some directories as national turned out to be Northwest-Colorado-only - which is precisely why every row now reports which sub-region extents contain the point.

My site came back clear. Is it really clear? Check coverage_status. inside_a_mapped_subregion means all seven services answered and none of them maps habitat there. outside_every_mapped_subregion means the point is beyond the mapped area entirely, which is a much weaker statement.

What does the stipulation level mean? It is a relative indication of permitting burden, not a legal test. high (PHMA) implies seasonal timing limitations, surface-disturbance density caps, lek noise thresholds and net-conservation-gain obligations. The developability_note spells out what the tier normally carries.

Why did my run fail with "Upstream drift detected"? A live assertion about one of the seven services failed - a renamed layer, a collapsed feature count, a shrunken extent, or an unknown habitat designation. The alternative would have been to bill you for a confident wrong answer. The message names the exact check and the exact service.

Does this include leks? No, deliberately. See "Reading the results correctly" above.

Same coordinate in, same asset_label out:

  • Energy Corridor Section 368 Screener - designated federal energy corridors.
  • BLM Mining Claims - active claims on the same federal surface.
  • USFWS Critical Habitat Screener - ESA-listed species habitat.
  • EPA Nonattainment Air Permit Screener - NAAQS status for the same site.
  • Interconnection Queue Tracker - what is already queued nearby.
  • Site Due Diligence Bundle - 20 layers in a single call.