CostCandor

= published prices × your house

What a Los Angeles re-roof permit actually records — and why it isn't the price

Published 2026-08-05 · records retrieved 2026-08-05 · our band fixed as of 2026-07 · how we build these numbers

Run your own numbers in the roof replacement calculator →

This record was supposed to grade us. Los Angeles publishes every building permit it issues, each carrying a dollar figure, and 7,477 issued in the first seven months of 2026 describe a re-roof. Our roof calculator publishes a cost band. Setting the two side by side looked like the most direct audit available anywhere.

For most of the file the money isn't money — it is a rate applied from a table. For a minority it looks real and still cannot be used, for a different reason. Both halves are below, including the parts that cut against how we first wrote it.

1. What this record is

The dataset is the City of Los Angeles Department of Building and Safety permit file, resource pi9x-tg5x on the city's open-data portal. It is a public government record; the portal attaches no license restriction. We retrieved it on 2026-08-05. Three fields do the work: issue_date, work_desc (free-text scope), and valuation (the dollar figure filed with the permit). Two queries reproduce everything below — first, the population count:

# how many re-roof permits did Los Angeles issue in Jan-Jul 2026?
curl -s -G 'https://data.lacity.org/resource/pi9x-tg5x.json' \
  --data-urlencode "\$where=issue_date >= '2026-01-01' AND issue_date < '2026-08-01' \
                    AND upper(work_desc) like '%RE-ROOF%'" \
  --data-urlencode '$select=count(1)'

# => [{"count_1":"7477"}]

The second pulls the fields the analysis needs. We deliberately do not select the address, parcel, or coordinate columns — the raw file carries them, and this site publishes derived statistics and the queries behind them, never rows identifying individual homes:

curl -s -G 'https://data.lacity.org/resource/pi9x-tg5x.json' \
  --data-urlencode "\$where=issue_date >= '2026-01-01' AND issue_date < '2026-08-01' \
                    AND upper(work_desc) like '%RE-ROOF%'" \
  --data-urlencode '$select=issue_date,valuation,work_desc' \
  --data-urlencode '$limit=50000' > reroof.json

2. What it measures — and what it quietly does not

Here is the test that ended the comparison. The scope text usually states the roof's size in squares, so divide each permit's valuation by its square count. A contract amount would produce a wide, lumpy spread — different materials, different crews, thousands of separate negotiations.

It is not a spread. Of the 5,709 permits where a square count could be read, 4,347 — 76.1% — carry a valuation of exactly $200.00 per square, and another 863, or 15.1%, exactly $300.00. Together, 91.3%. Not approximately $200, not clustered near it: to the cent. Hold on to that denominator, though — section 3 shows how much of the 91.3% is an artifact of how we read the text.

Prices do not behave this way; rate tables do. The descriptions hint at which table: filings at $200.00 per square describe a re-roof over existing solid sheathing, those at $300.00 one over new solid sheathing — which would make the rate a classification of deck scope rather than a negotiated amount. We read that split off the text rather than tabulating it, so treat it as the likely key, not a counted result. The tail agrees: 85 filings compute to $0.00 per square, a field left at zero, eleven to $400.00, ten to $250.50.

None of which makes the field improper — a jurisdiction needs an auditable basis for permit fees. It is simply not the homeowner's bill. We did not locate the ordinance that fixes these rates, so we are not asserting where $200 and $300 come from, only that whatever produced them was a table rather than a market.

3. The cohort, and what we dropped

The population is every permit issued from 2026-01-01 through 2026-08-01 whose work_desc contains RE-ROOF: 7,477 permits, with no filter on property type, so houses, apartment buildings, and detached garages are all in there. Square counts came out of the free text with one pattern:

(\d+(?:\.\d+)?)\s*(?:SQ|SQUARE)S?\b

