# Building Permits Scraper - Construction Leads, 13 Cities (`plotpointtech/building-permits-feed`) Actor

New building permits from 13 US and Canadian cities (NYC, LA, Chicago, SF, Seattle, Austin and more) in one format: work type, address, project value, contractor and owner. Filter by keyword or value. $4 per 1,000 permits.

- **URL**: https://apify.com/plotpointtech/building-permits-feed.md
- **Developed by:** [Plot Point Technologies](https://apify.com/plotpointtech) (community)
- **Categories:** Lead generation, Real estate, Automation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.48 / 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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Building Permits Scraper: Construction Leads from 13 Cities

**Get new building permits from 13 major US and Canadian cities in one consistent format, straight from each city's official open-data portal.** Every city publishes permits differently. This building permits scraper maps them all into one schema: permit type, work description, address, issue date, declared project value, contractor and owner, so a single run gives you a table you can sort, filter and load into your CRM.

**Cities covered:** New York, Los Angeles, Chicago, San Francisco, Seattle, Austin, Cincinnati, Baton Rouge, Mesa, Corona, Marin County, Calgary and Edmonton.

### What can this building permits scraper do?

- **Pull fresh permits** issued (or applied for, where a city publishes applications) in the last N days.
- **Find the jobs you want** with keywords such as roof, solar, pool, ADU, HVAC, demolition or new construction.
- **Focus on bigger projects** with a minimum declared project value, for example $50,000.
- **Prospect contractors** by keeping only permits that name a contractor.
- **Stay balanced** with a per-city cap so one large city does not crowd out the rest.

### What data do you get?

| Field | Meaning |
|---|---|
| `city`, `cityKey` | Jurisdiction |
| `permitNumber`, `permitType`, `workType`, `status` | The permit and what kind of work it covers |
| `description` | The city's description of the work |
| `appliedDate`, `issuedDate` | Key dates (YYYY-MM-DD) |
| `address`, `zip`, `lat`, `lon` | Where the work is |
| `valuation` | Declared project value in dollars, where published |
| `squareFeet`, `units` | Size and housing units, where published |
| `contractor`, `owner` | Contractor(s) and owner/applicant, where published |
| `link`, `source` | Link to the city's permit record (where available) and the source dataset |

### Who uses it?

- **Contractors and trades** (roofing, solar, HVAC, pools, electrical, plumbing) looking for owners and builders with active projects.
- **Building-material suppliers and equipment rental** firms finding job sites early.
- **Real-estate investors, lenders and insurers** tracking development and renovation activity.
- **Market researchers** measuring construction activity by city and project type.

### How to use it

1. Click **Try for free** (or **Start**).
2. Pick your **Cities** (leave empty for all 13) and **Days back**.
3. Add **Keywords** and a **Minimum project value** if you want specific job types.
4. Run it and export to Excel, CSV or JSON, or push it to your CRM.
5. Schedule it weekly (Days back = 7) or daily (Days back = 1) for a steady lead feed.

### Input example

```json
{
  "cities": [
    "chicago",
    "austin",
    "seattle"
  ],
  "daysBack": 7,
  "keywords": [
    "roof",
    "solar",
    "new construction"
  ],
  "minValuation": 20000,
  "onlyWithContractor": true,
  "maxResults": 300
}
```

### Output example

```json
{
  "city": "Calgary, AB",
  "cityKey": "calgary",
  "permitNumber": "BP2026-20550",
  "permitType": "Single Construction Permit 1407 - Two Family Semi-Detached (1 Unit)",
  "workType": "New",
  "description": "SEMI-D,GARAGE,DECK,PORCH,",
  "status": "In Review",
  "appliedDate": "2026-10-26",
  "issuedDate": null,
  "address": "184 CREEKSIDE TC SW",
  "zip": null,
  "valuation": 246805.33,
  "squareFeet": 2017,
  "units": 1,
  "contractor": "MORRISON HOMES (CALGARY)",
  "owner": "MORRISON HOMES (CALGARY)",
  "lat": 50.86,
  "lon": -114.08,
  "link": null,
  "source": "https://data.calgary.ca/d/c2es-76ed"
}
```

### How much does it cost?

Pay per permit returned: **$4 per 1,000 permits** ($0.004 each), plus a $0.00005 start fee per run. No separate compute charges.

| You get | You pay |
|---|---|
| 100 roofing and solar permits | $0.40 |
| 500 permits across all cities | $2.00 |
| 2,500 permits a month from a weekly schedule | $10.00 |

Use **Maximum results** and **Maximum per city** to control cost. Apify's free plan includes monthly credits to try it.

**Volume discounts on higher Apify plans.** The prices above are for the Apify Free plan. On paid plans the per-result price drops automatically: about 15% lower on Bronze, 25% lower on Silver and 38% lower on Gold and above.

### Use it via API, Make, Zapier, n8n or an AI agent

**Apify API.** Start a run and get the results back in one HTTP request (replace `YOUR_API_TOKEN` with the token from Apify Console > Settings > Integrations):

```bash
curl -X POST "https://api.apify.com/v2/acts/plotpointtech~building-permits-feed/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"cities": ["chicago", "austin", "seattle"], "daysBack": 7, "keywords": ["roof", "solar", "new construction"], "minValuation": 20000, "onlyWithContractor": true, "maxResults": 300}'
```

For longer jobs, start the run asynchronously and read the dataset when it finishes. Official `apify-client` libraries exist for Python and JavaScript; the **API** tab on this page has ready-made code.

**No-code automation.** Connect the tool to **Make, Zapier, n8n, Google Sheets, Slack, Airtable** or any webhook with Apify integrations, and use **Schedules** in Apify Console to run it hourly, daily or weekly.

**AI agents (MCP).** Give Claude, ChatGPT, Cursor, VS Code or any MCP-compatible agent direct access to this tool through the hosted Apify MCP server. Add this server URL to your client:

```
https://mcp.apify.com?tools=plotpointtech/building-permits-feed
```

The agent can then call the tool with the same input fields shown above and read the results.

### FAQ

**Is it legal to use building permit data?**
Yes. Building permits are public records, and every source here is a city's official open-data portal published for reuse. Some cities list owners who are private individuals; if you contact them, you are responsible for following privacy and marketing laws such as telemarketing and anti-spam rules.

**Why are some fields empty?**
Fields are filled only where a city publishes them. Not every city publishes contractor names, owner names or project values, and some do not publish a link to each permit.

**How fresh is the data?**
It follows each city's own update schedule, usually daily.

**Can you add my city?**
Open an issue with the city's open-data permit dataset and we will look at adding it.

**Do I need an API key?**
No. For very large pulls you can add a free Socrata app token, which raises the portals' rate limits.

### Related tools from Plot Point Technologies

- [Local Business Leads Scraper - MX-Checked Emails & Phones](https://apify.com/plotpointtech/local-business-leads): local businesses by category and city with checked emails.
- [Government Tenders Scraper - EU TED, UK & Canada Contracts](https://apify.com/plotpointtech/government-tenders-feed): open public contracts from EU TED, UK and Canada in one format.
- [Email & Contact Scraper - Website Emails, Phones & Socials](https://apify.com/plotpointtech/website-contact-finder): emails, phones and social links from any list of company websites.

Plot Point Technologies is not affiliated with any city government.

***

If this tool saved you time, we would be grateful for a short review on this page; it helps other people find it. If something did not work as expected, please open an issue on the **Issues** tab and we will look into it quickly.

# Actor input Schema

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

Which jurisdictions to include. Leave empty for all.

## `daysBack` (type: `integer`):

Permits dated within this many recent days (issued, or applied where a city publishes applications).

## `minValuation` (type: `integer`):

Only permits with at least this declared job value. Permits without a value are dropped when set.

## `keywords` (type: `array`):

Match permit type, work type or description, e.g. roof, solar, pool, new construction, HVAC.

## `onlyWithContractor` (type: `boolean`):

Skip permits that list no contractor.

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

Total cap across all cities.

## `maxPerCity` (type: `integer`):

Cap per city so one large city does not crowd out others.

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

For very large pulls. Free from any Socrata open-data portal.

## Actor input object example

```json
{
  "cities": [],
  "daysBack": 7,
  "keywords": [],
  "onlyWithContractor": false,
  "maxResults": 500,
  "maxPerCity": 500
}
```

# Actor output Schema

## `results` (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("plotpointtech/building-permits-feed").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("plotpointtech/building-permits-feed").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 plotpointtech/building-permits-feed --silent --output-dataset

```

## MCP server setup

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

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/NAafav6p0ajd9O6vS/builds/7y4ep2ILGDvF5au2R/openapi.json
