Los Angeles County, California carries 2,455,390 parcel records in PropRaven's county coverage rollup. 9,006 of them — 0.36% — carry an owner name. The same records carry an assessed value 97.3% of the time. The county with the most records in our rollup publishes, in the feed we receive, almost everything about a parcel except who owns it.
Maine goes further: across 2,266,862 records in 16 county rows, owner-name fill is 0.0% and assessed-value fill is 0.0%. Texas names an owner on 73.1% of its 22,155,025 records and draws a parcel polygon on 0.0% of them — 251 of its 253 county rows contain no geometry at all. Below, every county row in the rollup is scored on four fields an assessor or GIS office publishes — situs address, owner name, assessed value, parcel geometry — and ranked by what is left blank. Every figure is a count of records in the coverage rollup, not distinct parcels; the Method section says why.
The national picture
| Field | Records with the field | Share of 289,856,342 | County rows with zero |
|---|---|---|---|
| Situs address | 233,624,866 | 80.6% | 68 |
| Geocode (ours) | 218,616,281 | 75.4% | 74 |
| Owner name | 190,183,410 | 65.6% | 135 |
| Assessed value | 170,218,312 | 58.7% | 271 |
| Parcel geometry | 113,207,582 | 39.0% | 1,152 |
Of 2,992 county rows, 1,246 — carrying 72,325,512 records — are missing owner name, assessed value, or geometry entirely; 87 rows (2,887,121 records) are missing all three. A county tends to publish a field for nearly everything or for nearly nothing:
| Fill band (county rows) | Owner name | Assessed value | Geometry |
|---|---|---|---|
| 0% | 135 | 271 | 1,152 |
| Above 0%, under 50% | 788 | 1,238 | 1,315 |
| 50% to under 90% | 402 | 441 | 330 |
| 90% or more | 1,667 | 1,042 | 195 |
States, ranked by what they leave blank
State figures sum each state's rows before dividing, so they are record-weighted. The 31 rows with no state label (2,096,830 records, empty on every field) are excluded.
Lowest owner-name fill
| State | Records | Owner name | Assessed value | Geometry |
|---|---|---|---|---|
| Maine | 2,266,862 | 0.0% | 0.0% | 85.8% |
| New Hampshire | 1,999,451 | 0.9% | 0.0% | 48.2% |
| Rhode Island | 1,775,044 | 4.3% | 12.3% | 91.9% |
| New Jersey | 7,052,784 | 5.0% | 93.8% | 84.1% |
| California | 19,349,387 | 9.3% | 58.5% | 47.5% |
Florida and Arkansas, at the other end, name an owner on 99.9% of records; Montana on 99.7%.
The bottom five are exactly the five our methodology notes already name: "County feeds in NJ, ME, NH, RI, CA Prop 13 partially redact owner names at the publishing layer. Cannot enrich — the data isn't published upstream." That is the documented caveat; this piece measures the gap and does not re-verify each state's publishing rule.
Lowest assessed-value fill
| State | Records | Assessed value | Owner name | Rows at zero value |
|---|---|---|---|---|
| Maine | 2,266,862 | 0.0% | 0.0% | 16 of 16 |
| New Hampshire | 1,999,451 | 0.0% | 0.9% | 10 of 10 |
| Wyoming | 1,341,260 | 0.0% | 79.7% | 23 of 23 |
| Iowa | 6,678,123 | 5.2% | 62.5% | 0 of 99 |
| Nevada | 4,740,710 | 10.5% | 39.8% | 0 of 17 |
Wyoming names an owner on 79.7% of records and values none. Iowa and Nevada are the opposite shape — no county row at zero, statewide fill of 5.2% and 10.5%. Geometry is the field states publish least: Texas is at 0.0%, then Washington 6.2%, Arizona 8.6%, Florida 9.6%.
The largest counties missing owner names
County rankings apply the guards the county pages use (see Method), leaving 2,415 rows, 800 of them with at least 50,000 records. Of those 800, 114 rows — 29,493,990 records — name an owner on fewer than 5% of records.
| County | Records | Owner names | Owner fill | Assessed value | Geometry |
|---|---|---|---|---|---|
| Los Angeles County, CA | 2,455,390 | 9,006 | 0.36% | 97.3% | 8.6% |
| Riverside County, CA | 1,401,803 | 10,837 | 0.77% | 81.0% | 46.4% |
| Orange County, CA | 1,123,145 | 20,083 | 1.78% | 47.4% | 16.6% |
| San Diego County, CA | 1,093,243 | 5,303 | 0.48% | 91.6% | 13.9% |
| Santa Clara County, CA | 1,046,098 | 25,022 | 2.39% | 42.9% | 68.6% |
| Clackamas County, OR | 550,338 | 8,502 | 1.54% | 57.3% | 35.1% |
| Rockingham County, NH | 547,927 | 3,701 | 0.67% | 0.0% | 54.2% |
| Camden County, NJ | 508,550 | 5,718 | 1.12% | 96.4% | 96.0% |
The first five are California; together they carry 7,119,679 records and 70,251 owner names. Camden is the New Jersey pattern — values on 96.4% of records, owner names on 1.12%.
The largest counties missing assessed values
161 of the 800 large rows — 22,528,282 records — carry an assessed value on fewer than 5% of records.
| County | Records | Assessed values | Value fill | Owner name | Geometry |
|---|---|---|---|---|---|
| Clark County, NV | 1,362,522 | 7,017 | 0.51% | 70.9% | 28.9% |
| Sacramento County, CA | 1,007,561 | 52 | 0.00% | 50.9% | 18.0% |
| Polk County, IA | 748,221 | 30,154 | 4.03% | 70.3% | 42.5% |
| Will County, IL | 508,850 | 7,618 | 1.49% | 11.1% | 44.8% |
| Shelby County, TN | 353,982 | 0 | 0.00% | 99.6% | 68.3% |
| Stanislaus County, CA | 336,649 | 49 | 0.01% | 0.1% | 2.5% |
Sacramento County carries 52 assessed values on 1,007,561 records. Shelby County, Tennessee names an owner on 99.6% of records and values none.
The largest counties with no geometry
200 of the 800 large rows, carrying 37,881,480 records, have no parcel geometry at all. Texas dominates:
| County | Records | Address | Owner name | Assessed value |
|---|---|---|---|---|
| Harris County, TX | 1,621,867 | 99.3% | 99.6% | 90.5% |
| Tarrant County, TX | 1,448,471 | 99.9% | 99.9% | 46.7% |
| Monroe County, NY | 1,071,758 | 99.8% | 94.1% | 94.1% |
| Dallas County, TX | 894,204 | 99.9% | 90.3% | 84.8% |
| Collin County, TX | 884,776 | 99.5% | 99.7% | 95.3% |
These are otherwise well-filled counties: Harris is above 90% on every attribute field and at zero on the polygon.
The composite
The index is the unweighted mean of the four county-published fill rates, truncated to one decimal; geocode is left out because we derive it. Among the 800 large rows, the bottom five and the top four:
| County | Records | Address | Owner | Value | Geometry | Index |
|---|---|---|---|---|---|---|
| Fayette County, PA | 77,994 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0 |
| St. Landry Parish, LA | 53,616 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0 |
| Allegan County, MI | 67,989 | 4.2% | 0.0% | 0.0% | 0.0% | 1.0 |
| Nobles County, MN | 52,237 | 1.0% | 2.6% | 1.7% | 0.0% | 1.3 |
| Berrien County, MI | 87,118 | 3.1% | 3.2% | 0.0% | 0.0% | 1.6 |
| Pulaski County, AR | 171,851 | 100.0% | 100.0% | 99.7% | 99.9% | 99.9 |
| Saline County, AR | 55,684 | 99.3% | 100.0% | 97.6% | 99.9% | 99.2 |
| Tulsa County, OK | 283,784 | 97.7% | 98.5% | 98.3% | 99.9% | 98.6 |
| Beaufort County, SC | 105,591 | 97.2% | 99.5% | 98.1% | 99.9% | 98.6 |
A row of zeros — Fayette, St. Landry — can mean the county publishes an identifier and nothing else, or that our connector captured the identifier and nothing else. The rollup does not say which, and neither do we.
Why it matters
A parcel record with no owner name cannot be joined to a deed, a permit, or another parcel held by the same owner. One with no assessed value cannot be compared to its neighbors or its own sale price. One with no geometry cannot be put on a map or tested against a flood zone.
The gaps sit where the parcels are: a national dataset can report 65.6% owner-name coverage and still be nearly blind to owners in California, the state with the most records in it. And this is a lower bound on what counties withhold, not a measurement of it. A zero means the field did not reach our serving layer. Where the methodology notes say why, we cite that as documented; where they do not, a zero is an open question about the source, the connector, or both.
Method
The data is public.parcel_coverage_summary in the serving database at source version 2026-08-28: one row per state-and-county code with the record count and the number of records carrying an address, a geocode, an owner name, an assessed value and a geometry. Fill rates are with_<field> / parcel_count, truncated (not rounded) to one decimal — two where a rate is under 5% — so no figure overstates coverage.
Records, not parcels. parcel_count counts rows in the serving relation, and the same parcel appears once per county-source row that carries it. Nationally that fan-out is 1.52x — 289,856,342 records against 191,288,445 distinct parcel ids at the 2026-08-30 epoch — and it runs to 6.5x in Vermont. Every count here is a record count and every rate a share of records; a distinct-parcel denominator could give a different number, and we did not compute it.
County identity. Counties are keyed on FIPS, state_fips || right(county_fips, 3), joined to the usfs_wildfire_risk gazetteer for name and population, as the county pages do. The rollup's own county_name label disagrees with the FIPS code on a number of rows and was not used. Los Angeles County's gazetteer population, 9,848,406, is the largest of any county.
Exclusions for the county tables. From 2,992 rows: 326 (71,930,223 records) are codes the site flags as replicated statewide feeds; 183 (8,553,419 records) carry a rollup label containing "statewide"; 34 (3,264,142 records) have no gazetteer match; 31 (2,096,830 records) have no state label; 3 (9,761 records) exceed 4,000 records per 1,000 residents. That leaves 2,415 rows and 204,001,967 records, of which 800 rows (173,386,231 records) reach the 50,000-record floor. State tables use every row with a state label; the national table uses all 2,992. "Missing" means under 5% fill for owner name and assessed value, and exactly zero for geometry. Field definitions — name_raw, assessed_value_total, geometry — are in the data dictionary.
Where this goes next
Three things would make this index better: a distinct-parcel denominator per county, so a rate is a share of parcels rather than rows; a reason code on every zero — not published, published but not captured, captured but not loaded — because until it exists a zero is an observation, not an accusation; and rollup county labels that agree with their FIPS codes.
The larger point stands without any of that. The counties that publish the least about their parcels are not small or rural. They include the most populous county in the country, most of California, owner names on 5.0% of New Jersey's records, and 251 of the 253 county rows in Texas without a single parcel polygon.
Data: public.parcel_coverage_summary at source version 2026-08-28 (2,992 county rows, 289,856,342 records), joined on FIPS to the usfs_wildfire_risk gazetteer. All counts are records in the coverage rollup, not distinct parcels. Shares are truncated, never rounded up. Figures are as of 2026-09-05 and are restated each serving epoch. The records behind them are searchable at propraven.com.
SQL. Run read-only against the serving database. flags is the countyFlags list from src/lib/data/state-distinct-parcels.json (336 codes, epoch 2026-08-28).
-- National totals and zero-field county rows
SELECT count(*) AS county_rows, sum(parcel_count) AS records,
sum(with_address), sum(with_geocode), sum(with_owner), sum(with_value), sum(with_geometry),
trunc(100.0*sum(with_address)/sum(parcel_count),1) AS addr_pct,
trunc(100.0*sum(with_geocode)/sum(parcel_count),1) AS geocode_pct,
trunc(100.0*sum(with_owner)/sum(parcel_count),1) AS owner_pct,
trunc(100.0*sum(with_value)/sum(parcel_count),1) AS value_pct,
trunc(100.0*sum(with_geometry)/sum(parcel_count),1) AS geom_pct,
count(*) FILTER (WHERE with_address=0), count(*) FILTER (WHERE with_geocode=0),
count(*) FILTER (WHERE with_owner=0), count(*) FILTER (WHERE with_value=0),
count(*) FILTER (WHERE with_geometry=0),
count(*) FILTER (WHERE with_owner=0 OR with_value=0 OR with_geometry=0) AS rows_any_zero,
sum(parcel_count) FILTER (WHERE with_owner=0 OR with_value=0 OR with_geometry=0) AS recs_any_zero,
count(*) FILTER (WHERE with_owner=0 AND with_value=0 AND with_geometry=0) AS rows_all_zero,
sum(parcel_count) FILTER (WHERE with_owner=0 AND with_value=0 AND with_geometry=0) AS recs_all_zero,
min(source_version), max(source_version)
FROM public.parcel_coverage_summary;
-- Fill bands (repeated for with_value and with_geometry)
SELECT bucket, count(*) AS counties, sum(parcel_count) AS records
FROM (SELECT parcel_count,
CASE WHEN with_owner=0 THEN '1: 0%'
WHEN with_owner*100 < parcel_count*50 THEN '2: under 50%'
WHEN with_owner*100 < parcel_count*90 THEN '3: 50 to 90%'
ELSE '4: 90% or more' END AS bucket
FROM public.parcel_coverage_summary WHERE parcel_count>0) t
GROUP BY 1 ORDER BY 1;
-- State ranking (record-weighted)
SELECT state_abbr, count(*) AS county_rows, sum(parcel_count) AS records,
trunc(100.0*sum(with_address)/sum(parcel_count),1) AS addr_pct,
trunc(100.0*sum(with_owner)/sum(parcel_count),1) AS owner_pct,
trunc(100.0*sum(with_value)/sum(parcel_count),1) AS value_pct,
trunc(100.0*sum(with_geometry)/sum(parcel_count),1) AS geom_pct,
count(*) FILTER (WHERE with_owner=0) AS rows_zero_owner,
count(*) FILTER (WHERE with_value=0) AS rows_zero_value,
count(*) FILTER (WHERE with_geometry=0) AS rows_zero_geom
FROM public.parcel_coverage_summary
WHERE state_abbr IS NOT NULL
GROUP BY 1 ORDER BY owner_pct ASC, records DESC;
-- County tables: shared base, exclusions, then one SELECT per table
WITH flags(fips5) AS (VALUES ('13001'),('13011'),('13099'),('13183'),('13215'),('13307'),('13317'),('15005'),('15009'),('16005'),('16007'),('16011'),('16023'),('16025'),('16033'),('16049'),('16053'),('16061'),('16063'),('16071'),('16073'),('16077'),('17131'),('17155'),('19001'),('19003'),('19009'),('19053'),('19071'),('19117'),('19133'),('19135'),('19143'),('19151'),('19159'),('19161'),('19173'),('19177'),('19185'),('20019'),('20029'),('20063'),('20153'),('20157'),('20181'),('20205'),('21131'),('21165'),('22059'),('23009'),('23017'),('23021'),('23029'),('24017'),('24023'),('24035'),('25003'),('25007'),('25011'),('25015'),('25019'),('27001'),('27011'),('27021'),('27031'),('27059'),('27061'),('27071'),('27073'),('27075'),('27077'),('27089'),('27095'),('27097'),('27107'),('27115'),('27151'),('27155'),('27163'),('27167'),('28161'),('29119'),('29123'),('29141'),('29153'),('29179'),('30003'),('30005'),('30007'),('30009'),('30011'),('30013'),('30015'),('30019'),('30025'),('30033'),('30037'),('30039'),('30045'),('30051'),('30055'),('30059'),('30069'),('30071'),('30075'),('30079'),('30091'),('30097'),('30101'),('30103'),('30107'),('30109'),('31117'),('31155'),('31157'),('31165'),('31167'),('32009'),('32011'),('32015'),('32017'),('32021'),('32027'),('32029'),('32033'),('32510'),('33005'),('34009'),('34019'),('34037'),('35003'),('35029'),('35033'),('35057'),('35061'),('36005'),('36007'),('36011'),('36025'),('36027'),('36031'),('36033'),('36035'),('36037'),('36041'),('36049'),('36051'),('36057'),('36061'),('36065'),('36075'),('36079'),('36091'),('36093'),('36095'),('36099'),('36101'),('36107'),('36109'),('36113'),('37011'),('38001'),('38003'),('38005'),('38007'),('38009'),('38011'),('38013'),('38019'),('38021'),('38023'),('38025'),('38027'),('38029'),('38037'),('38039'),('38041'),('38043'),('38045'),('38047'),('38049'),('38051'),('38063'),('38065'),('38067'),('38069'),('38073'),('38075'),('38079'),('38081'),('38083'),('38085'),('38087'),('38089'),('38091'),('38095'),('38103'),('40029'),('40055'),('40057'),('40093'),('41065'),('42035'),('42059'),('42061'),('42105'),('44001'),('44005'),('44009'),('45005'),('45065'),('46003'),('46007'),('46011'),('46037'),('46055'),('46059'),('46077'),('46079'),('46097'),('46111'),('46117'),('46119'),('47019'),('48009'),('48017'),('48033'),('48063'),('48065'),('48083'),('48089'),('48095'),('48097'),('48109'),('48137'),('48151'),('48155'),('48229'),('48263'),('48269'),('48271'),('48301'),('48311'),('48345'),('48353'),('48385'),('48443'),('48449'),('48469'),('48503'),('49007'),('49009'),('49015'),('49017'),('49021'),('49025'),('49033'),('49041'),('50001'),('50013'),('50015'),('50021'),('50025'),('51001'),('51005'),('51009'),('51025'),('51045'),('51067'),('51083'),('51097'),('51105'),('51111'),('51159'),('51167'),('51169'),('51181'),('51187'),('51520'),('51690'),('51720'),('51770'),('51820'),('53001'),('53003'),('53013'),('54013'),('54015'),('54017'),('54021'),('54023'),('54027'),('54031'),('54041'),('54047'),('55029'),('55063'),('55065'),('55071'),('55078'),('55089'),('55113'),('55139'),('56023'),('56027'),('56035'),('56041'),('01019'),('01087'),('02060'),('02068'),('02090'),('02100'),('02150'),('02195'),('02230'),('04009'),('04011'),('04012'),('06017'),('06035'),('06113'),('08015'),('08019'),('08023'),('08033'),('08045'),('08047'),('08053'),('08055'),('08079'),('08091'),('08097'),('08109'),('08111'),('08117')),
base AS (
SELECT s.state_abbr, s.county_name AS label, s.parcel_count AS recs,
s.with_address, s.with_geocode, s.with_owner, s.with_value, s.with_geometry,
s.state_fips || right(s.county_fips,3) AS fips5,
g.county_name AS gname, g.population, g.total_buildings
FROM public.parcel_coverage_summary s
LEFT JOIN propraven_loading_2026_05_tier1.usfs_wildfire_risk g
ON g.county_fips = s.state_fips || right(s.county_fips,3)),
tagged AS (
SELECT b.*, CASE WHEN b.state_abbr IS NULL THEN 'no state label'
WHEN b.gname IS NULL THEN 'no gazetteer match'
WHEN b.fips5 IN (SELECT fips5 FROM flags) THEN 'site flags as replicated feed'
WHEN b.population > 0 AND b.recs*1000.0/b.population > 4000 THEN 'over 4000 records per 1000 residents'
WHEN b.total_buildings > 0 AND b.recs > 5*b.total_buildings THEN 'over 5x buildings'
WHEN b.label ILIKE '%statewide%' THEN 'statewide label'
ELSE 'kept' END AS status
FROM base b),
clean AS (SELECT * FROM tagged WHERE status = 'kept')
-- exclusion accounting
SELECT status, count(*), sum(recs), count(*) FILTER (WHERE recs>=50000), sum(recs) FILTER (WHERE recs>=50000)
FROM tagged GROUP BY 1 ORDER BY 2 DESC;
-- owner names (assessed values: swap with_owner for with_value)
SELECT state_abbr, gname, recs, with_owner, trunc(100.0*with_owner/recs,2),
trunc(100.0*with_value/recs,1), trunc(100.0*with_geometry/recs,1), population
FROM clean WHERE recs>=50000 AND with_owner*100 < recs*5 ORDER BY recs DESC LIMIT 20;
-- geometry
SELECT state_abbr, gname, recs, trunc(100.0*with_address/recs,1), trunc(100.0*with_owner/recs,1),
trunc(100.0*with_value/recs,1), population
FROM clean WHERE recs>=50000 AND with_geometry=0 ORDER BY recs DESC LIMIT 12;
-- composite (ORDER BY idx DESC for the top table)
SELECT state_abbr, gname, recs, trunc(100.0*with_address/recs,1), trunc(100.0*with_owner/recs,1),
trunc(100.0*with_value/recs,1), trunc(100.0*with_geometry/recs,1),
trunc((100.0*with_address/recs + 100.0*with_owner/recs + 100.0*with_value/recs + 100.0*with_geometry/recs)/4,1) AS idx,
population
FROM clean WHERE recs>=50000 ORDER BY idx ASC, recs DESC LIMIT 12;
-- large-row counts behind the prose
SELECT count(*), sum(recs), count(*) FILTER (WHERE recs>=50000), sum(recs) FILTER (WHERE recs>=50000),
count(*) FILTER (WHERE recs>=50000 AND with_owner*100 < recs*5),
sum(recs) FILTER (WHERE recs>=50000 AND with_owner*100 < recs*5),
count(*) FILTER (WHERE recs>=50000 AND with_value*100 < recs*5),
sum(recs) FILTER (WHERE recs>=50000 AND with_value*100 < recs*5),
count(*) FILTER (WHERE recs>=50000 AND with_geometry=0),
sum(recs) FILTER (WHERE recs>=50000 AND with_geometry=0)
FROM clean;
-- the five California counties named in "Why it matters"
SELECT count(*), sum(parcel_count) AS records, sum(with_owner) AS owner_names
FROM public.parcel_coverage_summary
WHERE state_fips || right(county_fips,3) IN ('06037','06065','06059','06073','06085');
-- gazetteer population rank
SELECT county_fips, county_name, population
FROM propraven_loading_2026_05_tier1.usfs_wildfire_risk
ORDER BY population DESC NULLS LAST LIMIT 5;