Construction market research
Turn repeat permit exports into one project queue.
Start with up to five recent published Chicago permits. Use the source and permit number to prepare a tidy project register, then add your own issue-date window when you need a repeatable review scope.
See it before you configure it
A closer look at the workflow.
Saved sample · October 12, 2026
This preview makes no live data requests.
Inspect the records
| Published permit ID | Work class | Published status | Declared valuation | Issue date |
|---|---|---|---|---|
| B200511080 | Fire Alarm System | ACTIVE | Not provided | 2026-10-11T00:00:00.000 |
| B200513253 | Electrical Work | ACTIVE | 60000 | 2026-10-11T00:00:00.000 |
| B200513396 | Electrical Work | ACTIVE | 500 | 2026-10-11T00:00:00.000 |
Three historical records from a bounded run that stopped at its configured spending limit. This excerpt does not certify a complete date window. Property addresses, party names and contact fields are omitted from the public sample.
Start with a focused input
{
"cities": [
"chicago"
],
"permitTypeKeywords": [],
"onlyWithContractor": false,
"maxResultsPerCity": 5,
"maxRunSeconds": 120,
"includeRaw": false
}Download input JSONThe saved preview and sample downloads make no live requests. Running an Actor is a separate, user-initiated action on Apify; review its current pricing and set a maximum total charge first. Input row limits are not spending caps.
Keep one identity per record
Permit observations with stable project keys, ready for a register and change-review process you connect.
JSON.stringify([sourceCity, String(permitId)]) after rejecting null/empty permitIdUse the completed run's exact dataset. After a destination error, replay it rather than starting a new paid collection; deduplicate by run ID plus record_key.
The template produces flat rows. Connect your own spreadsheet or service desk and use this key when updating records.
Get the n8n templateFrom first run to repeatable work
Make it part of your process.
- 01
Start with five recent records
Import the inactive n8n starter. Its input selects Chicago, caps output at five records and applies no date filter. To inspect an issue-date window, add issuedSince and issuedUntil in YYYY-MM-DD format. The dated preview shows earlier retained records, not the result of a new run.
- 02
Check what was actually collected
Select your Apify Header Auth credential on all five HTTP Request nodes and run manually after reviewing pricing. The starter requests a $0.15 charge ceiling, checks SUMMARY and verifies the dataset count. Operational partials stop delivery; a clean result cap is allowed and labeled bounded_sample.
- 03
Use a source-aware project key
The starter creates record_key from sourceCity and the string permitId, then stops at flat rows. Add your own spreadsheet or CRM upsert connection using that key. An unusable or duplicate identity stops the starter for review; an address alone is not a safe permit key.
- 04
Reconcile an overlapping window
For repeat research, configure an overlapping issue-date window and destination comparisons. Review new keys or changed status, description, valuation and dates; exclude scrapedAt from change detection. A five-row cap and date overlap can still miss records or older revisions.
Understand the output
Fields with a clear purpose.
- sourceCity + permitId
- Composite destination key. Different portals can reuse the same permit number.
- permitType / permitClass / status / workDescription
- Published project classifications and description, with source-dependent coverage.
- valuation
- Declared project valuation when published; null remains unknown and is not converted to zero.
- issueDate / appliedDate
- Source issue and application dates. Keep their original date meaning and format.
- sourceUrl / scrapedAt
- Official record link when available, plus the observation time.
Before you rely on a result
Check the coverage.
- Read SUMMARY.failedSources and perCity; source keys use displayed city labels.
- Require stoppedEarlyOnTimeLimit and stoppedOnChargeLimit to be false before describing the intended run as completed.
- Even a clean completion does not establish exhaustive source coverage; record the chosen source/date/cap.
Source and workflow limits
- Coverage is the ten supported portals, not national coverage. Freshness and field availability vary by source.
- At most 50,000 source rows are scanned per city. Date, keyword or valuation filters can yield fewer rows without proving the window exhausted.
- Declared valuation is not actual spending. A published status is not a forecast of work starting or a purchasing decision.
- Deduplication and change classification are destination responsibilities; no built-in permit history is implied.
- The starter has no date filter and no schedule. Add an issue-date window for your research, and configure any destination or recurrence yourself.
Common questions
A few useful answers.
Does this cover every US building permit?
No. The current Actor supports ten listed city and county portals. Choose a supported source and check its field coverage before expanding.
Does the Actor have a native changes-only mode?
No. Repeat reconciliation and change detection belong in your destination. Keep the source-plus-permit key stable and compare selected business fields.
Is a permit a qualified sales lead?
A permit is published project evidence. It does not establish buying intent, contractor selection timing or permission to contact someone. A person should qualify the project before any outreach.
Why is valuation empty on some rows?
The source did not publish a usable mapped value. Preserve null. Setting a minimum valuation filter also removes records with unknown valuation.
Can I use an empty export to delete old projects?
No. Empty output may reflect filters, source limitations or an interrupted run. Preserve prior projects and inspect SUMMARY before updating coverage assumptions.
Sources & further reading
- US Building Permits Scraper on Apify
- Chicago official building permits dataset
- Socrata query documentation
- Apify and n8n integration
- Apify and Make integration
- Retrieve a completed run's dataset
- Read the run SUMMARY record
Read the related source guide →
Guide prepared October 13, 2026. Samples are dated observations; current source records can differ.