It matched 5,709 permits, or 76.4%. The remaining 1,768 — 23.6% — were dropped, and how they failed matters: a quarter of a file disappearing is where a selection story hides. Most misses are the same sentence as the matches, with the number typed into the underscore blanks the form leaves behind: sheathing___14___Squares. The pattern wants whitespace before the word, finds underscores, and walks past a count legible to any human.

So we did what we would want a reader to do, and it cost us the headline. Widening the pattern to accept underscores recovers roughly two-thirds of the dropped filings, raising the parseable set from 5,709 to 6,931 — and the share on the two spikes falls from 91.3% to 75.5%. The 91.3% is therefore not a property of Los Angeles re-roof permits. It is a property of the ones a strict regular expression happened to size, and that pattern was quietly selecting the tidier filings. The finding survives — three quarters on two values to the cent is still a table, not a market — but the number that made the point most loudly does not. Every share here is on the strict 5,709 unless labelled otherwise.

4. There are two forms in this file, and only one is a table

The larger problem with any single share: it averages two different documents. Sort the permits by the boilerplate their scope text uses and the file splits along a seam nobody labelled. One form — 5,921 filings — reads Class A or B roof covering material. The other — 801 — drops two words: Class A or B material. They do not exhaust the file, and no published column says they differ.

They behave nothing alike. In the first, $200.00 per square is both the most common value and the median, holding 73.5% of the group by itself, and the median filed valuation is $5,000. In the second, the most common per-square value holds 3.7% — no spike at all. Its quartiles run $377 / $575 / $800 per square, its tails from roughly $170 at the 5th percentile to $1,787 at the 95th, and its median filed valuation is $14,000.

The comfortable explanation would be bigger or harder roofs. It is not: median roof size is 23 squares in the first group and 24 in the second. What it looks like is people typing numbers. 59.6% of its valuations are exact multiples of $1,000 — a human rounding, not a rate times an area — the schedule rates account for only 2.4% of it, and it runs at 8–12% of filings every month from January through July, so it is not one vendor's batch. Which is why the claim has to be split rather than stated flat: on most permits the dollar figure is a schedule rate, on a minority it appears to be somebody's estimate.

That minority is the only part of the file that could grade us, so we ran it rather than leave it unmentioned. Against our combined band of $550–$1,000 per square, 40.1% of the 801 land inside, 46.2% below, 13.7% above. Their median of $575 is exactly our architectural-asphalt typical, and 22% under our combined typical of $735 with tear-off priced in.

That is neither a pass nor a fail, because it cannot separate two explanations. Permit fees are computed from the filed valuation, so every applicant has a standing reason to write a number smaller than the contract. A cohort sitting a fifth under our typical is what you would see if our band were a fifth too high — and equally what you would see if filings ran a fifth light. Nothing published tells those apart, and we are not going to pick the one that flatters us.

5. The distribution and our band on the same axis

Per square of roofFigureWhat the number is
Permit valuation, most common value$200.00 — 4,347 (76.1%)Scope reads "over existing solid sheathing"
Permit valuation, second value$300.00 — 863 (15.1%)Scope reads "over new solid sheathing"
Those two spikes, strict parse → widened91.3% → 75.5%n 5,709 → 6,931 once underscores are allowed
"Class A or B material" cohort$377 / $575 / $800 — 801 filingsp25 / median / p75; no spike, looks self-reported
Our band — architectural asphalt, installed$450 – $750Material and labor, national
Our band — tear-off and disposal$100 – $250Added per square on top
Our band — both lines together$550 – $1,000What our calculator tells you to expect

The temptation is to read the top rows against the bottom ones and conclude Los Angeles roofers are cheap. Watch what a correction does. California carries a labor index of 1.15 in our dataset, and with roughly 65% of a roofing job being labor, a California band sits about 10% above the national figures in that table — widening the gap rather than closing it. A gap that moves the wrong way when corrected is a gap between units.

6. Verdict

Verdict

(C) Comparison rejected — this record cannot check our band in either direction.

