Methodology
We download residential building permits from city open-data portals, keep the ones whose description matches a project type, drop declared values under $500 and the top 1%, and publish the median, the middle half and the count whenever at least 30 permits remain. Everything is reproducible from the dataset ids below.
Sources
| City | Portal dataset | Cost field | Residential filter |
|---|---|---|---|
| Chicago, IL | Building Permits, ydr8-5enu | reported_cost | Express-permit scope text plus a per-project cost cap |
| Los Angeles, CA | Building Permits, pi9x-tg5x | valuation | permit_sub_type = 1 or 2 Family Dwelling |
| New York City, NY | DOB NOW Job Filings, w9ak-ipjd | initial_cost | building_type in (1 Family, 2 Family) |
| Seattle, WA | Building Permits, 76t5-zqzr | estprojectcost | permitclassmapped = Residential |
| Austin, TX | Issued Construction Permits, 3syk-w9eu | total_job_valuation | permit_class_mapped = Residential |
Steps
- Period. Permits issued in the trailing 24 months from the compile date.
- Match. Each project type has one text rule per city (for example Chicago
SCOPE: ROOF REPLACEMENT, Los AngelesRe-roof). Rules are listed on each city page. - Trim. Drop declared values under $500 and everything above the 99th percentile.
- Gate. Publish a cell only if 30 or more permits remain. Below that we publish nothing for that city.
- Statistics. Median, 25th and 75th percentile, minimum and maximum after trimming. Where a permit states a size (square feet in Chicago, roofing squares in Los Angeles) we also publish a per-unit median and size buckets.
- Refresh. Re-compiled monthly. Each page shows its compile date.
Known bias
- Declared values are filed to set permit fees. They typically sit below the contractor's final invoice.
- Unpermitted work is invisible to this method.
- Text matching is imperfect. A "roof" rule can catch a solar install that mentions the roof. The cost cap and trimming limit, but do not remove, that noise.
- Chicago's dataset has no residential flag. We rely on the express-permit scope text and a per-project cost cap.
National ranges
The national figures on each guide are separate. They are synthesised from published contractor-cost sources and cited on the guide. The permit data is our own compilation and is the only part of this site we call original. See About.
Reproduce it
Every cell is in permits.csv with its dataset id and matching rule. The same query against the portal's SoQL endpoint returns the underlying permits.