Building Permits Scraper: Construction Leads from 7 US Cities avatar

Building Permits Scraper: Construction Leads from 7 US Cities

Pricing

$3.00 / 1,000 permits

Go to Apify Store
Building Permits Scraper: Construction Leads from 7 US Cities

Building Permits Scraper: Construction Leads from 7 US Cities

Returns issued building permits from 7 US city open data portals (Seattle, Austin, San Francisco, Cincinnati, Baton Rouge, New Orleans, Montgomery County MD): type, work description, address, ZIP, estimated cost, status and coordinates. Filter by city, date, cost and type.

Pricing

$3.00 / 1,000 permits

Rating

0.0

(0)

Developer

Viktor Wiberg

Viktor Wiberg

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 hours ago

Last modified

Share

A permit scraper for contractor leads. It collects issued building permits from the official open data portals of seven US cities and counties, one row per permit in one schema: city, permit number, issue and application date, permit type, work class, category, work description, street address, ZIP, estimated project cost, status, coordinates and a link to the permit where the city has one.

Use it to find new construction and renovation projects for sales leads (roofing, solar, HVAC, windows, materials, equipment rental), to watch what gets built in a neighbourhood, or to feed a CRM or a market report with fresh permits every morning instead of searching each city portal by hand.

What is covered

CityPortalDatasetLicense
Seattle, WAdata.seattle.govBuilding Permits (76t5-zqzr)Public Domain
Austin, TXdata.austintexas.govIssued Construction Permits (3syk-w9eu)Public Domain U.S. Government
San Francisco, CAdata.sfgov.orgBuilding Permits (i98e-djp9)Open Data Commons PDDL
Cincinnati, OHdata.cincinnati-oh.govCincinnati Building Permits (uhjb-xac9)Public Domain
Baton Rouge, LAdata.brla.govEBR Building Permits (7fq7-8j7r)Public Domain
New Orleans, LAdata.nola.govPermits (rcm3-fn58)CC0 1.0 (Public Domain Dedication)
Montgomery County, MDdata.montgomerycountymd.govResidential Permit (m88u-pqki) and Commercial Permits (i26v-w6bd)Public Domain

All datasets are updated by the cities every day or every few days. The actor reads them live through the Socrata SODA API, so a run always returns what the portal has at that moment.

  • Filters: city, issue date range, minimum estimated cost, permit type words and keywords in the work description.
  • Newest issued first across all selected cities.
  • With no input the actor returns the 50 newest permits issued in the last 30 days across all seven cities.

Example from a real run

This is the input and the first two rows of a run on the Apify platform on 3 October 2026 (run yPcsczfd2nBRbu4PU).

Input:

{
"cities": ["seattle", "austin"],
"minCost": 100000,
"maxResults": 3
}

Output (excerpt):

[
{
"city": "Austin",
"state": "TX",
"permitNumber": "2025-027099 BP",
"issuedDate": "2026-10-01",
"appliedDate": "2024-05-29",
"permitType": "Building Permit",
"workClass": "New",
"category": "Commercial",
"workDescription": "Ground up construction of a single story welding shop (Custom Manufacturing) with mezzanine",
"address": "4503 LUCKSINGER LN",
"zip": "78745",
"estimatedCost": 500000,
"status": "Active",
"latitude": 30.21523347,
"longitude": -97.76602047,
"permitUrl": "https://abc.austintexas.gov/web/permit/public-search-other?t_detail=1&t_selected_folderrsn=13479763",
"sourceDataset": "https://data.austintexas.gov/d/3syk-w9eu",
"sourcePortal": "data.austintexas.gov",
"license": "Public Domain U.S. Government"
},
{
"city": "Seattle",
"state": "WA",
"permitNumber": "7164872-CN",
"issuedDate": "2026-10-01",
"appliedDate": "2026-09-29",
"permitType": "Building",
"workClass": "Addition/Alteration",
"category": "Non-Residential",
"workDescription": "Construct repairs to existing commercial building at south elevation to remove and replace windows siding in kind STFI.",
"address": "2227 NW 57TH ST",
"zip": "98107",
"estimatedCost": 180408,
"status": "Issued",
"latitude": 47.66989921,
"longitude": -122.38599435,
"permitUrl": "https://services.seattle.gov/portal/customize/LinkToRecord.aspx?altId=7164872-CN",
"sourceDataset": "https://data.seattle.gov/d/76t5-zqzr",
"sourcePortal": "data.seattle.gov",
"license": "Public Domain"
}
]

