# Building Permits Monitor — NYC, Chicago, LA, SF, Austin (`esco.api/building-permits`) Actor

Fresh building permits from official city open-data feeds — normalized, deduplicated, lead-ready. Contractor names, job costs, work descriptions. Filter by minimum job value.

- **URL**: https://apify.com/esco.api/building-permits.md
- **Developed by:** [Francesco Freedman](https://apify.com/esco.api) (community)
- **Categories:** Lead generation, Real estate, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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

## Building Permits Monitor — Official City Feeds (NYC, Chicago, LA, SF, Austin)

Get **every building permit issued in five of America's biggest construction markets**, straight from the official city open-data feeds — normalized, deduplicated, and lead-ready. Contractor names, licenses, phone numbers (where the city publishes them), job descriptions, and job values, **the day the city publishes them**.

Building permits are a buying signal you can set your watch to: a permit means money is being spent at that address, by that owner, through that contractor — right now.

### Why this actor

- **Official sources only.** Data comes directly from city government open-data portals (NYC DOB, Chicago, LA DBS, SF DBI, Austin) — no scraping of third-party sites, no stale resold lists.
- **Contractor intelligence included.** NYC: contractor business name + license. Chicago: contractor name + trade. Austin: contractor company, trade, **and phone number**. Deep links to the city permit record where available.
- **You only pay for new permits.** With `newOnly` enabled (default), permits already delivered in previous runs are skipped — a scheduled run only charges for rows you haven't seen before.
- **Job-value filter.** Set `minCost` to only receive permits above a dollar threshold (e.g. $50,000+ renovations) and skip the water-heater swaps.
- **One normalized schema across cities.** Permit number, type, work description, issue date, cost, address, contractor — same columns whether it came from NYC or Austin.

### Output example

```json
{
    "city": "NYC",
    "permit_number": "M01419837-I1-GC",
    "permit_type": "General Construction",
    "description": "Interior renovation of existing retail space...",
    "issued_date": "2026-07-07",
    "estimated_cost": 150000,
    "address": "50 GREENE STREET",
    "zip": "10013",
    "contractor_name": "ARIEL CONSULTANTS LLC",
    "contractor_license": "616931",
    "source": "NYC Department of Buildings (data.cityofnewyork.us)"
}
```

Typical volume (all five cities): **700–1,000 permits per day**.

### Who uses this

- **Building-material & equipment suppliers** — reach contractors with active jobs, not cold lists.
- **Subcontractors** (electrical, plumbing, HVAC, roofing) — see which GCs just pulled permits near you.
- **Solar, security, smart-home installers** — homeowners mid-renovation are buying.
- **Insurance & bonding** — new projects need coverage; valuation included.
- **Real-estate investors & proptech** — track renovation activity by neighborhood, spot flips early.
- **Data teams** — construction-activity indices, comps, market research.

### Inputs

| Field | Default | Notes |
|---|---|---|
| `cities` | all five | Any subset of NYC, CHI, LA, SF, AUS |
| `sinceDays` | `7` | Look-back window (1–90 days) |
| `minCost` | `0` | Only permits with job value ≥ this (permits without a recorded cost are excluded when > 0) |
| `newOnly` | `true` | Skip permits delivered by previous runs |
| `maxResults` | `0` (no cap) | Handy for test runs |
| `socrataAppToken` | — | Optional; raises city API rate limits for large backfills |

### Recommended setup: scheduled lead feed

1. Create a **Schedule** in Apify Console (daily, e.g. 7:00 AM).
2. Input: your cities, `sinceDays: 3`, `newOnly: true`, and a `minCost` that fits your ticket size.
3. Add an integration (email, Slack, webhook, Google Sheets, Make/Zapier) to deliver each run's fresh permits to your pipeline.

**Note on freshness:** cities publish on their own schedules — most update daily, but some (e.g. Los Angeles) can lag a few days behind the issue date. `newOnly` mode handles this automatically: late-arriving permits are delivered as soon as the city publishes them, never duplicated.

### More cities?

NYC, Chicago, LA, SF, and Austin are live. Dozens more cities publish official permit feeds — **open an issue and tell me which city you need**; well-supported requests ship within days.

### Data & fair-use notes

All records are public building permits published by city governments for exactly this purpose. The actor queries official open-data APIs politely (paged, rate-limited, identified). Records describe permits and businesses, not consumers.

# Actor input Schema

## `cities` (type: `array`):

Which city feeds to pull. All supported cities by default.

## `sinceDays` (type: `integer`):

Return permits issued within the last N days. City feeds update daily (some with 1-2 day lag), so 7 is a good weekly cadence; use 2-3 on a daily schedule.

## `minCost` (type: `integer`):

Only return permits with an estimated/reported job cost at or above this amount. Note: permits with no cost on record are excluded when this is above 0. Set 0 to include everything.

## `newOnly` (type: `boolean`):

When enabled, permits already returned by previous runs of this actor are skipped, so a scheduled run only yields (and only charges for) genuinely new permits.

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

Hard cap on total results across all cities (0 = no cap). Useful for test runs.

## `socrataAppToken` (type: `string`):

Optional app token from any Socrata open-data portal account. Not required — it just raises the city APIs' rate limits for very large backfills.

## Actor input object example

```json
{
  "cities": [
    "NYC",
    "CHI",
    "LA",
    "SF",
    "AUS"
  ],
  "sinceDays": 7,
  "minCost": 0,
  "newOnly": true,
  "maxResults": 0
}
```

# 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("esco.api/building-permits").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("esco.api/building-permits").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 '{}' |
apify call esco.api/building-permits --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=esco.api/building-permits",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

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