Building Permits & Code Violations: 10 US Cities avatar

Building Permits & Code Violations: 10 US Cities

Pricing

from $1.00 / 1,000 permit or violation records

Go to Apify Store
Building Permits & Code Violations: 10 US Cities

Building Permits & Code Violations: 10 US Cities

Get new building permits and code violations from Chicago, New York, Los Angeles, San Francisco, Austin, Seattle, Baton Rouge, New Orleans, Cincinnati, and Orlando open data in one clean format. Filter by keyword, ZIP code, and project cost, and pay only for new records on repeat runs.

Pricing

from $1.00 / 1,000 permit or violation records

Rating

0.0

(0)

Developer

ManiGinaM

ManiGinaM

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Security

Limited permissions

Share

Get new building permits and code violations from ten US cities in one clean, consistent format: Chicago, New York, Los Angeles, San Francisco, Austin, Seattle, Baton Rouge, New Orleans, Cincinnati, and Orlando. The Actor reads each city's official open data portal, turns every permit, violation, and complaint into the same record with the date, status, category, description, address, ZIP code, coordinates, estimated project cost, and contractor, and links back to the source.

Filter by keyword, ZIP code, and minimum project cost, and turn on new records only so a daily schedule pays only for permits and violations you have not received before.

Who is it for?

  • Contractors, roofers, solar installers, and home service companies looking for new projects and property owners who need work done.
  • Building material suppliers and equipment rental firms tracking where construction is starting.
  • Real estate investors and wholesalers looking for distressed properties with open code violations.
  • Property managers, insurers, and lenders watching permits and violations on addresses they care about.
  • Analysts, journalists, and researchers comparing construction activity and code enforcement across cities.

What data does it return?

One row per building permit or code violation that matches your filters, in the same fields for every city:

  • City, record type (permit or violation), record number, and date issued or opened
  • Status, category, and description of the work or the violation
  • Street address, ZIP code, latitude, and longitude
  • Estimated project cost and contractor, where the city publishes them
  • A link to the record on the city's site, where available, and to the source dataset

Owner name and apartment number fields are never read, so they are left out on purpose. Descriptions are kept as the city wrote them.

How to use

  1. Open the Actor and go to the Input tab.
  2. Pick the Cities and Record types you want, or leave them empty for all ten cities and both types.
  3. Set Days to look back, for example 7 for the last week.
  4. Optionally add Keywords such as roof or solar, ZIP codes, and a Minimum project cost to narrow the list.
  5. To run it on a schedule, turn on New records only and give the schedule a Monitor name.
  6. Click Start, then open the Output tab to view, filter, or download the records as CSV, Excel, JSON, or HTML.
  7. Add a daily schedule under Schedules to receive new permits and violations every day.

Input

FieldTypeDefaultDescription
citiesarrayallchicago, new-york, los-angeles, san-francisco, austin, and seattle.
recordTypesarraybothpermit for building permits and violation for code violations and complaints.
daysBackinteger7Calendar days of records to read, today included, up to 90.
keywordsarraynoneKeep only records whose category or description contains one of these words.
zipCodesarrayallKeep only records in these 5-digit ZIP codes.
minEstimatedCostinteger0Keep only permits with at least this estimated project cost in dollars. Violations are not affected.
onlyNewRecordsbooleanfalseSkip records that an earlier run with the same monitor name already delivered, free of charge.
monitorNamestringdefaultKeeps a separate memory of delivered records per name.
maxResultsPerSourceinteger500Stop reading one city dataset after this many records, up to 50,000.
maxResultsinteger5000Stop after this many records in total, up to 200,000.

Example input for a daily schedule of roofing and solar permits worth at least $10,000 in Austin and Seattle:

{
"cities": ["austin", "seattle"],
"recordTypes": ["permit"],
"daysBack": 3,
"keywords": ["roof", "solar"],
"minEstimatedCost": 10000,
"onlyNewRecords": true,
"monitorName": "roof-solar-austin-seattle",
"maxResults": 1000
}

Output

Each record looks like this (a fictional example):

