# Company Expansion & Facility Activity Intelligence (`beaming_tellurium/company-expansion-facility-intelligence`) Actor

Track major company expansions, facility projects, jobs, capital investment, and state incentives from official Kentucky, Tennessee, and Utah sources.

- **URL**: https://apify.com/beaming\_tellurium/company-expansion-facility-intelligence.md
- **Developed by:** [Ryan](https://apify.com/beaming_tellurium) (community)
- **Categories:** Business, 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 expansion 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

## U.S. Company Expansion & Facility Intelligence

Track major company expansions, facility projects, job commitments, capital
investment, and state economic-development incentives from official public
sources. The Actor normalizes fragmented state records into one consistent,
change-aware dataset.

### What you get

- company, facility, county, and state
- projected capital investment and jobs
- incentive program and award amount when published
- lifecycle stage such as preliminary approval, final approval, amendment, or award
- stable company, project, facility, and source-event IDs
- source authority, URL, record ID, retrieval time, and content hashes
- `NEW`, `CHANGED`, or `UNCHANGED` classification across runs
- changed-field details and first/last-seen timestamps

Current official-source coverage includes:

- Kentucky Business Investment actions and KEDFA meeting documents
- Tennessee FastTrack contracted projects
- Utah incented companies

### Common uses

- site-selection and economic-development intelligence
- sales and investment signals from new facilities and expansions
- monitoring major hiring and capital-expenditure commitments
- incentive benchmarking across states
- alerts when an approved project changes lifecycle stage or economics
- building a longitudinal economic-event dataset

### Quick start

The default input runs all supported states and keeps projects meeting at least
one of these thresholds: $5 million in capital investment or 50 planned jobs.

```json
{
  "states": ["KY", "TN", "UT"],
  "minCapitalInvestment": 5000000,
  "minJobs": 50,
  "productionMode": true,
  "emitUnchanged": true
}
```

For recurring monitoring, use a named history store consistently and suppress
unchanged dataset rows:

```json
{
  "states": ["KY", "TN", "UT"],
  "historyStoreName": "company-expansion-history",
  "healthStoreName": "company-expansion-source-health",
  "productionMode": true,
  "emitUnchanged": false
}
```

Named stores belong to the account running the Actor. A fresh history namespace
classifies its first qualified records as `NEW`.

### Pricing

The Store candidate uses transparent pay-per-event pricing:

- **Validated source run:** $0.15 once, only after all selected official sources
  have been collected and the production quality gates pass.
- **Dataset item:** $0.003 for each record written to the default dataset.
- **Actor start:** Apify's standard $0.00005 synthetic start event.

Platform usage is included in these event prices. A stable monitoring run with
`emitUnchanged: false` normally incurs only the validated-run and Actor-start
events; new or changed records add the per-item charge. A fresh default
three-state bootstrap producing 1,068 records would cost about $3.35.

The Actor respects the run's maximum-charge limit. If the remaining budget cannot
cover every result, it returns the affordable prefix, reports
`PASS_LIMIT_REACHED`, and leaves undelivered new or changed records uncommitted so
they remain eligible for a later run.

### Example output

```json
{
  "company_name": "Example Manufacturing, Inc.",
  "state": "TN",
  "county": "Coffee",
  "canonical_stage": "incentive_awarded",
  "capital_investment": 8920000,
  "jobs_planned": 90,
  "incentive_amount": 687500,
  "change_class": "NEW",
  "source_authority": "Tennessee Department of Economic and Community Development",
  "source_url": "https://www.tn.gov/ecd/resources/openecd/fasttrack-project-database1.html"
}
```

### Change tracking

Every run first validates all selected sources and previews the complete history
delta without writing it. History is committed only after every production gate
passes. Distinct lifecycle actions remain distinct events, so a final approval
does not overwrite the project's preliminary approval.

The `SOURCE_HEALTH` output reports row counts, provenance completeness, identity
collisions, semantic hashes, row loss, Kentucky document health, and excessive
history deltas.

### Input controls

- Thresholds use OR logic. Set one threshold to `0` to disable it.
- `years` filters retained source-event years.
- Kentucky uses the current UTC year unless explicit start and end years are supplied.
- `emitUnchanged: false` emits only new or changed records while still updating history.
- For recurring paid monitoring, `emitUnchanged: false` avoids paying again for
  unchanged dataset rows.
- Production quality and cost limits are configurable in the input form.
- `resetHistory` is development-only and should remain disabled in production.

### Reliability and limits

The Actor uses bounded retries for transient official-source failures, stable
identity rules, persistent semantic fingerprints, and fail-closed quality gates.
Source websites can change without notice; a structural change should fail the
run rather than silently produce incomplete intelligence.

Coverage is limited to the official sources and states listed above. Published
values are government-reported commitments or approvals, not guarantees that a
project will be completed.

### Official sources

- Kentucky financial incentives: <https://fisearch.ced.ky.gov/>
- KEDFA board books and minutes: <https://newkentuckyhome.ky.gov/Newsroom/KEDFA_Meeting_Approvals>
- Tennessee FastTrack: <https://www.tn.gov/ecd/resources/openecd/fasttrack-project-database1.html>
- Utah incented companies: <https://business.utah.gov/recruitment/companies/>

### Privacy

The Actor collects public company and economic-development records. It does not
collect private user data or require third-party credentials.

# Actor input Schema

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

State adapters to run. Production runs default to all validated adapters.

## `minCapitalInvestment` (type: `integer`):

Keep a record when capital investment meets this threshold OR planned jobs meets the jobs threshold. Set to 0 to disable this criterion.

## `minJobs` (type: `integer`):

Keep a record when planned jobs meets this threshold OR capital investment meets the capex threshold. Set to 0 to disable this criterion.

## `years` (type: `array`):

Optional source event years to keep. Leave empty for all years.

## `kentuckyStartYear` (type: `integer`):

First KBI action year to query. When omitted, the Actor uses the current UTC year.

## `kentuckyEndYear` (type: `integer`):

Last KBI action year to query. When omitted, the Actor uses the current UTC year.

## `kentuckyIncludeMeetingDocuments` (type: `boolean`):

Match KBI records to official KEDFA board books and approved minutes, retaining source hashes and minute evidence when available.

## `historyStoreName` (type: `string`):

Named Apify key-value store used to retain first-seen state and deltas across Actor runs.

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

Named key-value store holding the last successful per-source baseline.

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

Fail closed before history is committed when source integrity or delta gates fail.

## `maximumSourceRows` (type: `integer`):

Hard run-cost guard across all selected adapters.

## `maximumKentuckyDocuments` (type: `integer`):

Hard download-cost guard for KEDFA board books and approved minutes.

## `maximumSourceRowDropPercent` (type: `number`):

Fail when a state source falls this percentage below its last successful baseline.

## `maximumHistoryDeltaPercent` (type: `number`):

Fail when NEW plus CHANGED rows exceed this share of a non-bootstrap run.

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

Maximum concurrent history reads or writes; bounded to protect Apify storage APIs.

## `qualityMinKentuckyRows` (type: `integer`):

Fail when the Kentucky financial-incentives source returns fewer rows.

## `qualityMinTennesseeRows` (type: `integer`):

Fail when the Tennessee FastTrack source returns fewer rows.

## `qualityMinUtahRows` (type: `integer`):

Fail when the Utah incented-company source returns fewer rows.

## `emitUnchanged` (type: `boolean`):

Emit current qualified records even when they did not change.

## `resetHistory` (type: `boolean`):

Development-only. Reset current state for records touched by this run.

## Actor input object example

```json
{
  "states": [
    "KY",
    "TN",
    "UT"
  ],
  "minCapitalInvestment": 5000000,
  "minJobs": 50,
  "years": [],
  "kentuckyIncludeMeetingDocuments": true,
  "historyStoreName": "worker2-expansion-history-v4",
  "healthStoreName": "worker2-source-health-v1",
  "productionMode": true,
  "maximumSourceRows": 5000,
  "maximumKentuckyDocuments": 50,
  "maximumSourceRowDropPercent": 35,
  "maximumHistoryDeltaPercent": 35,
  "storageConcurrency": 20,
  "qualityMinKentuckyRows": 1,
  "qualityMinTennesseeRows": 500,
  "qualityMinUtahRows": 250,
  "emitUnchanged": true,
  "resetHistory": 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/company-expansion-facility-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/company-expansion-facility-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/company-expansion-facility-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,beaming_tellurium/company-expansion-facility-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/7U1yBfCPv6oBPAkFX/builds/0rzRuNXCgAE35TSMD/openapi.json
