# Environmental Due Diligence Bundle: 20-Layer Site Scorecard (`malonestar/site-due-diligence-bundle`) Actor

Environmental due diligence at $0.10 per property - one row per site, not per layer. Lat/lon plus radius returns a go/caution/no-go fatal-flaw verdict and 0-100 score across 20 federal layers: EPA contamination, FEMA flood, NWI wetlands, ESA habitat, karst, landslide, levee, dams, CBRS, pipelines.

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

## Pricing

from $55.00 / 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Environmental Due Diligence Bundle - 20-Layer Site Fatal-Flaw Scorecard

Takes a coordinate and a radius and returns **one site-screening scorecard** that runs twenty **environmental due diligence**, hazard, regulatory and opportunity checks at once, instead of calling twenty separate actors. Every site comes back as a single row with a **go / caution / no-go verdict**, a **0–100 site score**, a **coverage percentage**, a rolled-up `fatal_flaw_count`, a `flags` list, an `opportunities` list and a plain-language summary.

Built as a fast **environmental site screening API** for **site selection due diligence**, **Phase I ESA database review**, **fatal flaw analysis** and **land constraint analysis** — the pre-screen you run before you pay for the real studies.

### What it screens (20 layers)

| Layer (`layers` key) | Source | Result type |
|---|---|---|
| `epa_contamination` | EPA ECHO — RCRA hazardous-waste handlers and TRI reporters within the radius | flag |
| `flood_risk` | FEMA National Risk Index (county) via the FCC block geocoder | flag on high inland/coastal flood risk |
| `critical_habitat` | USFWS ESA Critical Habitat, Final + Proposed | flag (**ESA Section 7 consultation**) |
| `protected_lands` | USGS PAD-US protected/conservation lands (point-in-polygon) | flag |
| `seismic_design` | USGS **ASCE 7-22** seismic design web service (IBC 2024 edition) | flag on high Seismic Design Category / site-specific study |
| `wildfire_exposure` | NIFC WFIGS active perimeters and incidents | flag when in or near an active fire |
| `karst_terrain` | USGS CONUS\_Karst compilation (OFR 2014-1156), 7 layers | flag — `Elevated` or `Moderate` tier |
| `landslide_hazard` | USGS US Landslide Inventory (polygons + points) | flag |
| `levee_proximity` | USACE National Levee Database Leveed Areas | flag, with an editorial 0–100 `levee_risk_score` |
| `impaired_waters_303d` | EPA ATTAINS Clean Water Act §303(d) impaired/threatened waters | flag, with listed pollutant causes |
| `state_tank_spill_registry` | EPA UST Finder national baseline + NY DEC, CA GeoTracker, TX TCEQ PST/LPST, FL DEP | flag on any currently **open** case |
| `gas_pipeline_proximity` | US DOT NTAD Natural Gas Pipelines (EIA) | flag inside the `<500ft` right-of-way band |
| `calfire_fhsz` | CAL FIRE Fire Hazard Severity Zone, California only | flag on **Very High**; outside CA → `not_applicable` |
| **`air_nonattainment`** *(new)* | **EPA NAAQS nonattainment area lookup** — 11 active pollutant/standard layers | flag → **New Source Review (NSR) offsets + LAER** instead of PSD |
| **`wetlands_nwi`** *(new)* | **USFWS National Wetlands Inventory** — on-parcel + radius buffer | flag → **Section 404 permit screening** and mitigation |
| **`historic_nrhp`** *(new)* | **NPS National Register of Historic Places** — sites + districts | flag → **NHPA Section 106 screening** |
| **`cbrs_coastal_barrier`** *(new)* | **USFWS Coastal Barrier Resources System** units | flag → **CBRA federal-funding bar / NFIP ineligible** |
| **`dam_inundation_exposure`** *(new)* | **USACE National Inventory of Dams** — hazard class + condition | flag on a Poor/Unsatisfactory high-hazard dam nearby |
| `transmission_grid` | HIFLD transmission lines + substations | opportunity (interconnection proximity) |
| `ira_energy_community` | DOE/NETL IRA energy-community layers | opportunity (10% ITC / +10% PTC bonus) |

