Building Permits & Code Violations: 10 US Cities
Pricing
from $1.00 / 1,000 permit or violation records
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Security
Limited permissionsShare
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
- Open the Actor and go to the Input tab.
- Pick the Cities and Record types you want, or leave them empty for all ten cities and both types.
- Set Days to look back, for example 7 for the last week.
- Optionally add Keywords such as roof or solar, ZIP codes, and a Minimum project cost to narrow the list.
- To run it on a schedule, turn on New records only and give the schedule a Monitor name.
- Click Start, then open the Output tab to view, filter, or download the records as CSV, Excel, JSON, or HTML.
- Add a daily schedule under Schedules to receive new permits and violations every day.
Input
| Field | Type | Default | Description |
|---|---|---|---|
cities | array | all | chicago, new-york, los-angeles, san-francisco, austin, and seattle. |
recordTypes | array | both | permit for building permits and violation for code violations and complaints. |
daysBack | integer | 7 | Calendar days of records to read, today included, up to 90. |
keywords | array | none | Keep only records whose category or description contains one of these words. |
zipCodes | array | all | Keep only records in these 5-digit ZIP codes. |
minEstimatedCost | integer | 0 | Keep only permits with at least this estimated project cost in dollars. Violations are not affected. |
onlyNewRecords | boolean | false | Skip records that an earlier run with the same monitor name already delivered, free of charge. |
monitorName | string | default | Keeps a separate memory of delivered records per name. |
maxResultsPerSource | integer | 500 | Stop reading one city dataset after this many records, up to 50,000. |
maxResults | integer | 5000 | Stop 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
| City | Building permits | Code violations |
|---|---|---|
| Chicago, IL | Building Permits | Building Violations |
| New York, NY | DOB NOW Build Approved Permits | HPD Housing Maintenance Code Violations |
| Los Angeles, CA | Building and Safety Building Permits Issued | Building and Safety Code Enforcement Cases, open and closed |
| San Francisco, CA | Building Permits | DBI Notices of Violation |
| Austin, TX | Issued Construction Permits | Austin Code Complaint Cases |
| Seattle, WA | Building Permits | Code Complaints and Violations |
| Baton Rouge, LA | EBR Building Permits | Not published |
| New Orleans, LA | Permits | Code Enforcement All Violations |
| Cincinnati, OH | Cincinnati Building Permits | Code Enforcement, City of Cincinnati cases only |
| Orlando, FL | Permit Applications, issued permits only | Code 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.
Related Actors
- Louisiana Building Permits: building permits from Baton Rouge and New Orleans.
- Website Contact Enrichment: emails, phones, and social links from contractor websites.
- SEC Form D Funding Leads: companies that just raised money, from new SEC filings.
- Career Site Job Search: open jobs from company career sites.
Is it legal to use building permit and code violation data?
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.