# US Building Permits Scraper — New Construction Leads (`publicdata/us-building-permits-scraper`) Actor

Export issued building permits from six US city open-data portals: address, permit type, declared value, contractor and owner. Filter by issue date to get construction jobs that are about to start. New York, Chicago, LA, Austin, Seattle, San Francisco. No API key.

- **URL**: https://apify.com/publicdata/us-building-permits-scraper.md
- **Developed by:** [PublicData](https://apify.com/publicdata) (community)
- **Categories:** Lead generation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.25 / 1,000 permits

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

## US Building Permits Scraper — New Construction Leads

**A building permit that was just issued is a construction job about to start — with the address, what is being built, what it costs and, in most cities, the contractor doing it.**

This Actor reads the permit datasets six US cities publish as open data and returns one clean row per permit, whatever each city calls its own columns. Filter by issue date and you have this week's construction pipeline instead of a directory.

No API key, no login, no proxies.

### What you get

**The lead signal**

- **`issuedDate`** — always ISO, whatever format the city stores it in
- **`address`**, `locality`, `postalCode`, and `latitude`/`longitude` where published

**What is being built**

- `permitType`, `permitSubtype`, `workClass`, `status`
- **`description`** — the scope of work in the city's own words: *"SCOPE: ROOF REPLACEMENT. AREA: 6450 SQ. FT."*
- **`declaredValue`** in USD — the cost the applicant declared

**Who is doing it**

- **`contractor`** and `contractorPhone` where the city publishes them
- `owner` — the property owner or their business

**Provenance**

- `permitNumber`, `city`, `cityCode`, `recordDate`, `sourceDataset`, `sourceUrl`, `source`

### Coverage

| City | Dataset | Permits in 2026 | Cost | Contractor |
|---|---|---|---|---|
| **New York City** | DOB Permit Issuance | 3,969,159 issued (all years) | — | 99% |
| **Los Angeles** | Building Permits | 41,204 | yes | — |
| **Austin** | Issued Construction Permits | 36,946 | yes | 91% |
| **Chicago** | Building Permits | 20,170 | yes | yes |
| **San Francisco** | Building Permits | 14,413 | yes | — |
| **Seattle** | Building Permits | 4,239 | yes | 8% |

Counts measured against the live portals on 25 August 2026.

### Who uses this

- **Building-material suppliers, roofers, solar installers, HVAC and landscaping firms** — permits filtered by work type and value are jobs that have just been approved and not yet sourced.
- **Subcontractors** — `contractor` shows which general contractor won the job, so you approach the firm that now needs trades.
- **Real-estate and property analysts** — permit volume and declared value by ZIP code, as a leading indicator months ahead of completions.
- **Insurers and lenders** — verify that work at an address was permitted, and what it was declared to cost.
- **Developers and AI agents** — one schema over six portals, callable over the API or as an MCP tool.

### Example output

```json
{
  "permitNumber": "100999521",
  "city": "Chicago",
  "issuedDate": "2026-08-23",
  "permitType": "PERMIT - EASY PERMIT PROCESS",
  "description": "SCOPE: ROOF REPLACEMENT. AREA: 6450 SQ. FT.",
  "declaredValue": 132500.0,
  "currency": "USD",
  "address": "6605 N AVONDALE AVE",
  "contractor": "MARTINEZ VANESSA",
  "sourceDataset": "data.cityofchicago.org/ydr8-5enu",
  "source": "US city open-data portals (Socrata)"
}
```

### Input

| Field | What it does |
|---|---|
| `cities` | `NYC`, `CHI`, `LA`, `AUS`, `SEA`, `SF`. Empty = all six. |
| `issuedAfter` | **The lead filter**: permits issued from this date on. Empty = the last 7 days. |
| `issuedBefore` | Upper bound of the window. |
| `minValue` | Minimum declared cost in USD. New York publishes no cost column and is skipped when this is set. |
| `query` | Work description contains — `roof`, `solar`, `kitchen`, `demolition`. Not available for New York, which publishes no description column. |
| `permitType` | Permit type contains — `electrical`, `new construction`, `alteration`. |
| `includeRaw` | Attach the untouched city record as well. |
| `maxItems` | Safety cap across all cities. `0` = unlimited. |

Roofing jobs over $50,000 approved this month:

```json
{ "cities": ["CHI", "AUS", "SEA"], "issuedAfter": "2026-08-01", "query": "roof", "minValue": 50000 }
```

Everything permitted in Los Angeles last week:

```json
{ "cities": ["LA"], "issuedAfter": "2026-08-18" }
```

### Run it on a schedule

Save your filters as a Task, leave the dates empty so each run covers the last 7 days, and schedule it weekly. Attach an Apify integration and new permits land in **Google Sheets**, **Slack**, **e-mail**, a **webhook**, or **Make** and **Zapier**.

Deduplicate on `permitNumber` together with `cityCode` — permit numbers are unique per city, not nationally.

### Use it from code or from an AI agent

Start runs and read the dataset over the Apify API or CLI, as JSON, CSV, Excel or XML. The Actor is also exposed as an **MCP tool** through the Apify MCP server, so an agent can answer "which roofing permits over $50k were issued in Chicago this week?" in one call.

### Pricing

Pay per event: a small fee per permit exported. API calls only — no browser, no proxy — so platform usage on top is negligible. Use `maxItems` for a hard ceiling.

### Where the data comes from

Each city publishes its permit register on its own open-data portal, all running Socrata. This Actor queries those endpoints directly; `sourceDataset` and `sourceUrl` on every row point back to the exact record.

**Honest limits**, every one of them measured against the live portals on 25 August 2026.

Six cities, not the whole country — most US municipalities publish nothing comparable. The portals refresh on each city's own schedule, so this is a daily-to-weekly feed, not real time.

**The cities differ, and the differences are not cosmetic.** New York publishes no declared cost and no description, so value and keyword filters cannot apply there and it is skipped when you set them. Its issue date is stored as US-format text rather than a date, so this Actor expands your window into the individual days it covers — which caps a single New York run at 400 days of history. Contractor coverage is 99% in New York, 91% in Austin and only **8%** in Seattle; Los Angeles and San Francisco publish no contractor column at all, and those rows come back null rather than guessed.

A declared value is what the applicant stated on the application, not the final cost of the work. This Actor is independent and not affiliated with any city agency.

### Related Actors

Same engine, same official-source approach:

- [**US Business Registry**](https://apify.com/publicdata/us-business-registry-scraper) — newly registered companies by state, on the same Socrata protocol
- [**UK Public Tenders**](https://apify.com/publicdata/uk-contracts-finder-find-a-tender) — Contracts Finder and Find a Tender in one run
- [**AusTender (Australia)**](https://apify.com/publicdata/austender-australian-government-contracts) — federal contracts, winners and expiry dates
- [**EU Tenders (TED)**](https://apify.com/publicdata/ted-eu-public-tenders) — European procurement notices and contract awards
- [**Swiss Public Tenders (simap.ch)**](https://apify.com/publicdata/simap-swiss-public-tenders) — tenders and awards with prices and bid counts
- [**France Company Register**](https://apify.com/publicdata/france-company-register-scraper) — SIREN/SIRET, executives, official labels

***

#### Italiano

Esporta i **permessi edilizi rilasciati in sei città americane** dai portali open data ufficiali: indirizzo, tipo di intervento, valore dichiarato, impresa e proprietario. Il filtro sulla data di rilascio lo rende una fonte di **cantieri appena approvati**: chi vende materiali, coperture, impianti o subappalti trova lavori assegnati da pochi giorni. New York, Chicago, Los Angeles, Austin, Seattle, San Francisco.

#### Deutsch

Exportiert **erteilte US-Baugenehmigungen** aus den offiziellen Open-Data-Portalen von sechs Städten: Adresse, Art der Arbeiten, angegebener Bauwert, Bauunternehmen und Eigentümer. Über das Erteilungsdatum filtern Sie **frisch genehmigte Bauvorhaben** — Leads für Baustoffhandel, Dachdecker, Solar- und Haustechnikbetriebe.

#### Français

Exporte les **permis de construire délivrés dans six villes américaines** depuis les portails open data officiels : adresse, nature des travaux, coût déclaré, entreprise et propriétaire. Le filtre sur la date de délivrance fournit les **chantiers fraîchement autorisés**, avant que les fournisseurs et sous-traitants ne soient choisis.

# Actor input Schema

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

Which city portals to read. Empty = all six.

## `issuedAfter` (type: `string`):

The lead filter: permits issued from this date on (YYYY-MM-DD). Empty = last 7 days.

## `issuedBefore` (type: `string`):

Upper bound of the window (YYYY-MM-DD).

## `minValue` (type: `integer`):

Keep only permits at or above this cost. New York publishes no cost column and is skipped when this is set.

## `query` (type: `string`):

e.g. `roof`, `solar`, `kitchen`, `demolition`. New York publishes no description column.

## `permitType` (type: `string`):

e.g. `electrical`, `new construction`, `alteration`.

## `includeRaw` (type: `boolean`):

Attach the untouched row as published by the city.

## `maxItems` (type: `integer`):

Safety cap across all selected cities. 0 = unlimited.

## Actor input object example

```json
{
  "cities": [
    "CHI"
  ],
  "includeRaw": false,
  "maxItems": 500
}
```

# Actor output Schema

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

Issued building permits from six US cities: address, type, declared value, contractor and owner. Every exported row is one dataset item.

# 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 = {
    "cities": [
        "CHI"
    ],
    "query": "",
    "permitType": "",
    "maxItems": 500
};

// Run the Actor and wait for it to finish
const run = await client.actor("publicdata/us-building-permits-scraper").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 = {
    "cities": ["CHI"],
    "query": "",
    "permitType": "",
    "maxItems": 500,
}

# Run the Actor and wait for it to finish
run = client.actor("publicdata/us-building-permits-scraper").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 '{
  "cities": [
    "CHI"
  ],
  "query": "",
  "permitType": "",
  "maxItems": 500
}' |
apify call publicdata/us-building-permits-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,publicdata/us-building-permits-scraper"
        }
    }
}

```

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/G9ZdRXH7W64gJfapR/builds/k9lFSHPDiA9AFPR9Z/openapi.json