On most filings valuation records a schedule rate rather than a transaction, so it can neither confirm nor move our numbers. On the minority that do look self-reported the arithmetic runs — 40.1% inside our band — but the incentive to file low is unmeasured and points the same way as the result, so agreement and disagreement are indistinguishable. We are not claiming the check passed. Our roof band stands where it stood before we opened this dataset — fixed as of the 2026-07 stamp on our roofing data, which predates the 2026-08-05 retrieval — and on the sources in our methodology, not on anything here.

What it does establish is narrower and still worth publishing: in Los Angeles most permit valuations are administrative figures, and anyone citing them as local roof prices — a contractor, a news story, a cost website, us — is quoting a fee schedule with a dollar sign on it.

7. If you are collecting roof quotes in Los Angeles

The permit file is still worth pulling before you sign; you just have to ask it what it can answer. It will tell you a permit was issued, when, what scope was declared, and often how many squares the roof was — the one number that makes competing bids comparable at all. So: ask each bidder for their measured square count and check it against the figure that will end up in the permit description. Ask whether the bid assumes new sheathing or a re-roof over the existing deck — the distinction Los Angeles itself uses to sort these jobs, and a real cost difference rather than a paperwork one. Confirm the permit is pulled in the contractor's name, not yours. And when someone quotes a neighborhood price they say came from permit records, ask which field they read; if the answer is the valuation, they have read a fee calculation. Our quote checklist covers the remaining line items, and the cost-factors guide ranks which genuinely move the number.

Frequently asked questions

Can I find out what my neighbor paid for their roof from building permits?

In Los Angeles, mostly no. Re-roof permits there come in two description forms. The common one, 5,921 filings whose scope text reads “Class A or B roof covering material”, carries a valuation of exactly $200.00 or exactly $300.00 per square of roof, to the cent, on most filings — a rate table, not a contract. A second form, 801 filings reading “Class A or B material”, behaves differently: its per-square figures spread smoothly from roughly $170 to $1,787 with no spike anywhere, which is what self-reported money looks like. But permit fees are computed from the filed amount, so those figures carry a standing reason to run low and cannot be read as prices either. The permit reliably tells you the roof was replaced and roughly how big it was. It does not tell you what was paid.

What does "valuation" mean on a building permit?

It is the figure a jurisdiction uses to calculate the permit fee and to classify the scope of work. Some jurisdictions ask for an estimated job cost, some apply a published rate per unit of work, and some accept whatever the applicant enters. Because the field is named like money and formatted like money, it gets quoted as a price by people who have not checked how it was produced. Before treating any permit valuation as a price, divide it by a size measure and look at the distribution: real prices spread out, administrative valuations stack on a few values.

Why do so many Los Angeles re-roof permits show exactly $200 per square?

Because on those filings the figure appears to be applied from a schedule rather than reported from a contract. They share one boilerplate scope text, and inside it the descriptions separate a re-roof over existing solid sheathing from one over new solid sheathing — the distinction the two rates appear to track. We read that split off the text rather than tabulating it, and we did not locate the ordinance or fee schedule that sets the rates, so we are not asserting where $200 and $300 originate. Only that whatever produced them was a table and not a market.

Does this mean roof replacement is cheap in Los Angeles?

No, and reading it that way is the specific error this record exists to prevent. A $200-per-square permit valuation is not a $200-per-square roof. Our own dataset puts architectural asphalt at $450–750 per square installed before tear-off, with tear-off and disposal adding $100–250 per square on top. California also carries a labor index of 1.15 in our data, and since roughly 65% of a roofing job is labor, a California band sits close to 10% above those national figures. The $200 rate is below our national floor because it is measuring something else entirely. The one cohort in the file that does look self-reported has a median of $575 per square — exactly our architectural typical, and 22% under our combined typical of $735 with tear-off included — and it comes with a structural reason to file low, so it is not evidence of a cheap city either.

Cost math by CostCandor