Sage-Grouse Habitat Siting Screener — BLM/USFS PHMA/GHMA
Pricing
from $4.40 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
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
| Key | Layer | Features | WGS84 extent (lon / lat) |
|---|---|---|---|
usfs_wy | Wyoming 9-Plan | 4 | -111.404..-103.999 / 40.556..44.840 |
usfs_ut | Utah | 46 | -113.579..-108.699 / 37.388..41.961 |
usfs_nvca | Nevada / California | 4 | -118.881..-113.811 / 37.654..42.415 |
usfs_nwco | NW Colorado | 14 | -107.219..-106.196 / 39.988..40.974 |
usfs_idmt | Idaho / SW Montana | 3 | -116.523..-110.874 / 41.519..46.050 |
blm_co | BLM Greater Sage Grouse HMA | 4 | -109.051..-105.643 / 39.200..41.003 |
blm_or | BLM OR GRSG Polygon Hub | 589 | -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
| Field | Type | Description |
|---|---|---|
assets | array | Points to screen: { "lat": number, "lon": number, "label": string } in WGS84 decimal degrees. |
radiusMiles | integer | When a point is clear, also search this many miles around it (0-50, default 0). True circular search with an exact count. |
maxAssets | integer | Safety cap on assets per run (default 25, max 200). |
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 |
checked_at | string | null |
screen_basis | string | null |
disclaimer | string | null |
error | string | null |
Verdict and audit trail
| Field | Type | Description |
|---|---|---|
in_habitat | boolean | null |
habitat_type | string | null |
habitat_type_label | string | null |
habitat_rank | integer | null |
stipulation_level | string | null |
developability_note | string | null |
primary_selection_basis | string | null |
overlapping_designation_count | integer | null |
overlapping_designations | array | null |
explicit_non_habitat | boolean | null |
non_habitat_sources | string | null |
Governing plan and decision document
| Field | Type | Description |
|---|---|---|
managing_source | string | null |
managing_agency | string | null |
managing_source_url | string | null |
applicable_plan | string | null |
applicable_plan_from_source | string | null |
record_of_decision | string | null |
plan_source_note | string | null |
eis_subregion | string | null |
priority_type | string | null |
population_area | string | null |
occupancy_status | string | null |
preliminary_habitat_code | string | null |
indicator_score | number | null |
Coverage: which sub-region actually maps this point
| Field | Type | Description |
|---|---|---|
coverage_status | string | null |
sources_covering_point | array | null |
sources_covering_point_count | integer | null |
subregions_covering_point | string | null |
Nearby habitat (when radiusMiles > 0)
| Field | Type | Description |
|---|---|---|
nearby_habitat_checked | boolean | null |
nearby_habitat_found | boolean | null |
nearby_habitat_types | array | null |
nearby_habitat_count_exact | integer | null |
nearby_most_restrictive_type | string | null |
nearby_most_restrictive_label | string | null |
nearby_sources | string | null |
radius_miles_used | number | null |
Per-source outcome (null means NOT CHECKED)
| Field | Type | Description |
|---|---|---|
source_status_usfs_wy | string | null |
source_status_usfs_ut | string | null |
source_status_usfs_nvca | string | null |
source_status_usfs_nwco | string | null |
source_status_usfs_idmt | string | null |
source_status_blm_co | string | null |
source_status_blm_or | string | null |
checked_sources | array | null |
source_errors | array | null |
sources_queried | integer | null |
sources_answered | integer | null |
sources_failed | integer | null |
sources_failed_names | string | null |
partial_result | boolean | null |
Truncation and upstream health
| Field | Type | Description |
|---|---|---|
pip_records_truncated | boolean | null |
nearby_records_truncated | boolean | null |
drift_checks_passed | integer | null |
drift_checks_total | integer | null |
Reading the results correctly
nullis notfalse. A nullin_habitatordevelopability_notemeans a source did not answer, so nothing was verified. Checkpartial_resultandsources_failed_namesbefore acting on a row.coverage_statusis as important asin_habitat.outside_every_mapped_subregionmeans 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: trueis stronger than a plain clear. It means a source affirmatively maps the point as outside habitat, rather than simply not covering it.primary_selection_basisshows 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:
| Columns | Populating 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.
Related actors
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.