BLM Solar Siting Screener — 2024 Western Solar Plan DLA Check avatar

BLM Solar Siting Screener — 2024 Western Solar Plan DLA Check

Pricing

from $4.40 / 1,000 results

Go to Apify Store
BLM Solar Siting Screener — 2024 Western Solar Plan DLA Check

BLM Solar Siting Screener — 2024 Western Solar Plan DLA Check

Screens coordinates against the BLM Solar PEIS analysis: exclusion areas, Solar Energy Zones, DRECP focus and variance lands. Returns the specific exclusion drivers, transmission and slope screens, the plan stage the data actually represents, and a per-layer status so a clear is never a guess.

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

3 days ago

Last modified

Share

BLM Solar Siting Area Screener - Western Solar Plan

Screen project coordinates against BLM's Solar Programmatic EIS spatial analysis. For each site you get: whether it is in an exclusion area where utility-scale solar is barred, whether it is in a Solar Energy Zone / Designated Leasing Area, whether it is in a DRECP Development Focus Area or variance-process land, the specific exclusion drivers BLM recorded, the transmission-proximity and slope screens, and a per-layer status so a "clear" is never a guess.

Informational screening only. Not an official BLM land-use or solar-eligibility determination and not a land survey.


Vintage: read this before comparing to another tool

The national exclusion layer is BLM's Proposed Plan analysis from the Final Solar PEIS. Its own layer description reads "the analysis data for the Proposed Plan of the Bureau of Land Management Final Solar Programmatic Environmental Impact Statement", and its service metadata reports a last edit of 2024-08-21 - four months before the Western Solar Plan Record of Decision (December 2024). BLM publishes no national ROD-stage replacement on this ArcGIS org (checked live 2026-08-01 across all 697 services; the only ROD-stage service is BLM_CA_DRECP_ROD, which is California-only).

Earlier versions of this actor described its output as the "2024 Western Solar Plan (Approved RMP Amendments / Record of Decision, December 2024)". That was wrong about the data. Every row now carries plan_stage, exclusion_layer_last_updated (read live from the service on every run) and exclusion_layer_vintage_note, and a live drift assertion fails the run if BLM republishes the layer or adds a value to the ProposedPlan vocabulary - which is exactly what a ROD refresh would look like.

ProposedPlan is a closed two-value vocabulary, verified live: Excluded (9,749,915 units) and Other (216,121 units). "Other" means the analysis did not exclude the unit; it is not a BLM statement that the unit is available for application. The raw value is reported verbatim in proposed_plan_class.

What each run asserts before it bills you

Every run, before a single row is emitted:

  • all four layers resolve and still publish the fields the mapper reads
  • each layer row count is inside a measured band (a re-vintage or truncation fails)
  • each layer own maxRecordCount is read and sent as resultRecordCount, so truncation is detectable
  • ProposedPlan still has exactly the two published values
  • a positive canary (Antonito Southeast SEZ, CO) still returns a polygon
  • a negative control (downtown Denver) returns nothing from all four layers
  • coordinates pass a degree-magnitude check

If any of that fails, the run fails loudly and bills nothing.

Who this is for

  • Utility-scale solar developers and land teams ranking candidate parcels on BLM land.
  • Renewable energy project finance and diligence teams checking siting risk.
  • Right-of-way / permitting consultants preparing an application.
  • GIS and land analysts batch-screening a portfolio of sections.
  • AI agents wiring a coordinate to a siting classification over MCP.

Example input

{
"assets": [
{ "lat": 37.0168, "lon": -105.9491, "label": "Antonito Southeast SEZ (CO)" },
{ "lat": 36.56, "lon": -114.92, "label": "Dry Lake area (NV)" },
{ "lat": 39.7392, "lon": -104.9903, "label": "Downtown Denver (CO) - off-BLM control" }
],
"maxAssets": 500
}
InputTypeNotes
assetsarray (required){ "lat": number, "lon": number, "label": string }. One billable row per asset. Omitting it fails the run before anything is billed.
maxAssetsintegerSafety cap, default 500, max 5000.

null is not false

false means the layer answered and the answer was negative. null means the layer did not answer, so nothing is being asserted. Each of the four BLM layers records its own outcome (exclusion_layer_status, dla_layer_status, variance_layer_status, dfa_layer_status, plus layers_failed, layer_errors and partial_result), and solar_developability_verdict reads NO DETERMINATION rather than a clear whenever a contributing layer is unavailable. If no asset could be classified the run fails and nothing is billed.

Output fields

One row per screened asset. Every field below is emitted on every row.

