US Building Permits – NYC, Chicago, SF, LA, Austin, Seattle avatar

US Building Permits – NYC, Chicago, SF, LA, Austin, Seattle

Pricing

from $2.00 / 1,000 building permits

Go to Apify Store
US Building Permits – NYC, Chicago, SF, LA, Austin, Seattle

US Building Permits – NYC, Chicago, SF, LA, Austin, Seattle

Reliable permit feed: never a silent empty result. A city portal that is down gives a clear free error row; no match gives a free no_results row with the city's newest date. Permits from NYC, Chicago, SF, LA, Austin, Seattle in one schema: type, cost, address, contractor.

Pricing

from $2.00 / 1,000 building permits

Rating

0.0

(0)

Developer

Liora Blyth

Liora Blyth

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

US Building Permits API – NYC, Chicago, SF, LA, Austin, Seattle

Fresh building permits from six major US cities – New York City, Chicago, San Francisco, Los Angeles, Austin and Seattle – in one consistent schema: permit number, type, work description, status, issue date, estimated cost, address, ZIP, lat/long and contractor company. Built for construction & market activity monitoring and trend tracking: permit volume and estimated value by city, ZIP area and permit type, plus contractor company activity.

Output is intended for market analysis; owner names / residential addresses where present in source data should not be used for personal outreach.

  • ✅ Never a silent empty dataset: if a source is down you get a free status: "error" row naming it; if nothing matched you get a free status: "no_results"-type row saying so. Errors and status rows are never charged.
  • ✅ Official open-data APIs only – no scraping of websites, no login, no proxies needed
  • ✅ One clean, documented schema across all sources
  • ✅ Pay only for results: $0.002 per permit ($2.00 per 1,000). Errors are free.

Coverage

  • Cities / sources (Socrata open-data portals): New York City (data.cityofnewyork.us, DOB permits), Chicago (data.cityofchicago.org), San Francisco (data.sf.gov), Los Angeles (data.lacity.org), Austin (data.austintexas.gov), Seattle (data.seattle.gov). Other cities are not covered.
  • Fields: city, state, permit number, job number, type/subtype, work description, status, issued/applied date, estimated cost, address, borough, ZIP, lat/long, contractors, owner business, housing units, parcel id, permit URL, source dataset URL, licence, fetchedAt. A field the city does not publish stays null (fill rates per field in RUN_SUMMARY).
  • Freshness: whatever each city has published; some cities lag days or weeks (see below).

When a source is down – error, not empty

  • Each city is fetched independently, with retries on HTTP 429 (honouring Retry-After).
  • If a city portal still fails: one free row {"city": "Chicago", "status": "error", "error": "…"}; the other cities continue and the run ends SUCCEEDED.
  • If the portals answered but no permit matched: one free row {"status": "no_results", …} plus, in RUN_SUMMARY.cities.<city>.newestIssueDateInSource, the newest permit date the city has published – so "the city has not published yet" is visible, not a silent empty dataset.
  • With onlyNewSinceLastRun and nothing new: one free status: "no_new" row.

Cost example and cost cap

  • 6 cities × 200 permits (default) = up to 1,200 permits = $2.40. One city, 30 days, minEstimatedCost: 100000 is typically 50–300 permits ($0.10–0.60).
  • Cap it two ways: maxItems (total permits across all cities, e.g. 250 → max $0.50) and/or Max charge per run (Console → Run options, or maxTotalChargeUsd in the API). The Actor stops cleanly at the limit. Status rows are free.

What can you use it for?

  • Construction activity monitoring: daily permit volume and estimated value by city, ZIP area and permit type
  • Trend tracking: how new-build, remodel, HVAC, EV charger and ADU permitting changes over time
  • Contractor company activity: which firms are active, in which areas and at what project sizes
  • Real-estate / investment research: where large projects are being permitted

Input

FieldWhat it does
citiesnyc, chicago, san_francisco, los_angeles, austin, seattle (default all)
daysBack / issuedFrom / issuedToIssue-date window
keywordsMatched in the work description, e.g. new building, HVAC, ADU
minEstimatedCostMinimum job value in USD
zipCodesLimit to ZIP codes
permitTypeContainse.g. electrical, new building
onlyWithContractorOnly permits with a contractor company
maxItemsPerCityBillable results cap per city
maxItemsOptional total billable cap for the whole run (empty = no total cap)
socrataAppTokenOptional free Socrata app token for heavy use
onlyNewSinceLastRunFor daily schedules: skip permits an earlier run already returned (not charged)

Example input:

{
"keywords": [
"new building",
"HVAC"
],
"daysBack": 30,
"maxItemsPerCity": 15
}

Output

