# Major Industrial Preconstruction Permit Intelligence (`beaming_tellurium/major-industrial-preconstruction-permit-intelligence`) Actor

Detect major industrial projects entering environmental preconstruction permitting from official Louisiana, West Virginia, and Texas sources.

- **URL**: https://apify.com/beaming\_tellurium/major-industrial-preconstruction-permit-intelligence.md
- **Developed by:** [Ryan](https://apify.com/beaming_tellurium) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 major industrial permit intelligence records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Major Industrial Preconstruction Permit Intelligence

Worker #3 detects major industrial projects entering environmental preconstruction permitting in Louisiana, West Virginia, and Texas. It uses only official state sources and retains project lifecycle changes rather than treating each run as a disposable scrape.

Version `0.9.3` is the validated production candidate. It does not modify or depend on Worker #1 or Worker #2.

The public Actor is available at `https://apify.com/beaming_tellurium/major-industrial-preconstruction-permit-intelligence`. Its production schedule runs daily at 06:30 America/Los\_Angeles against the validated v2 observation, delivery, and health stores.

Public example tasks:

- [Track Texas Data Center Air Permit Projects](https://apify.com/beaming_tellurium/major-industrial-preconstruction-permit-intelligence/examples/track-texas-data-center-permits)
- [Monitor Advanced Manufacturing Permit Projects](https://apify.com/beaming_tellurium/major-industrial-preconstruction-permit-intelligence/examples/monitor-advanced-manufacturing-permits)
- [Find Major Industrial Permits in LA, WV and TX](https://apify.com/beaming_tellurium/major-industrial-preconstruction-permit-intelligence/examples/find-major-industrial-permits-la-wv-tx)

### What it includes

- PSD and GHG PSD projects
- new major stationary sources and major modifications
- explicit industrial construction, capacity, equipment, or manufacturing expansions
- data centers, power generation, LNG, chemical, steel/metals, and advanced manufacturing projects
- application, completeness, revision, draft/preliminary decision, public notice, final issuance, and withdrawal stages when the official source exposes them

### What it rejects

- routine permit renewals or no-change Title V/Part 70 actions
- administrative changes, minor actions, and general permits
- temporary or small concrete batch plants
- portable crushers, well pads, and ordinary compressor stations
- Texas rows without usable official English evidence
- Texas name-only matches; project facts must come from the official summary PDF

### Official sources

- Louisiana DEQ Public Notices: `https://www.deq.louisiana.gov/public-notices`
- West Virginia DAQ NSR Permit Applications: `https://dep.wv.gov/daq/permitting/Pages/NSR-Permit-Applications.aspx`
- Texas TCEQ Pending Air Permit Applications: `https://www.tceq.texas.gov/permitting/air/newsourcereview/airpermits-pendingpermit-apps`

The Texas concrete-table section is intentionally excluded. The Actor uses the official English Plain Language Summary first and falls back to official English NORI/NAPD evidence only when the PLS is unavailable, unreadable, or mislabeled. The Actor fails instead of silently truncating when a configured document ceiling is too low.

### Data and history model

Each delivered event includes stable project, company, facility, and source-event IDs; permit and lifecycle fields; project facts; PSD flags; qualification reasons; official provenance; and observation history:

- `event_date`, `observed_at`, `first_seen_at`, `last_seen_at`
- `change_class`, `changed_fields`
- `previous_values`, `current_values`
- `source_url`, `source_hash`, `supporting_documents_hash`

Observation history and customer delivery state use separate named stores. All qualified source observations are committed append-only after source-health gates pass. `maxResults` and spending limits commit only the records actually delivered to the delivery store, so deferred results remain deliverable later.

Texas emits one current lifecycle observation per permit. When NORI/NAPD links appear or change, the same stable source event becomes `CHANGED`, while the earlier observation remains append-only. West Virginia retains distinct official lifecycle documents, including revisions and withdrawals.

### Main inputs

- `states`: any of `LA`, `WV`, `TX`; the public prefilled default is Louisiana only so marketplace QA and first-time evaluation finish comfortably within five minutes
- `onlyNew`: deliver only records not previously delivered
- `includeChanged`: include changed records with `onlyNew`
- `maxResults`: output limit independent of observation capture; the public prefilled default is 25
- `company`, `county`, `projectType`, `minimumStage`: customer filters
- `permitNumbers`: focused validation/monitoring; requires exactly one selected state
- `maximumTexasDocuments`, `maximumWestVirginiaDocuments`: fail-closed download ceilings
- `productionMode`: enforce source-health gates

Advanced inputs expose separate observation, delivery, and health store names plus bounded document/storage concurrency.

### Pricing

The Actor uses transparent pay-per-event pricing with platform usage included:

- **Validated official-source run:** `$0.15` once, after all selected source-health and evidence gates pass.
- **Intelligence record:** `$0.003` for each record written to the default dataset.
- **Actor start:** Apify's standard `$0.00005` synthetic event.

A current three-state bootstrap producing 61 records costs approximately `$0.33`. A stable `onlyNew: true` monitoring run with no new or changed records costs approximately `$0.15`. The minimum maximum-charge setting is `$0.16`; spending limits defer unaffordable records without incorrectly marking them delivered.

### Run locally

Requires Node.js 22 or newer.

```powershell
npm ci
npm test
npm start
```

For a full current-source verification:

```powershell
node scripts/validate-full-network.mjs
```

The validation script performs hundreds of official Texas PDF requests and should be used deliberately. See [VALIDATION.md](VALIDATION.md) for the validated results and [CLOUD\_LAUNCH.md](CLOUD_LAUNCH.md) for the public-release handoff.

### Important limitation

This product surfaces project signals from public permitting records. It is not legal advice, a compliance determination, or proof that construction or financing will occur. `event_date_inferred: true` identifies records where the source exposes no reliable document date and the observation date is used.

# Actor input Schema

## `states` (type: `array`):

Official state adapters to run.

## `onlyNew` (type: `boolean`):

Deliver only records not previously delivered, while still recording every official-source observation.

## `includeChanged` (type: `boolean`):

When Only new is enabled, include changed records as well as first-seen records.

## `maxResults` (type: `integer`):

Output limit. Deferred records remain eligible for later delivery and do not corrupt observation history.

## `company` (type: `string`):

Optional case-insensitive company/facility filter.

## `county` (type: `string`):

Optional county filter.

## `projectType` (type: `string`):

Examples: data\_center, power\_generation, advanced\_manufacturing, lng, chemical, steel\_metals.

## `minimumStage` (type: `string`):

Lowest canonical permit stage to deliver.

## `permitNumbers` (type: `array`):

Optional permit-number list. Intended for focused validation or monitoring; select exactly one state when used.

## `maximumTexasDocuments` (type: `integer`):

Hard safety ceiling. The run fails instead of silently processing a partial set.

## `maximumWestVirginiaDocuments` (type: `integer`):

Hard safety ceiling. The run fails instead of silently processing a partial set.

## `documentConcurrency` (type: `integer`):

Maximum number of official PDF downloads processed concurrently.

## `observationStoreName` (type: `string`):

Named key-value store for append-only official-source observations and current source state.

## `deliveryStoreName` (type: `string`):

Named key-value store tracking only records actually delivered to this customer's dataset.

## `healthStoreName` (type: `string`):

Named key-value store retaining the latest per-state source-health reports.

## `productionMode` (type: `boolean`):

Fail closed before history or delivery when an official source fails its structural or completeness checks.

## `storageConcurrency` (type: `integer`):

Maximum number of concurrent history-store reads or writes.

## `qualityMinLouisianaRows` (type: `integer`):

Fail a full Louisiana run when the official source returns fewer observations.

## `qualityMinWestVirginiaRows` (type: `integer`):

Fail a full West Virginia run when the official source returns fewer lifecycle observations.

## `qualityMinTexasRows` (type: `integer`):

Fail a full Texas run when the official source returns fewer current permit observations.

## `resetObservationHistory` (type: `boolean`):

Development only.

## `resetDeliveryHistory` (type: `boolean`):

Development only.

## Actor input object example

```json
{
  "states": [
    "LA"
  ],
  "onlyNew": false,
  "includeChanged": true,
  "maxResults": 25,
  "minimumStage": "application_received",
  "permitNumbers": [],
  "maximumTexasDocuments": 600,
  "maximumWestVirginiaDocuments": 150,
  "documentConcurrency": 6,
  "observationStoreName": "worker3-permit-observations-v2",
  "deliveryStoreName": "worker3-permit-delivery-v2",
  "healthStoreName": "worker3-source-health-v2",
  "productionMode": true,
  "storageConcurrency": 20,
  "qualityMinLouisianaRows": 5,
  "qualityMinWestVirginiaRows": 3,
  "qualityMinTexasRows": 1,
  "resetObservationHistory": false,
  "resetDeliveryHistory": false
}
```

# Actor output Schema

## `summary` (type: `string`):

No description

## `dataset` (type: `string`):

No description

## `sourceHealth` (type: `string`):

No description

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("beaming_tellurium/major-industrial-preconstruction-permit-intelligence").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("beaming_tellurium/major-industrial-preconstruction-permit-intelligence").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 '{}' |
apify call beaming_tellurium/major-industrial-preconstruction-permit-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,beaming_tellurium/major-industrial-preconstruction-permit-intelligence"
        }
    }
}
```

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/NJn1v37DkG31uZxf9/builds/Y6pR62rPrWhoCIv0F/openapi.json