FieldTypeDescription
asset_labelstringCaller-supplied label (or asset_N).
asset_latnumberWGS84 latitude of the screened point.
asset_lonnumberWGS84 longitude of the screened point.
solar_developability_verdictstringPlain-language classification. Reads NO DETERMINATION, rather than a clear, whenever a contributing BLM layer did not answer.
in_designated_leasing_areabooleanTrue when the point falls inside a BLM Solar Energy Zone / Designated Leasing Area polygon. Null when that layer did not answer - never a confident false in that case.
dla_namestringName of the Designated Leasing Area / Solar Energy Zone, if any.
dla_statestringBLM state office administering the DLA.
dla_statusstringDevelopable vs Non-developable sub-area within the DLA.
in_exclusion_areabooleanTrue when the BLM Solar PEIS analysis classes the intersecting unit as Excluded, meaning utility-scale solar development is barred there under the mapped analysis. Null when the exclusion layer did not answer.
exclusion_reason_codesarrayBLM two-digit exclusion category codes that apply to the intersecting unit. Null when the point is not excluded or the exclusion layer did not answer.
exclusion_reasonsarrayPlain-language BLM exclusion reasons decoded from exclusion_reason_codes.
in_variance_areabooleanTrue when the point falls in DRECP variance-process land. Null when that layer did not answer.
variance_acresnumberAcreage of the intersecting variance polygon.
in_development_focus_areabooleanTrue when the point falls in a DRECP Development Focus Area. Null when that layer did not answer.
dfa_acresnumberAcreage of the intersecting Development Focus Area.
dfa_technologystringTechnologies allowed in the DFA.
within_15mi_transmissionbooleanBLM flag: the intersecting analysis unit is within 15 miles of an existing or planned transmission line. Null when the exclusion layer did not answer.
slope_ge_10pctbooleanBLM flag: the intersecting analysis unit has slopes of 10 percent or steeper. Null when the exclusion layer did not answer.
on_blm_planning_area_landbooleanTrue when the point intersected at least one BLM Solar PEIS analysis unit or solar designation polygon. False only when every layer answered and none matched. Null when a layer did not answer.
statestringState the point falls in (from BLM data).
administrative_unitstringAdministering BLM field office.
area_acresnumberAcreage of the intersecting exclusion-analysis polygon.
plan_refstringThe BLM plan and the exact spatial analysis stage behind this row.
citationstringFull source citation including the ArcGIS services queried.
disclaimerstringInformational-use disclaimer, including the Proposed-Plan vintage caveat.
source_urlsobjectThe BLM ArcGIS FeatureServer layers queried.
layer_errorsarrayError messages from any BLM layer that did not answer, one entry per failing layer; null when every layer answered.
checked_atstringISO 8601 timestamp of the screen.
errorstringError message for an invalid coordinate; null otherwise. Per-layer failures are reported in the *_layer_status, layers_failed and layer_errors columns, not here.
plan_stagestringWhich stage of the BLM Solar PEIS the mapped exclusion analysis represents. The national layer is Proposed-Plan stage (published August 2024), not the December 2024 Record of Decision - BLM publishes no national ROD-stage replacement.
exclusion_layer_vintage_notestringPlain-language warning that exclusion boundaries are Proposed-Plan stage and should be confirmed with the administering BLM office.
exclusion_layer_last_updatedstringDate the BLM exclusion analysis layer was last edited, read live from the service metadata on every run rather than hard-coded.
proposed_plan_classstringThe ProposedPlan value BLM publishes for the intersecting analysis unit, verbatim. The published vocabulary is Excluded or Other; Other means the analysis did not exclude the unit, which is not the same as BLM declaring it available.
exclusion_criteria_countintegerBLM ExCount - how many distinct exclusion categories apply to the intersecting unit. Null when the exclusion layer did not answer.
exclusion_driver_fieldsarrayThe specific BLM exclusion-driver columns set to Y on the intersecting unit (for example e14d_wsa, e11_vrm_i_ii_az). The layer publishes about 180 of these and previous versions requested none of them.
exclusion_driver_labelsarrayReadable labels derived from the exclusion driver field names, each prefixed with its BLM exclusion category number. Derived, not published by BLM - exclusion_driver_fields carries the authoritative names.
unknown_exclusion_codesarrayExclusion category codes present in the BLM ExList that are not in the published category list this actor decodes. Null when every code was recognised.
transmission_driver_fieldsarrayBLM context columns showing which existing or planned transmission lines put this unit within 15 miles.
slope_driver_fieldsarrayBLM context columns showing which state slope layer flagged this unit at 10 percent or steeper.
corridor_driver_fieldsarrayBLM context columns showing whether the unit is in, or within 15 miles of, a designated Section 368 energy corridor.
within_15mi_designated_368_corridorbooleanTrue when BLM flags the unit as within 15 miles of a designated Section 368 energy corridor. Null when the exclusion layer did not answer.
dla_developablebooleanTrue when the intersecting Solar Energy Zone polygon carries a developable status. Null when the SEZ layer did not answer.
dla_commentsstringComment text BLM publishes on the intersecting Solar Energy Zone polygon.
dla_namesarrayEvery distinct Solar Energy Zone name intersecting the point, since a point can fall in more than one fragmented polygon.
variance_technologystringTechnology the DRECP variance-process land applies to.
variance_surface_occupancystringSurface-occupancy condition BLM publishes on the DRECP variance polygon.
sez_flag_on_analysisbooleanThe independent Solar Energy Zone flag carried on the BLM exclusion analysis unit itself, useful as a cross-check against the separate SEZ polygon layer. Null when the exclusion layer did not answer.
dfa_flag_on_analysisbooleanThe independent DRECP Development Focus Area flag carried on the BLM exclusion analysis unit. Null when the exclusion layer did not answer.
on_blm_surfacebooleanBLM surface-ownership flag on the intersecting analysis unit. Null when the exclusion layer did not answer.
exclusion_layer_statusstringOutcome of the BLM exclusion analysis query: ok, unavailable, or not_applicable.
dla_layer_statusstringOutcome of the BLM Solar Energy Zone query: ok, unavailable, or not_applicable.
variance_layer_statusstringOutcome of the DRECP variance-land query: ok, unavailable, or not_applicable.
dfa_layer_statusstringOutcome of the DRECP Development Focus Area query: ok, unavailable, or not_applicable.
layers_failedarrayNames of the BLM layers that did not answer for this asset. Null when every layer answered. Any classification backed by a failed layer is reported as null, never as a negative.
partial_resultbooleanTrue when at least one BLM layer did not answer for this asset, so the row is not a complete screen.

