Chicago Building Permits Scraper avatar

Chicago Building Permits Scraper

Pricing

$3.00 / 1,000 result rows

Go to Apify Store
Chicago Building Permits Scraper

Chicago Building Permits Scraper

Building permits issued in Chicago over the last 1 to 90 days. One row per permit: address, ward, permit type, reported cost, fees paid, contractor and the City record link. Chicago only.

Pricing

$3.00 / 1,000 result rows

Rating

0.0

(0)

Developer

US Tech Automations

US Tech Automations

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Chicago Permit Leads With Contractor & Fee Data

Contractor-insurance sales reps get one row per Chicago building permit with the contractor's name, role and fee already split into numeric fields, ready to prospect.

Building permits issued in the City of Chicago, pulled live from the City's own open-data portal every time the Actor runs. One row per permit, with the address, the ward, the permit type, the reported job cost, the fees paid, the contractor businesses named on the permit, and a link back to the City's own record.

Introduction

Chicago publishes every building permit it issues. The table is large, the column names are the Department of Buildings' own, and fifteen contact slots sit beside each permit holding a mix of businesses and private individuals. This Actor turns that into a clean table a person can actually use: pick how many recent days to cover, narrow by permit type, ward or job cost, and get back one row per permit.

Nothing is stored between runs and nothing is cached. Every run reads the City portal at data.cityofchicago.org, dataset ydr8-5enu, over the public JSON API with no key. Every row carries the exact City record link it came from, so any row can be checked against the source.

Coverage read from the portal on 2026-09-14: 847,141 permits, the oldest issued 2006-01-03 and the newest issued 2026-09-13. This Actor reads the most recent 1 to 90 days of that table.

Chicago only. No other city, no county, no state, no nationwide option.

Tutorial

  1. Set Days back to how many recent days to cover, 1 to 90, counting back from today in Chicago and including today. 7 covers the last seven days.
  2. Leave Permit type on "Any permit type", or pick one of the eleven types the City uses, such as renovation and alteration, new construction, signs, or wrecking and demolition.
  3. Leave Ward empty for the whole city, or set a ward from 1 to 50.
  4. Leave Minimum reported cost empty for every permit, or set a dollar figure to keep only the larger jobs.
  5. Set Maximum rows to cap the run. That cap is also the cost cap, because billing is per row.
  6. Start the run. Download the result as JSON, CSV or Excel from the dataset.

A run also writes a short report to the key-value store under OUTPUT: the row count, how many of those rows name a contractor, the oldest and newest issue date in the result, and the newest issue date the City currently holds.

Pricing

$0.003 per row. Every row is billed, starting with the first row of the run. There is no start fee and no charge for starting or stopping a run.

  • 100 rows costs $0.30
  • 1,000 rows costs $3.00
  • 10,000 rows costs $30.00

A run that returns no rows costs nothing, because nothing is billed except rows. A run that cannot reach the City portal returns no rows and so costs nothing. Bad input is refused before anything is fetched, and also costs nothing.

Maximum rows is the spending control. Set it to 100 on a first run and look at what comes back before asking for more.

Input and output examples

Input:

{
"daysBack": 7,
"permitType": "PERMIT - RENOVATION/ALTERATION",
"ward": 27,
"minCost": 10000,
"maxItems": 100
}

One output row, shortened:

{
"city": "chicago",
"permit_number": "B200471466",
"record_id": "N2892074",
"permit_type": "PERMIT – EXPRESS PERMIT PROGRAM",
"review_type": "EXPRESS PERMIT PROGRAM",
"work_type": "Masonry Work",
"permit_status": "ACTIVE",
"permit_milestone": "INSPECTION ELIGIBLE",
"issue_date": "2026-09-13",
"application_start_date": "2026-08-06",
"processing_days": 38.0,
"address": "6501 S RHODES AVE",
"ward": "20",
"community_area": "42",
"census_tract": "420700",
"parcel_pin": "2022219001",
"latitude": 41.77658147442843,
"longitude": -87.61178994510531,
"reported_cost_usd": 15000.0,
"fee_paid_usd": 375.0,
"fee_unpaid_usd": 0.0,
"fee_waived_usd": 0.0,
"total_fee_usd": 375.0,
"work_description": "TUCKPOINTING AND UNIT MASONRY REPAIR / REPLACEMENT.",
"contractor_name": "FIX IT CHICAGO INC",
"contractor_role": "GENERAL CONTRACTOR",
"contractor_city": "OAK PARK",
"contractor_state": "IL",
"contractor_zip": "60304",
"contractor_count": 2,
"contractors": [
{
"role": "MASON CONTRACTOR",
"name": "BENSON & SON CONSTRUCTION CO.",
"city": "CHICAGO",
"state": "IL",
"zip": "60628"
},
{
"role": "GENERAL CONTRACTOR",
"name": "FIX IT CHICAGO INC",
"city": "OAK PARK",
"state": "IL",
"zip": "60304"
}
],
"source_dataset": "data.cityofchicago.org/resource/ydr8-5enu",
"source_url": "https://data.cityofchicago.org/resource/ydr8-5enu.json?id=N2892074",
"fetched_at": "2026-09-15T02:54:02Z"
}

Every row carries all of these fields, plus an attribution field holding the City of Chicago notice reproduced at the bottom of this page. A field the City left blank comes back as null rather than being dropped, so every row has the same shape and a CSV export has the same columns on every line.

The fields, in plain terms