### The scoring model

The bundle does the synthesis instead of handing you twenty independent flags.

**Severity tiers.** Every flagged layer is classified by what the flag actually *means*, using the metrics that layer already produces:

| Tier | Weight | What it is | Triggers |
|---|---|---|---|
| **A** | −35 | Legal or physical prohibition. On its own, enough to kill a site. | federal land; ESA critical habitat; inside an active fire perimeter; inside a mapped landslide; Very High CAL FIRE FHSZ; pipeline inside 500 ft; CBRS **System Unit** |
| **B** | −18 | Material permitting cost/schedule risk. | NAAQS nonattainment; wetland on/within 0.1 mi; NRHP resource on/within 0.25 mi; site-specific seismic study or SDC D–F; `Elevated` karst; non-accredited levee; open tank/spill case within 0.25 mi; Very High flood risk; in an impaired water; nearby Poor-condition high-hazard dam; CBRS **OPA**; non-federal protected land; wildfire near but not inside |
| **C** | −6 | Diligence-scope item. Investigate; rarely fatal. | everything else that flags (EPA RCRA/TRI counts, `Moderate` karst, farther pipeline bands, nearby mapped landslides, etc.) |

```
site_score = 100 − (35 × TierA) − (18 × TierB) − (6 × TierC)     floor 0
```

**Verdict bands**, evaluated strictly in this order:

| Verdict | When |
|---|---|
| `not-screened` | nothing was screened at all |
| `incomplete-screen` | `coverage_pct` < 80 — too little coverage to claim anything |
| `no-go` | any Tier-A constraint |
| `caution` | any Tier-B constraint, or `site_score` < 70 |
| `caution` | **any** layer unavailable or partial (see the coverage gate) |
| `proceed` | every applicable layer answered and nothing flagged |

**The coverage gate.** `verdict` can **never** be `proceed` while any applicable layer is `unavailable` or `partial`. A clean verdict therefore always implies complete coverage — an upstream outage can never be laundered into a clean bill of health. `coverage_pct` excludes `not_applicable` layers from its denominator and counts a `partial` layer as half.

**A `proceed` can still carry flags.** Tier-C findings are diligence-scope items, not blockers, so they do not move the verdict — but they are never hidden. A real `proceed` row from the demo portfolio reads `site_score: 94`, `verdict: proceed`, `fatal_flaw_count: 1`, with the finding spelled out in `flags` and in `verdict_reason` ("1 diligence-scope finding(s) to review"). Karst and nearby impaired waters are common enough across the US that treating them as blockers would make almost every site `caution` and destroy the verdict's discriminating power. Read `verdict` for the go/no-go call and `flags` for the scope of work.

**Opportunities are scored separately.** `opportunity_score` (0–25, from the IRA energy-community bonus and grid proximity) is never netted against constraints — an IRA bonus does not make a wetland go away.

### Layer status vocabulary

Every layer returns `{ status, detail, metric fields, data_vintage, sources_queried, sources_failed, citation }`.

| Status | Meaning |
|---|---|
| `clear` | **every** source for this layer answered, and nothing was found |
| `flag` | a potential fatal-flaw constraint was found |
| `opportunity` | a positive finding |
| `partial` | some sources answered and found nothing, but **at least one source failed and was not screened**. Never read as clear. |
| `unavailable` | no source answered. Not screened. |
| `not_applicable` | the dataset does not cover this location by design (e.g. CAL FIRE FHSZ outside California). Excluded from the coverage denominator. |

A layer that errors upstream is **never** silently reported as clear, and a "nothing found" sentence names only the sources that actually ran. One bad layer or one bad coordinate never crashes the run.

### Data vintage per layer

`checked_at` is the **query** time, not the data vintage. Every layer carries its own `data_vintage`:

| Layer | Vintage |
|---|---|
| `epa_contamination` | EPA ECHO, refreshed weekly |
| `air_nonattainment` | EPA OAQPS designations, refreshed weekly |
| `wildfire_exposure` | NIFC WFIGS, live / near-real-time |
| `transmission_grid`, `levee_proximity` | continuously updated hosted layers |
| `impaired_waters_303d` | EPA ATTAINS, Esri quarterly (exact quarter in `attains_service_edition`) |
| `flood_risk` | FEMA NRI county release, annual cycle |
| `state_tank_spill_registry` | EPA UST Finder annual + each state registry on its own cadence |
| `gas_pipeline_proximity` | US DOT NTAD annual release |
| `seismic_design` | **ASCE 7-22** (IBC 2024); USGS model version in `seismic_model_version` |
| `ira_energy_community` | DOE/NETL 2024v1 |
| `critical_habitat` | updated as rules publish in the Federal Register |
| `protected_lands` | PAD-US, multi-year republication cycle |
| `karst_terrain` | USGS OFR 2014-1156 — a **2014** compilation |
| `landslide_hazard` | USGS inventory v2, compiled from sources of varying age |
| `wetlands_nwi` | NWI imagery dates range from the **1970s** to the present by project |
| `historic_nrhp` | NPS spatial data; many points are batch-derived with unverified coordinates |
| `cbrs_coastal_barrier` | changes only by Act of Congress or a USFWS map revision |
| `dam_inundation_exposure` | NID; per-dam update and condition-assessment dates vary widely by state |
| `calfire_fhsz` | **SRA 2007 / LRA 2011 editions.** CAL FIRE has since adopted newer SRA (2022/2024-effective) and LRA (2025) maps that this service does not yet carry — confirm the currently adopted zone with CAL FIRE. |

### Example input

```json
{
  "assets": [
    { "lat": 29.7355, "lon": -95.2601, "label": "Houston Ship Channel industrial site, TX" },
    { "lat": 44.29, "lon": -105.5, "label": "Gillette, WY greenfield (coal-country)" }
  ],
  "radiusMiles": 1
}
```

### Example output

One row per site (abridged — the real row also carries the nested `layers` object with per-layer metrics, `data_vintage`, source health and citations, plus all 20 `<layer>_status` columns):

```json
{
  "asset_label": "Dauphin Island, AL coastal barrier parcel",
  "asset_lat": 30.23863,
  "asset_lon": -88.32039,
  "radius_miles": 2,
  "verdict": "no-go",
  "site_score": 0,
  "verdict_reason": "2 Tier-A constraint(s) -- a legal or physical prohibition: ESA critical habitat; CBRS coastal barrier unit (NFIP / federal-funding bar).",
  "coverage_pct": 100,
  "layers_screened": 19,
  "layers_applicable": 19,
  "layers_not_applicable": 1,
  "fatal_flaw_count": 6,
  "tier_a_count": 2,
  "tier_b_count": 2,
  "tier_c_count": 2,
  "opportunity_score": 0,
  "cbrs_coastal_barrier_status": "flag",
  "wetlands_nwi_status": "flag",
  "critical_habitat_status": "flag",
  "calfire_fhsz_status": "not_applicable",
  "flags_text": "ESA critical habitat: ... | CBRS coastal barrier unit: Inside CBRS System Unit Q02 (\"Dauphin Island\") ...",
  "site_screen_summary": "NO-GO - site score 0/100; 6 potential fatal-flaw constraints flagged (2 Tier-A, 2 Tier-B, 2 Tier-C)."
}
```

And a clean site from the same portfolio:

```json
{
  "asset_label": "Western Kansas low-constraint greenfield",
  "verdict": "proceed",
  "site_score": 94,
  "coverage_pct": 100,
  "fatal_flaw_count": 1,
  "tier_a_count": 0,
  "tier_b_count": 0,
  "tier_c_count": 1,
  "verdict_reason": "No prohibition and no major permitting constraint across 19 applicable layer(s); 1 diligence-scope finding(s) to review (see flags)."
}
```

### Key output fields

