Building Permit Monitor — 30 US Cities, New Permits, No Login avatar

Building Permit Monitor — 30 US Cities, New Permits, No Login

Pricing

from $10.00 / 1,000 permits

Go to Apify Store
Building Permit Monitor — 30 US Cities, New Permits, No Login

Building Permit Monitor — 30 US Cities, New Permits, No Login

Watch 30 US cities (NYC, LA, Chicago, SF, Seattle, Denver, Boston and more) and get only NEW building permits since the last run, filtered by type, keyword, value or contractor, with address, coordinates, value and contractor license. Daily schedule. No login. MCP-ready. $10 per 1,000 permits.

Pricing

from $10.00 / 1,000 permits

Rating

0.0

(0)

Developer

Khrystyna Skotte

Khrystyna Skotte

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Building Permit Monitor — new permits daily across 30 US cities

Get a daily feed of only the NEW building permits (and status changes) issued across NYC, Los Angeles, Chicago, San Francisco, Seattle, Denver, Boston, Philadelphia, Nashville, Washington DC, Detroit, Miami and 18 more cities, filtered by permit type, job value, description keywords and contractor. The monitor remembers every permit it has already reported, so a scheduled run emits just the delta, posts a summary to your webhook, and costs you only for what is actually new. One actor instead of 30 single-city scrapers.

Built for contractors, building-material suppliers, and solar / roofing / HVAC / plumbing lead-gen teams who need to know today which jobs were just permitted, where, for how much, and by whom.

Coverage

All sources are official open-data feeds (Socrata, ArcGIS FeatureServer, CKAN, Carto). Every one was verified live on 2026-09-28. "Typical lag" is how far behind the calendar the newest published permit usually is — set lookbackDays above the lag for slow cities.

KeyCitySourceIssue-date fieldTypical lagContractorValue
nycNew York City, NYDOB NOW: Build Approved Permits (Socrata rbx6-tga4)issued_datedailyyes + licenseyes
los-angelesLos Angeles, CALADBS Permits (Socrata pi9x-tg5x)issue_datedailynoyes
chicagoChicago, ILBuilding Permits (Socrata ydr8-5enu)issue_datedailyyesyes
san-franciscoSan Francisco, CADBI Building Permits (Socrata i98e-djp9)issued_datedailynoyes
seattleSeattle, WASDCI Building Permits (Socrata 76t5-zqzr)issueddatedailynoyes
austinAustin, TXIssued Construction Permits (Socrata quv8-5ckq)issue_date2–4 weeksnoyes
denverDenver, COResidential + Commercial Construction Permits (ArcGIS)DATE_ISSUEDdailyyesyes
bostonBoston, MAApproved Building Permits (CKAN)issued_datedailyapplicantyes
philadelphiaPhiladelphia, PAL&I Permits (Carto permits)permitissuedatedailyyesno
nashvilleNashville, TNBuilding Permits Issued (ArcGIS)Date_Issueddailycontactyes
washington-dcWashington, DCBuilding Permits in Last 30 Days (ArcGIS)ISSUE_DATEdaily, 30-day windowapplicantno
detroitDetroit, MIBSEED Building Permits (ArcGIS)issued_datedailynoyes
fort-worthFort Worth, TXDevelopment Permits, status = Issued (ArcGIS)Status_Datedailynoyes
charlotteCharlotte / Mecklenburg County, NCBuilding Permits (ArcGIS)issuedatedailynoyes
raleighRaleigh, NCBuilding Permits (ArcGIS)issueddatedailyyes + licenseyes
columbusColumbus, OHBuilding Permits (ArcGIS)ISSUED_DTdailyapplicant businessyes
clevelandCleveland, OHBuilding Permits (ArcGIS)ISSUE_DATEdailyyes + licenseyes
minneapolisMinneapolis, MNCCS Permits (ArcGIS)issueDatedailyapplicantyes
miamiMiami, FLBuilding Permits Since 2014 (ArcGIS)IssuedDatedailyyesyes
san-antonioSan Antonio, TXBuilding Permits (CKAN)DATE ISSUEDdailynoyes
pittsburghPittsburgh, PAPLI Permits (WPRDC CKAN)issue_dateweeklyyesyes
cincinnatiCincinnati, OHBuilding Permits (Socrata uhjb-xac9)issueddatedailyyesyes
mesaMesa, AZBuilding Permits (Socrata dzpk-hxfb)issued_datedailyyes + licenseyes
tucsonTucson, AZPermits (ArcGIS)ISSUEDATEdailynoyes
tacomaTacoma, WAAccela Permits (ArcGIS)issued_datedailynoyes
tempeTempe, AZBuilding Permits (ArcGIS)IssuedDateDtmdailyyes + licenseyes
scottsdaleScottsdale, AZPermits (ArcGIS)IssueDatedailybuilderyes
memphisMemphis, TNDPD Building Permits (ArcGIS)Issued_Date2–4 weeksnoyes
montgomery-county-mdMontgomery County, MDResidential Building Permits (Socrata m88u-pqki)issueddatedailynoyes
portlandPortland, ORBuilding Permits (PortlandMaps ArcGIS)ISSUEDATE4–8 weeksnoyes
dallasDallas, TXPermits 2008–2024 (ArcGIS)ISSUE_DATEstale — feed stopped Nov 2024noyes

