US Building Permits API - Normalized Construction Leads
Pricing
from $2.00 / 1,000 permit records
US Building Permits API - Normalized Construction Leads
[💵 $3.00 / 1K] One normalized schema for US building permits across major cities (Austin, Chicago, San Francisco, NYC). Unified permit type, status, valuation, geocoded address, dates, and contractor/owner contact - not a raw per-city dump.
Pricing
from $2.00 / 1,000 permit records
Rating
0.0
(0)
Developer
WebData Labs
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Share
One clean schema for US building permits across major cities. Pick a city, filter by issue date, permit type, valuation, or keyword, and get analysis-ready permit rows: normalized permit category, status, construction valuation, geocoded address, key dates, and contractor / owner contact - including phone numbers where the city publishes them.
Every US city posts building permits on its own open-data portal, and every portal has a different schema. Chicago names contractors in contact_1_name and reports cost in reported_cost; New York City buries the licensed contractor in permittee_s_business_name with a phone in permittee_s_phone__ and stores dates as text; San Francisco uses estimated_cost and a GeoJSON point; Austin splits out contractor_company_name, contractor_phone, and contractor_trade. Most "permit scrapers" hand you one city's raw columns. This Actor does the hard part: it maps each city onto one unified schema, normalizes dates to ISO, coerces valuation to a number, classifies the permit into a cross-city category, composes a single clean address, and pulls contractor/owner contacts into the same fields every time.
✅ What you get / ❌ what this isn't
| This Actor gives you | This Actor is not |
|---|---|
| One normalized row per permit, identical shape across every city | Not a raw per-city column dump |
Cross-city permitCategory (SOLAR, ROOFING, ELECTRICAL, NEW_CONSTRUCTION...) | Not affiliated with or endorsed by any city or government |
| Contractor name, trade, license, and phone where the city publishes it | Not a guarantee every city exposes contractor or valuation data |
Construction valuation coerced to a number, dates normalized to ISO | Not real-time - reflects each portal's publishing cadence |
| Geocoded address (street, locality, region, postal, lat/lng) | Not a credit, licensing, or legal-status check on any contractor |
| Reliable official open-data reads (no anti-bot, no proxy needed) | Not a national database - supported cities are listed below |
🔎 Why use this Actor
- Build fresh construction lead lists - solar, roofing, remodeling, HVAC - filtered by city, date, and trade.
- Monitor new permits weekly for a sales territory without learning four different city APIs.
- Track high-value projects by filtering on minimum construction valuation.
- Feed one consistent permit schema into a CRM, dashboard, model, or LLM pipeline.
- Skip the plumbing - date parsing, valuation coercion, address composition, and contact extraction are done.
👥 Who it's for
- Contractors and trade businesses (solar, roofing, HVAC, remodeling) buying local permit leads.
- Building-material suppliers and manufacturers tracking new construction activity.
- Proptech, construction-tech, and market-research teams needing normalized permit data.
- Sales and go-to-market teams building territory lead lists.
- Data teams that want one schema instead of a per-city ETL project.
🗂️ What data you get
One row per permit:
| Field | Type | Description |
|---|---|---|
source, city, state | string | Which city portal the row came from |
permitNumber, permitUrl | string | City permit identifier and its detail page (where available) |
permitType | string | The city's raw permit-type label |
permitCategory | string | Normalized cross-city category (SOLAR, ROOFING, ELECTRICAL, PLUMBING, MECHANICAL_HVAC, NEW_CONSTRUCTION, ADDITION_ALTERATION, DEMOLITION, SIGN, POOL_SPA, FENCE_WALL, DRIVEWAY_SITE, OTHER) |
workClass, description | string | Secondary work classification and work description |
status, statusNormalized | string | Raw status and normalized status (ISSUED, COMPLETED, IN_PROCESS, INACTIVE) |
appliedDate, issuedDate, expirationDate, completedDate | string | Key dates, normalized to YYYY-MM-DD |
valuation, valuationType | number / string | Construction value coerced to a number, and which field it came from |
address, street, locality, region, postalCode | string | Composed address plus components |
latitude, longitude | number | Geocoordinates where published |
contractorName, contractorTrade, contractorLicense, contractorPhone, contractorLocation | string | Contractor contact where the city publishes it |
ownerName, ownerBusinessName, applicantName | string | Owner / applicant where published |
contacts | array | All parties on the permit, each with role, name, and (where present) phone / license |
Example tasks
- Fresh solar install leads in Austin
- High-value construction permits in San Francisco
- New building permits with contractor contacts in NYC
🌎 Supported cities
| City | Source portal | Contractor data | Valuation |
|---|---|---|---|
| Austin, TX | data.austintexas.gov | Name, trade, phone | - |
| Chicago, IL | data.cityofchicago.org | Typed contacts (name, location) | Reported cost |
| San Francisco, CA | data.sfgov.org | - | Estimated cost |
| New York City, NY | data.cityofnewyork.us | Permittee business, phone, license | - |
More cities are added over time. Request a city via an Actor issue.
⚙️ How to get building permit data
- Open the Actor on Apify.
- Choose a
city. - Optionally filter by
issuedAfter/issuedBefore,permitTypeContains,minValuation, orsearchText. - Set how many permits to return (
maxItems). - Run the Actor.
- Open the
Permitsdataset view. - Export JSON, CSV, Excel, HTML, or XML, or call the Actor through the Apify API.
📥 Input
{"city": "austin","searchText": "solar","issuedAfter": "2026-01-01","maxItems": 500}
📤 Output
{"recordType": "permit","source": "austin","city": "Austin","state": "TX","permitNumber": "2026-064893 EP","permitType": "Electrical Permit","permitCategory": "SOLAR","status": "Active","statusNormalized": "ISSUED","issuedDate": "2026-06-26","valuation": null,"address": "715 E 32ND ST, AUSTIN, TX 78705","latitude": 30.29,"longitude": -97.72,"contractorName": "Freedom Solar Power","contractorTrade": "Electrical Contractor","contractorPhone": "5125967031","contacts": [{"role": "contractor", "name": "Freedom Solar Power", "trade": "Electrical Contractor", "phone": "5125967031"}]}
💵 How much does it cost?
The launch price is about $3.00 / 1,000 permits, tier-discounted for higher Apify plans. One permit row is one charged result. A run returning 500 permits is 500 results. Error rows are not charged.
🔁 Run it on the Apify platform
Schedule a weekly run per city to keep a fresh lead feed, call it from the Apify API, export to CSV/JSON/Excel, or connect the dataset to Make, Zapier, webhooks, a warehouse, a CRM, or an LLM pipeline.
⚠️ Limits and caveats
- This Actor reads each city's public open-data portal. It is not affiliated with any city or government, and it does not check a contractor's license validity, credit, or legal status.
- Field coverage varies by city. Not every city publishes contractor contact, phone, or valuation; missing fields are returned as
nullrather than guessed. See the supported-cities table. - NYC ordering caveat. NYC stores
issuance_dateas unsortable text, so results are ordered (andissuedAfter/issuedBeforefiltered) on the DOB processing datedobrundate. The permit's own issuance date is still parsed intoissuedDate. permitCategoryis best-effort keyword classification over each city's raw type/description vocabulary; the rawpermitTypeis always preserved.- Data reflects each portal's publishing cadence, which can lag the permit office by days.
🧩 Related Actors
- Website Contact Extractor - emails, phones, and socials from any domain.
- Lead List Deduplicator - dedupe and normalize messy lead lists.
- Shopify Store Analyzer - catalog and contacts from any Shopify store.
- SEC Financials API - normalized income, balance sheet, and cash flow from EDGAR.
❓ FAQ
Which cities are supported?
Austin, Chicago, San Francisco, and New York City at launch. Each is sourced from that city's official open-data portal and normalized to the same schema. More cities are added over time.
Where does the data come from?
Each city's public open-data portal (Socrata). These are the same datasets the cities publish for free; this Actor's value is normalizing them into one consistent, lead-ready schema.
Which cities include contractor phone numbers?
Austin and NYC publish a contractor/permittee phone on most records. Chicago publishes typed contacts (name and location, no phone). San Francisco does not publish contractor contact. The contractorPhone field is populated wherever the city provides it.
Why are some fields null?
Because that city does not publish that field for that permit. Coverage differs by city and by record type; nothing is guessed.
Does it need a proxy?
No. City open-data portals are public and served reliably to datacenter IPs. Enable Apify Proxy only for very large batches.
🛠️ Support
For bugs, missing fields, or a city request, open an Actor issue with the run URL, the city and filters used, and the field or behavior you expected.
⭐ Rate this Actor
If this Actor saved you time, please take 30 seconds to leave a review on the Reviews tab of US Building Permits API - Normalized Construction Leads - reviews are the main trust signal other users see, and they directly decide which features get built next. If something is broken or a field is missing, please open an issue first - we typically respond within a day and would love the chance to fix it before you rate.