CostGuideHQ

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

CityPortal datasetCost fieldResidential filter
Chicago, ILBuilding Permits, ydr8-5enureported_costExpress-permit scope text plus a per-project cost cap
Los Angeles, CABuilding Permits, pi9x-tg5xvaluationpermit_sub_type = 1 or 2 Family Dwelling
New York City, NYDOB NOW Job Filings, w9ak-ipjdinitial_costbuilding_type in (1 Family, 2 Family)
Seattle, WABuilding Permits, 76t5-zqzrestprojectcostpermitclassmapped = Residential
Austin, TXIssued Construction Permits, 3syk-w9eutotal_job_valuationpermit_class_mapped = Residential

Steps

  1. Period. Permits issued in the trailing 24 months from the compile date.
  2. Match. Each project type has one text rule per city (for example Chicago SCOPE: ROOF REPLACEMENT, Los Angeles Re-roof). Rules are listed on each city page.
  3. Trim. Drop declared values under $500 and everything above the 99th percentile.
  4. Gate. Publish a cell only if 30 or more permits remain. Below that we publish nothing for that city.
  5. 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.
  6. Refresh. Re-compiled monthly. Each page shows its compile date.

Known bias

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.