- `verdict` — `proceed` | `caution` | `no-go` | `incomplete-screen` | `not-screened`.
- `site_score` — 0–100 composite. `verdict_reason` explains it in one sentence.
- `coverage_pct`, `layers_screened`, `layers_partial`, `layers_unavailable`, `layers_not_applicable`.
- `tier_a_count` / `tier_b_count` / `tier_c_count`, `opportunity_score`.
- `fatal_flaw_count` — how many layers returned `flag`.
- `flags`, `opportunities`, `unavailable_layers`, `partial_layers`, `not_applicable_layers` — plus `*_text` single-cell versions that survive CSV/Excel export.
- **`<layer>_status`** — a flat scalar column for each of the 20 layers, so the per-layer verdict survives a spreadsheet export without 150 nested columns.
- `layers` — the full nested per-layer object with metrics, `data_vintage`, source health and citation.
- `site_screen_summary` — one-line roll-up. Leads with `INCOMPLETE COVERAGE` whenever any layer was unavailable or partial.

### Billing

One billable Result per **successfully screened** site. You are never charged for:

- an invalid coordinate (returned in a separate non-billable `invalid-inputs` dataset), or
- a row where every layer failed (0% coverage — also routed to `invalid-inputs`).

### What this costs against a commercial environmental due diligence report

**This Actor is $100 per 1,000 rows and emits exactly one row per screened site, so it is $0.10 per property** - whatever the radius, and however many of the twenty layers flag.

For comparison, here is published 2026 list pricing for a commercial **environmental database report** from one national consultancy, A3 Environmental Consultants, running ERIS data:

| Commercial product | Price | Turnaround |
|---|---|---|
| EDR report / environmental screen | $250 | 48-72 hrs |
| Complete database package, with topographic maps | $415 | 5 business days |
| Record Search with Risk Assessment - adds a signed risk opinion | $850 | 5 business days |
| Full Phase I ESA - adds a site visit, ASTM E1527-21, AAI | $2,200-$4,000 | 2-3 weeks |

Source: <https://a3e.com/what-does-an-edr-report-cost/>, list prices as published, page last updated 2026-05-29. EDR/LightBox, ERIS, Envirosite and GeoSearch quote per order rather than publishing prices, so only the figures above are cited here.

**Read that comparison carefully, because it is not like-for-like in either direction.**

**Broader than a database report.** A $250 environmental screen covers contamination records. This Actor also answers FEMA flood risk, ESA critical habitat, NWI wetlands, NAAQS nonattainment, NRHP historic resources, karst, landslide, levee, dams, coastal barrier, seismic design, wildfire, gas pipelines, protected lands and the IRA energy-community bonus. In the commercial world those are separate studies, not line items on a $250 report.

**Thinner on contamination.** This bundle's `epa_contamination` layer reads RCRA and TRI through EPA ECHO only. It does **not** carry Superfund/SEMS records that lack coordinates, and it is not an ASTM E1527-21 records review. If contamination is the actual question, run [EPA Contaminated Site Screener](https://apify.com/malonestar/epa-contaminated-site-screener) instead of, or alongside, this one - it screens ten EPA databases at the ASTM E1527-21 search distances.

**And it is missing everything a database report buys that is not a federal API:** historical aerial photography, topographic map series, Sanborn fire insurance maps, city directory research, state and tribal registries beyond the NY/CA/TX/FL coverage in the tank layer, a Professional Geologist's written interpretation of what the hits mean, and a signed deliverable backed by that firm's errors-and-omissions insurance. None of that exists here, and no output of this Actor is signed by anyone.

**The honest positioning:** use this to rank a shortlist of twenty candidate sites for $2.00, then spend the $250-$4,000 on the two that survive. It is a triage instrument, not a report, and it does not satisfy ASTM E1527-21 or establish the AAI landowner liability protections under 40 CFR Part 312.

### How radius works

