FIND YOUR IT.

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

Building permit projects · observed October 12, 2026
Published permit IDWork classPublished statusDeclared valuationIssue date
B200511080Fire Alarm SystemACTIVENot provided2026-10-11T00:00:00.000
B200513253Electrical WorkACTIVE600002026-10-11T00:00:00.000
B200513396Electrical WorkACTIVE5002026-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 JSON

The 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.

DESTINATION KEYJSON.stringify([sourceCity, String(permitId)]) after rejecting null/empty permitId

Use 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 template

From first run to repeatable work

Make it part of your process.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

Ready for your own data?

Start with a small scope.

Review current pricing and coverage, then configure your input on Apify.

Open Actor on Apify

Sources & further reading

Read the related source guide →

Guide prepared October 13, 2026. Samples are dated observations; current source records can differ.