# FWS Critical Habitat Screener — ESA Section 7 Site Check (`malonestar/fws-critical-habitat-screener`) Actor

Check coordinates against live USFWS Critical Habitat polygons. Per point: in/near designated habitat, species, Final vs Proposed status, Federal Register citation, ESA Section 7 consultation flag. MCP-ready. $0.01 per asset check.

- **URL**: https://apify.com/malonestar/fws-critical-habitat-screener.md
- **Developed by:** [Kyle Maloney](https://apify.com/malonestar) (community)
- **Categories:** Agents, Developer tools, Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## FWS Critical Habitat Screener — ESA Section 7 Site Check

Screen any set of coordinates against **live USFWS Critical Habitat** polygons
(Final + Proposed) with a single API call per point. Get a grounded yes/no —
in or near designated critical habitat, which species, Final vs Proposed
status, listing status (Endangered/Threatened), the Federal Register citation,
and an **ESA Section 7 consultation flag** — with a source citation on every row.

Data source: U.S. Fish & Wildlife Service Critical Habitat ArcGIS FeatureServer
(`services.arcgis.com/QVENGdaPbd4LUkLV/.../USFWS_Critical_Habitat`), queried
live via server-side spatial (point + radius buffer) intersection. No scraping,
no API key required.

### Who it's for
- **Environmental consultants & ESA/NEPA compliance teams** doing early-stage
  site screening before a formal Biological Assessment.
- **Real estate developers & land acquisition teams** de-risking parcels before
  purchase or entitlement — a critical-habitat hit can add months of federal
  consultation to a project timeline.
- **Renewable energy & infrastructure siting teams** (solar, wind, pipeline,
  transmission) screening candidate routes/sites at scale.
- **Title companies, lenders, and due-diligence platforms** wanting an
  automatable ESA red-flag check alongside flood/wetland/zoning screens.
- **AI agents / MCP tool chains** doing automated environmental site
  diligence as one step in a larger permitting or acquisition workflow.

### Example input
```json
{
  "assets": [
    { "lat": 30.2649, "lon": -97.7714, "label": "Zilker Park, Austin TX" },
    { "lat": 34.05, "lon": -118.24, "label": "Los Angeles office" }
  ],
  "radiusMiles": 1,
  "includeProposed": true,
  "maxAssets": 500
}
````

### Output fields (one row per hit; one CLEAR row for a point with no hits)

| Field | Description |
|---|---|
| `asset_label` | Your name for the screened point, echoed back |
| `asset_lat` / `asset_lon` | Coordinates screened |
| `radius_miles` | Buffer radius used for the spatial query |
| `in_critical_habitat` | true/false/null (null = ERROR row) |
| `species_comname` / `species_sciname` | Species whose habitat this point intersects |
| `spcode` | USFWS internal species code |
| `habitat_status` | `Final` (legally designated) or `Proposed` |
| `listing_status` | `Endangered` or `Threatened` |
| `fedreg` | Federal Register citation for the designation |
| `pubdate` | Publication date (YYYY-MM-DD) |
| `unitname` | USFWS habitat unit name (often a generic placeholder — USFWS doesn't always populate a real name) |
| `esa_consultation_flag` | true when this point may trigger ESA Section 7 consultation |
| `checked_at` | UTC timestamp of the check |
| `error` | Populated only on invalid-input rows |
| `disclaimer` / `source_url` | Advisory notice + exact FeatureServer queried |

### Use as an MCP tool

This actor is discoverable and callable by AI agents (Claude, Cursor, etc.)
via [mcp.apify.com](https://mcp.apify.com). Pass an array of `{lat, lon, label}`
points and get back a grounded, cited in/near-critical-habitat verdict per
point — clean input/output for chaining into larger site-diligence or
permitting-research agent workflows.

### FAQ

**Does this actor need an API key?** No — the USFWS ArcGIS service is
public and keyless.

**Does "no hit" mean the site is ESA-clear?** No. It means no *designated*
critical habitat intersects your search radius in USFWS's current dataset.
It does not rule out occupied habitat, other regulated species, wetlands, or
state-level protections. Always confirm with
[USFWS IPaC](https://ipac.ecosphere.fws.gov) and/or formal Section 7
consultation before relying on this for permitting or transaction decisions.

**What's the difference between Final and Proposed critical habitat?**
Final designations are legally in effect. Proposed designations are pending
public comment and may change or be withdrawn — useful for forward-looking
risk screening but not yet binding.

**How is pricing calculated?** $10 per 1,000 result rows ($0.01/row) — one
row per species hit, or one row per clear point. No charge for actor start.

**Can I screen a large portfolio?** Yes — pass up to 2,000 points per run
via `maxAssets`; each point queries the live ArcGIS service in sequence.

# Actor input Schema

## `assets` (type: `array`):

List of coordinates to screen against live USFWS Critical Habitat polygons. Each item is an object: {"lat": \<number -90..90>, "lon": \<number -180..180>, "label": "<your name for the asset>"}. Each hit (species intersecting the radius) produces one billable dataset row; a clear point produces one billable row too. Invalid points produce an ERROR row and the run continues.

## `radiusMiles` (type: `number`):

Buffer radius in statute miles used for the server-side spatial intersect query around each point. Smaller radius = tighter/faster site-level check; larger radius = wider nearby-habitat scan. Default 1.

## `includeProposed` (type: `boolean`):

Also query the Proposed Critical Habitat layer (designations pending finalization) in addition to Final. Proposed habitat does not yet carry the same legal weight as Final but is useful for forward-looking risk screening. Default true.

## `maxAssets` (type: `integer`):

Safety cap on the number of assets screened per run. Assets beyond this cap are skipped with a warning.

## Actor input object example

```json
{
  "assets": [
    {
      "lat": 30.2649,
      "lon": -97.7714,
      "label": "Zilker Park, Austin TX"
    },
    {
      "lat": 34.05,
      "lon": -118.24,
      "label": "Los Angeles office"
    }
  ],
  "radiusMiles": 1,
  "includeProposed": true,
  "maxAssets": 500
}
```

# Actor output Schema

## `results` (type: `string`):

The default dataset with one critical-habitat row per asset check.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "assets": [
        {
            "lat": 30.2649,
            "lon": -97.7714,
            "label": "Zilker Park, Austin TX"
        },
        {
            "lat": 34.05,
            "lon": -118.24,
            "label": "Los Angeles office"
        }
    ],
    "radiusMiles": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("malonestar/fws-critical-habitat-screener").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "assets": [
        {
            "lat": 30.2649,
            "lon": -97.7714,
            "label": "Zilker Park, Austin TX",
        },
        {
            "lat": 34.05,
            "lon": -118.24,
            "label": "Los Angeles office",
        },
    ],
    "radiusMiles": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("malonestar/fws-critical-habitat-screener").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "assets": [
    {
      "lat": 30.2649,
      "lon": -97.7714,
      "label": "Zilker Park, Austin TX"
    },
    {
      "lat": 34.05,
      "lon": -118.24,
      "label": "Los Angeles office"
    }
  ],
  "radiusMiles": 1
}' |
apify call malonestar/fws-critical-habitat-screener --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=malonestar/fws-critical-habitat-screener",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "FWS Critical Habitat Screener — ESA Section 7 Site Check",
        "description": "Check coordinates against live USFWS Critical Habitat polygons. Per point: in/near designated habitat, species, Final vs Proposed status, Federal Register citation, ESA Section 7 consultation flag. MCP-ready. $0.01 per asset check.",
        "version": "1.0",
        "x-build-id": "MJpi9SIhr1i7ooYh9"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/malonestar~fws-critical-habitat-screener/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-malonestar-fws-critical-habitat-screener",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/malonestar~fws-critical-habitat-screener/runs": {
            "post": {
                "operationId": "runs-sync-malonestar-fws-critical-habitat-screener",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/malonestar~fws-critical-habitat-screener/run-sync": {
            "post": {
                "operationId": "run-sync-malonestar-fws-critical-habitat-screener",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "assets": {
                        "title": "Assets to screen",
                        "type": "array",
                        "description": "List of coordinates to screen against live USFWS Critical Habitat polygons. Each item is an object: {\"lat\": <number -90..90>, \"lon\": <number -180..180>, \"label\": \"<your name for the asset>\"}. Each hit (species intersecting the radius) produces one billable dataset row; a clear point produces one billable row too. Invalid points produce an ERROR row and the run continues."
                    },
                    "radiusMiles": {
                        "title": "Search radius (miles)",
                        "minimum": 0.1,
                        "maximum": 50,
                        "type": "number",
                        "description": "Buffer radius in statute miles used for the server-side spatial intersect query around each point. Smaller radius = tighter/faster site-level check; larger radius = wider nearby-habitat scan. Default 1.",
                        "default": 1
                    },
                    "includeProposed": {
                        "title": "Include Proposed critical habitat",
                        "type": "boolean",
                        "description": "Also query the Proposed Critical Habitat layer (designations pending finalization) in addition to Final. Proposed habitat does not yet carry the same legal weight as Final but is useful for forward-looking risk screening. Default true.",
                        "default": true
                    },
                    "maxAssets": {
                        "title": "Max asset checks",
                        "minimum": 1,
                        "maximum": 2000,
                        "type": "integer",
                        "description": "Safety cap on the number of assets screened per run. Assets beyond this cap are skipped with a warning.",
                        "default": 500
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