`radiusMiles` (default 1, accepts 0.25–25) drives the distance-based layers: EPA, critical habitat, grid, wildfire, landslide, impaired waters, tank/spill, gas pipelines, NWI wetlands, NRHP resources and NID dams. The point-in-polygon layers — protected lands, flood/NRI county, seismic, IRA, karst, levee, CAL FIRE FHSZ, NAAQS nonattainment and CBRS — are exact intersect tests and ignore it.

### Who uses it

- Site selectors and corporate real-estate teams running **environmental due diligence**, **greenfield site screening** and **industrial land screening** on a shortlist before ordering full studies.
- **Data center site selection** and **solar site suitability** teams checking grid proximity, the IRA bonus and the full constraint stack in one call.
- Renewable-energy and infrastructure developers screening **New Source Review NSR PSD** exposure alongside wetlands, habitat and historic constraints.
- **Phase I ESA** and environmental consultants scoping the assessment with a fast regulatory-records and sensitive-receptor read, including a **brownfield pre-screen**.
- CRE lenders and insurers pulling **CRE collateral environmental screening** — flood, wildfire, seismic, karst, landslide, levee, contamination, tank/spill, pipeline, dam and coastal-barrier exposure on an address.
- AI agents turning a coordinate into a structured constraint profile with a single verdict.

### Use as an MCP tool

This Actor is callable directly by any MCP-compatible AI agent through Apify's hosted
MCP server. There is no server to run and no integration code to write - the tool
schema an agent sees is generated from this Actor's own input and dataset schemas.

**Endpoint**

```
https://mcp.apify.com?tools=malonestar/site-due-diligence-bundle
```

**Claude Desktop, Claude Code or Cursor** - add to `claude_desktop_config.json`,
`.mcp.json` or `.cursor/mcp.json` respectively:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com/?tools=malonestar/site-due-diligence-bundle",
      "headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
    }
  }
}
```

Get a token at https://console.apify.com/settings/integrations. Claude Desktop can
also authenticate interactively via OAuth against `https://mcp.apify.com` with no
`headers` block. Full reference: https://docs.apify.com/platform/integrations/mcp

**Try asking your agent**

> Run a full 20-layer due-diligence screen on 39.7392,-104.9903 and tell me whether the verdict is proceed, caution or no-go, and why.

**Chains well with** - expose these alongside it by comma-separating the `tools`
parameter, and the agent can carry results from one into the next:

- `malonestar/parcel-owner-lookup`
- `malonestar/epa-contaminated-site-screener`
- `malonestar/fema-nri-county-risk-profile`

```
https://mcp.apify.com?tools=malonestar/site-due-diligence-bundle,malonestar/parcel-owner-lookup,malonestar/epa-contaminated-site-screener,malonestar/fema-nri-county-risk-profile
```

Billing is unchanged when called as an MCP tool: this Actor is Pay-Per-Event and an
agent pays the same per-result price a human does. A run that cannot answer fails
without billing rather than returning an unverified negative.

### Use in n8n

This Actor is published as an n8n community node, so it can be dropped into a
workflow without writing an HTTP request by hand.

- npm: https://www.npmjs.com/package/n8n-nodes-site-due-diligence-bundle
- source: https://github.com/malonestar/n8n-nodes-site-due-diligence-bundle

Install from **Settings > Community Nodes > Install** in any self-hosted n8n
instance, enter `n8n-nodes-site-due-diligence-bundle`, then add your Apify API key as an
**Apify API** credential. The node calls this Actor through the Apify API, so there
is no extra infrastructure to run and billing is identical to a normal run.

#### Was this useful?

If a run answered your question, a short review on this Store page helps other buyers find the Actor; every published review is read. If a run gave a wrong or confusing answer, open an Issue on this page with the run ID and it will be treated as a defect, not feedback.

### FAQ

**Is this a Phase I Environmental Site Assessment?** No. It is an informational multi-source pre-screen to scope and prioritize — not a substitute for an ASTM E1527 Phase I, a legal ESA or land determination, a **wetland delineation**, a flood certificate, a stamped engineering study, or tax advice. Confirm every flag with the authoritative agency and a licensed professional.