FieldWhat it is
permit_numberThe permit number printed on the permit
record_idThe City's internal row id, used to build source_url
permit_typeOne of eleven City permit types
review_typeThe review track the permit went through
work_typeThe kind of work, such as "Masonry Work"
permit_statusThe City's status, such as ACTIVE
permit_milestoneWhere the permit has reached, such as INSPECTION ELIGIBLE
issue_dateThe day the permit was issued
application_start_dateThe day the application was opened
processing_daysDays the City took between those two dates
addressStreet number, direction and street name, joined
wardChicago ward, 1 to 50
community_areaCommunity area number
census_tractCensus tract number
parcel_pinProperty index number of the parcel
latitude, longitudeLocation, as published by the City
reported_cost_usdJob cost declared on the application
fee_paid_usdPermit fees paid
fee_unpaid_usdPermit fees still owed
fee_waived_usdPermit fees waived
total_fee_usdTotal fee on the permit
work_descriptionThe City's own description of the work
contractor_nameThe general contractor, or the first contractor listed
contractor_roleThat contractor's role, such as MASONRY CONTRACTOR
contractor_city, contractor_state, contractor_zipWhere that business is based
contractor_countHow many contractor businesses the permit names
contractorsEvery contractor on the permit, each with role, name and location
attributionThe City of Chicago notice
source_datasetThe dataset the row came from
source_urlThe City API link that returns this one record
fetched_atWhen the row was read, UTC

Recommendations

Start with Days back of 7, no permit type, no ward, and Maximum rows of 100. That run costs at most $0.30 and shows exactly what Chicago publishes before more is spent.

For remodel and renovation work, set Permit type to renovation and alteration and Minimum reported cost to a figure that matches the jobs worth chasing. For new build, use new construction. For demolition and site work, use wrecking and demolition. For ward-level canvassing, set one ward at a time.

To keep a rolling file, run once a day with Days back of 3. The overlap covers permits the City publishes a day or two late, and duplicates are easy to drop on record_id, which is unique per permit record.

Limitations

Read this before paying.

  • Chicago only. No other city is available in this Actor, under any input.
  • The City publishes on a delay. A permit appears in the portal some time after it is issued. When this page was written, the newest permit the portal held was dated the previous day. A window of 1 or 2 days can come back empty for that reason alone. Each run reports the newest issue date the City holds, so the current delay is visible in the run's own OUTPUT report.
  • Only contractor businesses are in the output. Chicago names up to fifteen contacts per permit, most of them private individuals: owners, owner-occupiers, applicants, tenants, architects and engineers. Only contacts whose role names them as a contractor are kept. A role that begins with OWNER is dropped even when it contains the word CONTRACTOR, because "OWNER AS GENERAL CONTRACTOR" means a homeowner doing their own work. Most permits still name a contractor somewhere: in a sample of 1,000 permits issued between 2026-09-02 and 2026-09-13, read on 2026-09-14, 975 had a contractor and 25 did not. That share is not guaranteed for any other window, so each run's OUTPUT report says how many rows in that run named one.
  • No phone numbers and no email addresses. The City does not publish them in this dataset, so they are not in the output and cannot be added.
  • No property ZIP code. This dataset has no ZIP column for the permit address. The ZIP fields in the output belong to the contractor's business address. Ward, community area, census tract, parcel number and coordinates are the location fields available.
  • Minimum reported cost drops blanks. When that filter is set, permits where the City left the reported cost empty are not returned, because an empty value cannot be compared to a number. Leave the filter empty to keep them.
  • The data is the City's, and so is its accuracy. Rows are a reshaped copy of what Chicago published at the moment of the run. Nothing is corrected, filled in, enriched or guessed. If the City's table is wrong or out of date, the row is too. The source_url on every row exists so any row can be checked.
  • 90 days is the furthest back a run reaches. The portal itself holds records from 2006, but this Actor is built for newly issued permits.
  • This is not a licence to the data. The charge is for the collection and the shared schema. The City of Chicago's own Terms of Use still govern what is done with the rows, and the portal remains open to use directly.

FAQ

Is an API key needed? No. The City portal is public and this Actor uses no key of any kind.

How is a row billed? Per row returned to the dataset, at $0.003 each, from the first row. Runs that return nothing are not billed.

What does "Days back" of 1 mean? Today only, in Chicago time. Because the City publishes on a delay, that will often be zero rows. 7 is a safer starting point.

Why do some rows have no contractor? Because the permit did not name one. Many small Chicago permits list only the owner, and owner names are not returned.

Can the date range be set to specific dates? No. The window is the most recent 1 to 90 days, ending today.

Are duplicate rows possible? Not within one run. Each permit record appears once, keyed on the City's own record id.

What happens if the City portal is down? The run returns no rows, reports status UNKNOWN with the exact error from the portal, and is not billed. Rows are never invented or served from a cache.

Can this be checked against the City? Yes. Open the source_url on any row. It returns that one permit record from the City's own API.

Source and credit

Data source: City of Chicago, "Building Permits", dataset ydr8-5enu, published at data.cityofchicago.org.

The City of Chicago Terms of Use at https://www.cityofchicago.org/city/en/narr/foia/data_disclaimer.html allow a secondary or derivative application built on this data, on the condition that the City's disclaimer travels with it. That disclaimer, word for word, is below, and it is also attached to every row in the attribution field:

This site provides applications using data that has been modified for use from its original source, www.cityofchicago.org, the official website of the City of Chicago. The City of Chicago makes no claims as to the content, accuracy, timeliness, or completeness of any of the data provided at this site. The data provided at this site is subject to change at any time. It is understood that the data provided at this site is being used at one’s own risk.

Refunds and support

Refunds: if a run returns zero rows for a valid input, email operations@ustechautomations.com within 7 days and we refund that run. Support: same address, replies within 2 business days.