# US Building Permits Scraper (`straightforward_hydra/us-building-permits-scraper`) Actor

Issued building & construction permits from major US city open-data portals (NYC, Chicago, SF, LA, Austin). No key.

- **URL**: https://apify.com/straightforward\_hydra/us-building-permits-scraper.md
- **Developed by:** [Dev D](https://apify.com/straightforward_hydra) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 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.

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

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

## US Building Permits Scraper 🏗️

**Issued building & construction permits from major US cities — NYC, Chicago, San Francisco, Los Angeles and Austin — straight from official city open-data portals. No API key, no proxy.**

Pull fresh, structured **building permit** records across the biggest US markets in one run: address, permit type, status, work description, issue date, estimated cost, contractor/owner, and geo-coordinates. Filter by date, ZIP, permit type, status, or a full-text keyword like `solar`, `roof`, `pool` or `demolition`.

Perfect for **contractor & trade lead generation** (solar, roofing, HVAC, remodeling), construction-market intelligence, real-estate and property research, and competitor monitoring.

> Data comes from each city's **official Socrata open-data portal** — public, non-personal permit records. No key required (an optional free Socrata app token raises rate limits).

---

### Supported cities

| City | State | Source portal |
|---|---|---|
| New York City | NY | data.cityofnewyork.us |
| Chicago | IL | data.cityofchicago.org |
| San Francisco | CA | data.sfgov.org |
| Los Angeles | CA | data.lacity.org |
| Austin | TX | data.austintexas.gov |

One normalized schema across all of them — mix and match cities in a single run.

### Features

- ✅ **No API key, no proxy** — official open-data APIs, very low maintenance.
- ✅ **Lead-gen ready** — pull permits issued in the last N days, filter by ZIP or keyword.
- ✅ **Full-text search** — `keyword` searches every column (e.g. `solar` finds solar installs regardless of city schema).
- ✅ **Normalized output** — same fields for every city; optional raw record included.
- ✅ **Newest first** — results ordered by most recent activity.

---

### Input

| Field | Description |
|---|---|
| **Cities** | Which cities to pull (default: all five). |
| **Issued after / before** | Date range (YYYY-MM-DD) on the permit's issue/activity date. |
| **Keyword** | Full-text search across all columns (`solar`, `roof`, `pool`, `demolition`…). |
| **Permit type contains** | Filter by permit-type text (where the city exposes it). |
| **Status contains** | Filter by status text (where the city exposes it). |
| **ZIP codes** | Restrict to specific ZIPs (where the city exposes a ZIP column). |
| **Max results per city** | How many permits to fetch per selected city. |
| **Include raw record** | Add the original city record under `raw`. |
| **Socrata app token** | Optional free token for higher rate limits. |

#### Example — fresh solar leads this month

```json
{
  "cities": ["la", "austin", "sf"],
  "keyword": "solar",
  "issuedAfter": "2025-06-01",
  "maxResultsPerCity": 500
}
````

#### Example — recent NYC permits in specific ZIPs

```json
{
  "cities": ["nyc"],
  "zipCodes": ["11214", "11215"],
  "issuedAfter": "2025-01-01",
  "maxResultsPerCity": 1000
}
```

### Output

```json
{
  "city": "Los Angeles",
  "state": "CA",
  "permit_number": "26016-10000-06158",
  "permit_type": "Bldg-New 1 or 2 Family Dwelling",
  "permit_status": "Issued",
  "description": "Install a 25.96kW DC commercial solar system",
  "address": "554 S SAN PEDRO ST",
  "zip": "90013",
  "neighborhood": "Downtown",
  "issue_date": "2026-07-09",
  "estimated_cost": 75000,
  "contractor_name": null,
  "owner_name": null,
  "latitude": 34.045,
  "longitude": -118.245,
  "permit_url": null,
  "source_domain": "data.lacity.org",
  "dataset_id": "pi9x-tg5x"
}
```

Field availability varies by city (e.g. Chicago has no ZIP/status column; NYC carries permittee/owner names; LA carries an estimated valuation and a solar flag).

### Run it on a schedule

Schedule a daily run with `issuedAfter` set to yesterday to get a steady feed of **new permits** — pipe them to Slack, Google Sheets, a CRM or a webhook for a continuously refreshed lead list.

### Notes & limitations

- Official city **Socrata** open-data APIs — public, non-personal permit records.
- Coverage = the cities listed above (the biggest open-data markets); more can be added.
- Some filters only apply where a city exposes the matching column (documented above).
- Data freshness depends on each city's own publishing cadence.

***

#### Keywords

building permits, construction permits, permit scraper, US building permits, contractor leads, solar leads, roofing leads, HVAC leads, remodeling leads, NYC permits, Chicago permits, San Francisco permits, Los Angeles permits, Austin permits, DOB permits, construction data, real estate data, property data, open data, Socrata, lead generation, construction intelligence.

# Actor input Schema

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

Which cities to pull permits from. Leave empty for all supported cities.

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

Only permits issued on/after this date (YYYY-MM-DD). Great for pulling fresh leads on a schedule, e.g. permits from the last 7 days.

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

Only permits issued on/before this date (YYYY-MM-DD).

## `keyword` (type: `string`):

Full-text search across all columns, e.g. "solar", "roof", "pool", "kitchen", "demolition". Works on every city.

## `permitTypeContains` (type: `string`):

Filter by permit type text, e.g. "electrical", "new construction", "alteration". Applied where the city exposes a permit-type column.

## `statusContains` (type: `string`):

Filter by permit status text, e.g. "issued", "active", "final". Applied where the city exposes a status column (Chicago has none).

## `zipCodes` (type: `array`):

Restrict to these ZIP codes, e.g. \["11214", "94109"]. Applied where the city exposes a ZIP column (Chicago has none).

## `maxResultsPerCity` (type: `integer`):

How many permits to fetch per selected city (newest first).

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

Add the full original city record under a "raw" field alongside the normalized fields.

## `appToken` (type: `string`):

Optional free Socrata app token (dev.socrata.com) to raise rate limits. Not required for normal runs.

## Actor input object example

```json
{
  "cities": [
    "nyc",
    "chicago",
    "sf",
    "la",
    "austin"
  ],
  "maxResultsPerCity": 200,
  "includeRaw": false
}
```

# 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("straightforward_hydra/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 = {}

# Run the Actor and wait for it to finish
run = client.actor("straightforward_hydra/us-building-permits-scraper").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 straightforward_hydra/us-building-permits-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "US Building Permits Scraper",
        "description": "Issued building & construction permits from major US city open-data portals (NYC, Chicago, SF, LA, Austin). No key.",
        "version": "0.1",
        "x-build-id": "x8bte2QJbBac5Whxj"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/straightforward_hydra~us-building-permits-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-straightforward_hydra-us-building-permits-scraper",
                "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/straightforward_hydra~us-building-permits-scraper/runs": {
            "post": {
                "operationId": "runs-sync-straightforward_hydra-us-building-permits-scraper",
                "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/straightforward_hydra~us-building-permits-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-straightforward_hydra-us-building-permits-scraper",
                "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 cities to pull permits from. Leave empty for all supported cities.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "nyc",
                                "chicago",
                                "sf",
                                "la",
                                "austin"
                            ],
                            "enumTitles": [
                                "New York City (NY)",
                                "Chicago (IL)",
                                "San Francisco (CA)",
                                "Los Angeles (CA)",
                                "Austin (TX)"
                            ]
                        },
                        "default": [
                            "nyc",
                            "chicago",
                            "sf",
                            "la",
                            "austin"
                        ]
                    },
                    "issuedAfter": {
                        "title": "Issued after",
                        "type": "string",
                        "description": "Only permits issued on/after this date (YYYY-MM-DD). Great for pulling fresh leads on a schedule, e.g. permits from the last 7 days."
                    },
                    "issuedBefore": {
                        "title": "Issued before",
                        "type": "string",
                        "description": "Only permits issued on/before this date (YYYY-MM-DD)."
                    },
                    "keyword": {
                        "title": "Keyword (full-text)",
                        "type": "string",
                        "description": "Full-text search across all columns, e.g. \"solar\", \"roof\", \"pool\", \"kitchen\", \"demolition\". Works on every city."
                    },
                    "permitTypeContains": {
                        "title": "Permit type contains",
                        "type": "string",
                        "description": "Filter by permit type text, e.g. \"electrical\", \"new construction\", \"alteration\". Applied where the city exposes a permit-type column."
                    },
                    "statusContains": {
                        "title": "Status contains",
                        "type": "string",
                        "description": "Filter by permit status text, e.g. \"issued\", \"active\", \"final\". Applied where the city exposes a status column (Chicago has none)."
                    },
                    "zipCodes": {
                        "title": "ZIP codes",
                        "type": "array",
                        "description": "Restrict to these ZIP codes, e.g. [\"11214\", \"94109\"]. Applied where the city exposes a ZIP column (Chicago has none).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResultsPerCity": {
                        "title": "Max results per city",
                        "minimum": 1,
                        "maximum": 50000,
                        "type": "integer",
                        "description": "How many permits to fetch per selected city (newest first).",
                        "default": 200
                    },
                    "includeRaw": {
                        "title": "Include raw record",
                        "type": "boolean",
                        "description": "Add the full original city record under a \"raw\" field alongside the normalized fields.",
                        "default": false
                    },
                    "appToken": {
                        "title": "Socrata app token (optional)",
                        "type": "string",
                        "description": "Optional free Socrata app token (dev.socrata.com) to raise rate limits. Not required for normal runs."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