cities: ["all"] runs every live city. dallas is excluded from all and from the defaults; request it explicitly only if you want historical data. Houston and Phoenix publish no machine-readable permit feed and are not covered (Mesa, Tempe and Scottsdale cover much of the Phoenix metro).

How it works

  1. For each selected city, queries the official feed for permits issued in the last lookbackDays (server-side date filter, newest first, up to 5,000 per city per run).
  2. Normalises every row into the same 20-field record (see Output) and applies your filters.
  3. Compares each permit against the monitor's saved state (city → permitNumber → status).
  4. Emits a record when the permit is unseen (changeType: "new") or its status changed since last seen (changeType: "status_change", with previousStatus).
  5. Saves the state, then POSTs a run summary to webhookUrl if set.

State lives in a named key-value store permit-monitor-<hash of monitorId> in your Apify account, capped at 50,000 permits (oldest are dropped first). Delete the store to reset a monitor.

Input

FieldDefaultNotes
cities["nyc","los-angeles","chicago"]City keys from the table above, or ["all"]
permitTypes[]Case-insensitive substrings matched against permit type and work class, e.g. ["electrical","roof","demolition"]. OR-ed
minValue0Minimum estimated/declared job value in USD. When set, permits with no published value are dropped, so Philadelphia and DC (no value field) will not match
keywords[]Case-insensitive substrings matched against the work description (plus type/class), e.g. ["solar","PV","photovoltaic"]
contractors[]Case-insensitive substrings matched against the contractor name
lookbackDays7Permits issued within N days. Raise it for Austin, Memphis, Portland (see lag column)
maxNewPerCity5Cap per city per run. Also bounded by maxItems / number of cities so one big city cannot starve the others. Permits beyond the cap stay unseen and come out next run
maxItems10Overall cap per run
firstRunModeemitAllemitAll reports every current match on the first run; baseline records them silently
webhookUrl""Optional POST target for the run summary
monitorIddefaultOne state store per ID, so several watchlists can run side by side

Where a city encodes the trade in its type or work class (Tucson Solar, Chicago Electrical Work, Philadelphia Electrical), use permitTypes. Where it only appears in the free-text description (Los Angeles, Mesa, Boston), use keywords. Using both with the same terms is safe: a permit matches if it passes each filter you set.

  1. Create a task with your cities and filters and set monitorId (solar-southwest, roofing-tx).
  2. First run: set firstRunMode to baseline with lookbackDays 30. This records everything current and emits nothing, so day one is not a 5,000-row backlog.
  3. Set lookbackDays back to 7 (or 30 for the slow cities), maxNewPerCity and maxItems high enough for your cities (NYC alone issues ~3,000 permits a week; Chicago ~500; Seattle ~50).
  4. Schedule the task daily at 07:00 in your local time zone. Most cities refresh their feed overnight.
  5. Point webhookUrl at Slack (incoming webhook), Zapier, Make, or your own endpoint.

