US Building Permits Scraper: Contractors & Project Costs avatar

US Building Permits Scraper: Contractors & Project Costs

Pricing

$4.00 / 1,000 building permits

Go to Apify Store
US Building Permits Scraper: Contractors & Project Costs

US Building Permits Scraper: Contractors & Project Costs

Search official US city and county building permits. Normalize project costs, issue and application dates, addresses, contractor licenses and public owner details for roofing, solar, HVAC and property research.

Pricing

$4.00 / 1,000 building permits

Rating

0.0

(0)

Developer

SR

SR

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Security

Limited permissions

Share

US Building Permits Scraper

US Building Permits Scraper is a building permits scraper that collects official city and county permit records in one consistent dataset. Search for roofing, solar, HVAC, renovations or other construction work, then export project descriptions, declared costs, property addresses and public contractor details. Each result represents one permit from one jurisdiction, with the original permit number retained for verification and future updates.

This Actor helps contractors identify relevant projects, suppliers understand local construction activity, and property researchers connect permitted work to a property. It uses the terminology published by each jurisdiction. A permit is evidence of a recorded application or authorization, and does not establish that construction has started or that a contractor is seeking bids.

US building permits scraper coverage

Choose jurisdictions using the identifiers below. The order matters: the Actor retrieves permits from the first jurisdiction before continuing to the next, until the global maximum is reached. A busy first city can fill the entire request. Run separate searches when you need a fixed allocation for each city.

IdentifierOfficial jurisdictionCoverage notes
new_yorkNew York CityDOB NOW approved permits; contractor and owner details; no application date
chicagoChicagoBuilding permits and public contact roles; no property ZIP code
los_angelesLos AngelesIssued permits since 2020; no contractor or owner fields
miami_dadeMiami-Dade CountyContractor, license and owner details; no property ZIP or coordinates
miamiCity of MiamiContractor company and project value; no property ZIP
nashvilleNashvilleProject purpose, cost and public contact; contact role is not inferred
columbusColumbusPermit classifications and applicant company; no work description or application date
raleighRaleighContractor, published license, owner and address fields
detroitDetroitPermit and property details; no contractor information
san_franciscoSan FranciscoBuilding permits, descriptions and declared values
seattleSeattleBuilding permits, application dates and contractor company where published
austinAustinConstruction permits, contractor and applicant fields
baton_rougeBaton RougeBuilding permits with contractor, applicant and owner names
cincinnatiCincinnatiBuilding permits, descriptions and contractor company
new_orleansNew OrleansPermits with public contractor, applicant and owner text
montgomery_county_mdMontgomery County, MarylandResidential permits; commercial permits are outside this release

Dallas and NYC BIS legacy permits are outside this release. Available date ranges and update schedules depend on the official dataset. Missing fields are returned as null, and no contact information is inferred from unrelated records.

Input

cities is the list of jurisdiction identifiers. date_field selects issued or applied; the default is issue date. date_from and date_to accept inclusive calendar dates in YYYY-MM-DD form. Without dates, the search covers the preceding 30 days through the request date. A jurisdiction without application dates produces a warning when you request applied.

keywords matches any supplied term as a case insensitive substring in the work description. For example, roof also matches roofing. It is a text filter, rather than a verified trade classification. Columbus does not publish a free text work description, so keyword searches report that jurisdiction as unsupported. permit_types matches any supplied term across source permit and work type fields. Keyword and type filters are combined with the date and cost requirements.

min_cost is an inclusive minimum declared project value in US dollars. Permits without a published value cannot satisfy this filter. max_items is the total maximum across all selected jurisdictions, from 1 to 10,000, and defaults to 100. include_raw attaches the original source attributes for auditing. The Actor follows continuation pages automatically; API integrations can use cursor with the original input unchanged.

The following input was used to retrieve real Chicago roofing permits in October 2026:

{
"cities": ["chicago"],
"date_from": "2026-10-01",
"date_to": "2026-10-30",
"keywords": ["roof"],
"max_items": 10
}

Output

Download results from the default dataset as JSON, CSV or Excel. Core fields include permit_id, jurisdiction, status, permit_type, description, issued_at, applied_at, cost, currency, address, street, city, state, postal_code, lat, lng and property_id. Contractor, applicant and owner information use flat fields such as contractor_name, contractor_license, applicant_name and owner_name.

jurisdiction identifies the authority that published the record. city identifies the address locality; these can differ for county datasets. New York uses the published borough as the locality. Shared address and coordinate field names make the results suitable for matching with property listings from Zillow, Redfin and Realtor.com. An address match still requires your own normalization and validation.

For example, Chicago permit 101085459, issued on 2026-10-29, describes a new residence and garage with a roof deck at 1965 W BERWYN AVE, Chicago, IL, with a declared value of 350,000 USD. Its general contractor is RESTORE PROS CORP. Other public contact roles remain available in contacts, so an electrical contractor is not mistaken for the general contractor.

Every row includes source, source_dataset, source_url and fetched_at. Costs of zero or one dollar remain as published. Dates preserve the source calendar date. Warnings identify jurisdictions that returned no matches, lack a requested filter, or could not be served. A partial response retains usable results from other jurisdictions.

Pricing

Billing is per delivered permit. The current price appears in the Actor pricing tab. There is no custom run start charge. Searches that deliver no permits have no permit event charge. Users on the free plan receive at most 10 permits per run; these delivered permits still count toward usage. Paying users can request the full maximum. Duplicate permits within one collection are identified by jurisdiction and permit number.

FAQ

Why is the contractor, ZIP code or owner missing?

Each authority publishes different fields. Los Angeles does not expose contractor information in this dataset, while Chicago does not publish a property ZIP code. Missing values remain null. Contractor mailing addresses are never substituted for the permitted property's location.

Can I use this to find roofing, solar or HVAC projects?

Yes. Supply the relevant description terms through keywords, optionally alongside permit type and cost filters. Results reflect the authority's text, so abbreviations and local terminology can affect recall. A keyword match does not confirm sales intent or project timing.

Does max_items apply to every city separately?

It is a global total, processed in the order in cities. Request separate runs for independent city quotas. The Actor may deliver fewer rows when filters are selective or a source is unavailable, and reports source warnings alongside the results.

Can I reproduce and audit a record?

Use the retained permit number, dataset reference and public query URL. Enable include_raw to retain the published attributes. Official datasets can be updated or corrected after collection, so save fetched_at with your exports when comparing successive runs.