Each result is one row in the dataset (download as JSON, CSV, Excel or via API). Example:

{
"city": "New York City",
"state": "NY",
"permitNumber": "M00998301-I1-GC",
"jobNumber": "M00998301-I1",
"permitType": "General Construction",
"permitSubtype": "Renewal Permit Without Changes",
"description": "FACADE AND ROOF REPAIRS AS PER PLANS FILED HEREWITH. NO CHANGE TO USE, EGRESS OR OCCUPANCY.",
"status": "Permit Issued",
"issuedDate": "2026-10-22",
"appliedDate": "2024-04-08",
"estimatedCost": 822799.5,
"address": "32 WEST 40 STREET",
"borough": "Manhattan",
"zipCode": "10018",
"latitude": 40.752747,
"longitude": -73.983148,
"contractors": [
{
"company": "NEW AMSTERDAM RESTORATION",
"role": "Applicant (GC)",
"licenseNumber": "622709"
}
],
"ownerBusiness": "MAXWELL-KATES, INC.",
"housingUnits": null,
"parcelId": "1008410069",
"permitUrl": null,
"source": "https://data.cityofnewyork.us/d/rbx6-tga4",
"license": "NYC Open Data terms",
"fetchedAt": "2026-10-24T16:45:07+00:00"
}

Reliability – freshness and empty fields

  • Freshness differs by city. Each city publishes on its own schedule (some daily, some with long delays). RUN_SUMMARY reports per city the newest issue date saved and, when nothing matched, the newest issue date available in the source – so you can tell "no new permits" from "the city has not published yet".
  • Field fill rates. RUN_SUMMARY.cities.<city>.fieldFillRate shows the share of saved rows with permit number, issue date, type, description, address, ZIP, cost, contractors and coordinates. Some sources simply do not publish a field (e.g. Chicago's permit dataset has no site ZIP column), and those stay null rather than being filled with placeholders.
  • onlyNewSinceLastRun remembers returned permit ids per filter combination in a named key-value store on your account; repeats are skipped and not charged. If nothing is new you get one free status: "no_new" row.
  • Rate limits (HTTP 429) are retried with Retry-After; a city that fails gives a free status: "error" row while the other cities continue.
  • No contact enrichment: rows contain only what the city publishes.

Pricing

Pay-per-event, no subscription:

EventPrice
Building permit (permit)$0.002 ($2.00 / 1,000)
Actor start$0.00005

Error rows and empty results are never charged. Set Max charge per run in Apify Console to cap your spend – the Actor stops cleanly when the limit is reached.

Option names (shared across our open-data Actors)

The five Actors in this pack (Prediction Markets, US Building Permits, EU Company Registry, UK Public Tenders, EU Fuel Prices) use the same names for the same job:

JobOptionNotes
Free-text filterkeywords (array)EU Company Registry uses query (one company name) + registrationNumbers
Date windowdaysBack + …From / …ToissuedFrom/To (permits), publishedFrom/To (tenders)
Total billable capmaxItemsavailable in all five; per-source caps (maxMarketsPerPlatform, maxItemsPerCity, maxResultsPerCountry, maxPagesPerSource) still work
Only new rows on schedulesonlyNewSinceLastRunEU Fuel Prices: onlyChangedSinceLastRun (prices that changed)
Which sourcesplatforms / cities / countries / sourcesthe natural unit of each source

Status rows always use the same status values: error / source_unavailable (source down), no_results / no_match / not_found (source answered, nothing matched), no_new (nothing new since last run). They are never charged.

FAQ

Where does the data come from?
The cities' official open-data portals (Socrata SODA API): NYC Open Data, Chicago Data Portal, DataSF, Los Angeles Open Data, Austin Open Data and Seattle Open Data. Public records, no login.

Do you return homeowner names or phone numbers?
No. Person names and phone numbers are dropped on purpose; we keep contractor / business names and license numbers only. Sole-proprietor business names that are just a person's name are also removed.

Why is estimated cost empty for some permits?
Some cities (e.g. Austin for trade permits) do not publish a job value for every permit type.

How fresh is it?
Cities update daily or a few times a week; each run queries the portal live.

Can you add my city?
Yes – any Socrata or ArcGIS permit dataset can be added. Open an issue on the Actor page.

This Actor only reads public data published by government bodies or by the platforms' own public APIs under open licences (each row has source/license or url fields where available). It returns organisation-level data and deliberately excludes personal data. You are responsible for using the data in line with the source licence and applicable law (e.g. GDPR).

Integrations

Schedule runs, then push results to Google Sheets, Slack, webhooks, Zapier, Make or your database with Apify integrations, or call the Actor from the Apify API / Python / JavaScript clients.