US Building Permits Scraper — City & County Permit Records avatar

US Building Permits Scraper — City & County Permit Records

Pricing

from $3.00 / 1,000 permit record scrapeds

Go to Apify Store
US Building Permits Scraper — City & County Permit Records

US Building Permits Scraper — City & County Permit Records

Scrape building permits from 26 US city and county open-data portals (NYC, Chicago, LA, SF, Seattle, Austin, Philadelphia, Boston, DC, Miami-Dade, more) into a normalized JSON schema. Filter by date, type, cost and keyword; monitor new permits for contractor, solar and roofing leads. $0.003/permit.

Pricing

from $3.00 / 1,000 permit record scrapeds

Rating

0.0

(0)

Developer

Owlabee

Owlabee

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

What it does

This Actor pulls building permits from the official open-data portals of 26 US cities and counties and writes them into one normalized JSON schema: permit number, type and subtype, work description, status, applied / issued / finalized / expiration dates, estimated cost, address with coordinates and parcel id, contractor and license, and the owner or applicant names where the jurisdiction publishes them. Every record links back to its public source.

It talks directly to each city's Socrata (SODA), CKAN DataStore, ArcGIS REST or CARTO SQL API — no browser, no proxies, no login — so runs are fast, cheap and stable. Filter by issued-date window, permit-type keywords, work-description keyword and minimum cost, and turn on Only new permits since last run to get a daily feed of fresh permits for contractor, solar, roofing, HVAC, remodeling or real-estate lead generation. Results are available as JSON, CSV, Excel, via the Apify API, webhooks and the Apify MCP server.

How to use

  1. Pick one or more Jurisdictions (or "All supported jurisdictions") and set Issued within (days).
  2. Optionally narrow with Permit type keywords (e.g. roof, solar, electrical), a Work description keyword (e.g. kitchen), a Minimum estimated cost, and cap Max permits per jurisdiction.
  3. Click Start. Permits appear in the dataset as each jurisdiction is paged. For a daily feed, schedule the Actor with Only new permits since last run enabled and add a Webhook URL.

Input

FieldTypeRequiredDescription
jurisdictionsstring[]yesRegistry ids (see table below) or all. Default ["chicago","seattle"].
issuedWithinDaysintegernoOnly permits issued in the last N days (1–3650). Default 30.
permitTypesstring[]noKeep permits whose type/subtype contains any of these words (case-insensitive).
keywordstringnoKeep permits whose work description contains this text.
minEstimatedCostintegernoDrop permits with a declared cost below this (permits without a cost are kept).
maxResultsPerJurisdictionintegernoCap per jurisdiction, newest first. Default 1000.
onlyNewSinceLastRunbooleannoMonitor mode: emit only permits not seen in earlier runs (per jurisdiction, up to 50,000 remembered).
stateStoreNamestringnoNamed key-value store for the seen-sets. Default building-permits-scraper-state.
includeRawbooleannoAttach the untouched source row as raw.
socrataAppTokenstring (secret)noOptional Socrata app token to raise rate limits on the 13 Socrata-backed portals.
webhookUrlstringnoPOST target for the run summary + emitted permits (max 500).

Filters are pushed to the server wherever the portal supports it (Socrata $where, ArcGIS where, CARTO SQL) and always re-applied client-side, so behaviour is identical across APIs. CKAN portals (Boston, Pittsburgh) have no date filter: they are scanned newest-first until the window ends.

Output example

{
"jurisdiction": "nyc",
"jurisdictionName": "New York City, NY",
"permitNumber": "B01186301-S6-MS",
"permitType": "Mechanical Systems",
"permitSubtype": "Initial Permit",
"workDescription": "Mechanical Systems filed in conjunction to NB application #B01186301-I1.",
"status": "Permit Issued",
"appliedDate": "2026-02-20",
"issuedDate": "2026-10-14",
"finalizedDate": null,
"expirationDate": "2027-10-14",
"estimatedCost": null,
"address": "280 BERGEN STREET",
"city": "Brooklyn",
"state": "NY",
"zip": "11217",
"parcelId": "3003880020",
"latitude": 40.683782,
"longitude": -73.982946,
"contractorName": "DEVELOPING NY STATE LLC",
"contractorLicense": "612632",
"ownerName": "DEVELOPING NY STATE",
"applicantName": "YITCHOK KATZ",
"sourceApi": "socrata",
"sourceUrl": "https://data.cityofnewyork.us/d/rbx6-tga4",
"sourceRecordId": "B01186301-S6-MS-1",
"fetchedAt": "2026-10-16T13:25:32.995Z"
}