Columns that are null on a healthy run

error, layers_failed, layer_errors and unknown_exclusion_codes are null when everything worked - that is the good news, not a dead column. error is populated by an invalid coordinate (for example {"lat": 999, "lon": -105}); layers_failed and layer_errors by a BLM outage; unknown_exclusion_codes only if BLM adds an exclusion category. dla_comments, variance_surface_occupancy and the DRECP columns are null off a DRECP hit - use a California Desert coordinate to populate them. All are pinned by offline fixtures so they cannot rot.

Sources

LayerWhat it providesRows (2026-08-01)
BLM_National_Final_Solar_PEIS_Proposed_Plan_Analysis/8National exclusion analysis with about 180 named exclusion-driver columns, transmission and slope screens, Section 368 corridor context9,966,036
Energy_Designations/10BLM Solar Energy Zone / Designated Leasing Area polygons153
Energy_Designations/12DRECP Development Focus Areas171
Energy_Designations/13DRECP variance-process lands7

All keyless, all on the BLM ArcGIS Online org KbxwQRRfWyEYLgp4.

Use as an MCP tool

Available to AI agents through mcp.apify.com. Input is a plain list of coordinates; every output field carries a description. An agent should read partial_result before treating a negative as final, and should quote plan_stage whenever it reports an exclusion result.

Pricing

Pay per result: $8 per 1,000 rows (one row per screened site), with graduated discounts on paid Apify plans. A failed run emits no rows and bills no result events.

FAQ

Is this the Record of Decision map? No, and the actor says so on every row. BLM has not published a national ROD-stage spatial layer; this is the Proposed Plan analysis from the Final PEIS (August 2024).

What does proposed_plan_class = "Other" mean? BLM analysis did not exclude that unit. It is not a statement that the unit is available for a right-of-way application - the transmission-proximity and slope screens and field-office review also apply, and both screens are reported (within_15mi_transmission, slope_ge_10pct).

Why does a site get several exclusion reasons? Fragmented analysis units can overlap a point, and a unit can trip several categories. Codes are unioned and the most restrictive answer wins; exclusion_driver_fields names each specific BLM column.

My point is on private land. The verdict will say it is outside the analysis footprint. The Western Solar Plan applies only to BLM-administered public land in AZ, CA, CO, ID, MT, NM, NV, OR, UT, WA and WY.

What happens during a BLM outage? The affected layer is unavailable, its flag is null, partial_result is true, and the verdict reads NO DETERMINATION. If nothing could be classified the run fails and bills nothing.

  • Energy Corridor Section 368 Screener - federal energy right-of-way corridors.
  • IRA Energy Community Bonus Screener - 10% ITC/PTC adder eligibility.
  • HIFLD Grid Proximity Screener - nearest transmission line, substation and serving utility.
  • BLM Sage Grouse Siting Screener - PHMA/GHMA habitat constraints.
  • Site Due Diligence Bundle - 20 environmental and siting layers in one call.

Informational screening only. Not an official BLM determination and not a land survey. Confirm with the administering BLM field or state office before any siting, leasing or right-of-way decision.