Skip to content
Tariff data · 2026-08-27

Data audit · URDB snapshot 2026-08-27

What the free tariff database gets wrong, measured

The NREL Utility Rate Database is the public source behind most residential electricity cost estimates. It is free, comprehensive, and quietly unsafe to use as-is. Three defects account for most of the damage. Each one is counted below on the 2026-08-27 snapshot, with the exact tariff records so you can check them yourself.

Short version. 53.9% of residential records are expired but still returned. Same-name tariffs exist as delivery-only and delivery-plus-supply twins, and picking the wrong twin changes the total by up to 5×. Enrollment cutoffs are written only in free text, so closed plans look open. Two frontier AI assistants, asked a concrete bill question, fell into these traps in different ways. Our engine did not.

Defect 1 · More than half the residential records are expired

Of 13,835 residential tariffs in the bulk file, 7,460 carry an end date that has already passed. The API does not filter them for you. A naive lookup by utility name returns expired and current plans side by side, and the expired ones often have the friendlier names.

Filter stepRecordsShare of total
All residential records13,835100%
Has an end date (expired)7,46053.9%
No end date (nominally current)6,37546.1%
…of which filed before 20245,55040.1%
Current and filed 2024 or later8256.0%
Counted on the 2026-08-27 bulk CSV. "Nominally current" means no end date; most of those were filed years ago and have been superseded without the old row being closed.

The is_default flag does not rescue you: it is true on 3% of nominally current records, so it cannot be used to pick the live plan.

Defect 2 · One tariff, two records, 5× apart

In states with retail choice, the same rate schedule is filed twice: once pricing only the utility’s delivery charges, once pricing delivery plus the default supply. The two rows share a name. The only field that distinguishes them is a free-text clause inside energycomments, and 58.7% of current records have no such clause at all.

ConEd NYC · SC-1 Voluntary TOD (Rate II)Priced asJuly 2 pmJuly 2 amRatio
Rate II [NYC]Delivery only66.93¢4.49¢14.9×
Rate II – Zone J [NYC]Delivery + supply93.34¢30.90¢3.0×
Same tariff, same customer, same hour. Quote the delivery-only row as a total and the bill is off by roughly 5×. The saving from shifting load is nearly identical in both rows ($57.44/month), because the supply adder is constant across periods — which is exactly why this error hides in savings calculators and surfaces in bill estimates.

Across the 825 current records we classify by billing scope: 161 are all-in, 150 delivery-only, 28 supply-only, and 486 cannot be determined from the record alone. For the last group we fall back to the ZIP-level service-type field and, in regulated states, to the market structure itself. That fallback is what raises usable ZIP coverage from 13% to 60%.

Defect 3 · Closed plans look open

Whether a plan accepts new customers is not a field. It is a sentence in the description, copied from the tariff:

“Applications for service under this Rate will not be accepted on or after March 1, 2014.”— ConEd SC-1 Voluntary TOD (Rate II), a plan that still has no end date in the database and still appears in every default query.

We extract these clauses with a pattern over the description text. On the current 2024+ set that closes 21 plans that would otherwise be recommended. That is a small count with a large effect: closed legacy time-of-use plans are frequently the ones with the widest peak/off-peak spread, so any optimiser that cannot see the cutoff will recommend a plan the customer cannot join.

The same question, three answers

We asked two frontier AI assistants a concrete question and ran it through the engine:

A ConEd customer in New York City installs a heat-pump water heater that draws 4 kWh a day in a two-hour block. Which time-of-use plan should they be on, and in July, how much do they save by running it at 2 am instead of 2 pm?
SourcePlan citedJuly peak windowMonthly savingBasis
Gemini ProSC-1 Rate III2–6 pm$30–45none given
Meta AISC-1 Rate III8 am–midnight$75–108inline citation
plainrates engineVoluntary TOD (Rate III) – Zone I8 am–midnight$42.27URDB tariff record
Engine run: 2026-07 schedule, Rate III Zone I, 2 pm marginal 49.19¢ vs 2 am 15.10¢, monthly $81.00 → $38.73. Reproduce with `npm run compare` in the repository.
  • Gemini got the peak window wrong. Rate III peaks 8 am to midnight on summer weekdays. A customer who follows the “2–6 pm” advice and runs the heater at 9 am pays the full 49.19¢ peak rate — the advice costs money.
  • Meta AI got the window right but priced it on Rate II, the plan closed to new applicants since 2014, and on its delivery-plus-supply twin — hence a saving nearly double the real one.
  • Neither registered that Rate II cannot be joined. Both defects 2 and 3 are in play in a single ordinary question.

What survives the filters

ZIP codes where…ZIPsShare
URDB has any residential tariff36,28592.7%
…filed 2024 or later28,43472.6%
…and open to new customers28,43472.6%
…and total bill is computable (delivery + supply)23,50460%
123 utilities are fully computable: 25 where the record states its scope, 98 where regulated-market structure lets us infer it. Newest tariff in the snapshot took effect 2026-06-01. The ZIP-to-utility mapping is a 2020 dataset last modified 2022-02-11 — a known limit.

Everything on this site — 594 plan pages across 137 utilities — is built from that 60%. For the rest we say we do not know, and we would rather a bill estimate say that than be quietly wrong by 5×.

What the engine does not do

  • Demand charges are flagged, not priced. They apply to about 1.5% of residential plans.
  • Supply charges in retail-choice states reset monthly and cannot be forecast; we price the current filed value and show delivery and supply separately.
  • Holidays are billed as weekdays, which slightly overstates summer peaks for some utilities.
  • Net metering: sell rates are parsed but not modelled.
  • Rate zones (PG&E climate zones, ConEd load zones) are on the bill, not in any public dataset; we show all and let the user pick.

Reproduce it

The parser, classifiers and engine are TypeScript with 118 tests. The three counts above come from streaming the bulk CSV once; the benchmark is one script.

npm run fetch      # pull the 2026-08-27 snapshot + provenance
npm run compare    # ConEd heat-pump benchmark vs. AI answers
npm run coverage   # ZIP coverage funnel
npm run diagnose -- 10001 4226 "load-zone:zone i|territory:nyc"

Every record cited links to its URDB source page. The filtered dataset is published as CC0 on the data page.

If this shows up in your quotes

If your product estimates bills, sizes systems, or models savings from tariff data, one of these three defects is probably in your numbers today. We would like to know which, and whether a corrected, computable tariff layer would be useful to you — as an API, a dataset, or a one-off audit of the records you rely on.

Write to [email protected] with the utilities you cover. We will run them through the same filters and send back what changes.

This page is a data audit, not an endorsement of any provider. plainrates is independent, earns no commission, and publishes its corrected dataset free. Canonical URL: https://plainrates.com/proof/