Dates are ISO-8601 as published (date-only when the portal stores midnight). estimatedCost is a number in USD or null when the jurisdiction publishes no valuation (DC, Philadelphia, Maricopa County). In monitor mode every emitted permit carries isNew: true. A jurisdiction that cannot be queried produces one error item instead of failing the run: { "jurisdiction": "boston", "error": "HTTP_503", "errorMessage": "...", "sourceApi": "ckan", "fetchedAt": "..." }.

Supported jurisdictions

All entries were verified live on 2026-10-16 (dataset id, field mapping, freshness of the newest issued date).

IdJurisdictionSource (API)Update frequency / notes
nycNew York City, NYDOB NOW: Build – Approved Permits rbx6-tga4 (Socrata)Daily. Electronic DOB NOW filings; cost, contractor license, owner.
chicagoChicago, ILBuilding Permits ydr8-5enu (Socrata)Daily. Contractor/owner/applicant from contact roles.
los-angelesLos Angeles, CALADBS Permits Issued 2020–present pi9x-tg5x (Socrata)Weekly; issued dates lag ~1 week. No contractor/owner columns.
san-franciscoSan Francisco, CADBI Building Permits i98e-djp9 (Socrata)Daily. One row per permit address.
seattleSeattle, WASDCI Building Permits 76t5-zqzr (Socrata)Daily. Per-record portal links.
austinAustin, TXIssued Construction Permits 3syk-w9eu (Socrata)Daily. Contractor + applicant, per-record links.
philadelphiaPhiladelphia, PAL&I Permits (CARTO SQL, OpenDataPhilly)Daily. Contractor + OPA owner; no valuation.
bostonBoston, MAApproved Building Permits (CKAN DataStore)Daily. Applicant, declared valuation.
washington-dcWashington, DCDCRA Building Permits in {year} (ArcGIS)Daily. Layer per calendar year, resolved at run time; no valuation.
miami-dade-countyMiami-Dade County, FLPermits issued by the County, 2 previous years to present (ArcGIS)Daily. County-issued permits (unincorporated areas), no coordinates.
maricopa-county-azMaricopa County, AZBuilding Permits (ArcGIS)Daily. Unincorporated county only; no valuation.
nashvilleNashville / Davidson County, TNBuilding Permits Issued (ArcGIS)Daily.
detroitDetroit, MIBSEED Building Permits (ArcGIS)Daily. No status/contractor columns.
raleighRaleigh, NCBuilding Permits (ArcGIS)Daily. Contractor, parcel owner.
baltimoreBaltimore, MDDHCD Building Permits (ArcGIS)Every 2–4 weeks; issued dates lag up to a month.
cincinnatiCincinnati, OHBuilding Permits uhjb-xac9 (Socrata)Daily. Per-record links.
pittsburghPittsburgh, PAPLI Permits (CKAN DataStore, WPRDC)Daily. Contractor + owner when published.
louisvilleLouisville / Jefferson County, KYActive Construction Permits (ArcGIS)Daily. Active permits only; no free-text description.
memphisMemphis / Shelby County, TNDPD Building Permits (ArcGIS)~Every 2 weeks; issued dates lag up to ~3 weeks.
new-orleansNew Orleans, LAOne Stop Permits rcm3-fn58 (Socrata)Daily. Contractor, owner, applicant.
tucsonTucson, AZResidential Permits (ArcGIS)Daily. Residential layer only.
buffaloBuffalo, NYPermits 9p2d-f3yt (Socrata)Daily. Applicant + license number.
orlandoOrlando, FLPermit Applications ryhf-m453 (Socrata)Daily refresh; issued dates lag ~3 weeks. Contractor + owner.
montgomery-county-md-residentialMontgomery County, MDResidential Permits m88u-pqki (Socrata)Daily.
montgomery-county-md-commercialMontgomery County, MDCommercial Permits i26v-w6bd (Socrata)Daily.
cambridge-maCambridge, MABuilding Permits: Addition/Alteration qu2z-8suj (Socrata)Daily. Applicant + contractor firm.