{
"city": "Austin, TX",
"recordType": "permit",
"recordId": "2026-999001 BP",
"date": "2026-11-02",
"status": "Active",
"category": "Building Permit",
"description": "Residential reroof and new rooftop solar panels",
"address": "100 Example St",
"zipCode": "78701",
"latitude": 30.2672,
"longitude": -97.7431,
"estimatedCost": 24500.0,
"contractor": "Example Roofing LLC",
"recordUrl": "https://abc.austintexas.gov/web/permit/public-search-other?t_detail=1&t_selected_folderrsn=99999999",
"datasetUrl": "https://data.austintexas.gov/d/3syk-w9eu",
"checkedAt": "2026-11-03T14:05:12Z",
"note": null
}

Fields a city does not publish are null, for example estimated cost on violations. When a run finds nothing to deliver, for example because every record was already delivered or none matched, it adds one free row with only checkedAt and a note explaining why.

Every run also saves a free RUN_SUMMARY record in the default key-value store with the datasets read, datasets that could not be read, rows scanned, records matched, records skipped as already delivered, records published per dataset, and why the run ended.

Cities and datasets

CityBuilding permitsCode violations
Chicago, ILBuilding PermitsBuilding Violations
New York, NYDOB NOW Build Approved PermitsHPD Housing Maintenance Code Violations
Los Angeles, CABuilding and Safety Building Permits IssuedBuilding and Safety Code Enforcement Cases, open and closed
San Francisco, CABuilding PermitsDBI Notices of Violation
Austin, TXIssued Construction PermitsAustin Code Complaint Cases
Seattle, WABuilding PermitsCode Complaints and Violations
Baton Rouge, LAEBR Building PermitsNot published
New Orleans, LAPermitsCode Enforcement All Violations
Cincinnati, OHCincinnati Building PermitsCode Enforcement, City of Cincinnati cases only
Orlando, FLPermit Applications, issued permits onlyCode Enforcement Cases

Each record's datasetUrl links to the exact public dataset. Rows a city publishes more than once for the same record are merged into one record, so you are charged once per permit or violation.

New records only

With New records only on, the Actor remembers every record it delivers in a named key-value store called city-building-permits-code-violations-monitor, under the monitor name you choose. Later runs with the same monitor name skip those records and do not charge for them, so a daily schedule with a few days of overlap never pays twice for the same permit. Use a different monitor name for each schedule with different filters.

How it works

The Actor queries each city's official Socrata open data API for records dated in your range, newest first, a page at a time. It applies your filters, merges duplicate rows, and delivers the matching records in one schema. It reads one page at a time with a short pause and identifies itself with a contact address. A city that cannot be reached is noted in the summary while the other cities still deliver.

Pricing

This Actor uses pay per event pricing: $1.00 per 1,000 records, charged as the permit-or-violation event for each record delivered, plus a tiny Actor start fee. Run notes, the summary, filtered out records, and records skipped by New records only are free. Set Max records in total to cap what a run can cost.

API and integrations

You can start the Actor and read its results from your own code with the Apify API, the Apify Python and JavaScript clients, or the Apify CLI. Copy ready-made calls from the API tab on the Actor page.

Send new records to a CRM, Google Sheets, Slack, Zapier, Make, or a webhook from the Integrations tab, for example to alert your crew about every new roofing permit in your ZIP codes.

Building permits and code enforcement records are public records that these cities publish on their official open data portals for anyone to use. The Actor reads only those public datasets and leaves out the owner name and apartment number fields. You are responsible for how you use the records, including following anti-spam, privacy, and telemarketing laws such as CAN-SPAM and the TCPA when you contact anyone. This Actor is not affiliated with or endorsed by any of these cities.

FAQ

How fresh is the data? Most cities update their datasets daily. Some publish a record a few days or weeks after it is issued, so a run with a larger Days to look back and New records only on catches late records without paying twice.

Why did a run return no records? Either no record matched your filters, every match was already delivered with New records only on, or the city had not published records for your range yet. The free note row and the RUN_SUMMARY record say which.

Does it include owner names or phone numbers? No. Owner names are left out on purpose. Pair contractor names with Website Contact Enrichment to find business contact details.

How is it different from the Louisiana Building Permits Actor? That Actor goes deeper on Baton Rouge and New Orleans permits. This one covers ten cities across the US, including Baton Rouge and New Orleans, adds code violations and complaints, and returns one schema for every city.

Can you add my city? Yes, see below.

Feedback and custom requests

Found a bug or a city dataset that changed? Open an issue on the Issues tab and it will be fixed quickly. For another city, extra fields, or a custom request such as a different filter or output, open an issue as well.