Input

FieldTypeDefaultDescription
citiesarrayall sevenseattle, austin, san-francisco, cincinnati, baton-rouge, new-orleans, montgomery-county-md. Names such as "San Francisco" or "SF" also work.
issuedFromdate30 days agoPermits issued on or after this date, YYYY-MM-DD.
issuedTodatetodayPermits issued on or before this date.
minCostintegernoneMinimum estimated or declared project cost in USD. Permits without a cost are left out when it is set.
permitTypesarrayallWords that must appear in permitType, workClass or category, for example ["new", "demolition"].
keywordsarraynoneWords that must appear in workDescription, for example ["solar", "roof"].
maxResultsinteger50Rows in total, 1 to 10 000.
onlyNewbooleanfalseOnly permits that earlier runs with the same input did not deliver.

Output

FieldDescription
city, stateCity or county and two letter state code.
permitNumberThe permit or record number used by the city.
issuedDateDate the permit was issued, YYYY-MM-DD.
appliedDateDate the application was filed, when the city publishes it.
permitTypePermit type as the city names it, for example "Building Permit", "Demolition", "Mechanical HVAC".
workClassNew, addition, alteration, repair and similar, where the city has it.
categoryResidential or commercial class, or land use.
workDescriptionThe city's description of the work (up to 2 000 characters).
address, zipStreet address of the site and five digit ZIP. New Orleans publishes no ZIP.
estimatedCostEstimated, declared or construction value in USD as the city records it.
statusCurrent status, for example Issued, Active, Finaled. Baton Rouge publishes no status.
latitude, longitudeCoordinates of the site, null when missing.
permitUrlLink to the permit in the city's own system (Seattle, Austin, Cincinnati).
sourceDataset, sourcePortal, licenseWhere the row comes from and under which license.

The schema leaves out names and contact details on purpose: owner, applicant, contractor and permittee columns are never requested from the portals.

Monitoring and scheduling

Set onlyNew to true to use the actor as a daily permit alert. The actor then remembers which permits it has delivered for the same input, in a named key-value store in your Apify account (nightwave-state-us-building-permits, one record per input). Each run returns and charges only permits that earlier runs did not deliver. The first run returns everything in the selection. A run without news finishes successfully with 0 rows.

onlyNew and maxResults are not part of the remembered input, so you can change them without starting over. Changing any other field starts a fresh state. Leave issuedFrom empty in a schedule: it then always looks 30 days back, and permits you already have are skipped.

A second run straight after the first, with onlyNew and the same input, returns 0 rows and is not charged, unless a city published new permits in between.

Example: every morning at 07:00, new commercial permits worth 250 000 USD or more in Austin and Seattle. In Apify Console, open Schedules, create a schedule with the cron expression 0 7 * * * and add this actor with the input below.

{
"cities": ["austin", "seattle"],
"permitTypes": ["commercial", "non-residential"],
"minCost": 250000,
"onlyNew": true,
"maxResults": 500
}

The same schedule through the Apify API:

curl -X POST "https://api.apify.com/v2/schedules?token=<YOUR_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"name": "daily-building-permits", "cronExpression": "0 7 * * *", "timezone": "America/Chicago", "isEnabled": true, "isExclusive": true,
"actions": [{"type": "RUN_ACTOR", "actorId": "nightwave-owner~us-building-permits",
"runInput": {"contentType": "application/json; charset=utf-8", "body": "<the input above as a JSON string>"}}]}'

Connect a webhook or an integration (Slack, e-mail, Google Sheets, HubSpot) to the actor in Apify Console if you want the new rows sent somewhere when the run finishes.