For lagging feeds (Baltimore, Memphis, Orlando, Los Angeles) use issuedWithinDays of 30–45 so the window overlaps the publication delay. Not included on purpose: Dallas (dataset frozen since 2020), Denver (empty layers), Virginia Beach (not updated since July 2026), the NYC legacy BIS feed (free-text dates, 15–30 s queries), and Mesa, San Diego and King County (no queryable API; see "Phase B" in docs/listing.md).

Monitor mode

With onlyNewSinceLastRun, the Actor keeps a seen-set of sourceRecordIds per jurisdiction in the state store (max 50,000 per jurisdiction, oldest pruned first) and emits only permits it has not seen before, flagged isNew: true. The first run is a baseline: it emits and charges for every permit in the window. Permits that drop out of the date window and reappear are not reported again. Use one state store name per schedule if you run different filters against the same jurisdiction.

Pricing

Pay per event. You only pay for what the Actor produces; set a maximum cost per run in the run options to cap spend.

EventPriceNotes
Permit record scraped$0.003Per dataset item, including error items for jurisdictions that failed
Jurisdiction crawled$0.01Once per jurisdiction per run, regardless of result count
Actor start$0.00005Apify platform event

Examples: 1,000 permits ≈ $3.00; a daily check of 10 cities ≈ $0.10 + $0.003 per new permit found. The default input (2 jurisdictions × 25 permits) costs $0.17. Monitor runs that find nothing new cost only the per-jurisdiction fee.

Limits and fair use

  • Requests are rate-limited to at most 2 per second per portal, with exponential backoff on 429/5xx; three jurisdictions are crawled in parallel.
  • Page sizes are 1,000 rows; a jurisdiction with 20,000 permits in the window takes about 20 requests.
  • Only public open-data endpoints are used. No login, no proxies, no browsers. Socrata portals allow anonymous use; add a free app token for heavy daily use.
  • Each portal defines its own permit-type vocabulary; use generic words in permitTypes and check permitType/permitSubtype values in a first run.
  • Coverage is the jurisdiction's own dataset: county entries cover county-issued permits, Louisville publishes active permits only, Tucson residential only.

Other pay-per-event Actors from the same account, all limited-permission and agent-friendly:

FAQ

Does this need proxies or an API key? No. It calls public open-data APIs over plain HTTPS from Apify's standard infrastructure. A Socrata app token is optional and only raises rate limits.

How is cost controlled? Set maxResultsPerJurisdiction, narrow issuedWithinDays and filters, and set the run's maximum total charge; the Actor stops cleanly when any limit is reached. In monitor mode you pay per new permit only.

Why does a permit have estimatedCost: null or no contractor? The jurisdiction does not publish that column (see the table). Turn on includeRaw to see every field the portal does publish.

Can I get only solar or roofing permits? Yes: permitTypes: ["solar","roof"] and/or keyword: "solar". Type filters match the portal's type and subtype labels; the keyword matches the free-text work description, which is where most solar/re-roof jobs are described.

Can I run it on a schedule or from an AI agent? Yes — Apify Schedules, the API, or the Apify MCP server. The Actor is pay-per-event and uses limited permissions, so agents can discover and call it. Example prompts: "List building permits issued in Chicago this week with an estimated cost over $50,000", "Every morning send me new roofing permits in Austin and Raleigh", "Which contractors pulled the most solar permits in Philadelphia in the last 30 days?".

What happens when a city portal is down? That jurisdiction yields one error item (charged like a permit) and the rest of the run continues; the daily Store test therefore never fails on a single portal outage.

Can you add my city? Open an issue with the portal URL. Any Socrata, CKAN DataStore, ArcGIS FeatureServer/MapServer or CARTO dataset with an issued-date column can be added as a registry entry.

All data comes from public records published by the jurisdictions themselves under their open-data terms; this Actor does not access permit portals that require login or forbid automated access. Owner, applicant and contractor names are reproduced exactly as published by the jurisdiction and may be stale or incomplete. Use the data in compliance with the source's terms and applicable law. This Actor is not a consumer reporting agency and its output is not a consumer report under the Fair Credit Reporting Act (FCRA); it must not be used for employment, credit, insurance, housing or tenant screening decisions, or for any purpose that requires FCRA compliance. Respect do-not-contact rules and telemarketing laws when using the records for outreach.