**What does a `clear` result actually guarantee?** That every upstream source for that layer answered and nothing was found in the compiled national dataset. It does not rule out an undocumented local condition. If a source failed, you get `partial` or `unavailable` instead — never `clear`.

**What isn't screened?** The EPA layer covers RCRA and TRI via ECHO; Superfund/SEMS records without coordinates and the IRA brownfield category are out of scope. NWI does not map every wetland (small, forested and farmed wetlands are commonly omitted) and is **not a jurisdictional delineation**. NRHP listing is not the same as eligibility — unlisted but eligible resources still trigger Section 106. The tank/spill layer has a national EPA UST Finder baseline plus deeper registries in NY, CA, TX and FL only. CAL FIRE FHSZ is California-only. The **dam layer is a straight-line proximity proxy, not an inundation determination** — NID does not publish inundation polygons, so a site outside the radius can still lie in an inundation path; request the dam owner's EAP mapping for a real answer.

**How many sites per run?** Up to `maxAssets` (default 250). One billable scorecard row per successfully screened site.

**How does this compare on price to a commercial environmental due diligence report?** This Actor is $0.10 per site against a published $250-$415 for a commercial environmental database report. It is broader (20 layers, not just contamination) and thinner (ECHO RCRA/TRI only, no historical aerials, no Sanborn maps, no city directories, no professional interpretation, no signed deliverable). See the cost comparison section above.

# Actor input Schema

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

List of sites to run the full fatal-flaw scorecard on. Each item is an object with numeric lat and lon (WGS84 decimal degrees) and an optional label. One billable scorecard row is returned per successfully screened asset -- invalid coordinates are returned in a separate non-billable dataset. Example: \[{"lat":29.7355,"lon":-95.2601,"label":"Houston Ship Channel parcel"}].

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

Search radius in statute miles for the proximity layers (EPA contamination, ESA critical habitat, transmission grid, wildfire flag, landslide nearby-search, CWA 303(d) impaired waters, tank/spill registries, gas pipelines, NWI wetlands, NRHP historic resources, and NID dams). Point-in-polygon-only layers (protected lands, flood/NRI county, seismic, IRA energy community, karst, USACE levee, CalFire FHSZ, NAAQS nonattainment, CBRS) ignore this. Accepts 0.25 to 25; smaller means a tighter on-site screen.

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

Maximum number of assets to screen from the list (safety cap). Extra assets beyond this are ignored.

## Actor input object example

```json
{
  "assets": [
    {
      "lat": 29.7355,
      "lon": -95.2601,
      "label": "Houston Ship Channel industrial site, TX"
    },
    {
      "lat": 44.29,
      "lon": -105.5,
      "label": "Gillette, WY greenfield (coal-country)"
    }
  ],
  "radiusMiles": 1,
  "maxAssets": 250
}
```

# Actor output Schema

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

The default dataset.

# 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": 29.7355,
            "lon": -95.2601,
            "label": "Houston Ship Channel industrial site, TX"
        },
        {
            "lat": 44.29,
            "lon": -105.5,
            "label": "Gillette, WY greenfield (coal-country)"
        }
    ],
    "radiusMiles": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("malonestar/site-due-diligence-bundle").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": 29.7355,
            "lon": -95.2601,
            "label": "Houston Ship Channel industrial site, TX",
        },
        {
            "lat": 44.29,
            "lon": -105.5,
            "label": "Gillette, WY greenfield (coal-country)",
        },
    ],
    "radiusMiles": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("malonestar/site-due-diligence-bundle").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).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": 29.7355,
      "lon": -95.2601,
      "label": "Houston Ship Channel industrial site, TX"
    },
    {
      "lat": 44.29,
      "lon": -105.5,
      "label": "Gillette, WY greenfield (coal-country)"
    }
  ],
  "radiusMiles": 1
}' |
apify call malonestar/site-due-diligence-bundle --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,malonestar/site-due-diligence-bundle"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/CSbi7WGQIiIYCURuL/builds/fAYJOlMkdy4WFY93E/openapi.json