Limitations

  • Permit types, statuses and cost fields differ between cities. The actor keeps each city's own wording in permitType, workClass and category instead of forcing them into a shared list, so permitTypes matches on words. Try ["new"], ["demolition"], ["roof"], ["solar"] or ["commercial"].
  • estimatedCost is what the applicant declared to the city. Some cities record 0 for trade permits (electrical, plumbing) and some do not record it at all.
  • A city that does not answer is logged as a warning and the run continues with the other cities. The run fails only if every selected portal fails.
  • Chicago, New York City and Los Angeles are not included. Their permit datasets do not carry a public domain license in the portal metadata (Chicago's terms of use add an indemnity obligation, and the New York and Los Angeles datasets state no license), so they are left out until that changes.
  • Each city is read with at most 20 000 rows per run. Narrow the date range if you need more history from one city.

Use cases

  • Contractors and suppliers: new construction, additions and remodels above a cost threshold, every morning.
  • Solar, roofing and HVAC companies: filter on keywords such as ["solar"], ["reroof"] or ["heat pump"].
  • Real estate and market research: count permits per ZIP or per month to see where building activity grows.
  • Local journalism and planning: track demolitions and new housing in a neighbourhood.

FAQ

Is this the official data? Yes. Every row comes straight from the city's own Socrata portal, and sourceDataset links to the dataset.

How fresh is it? As fresh as the portal. Most of the cities above update daily, so permits issued yesterday are usually in today's data.

Can you add my city? Only cities whose permit dataset is published under a public domain or equivalent open license are added. Write to kontakt@nightwave.se with the dataset link.

Do I get owner or contractor names? No. The actor is built for project data, not personal data.

Data source and license

All data comes from the Socrata Open Data API (SODA) of each portal listed in the table above. The license of each dataset was read from the portal's own metadata (license in the Socrata catalog at api.us.socrata.com) on 3 October 2026, and is repeated in the license field of every row:

These licenses allow copying, changing and commercial reuse without permission. The cities provide the data as is and make no warranty about its accuracy. This actor is not affiliated with or endorsed by any of the cities.

Pricing

Pay per result: 0.003 USD per permit returned (event permit), which is 3 USD per 1 000 permits. Apify bills platform usage on top as usual. It is small: a test run that returned 1 000 permits from all seven cities took 10 seconds and used 0.0002 USD of platform usage. maxResults caps how many rows a run returns, so you always know the highest possible cost.

Contact

Built and maintained by Nightwave AB. Questions, bugs and feature requests: kontakt@nightwave.se

På svenska

Actorn hämtar beviljade bygglov från de öppna dataportalerna i sju amerikanska städer och län (Seattle, Austin, San Francisco, Cincinnati, Baton Rouge, New Orleans och Montgomery County i Maryland), en rad per bygglov i ett gemensamt format: stad, lovnummer, beviljat datum, ansökningsdatum, typ av lov, typ av arbete, kategori, beskrivning, adress, postnummer, uppskattad kostnad i USD, status, koordinater och länk till lovet där staden har en.

  • Källa: varje stads Socrata-portal (SODA API), läst direkt vid körningen. Ingen API-nyckel behövs.
  • Licens: bara dataset som enligt portalens egen metadata är public domain (Public Domain, PDDL eller CC0) är med, kontrollerat 3 oktober 2026. Licensen står i fältet license på varje rad. Chicago, New York och Los Angeles är inte med eftersom deras dataset saknar en sådan licens.
  • Inga personuppgifter: kolumner med ägare, sökande, entreprenörer och kontaktpersoner hämtas aldrig.
  • Filter: stad, datumintervall, lägsta kostnad, ord i lovtypen och sökord i beskrivningen. Utan input fås de 50 senaste loven från de senaste 30 dagarna.
  • Med onlyNew: true levereras bara lov som tidigare körningar med samma input inte har levererat, vilket passar för daglig bevakning (se "Monitoring and scheduling").
  • Pris: 0,003 USD per bygglov (3 USD per 1 000) plus Apifys plattformsanvändning.
  • Kontakt: kontakt@nightwave.se