The default input ({}) runs in emitAll mode on NYC, Los Angeles and Chicago so you see real permits on the first try.

Example: solar and roofing leads in the Southwest, jobs over $10,000

{
"cities": ["los-angeles", "mesa", "tempe", "scottsdale", "tucson"],
"keywords": ["solar", "photovoltaic", "PV", "reroof", "re-roof", "roofing"],
"minValue": 10000,
"lookbackDays": 7,
"maxNewPerCity": 200,
"maxItems": 1000,
"firstRunMode": "baseline",
"webhookUrl": "https://hooks.slack.com/services/XXX/YYY/ZZZ",
"monitorId": "solar-southwest"
}

Other quick profiles:

  • Commercial general contractors, big jobs: cities: ["nyc","chicago","denver","nashville","miami"], permitTypes: ["new building","commercial","new construction"], minValue: 250000
  • Track a competitor: cities: ["all"], contractors: ["renewal by andersen"]
  • Demolition (site-prep, hauling, salvage): permitTypes: ["demolition","demo"], cities: ["all"]

Output

One record per new or changed permit:

{
"city": "New York City",
"state": "NY",
"permitNumber": "B01358922-S2-GC-CX",
"permitType": "General Construction",
"workClass": "Initial Permit",
"description": "This subsequent filing SI MS/GC (Job B01358922-S1) to correct and update plan for legalization ...",
"status": "Permit Issued",
"issuedDate": "2026-09-25",
"appliedDate": "2026-09-03",
"address": "147 DIAMOND STREET, Brooklyn",
"zip": "11222",
"latitude": 40.727487,
"longitude": -73.947937,
"estimatedValue": 6050,
"contractorName": "CLIFF REFRIGERATION & A/C",
"contractorLicense": "GC 614451",
"ownerName": "Maureen Marsh",
"sourceUrl": "https://data.cityofnewyork.us/resource/rbx6-tga4.json",
"changeType": "new",
"previousStatus": null,
"firstSeenAt": "2026-09-29T00:17:40.009Z",
"monitorId": "default"
}

Fields a city does not publish are null (see the Contractor / Value columns above). sourceUrl is the permit's own page where the city provides one (Austin, Seattle, Columbus, Cleveland, Cincinnati, Tacoma, Tucson), otherwise the dataset endpoint. Descriptions are truncated to 300 characters.

Webhook payload

{
"monitorId": "solar-southwest",
"runAt": "2026-09-29T07:00:12.000Z",
"since": "2026-09-22",
"newCount": 14,
"statusChangeCount": 2,
"emitted": 16,
"seenTotal": 1830,
"baseline": false,
"cities": { "tucson": { "fetched": 141, "matched": 18, "new": 12, "statusChange": 0, "emitted": 12, "deferred": 6, "latestIssuedDate": "2026-09-27", "error": null } },
"permits": [ "...first 50 records..." ]
}

The same summary is saved as SUMMARY in the run's default key-value store.

Pricing

$0.005 per run start plus $0.01 per emitted permit ($10 per 1,000). Baseline runs and runs with nothing new cost only the start fee.

Notes and limits

  • Only permits with an issue date inside the lookback window are considered; applications not yet issued are not reported (except Fort Worth, where the window is the date the status became Issued).
  • Washington DC's feed only holds the last 30 days, so lookbackDays above 30 has no extra effect there.
  • Pittsburgh publishes weekly; Austin and Memphis run 2–4 weeks behind; Portland 4–8 weeks.
  • Permit numbers are unique within a city; the state is keyed per city so the same number in two cities does not collide.
  • No login, API key or proxy is needed. The actor is MCP-ready for AI agents.