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

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

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Building Permits Monitor — NYC, Chicago, LA, SF, Austin",
        "description": "Fresh building permits from official city open-data feeds — normalized, deduplicated, lead-ready. Contractor names, job costs, work descriptions. Filter by minimum job value.",
        "version": "0.1",
        "x-build-id": "xQBLKOPSGjMrf2paH"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/esco.api~building-permits/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-esco.api-building-permits",
                "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/esco.api~building-permits/runs": {
            "post": {
                "operationId": "runs-sync-esco.api-building-permits",
                "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/esco.api~building-permits/run-sync": {
            "post": {
                "operationId": "run-sync-esco.api-building-permits",
                "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": {
                    "cities": {
                        "title": "Cities",
                        "type": "array",
                        "description": "Which city feeds to pull. All supported cities by default.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "NYC",
                                "CHI",
                                "LA",
                                "SF",
                                "AUS"
                            ],
                            "enumTitles": [
                                "New York City",
                                "Chicago",
                                "Los Angeles",
                                "San Francisco",
                                "Austin"
                            ]
                        },
                        "default": [
                            "NYC",
                            "CHI",
                            "LA",
                            "SF",
                            "AUS"
                        ]
                    },
                    "sinceDays": {
                        "title": "Look-back window (days)",
                        "minimum": 1,
                        "maximum": 90,
                        "type": "integer",
                        "description": "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.",
                        "default": 7
                    },
                    "minCost": {
                        "title": "Minimum job value (USD)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "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.",
                        "default": 0
                    },
                    "newOnly": {
                        "title": "New results only (dedupe across runs)",
                        "type": "boolean",
                        "description": "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.",
                        "default": true
                    },
                    "maxResults": {
                        "title": "Max results",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Hard cap on total results across all cities (0 = no cap). Useful for test runs.",
                        "default": 0
                    },
                    "socrataAppToken": {
                        "title": "Socrata app token (optional)",
                        "type": "string",
                        "description": "Optional app token from any Socrata open-data portal account. Not required — it just raises the city APIs' rate limits for very large backfills."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
