@urbankitstudio/atlas 0.6.8 → 0.6.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -76,7 +76,7 @@ For single-address owner lookups in the browser, the free [Owner Lookup](https:/
76
76
 
77
77
  | Function | Returns |
78
78
  |---|---|
79
- | `listStates()` | `StateIndexEntry[]` — all 50 states + `populated` flag |
79
+ | `listStates()` | `StateIndexEntry[]` — all 50 states and DC + `populated` flag |
80
80
  | `findState(stateSlug)` | `StateFile \| undefined` |
81
81
  | `findCounty(stateSlug, countySlug)` | `CountyRecord \| undefined` |
82
82
  | `findCountyByFips(fips)` | `CountyRecord \| undefined` — match by 5-digit county FIPS |
@@ -134,9 +134,9 @@ Omit `?fips=` to get every tracked county in one call.
134
134
 
135
135
  ## Coverage today
136
136
 
137
- The atlas bundles **234 counties across all 50 US states** (246 verified endpoints), covering the largest counties in each. Call `listStates()` to enumerate the full set.
137
+ The atlas bundles **239 counties across all 50 US states and DC** (251 verified endpoints), covering the largest counties in each. Call `listStates()` to enumerate the full set.
138
138
 
139
- Every state has at least one county on record, and 228 of the 234 carry a verified endpoint. The other 6 have `hasPublicRest: false` and an empty `endpoints` array, with `notes` recording the reason and who to contact. Those reasons vary: a subscription-only regional GIS partner, a statewide server that requires an auth token, a state with no county-level parcel authority, a county viewer with no public query API, a county that does not publish owner names online. They ship rather than being omitted, so `findCounty()` still resolves them. **Check `hasPublicRest`** rather than assuming every county has an endpoint; `totals.countiesWithEndpoint` gives the queryable count directly.
139
+ Every state has at least one county on record, and 233 of the 239 carry a verified endpoint. The other 6 have `hasPublicRest: false` and an empty `endpoints` array, with `notes` recording the reason and who to contact. Those reasons vary: a subscription-only regional GIS partner, a statewide server that requires an auth token, a state with no county-level parcel authority, a county viewer with no public query API, a county that does not publish owner names online. They ship rather than being omitted, so `findCounty()` still resolves them. **Check `hasPublicRest`** rather than assuming every county has an endpoint; `totals.countiesWithEndpoint` gives the queryable count directly.
140
140
 
141
141
  Counties are added as their public REST endpoints are verified. Package versions bump when data refreshes — pin to a minor range (`^0.x`) to receive new counties without breaking changes.
142
142
 
package/data/alabama.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "stateSlug": "alabama",
3
3
  "stateName": "Alabama",
4
4
  "stateAbbrev": "AL",
5
- "lastUpdated": "2026-06-20",
5
+ "lastUpdated": "2026-10-03",
6
6
  "counties": [
7
7
  {
8
8
  "id": "al-shelby",
@@ -98,6 +98,48 @@
98
98
  "email": null
99
99
  },
100
100
  "notes": "Jefferson County AL (Birmingham, pop. 670,000; FIPS 01073) Basemap/Parcels layer. Data maintained by Jefferson County Tax Assessor Office and updated nightly. 76 fields in live schema as of 2026-06-27: OBJECTID, Unique_ID, PID, TAX_TOWNSH, ISP_SECTION, SEC, QSECTION, BLOCK, PARCEL, PARCELID, APP_PID, DISTRICT, ESN_NUM, ADDR_PSPR, Bldg_Number, Street_Name, Street_Type, Street_Dir, APARTMENT, ADDRAPT_PS, OWNERNAME, PROP_MAIL, CITYMAIL, ZIP_MAIL, STATE_Mail, Legal_Desc, Property_City, Property_State, NEIGHBOR_N, SUBDIV_NAME, ADDR_APR, ZIP, TotalMHValue, PrevParcelLand/Imp/Total, Water, Sewer, Gas, ACRES_APR, GIS_ACRES, Remarks, Name2, Plat_Book/Page (×2), NbhdCd, Ownership, Topography, RoadAcc, MaintDate, CITY, NbhName, PriMunCode, SecMunCode, PriAcreage, SecAcreage, LegalRemarks, ParcelNo, Division, RecordYear, SchDist, MapNumber, Sqft, FIREDEPTNAME, Cls, BLDG_IND, TAX_CODE, OBY_IND, AssdValue, Territory, FireFee_District. NOTE 2026-06-27: ZONING_BOE is no longer in the live schema (schema drift), removed from searchFields. OWNERNAME field returns padded fixed-width strings (trim on use). Note: distinct from Jefferson County CO (FIPS 08059) and Jefferson County KY (Louisville; FIPS 21111) already in atlas. Verified 2026-06-27: metadata 200, query 200, 410K+ parcels."
101
+ },
102
+ {
103
+ "id": "al-mobile",
104
+ "state": "AL",
105
+ "stateName": "Alabama",
106
+ "stateSlug": "alabama",
107
+ "county": "Mobile",
108
+ "countySlug": "mobile-county",
109
+ "countyFips": "01097",
110
+ "hasPublicRest": true,
111
+ "endpoints": [
112
+ {
113
+ "url": "https://services8.arcgis.com/HND1NcQt6vgOGn1z/arcgis/rest/services/MCRC_Public_Parcels/FeatureServer/0",
114
+ "serviceType": "FeatureServer",
115
+ "layerIndex": 0,
116
+ "layerName": "MCRC_Public_Parcels",
117
+ "supportsQuery": true,
118
+ "corsEnabled": true,
119
+ "searchFields": [
120
+ { "name": "Name1", "label": "Owner Name 1", "searchable": true },
121
+ { "name": "Name2", "label": "Owner Name 2", "searchable": true },
122
+ { "name": "Parcel_Number", "label": "Parcel ID", "searchable": true },
123
+ { "name": "Account_Number", "label": "Account Number", "searchable": true },
124
+ { "name": "PropAddr1", "label": "Site Address", "searchable": true },
125
+ { "name": "PropCity", "label": "Site City", "searchable": true },
126
+ { "name": "PropZip", "label": "Site ZIP", "searchable": false },
127
+ { "name": "Acreage", "label": "Acres", "searchable": false }
128
+ ],
129
+ "sampleQuery": "https://services8.arcgis.com/HND1NcQt6vgOGn1z/arcgis/rest/services/MCRC_Public_Parcels/FeatureServer/0/query?where=UPPER(Name1)%20LIKE%20%27SMITH%25%27&outFields=*&returnGeometry=false&resultRecordCount=10&f=json",
130
+ "license": "unknown",
131
+ "licenseUrl": "https://www.arcgis.com/home/item.html?id=07c93ca64bbf4fb8a8d49b7ea80ef067",
132
+ "status": "live",
133
+ "lastVerified": "2026-10-03",
134
+ "verifiedBy": "manual"
135
+ }
136
+ ],
137
+ "contact": {
138
+ "department": "Mapping Department, Mobile County Revenue Commission",
139
+ "url": null,
140
+ "email": null
141
+ },
142
+ "notes": "Mobile County, Alabama (Mobile; FIPS 01097) publishes its parcels as the 'Mobile County Alabama Tax Parcels' FeatureServer, authored by the Mobile County Revenue Commission's Mapping Department and updated 2026-09-22. 214,040 parcels, countywide. The owner is in Name1 (and Name2), the parcel id in Parcel_Number (ParcelNo is the formatted form), and the site address in PropAddr1 with PropCity and PropZip. The layer has NO owner mailing-address fields (its columns are OBJECTID, Parcel_Number, Account_Number, ParcelNo, Name1, Name2, PropAddr1, PropAddr2, PropCity, PropState, PropZip, Acreage, Sqft, KeyNum), so it serves owner names and site addresses, not mailing addresses. String fields are heavily space padded (Name1 is 255 wide), so trim them and search with UPPER(Name1) LIKE 'SMITH%', never equality. The spatial reference is wkid 102630, so send outSR=4326 if you need longitude and latitude. CORS answers Access-Control-Allow-Origin *. No open-data license is stated; the item carries only an informational-use disclaimer. Verified live 2026-10-03: owner SMITH returned rows (first owner SMITH BONNIE G, 0104430000006.000, 20240 HIGHWAY 43, Mount Vernon)."
101
143
  }
102
144
  ]
103
145
  }
@@ -0,0 +1,52 @@
1
+ {
2
+ "stateSlug": "district-of-columbia",
3
+ "stateName": "District of Columbia",
4
+ "stateAbbrev": "DC",
5
+ "lastUpdated": "2026-09-26",
6
+ "counties": [
7
+ {
8
+ "id": "dc-district-of-columbia",
9
+ "state": "DC",
10
+ "stateName": "District of Columbia",
11
+ "stateSlug": "district-of-columbia",
12
+ "county": "District of Columbia",
13
+ "countySlug": "district-of-columbia",
14
+ "countyFips": "11001",
15
+ "hasPublicRest": true,
16
+ "endpoints": [
17
+ {
18
+ "url": "https://maps2.dcgis.dc.gov/dcgis/rest/services/DCGIS_DATA/Property_and_Land_WebMercator/FeatureServer/40",
19
+ "serviceType": "FeatureServer",
20
+ "layerIndex": 40,
21
+ "layerName": "Owner Polygons (Common Ownership Layer)",
22
+ "supportsQuery": true,
23
+ "corsEnabled": true,
24
+ "searchFields": [
25
+ { "name": "SSL", "label": "Square, Suffix, Lot (Parcel ID)", "searchable": true },
26
+ { "name": "OWNERNAME", "label": "Owner Name", "searchable": true },
27
+ { "name": "CAREOFNAME", "label": "Care Of Name", "searchable": false },
28
+ { "name": "PREMISEADD", "label": "Premise (Situs) Address", "searchable": true },
29
+ { "name": "ADDRESS1", "label": "Owner Mailing Address", "searchable": true },
30
+ { "name": "ADDRESS2", "label": "Owner Mailing Address 2", "searchable": false },
31
+ { "name": "CITYSTZIP", "label": "Owner Mailing City/State/ZIP", "searchable": true },
32
+ { "name": "USECODE", "label": "Use Code", "searchable": false },
33
+ { "name": "LANDAREA", "label": "Land Area", "searchable": false },
34
+ { "name": "ASSESSMENT", "label": "Assessment", "searchable": false }
35
+ ],
36
+ "sampleQuery": "https://maps2.dcgis.dc.gov/dcgis/rest/services/DCGIS_DATA/Property_and_Land_WebMercator/FeatureServer/40/query?where=OWNERNAME%20LIKE%20'SMITH%25'&outFields=SSL,OWNERNAME,PREMISEADD,ADDRESS1,CITYSTZIP&returnGeometry=false&f=json&resultRecordCount=10",
37
+ "license": "open-data",
38
+ "licenseUrl": "https://creativecommons.org/licenses/by/4.0/",
39
+ "status": "live",
40
+ "lastVerified": "2026-09-26",
41
+ "verifiedBy": "manual"
42
+ }
43
+ ],
44
+ "contact": {
45
+ "department": "DC Office of the Chief Technology Officer (OCTO) GIS and Office of the Surveyor; data attributed daily from the Office of Tax and Revenue's Real Property Tax Administration (RPTA) Integrated Tax System Public Extract (ITSPE)",
46
+ "url": "https://opendata.dc.gov/datasets/DCGIS::common-ownership-lots",
47
+ "email": null
48
+ },
49
+ "notes": "The District of Columbia is one county-equivalent (FIPS 11001) with no counties inside it. Layer 40, Owner Polygons (Common Ownership Layer), is the District's general ownership layer: 137,400 lot polygons merged from the Record, Tax, Parcel, Reservation and Air Rights lot layers and regenerated daily from the Office of Tax and Revenue's Integrated Tax System Public Extract (ITSPE). Layers 49 (District Land) and 50 (Federal Land) on the same service are narrower views of it. The parcel ID is the SSL (square, suffix, lot), written either as 'SQUARE SUFFIX LOT' (e.g. '1929 7056') or as 'PAR NNNNNNNN' for Parcel-type lots; both answer an SSL LIKE prefix search. The owner mailing address (ADDRESS1, ADDRESS2, CITYSTZIP) is separate from the premise address (PREMISEADD). Verified 2026-09-26: OWNERNAME LIKE 'SMITH%' returns 939 lots, and a PREMISEADD search returns individual homeowners alongside institutions.\n\nCoverage: the layer maps land, one polygon per lot. A condominium building is a single lot on it, and 3,921 of its 4,142 condominium lots carry no owner name, so an owner search finds lot owners, not unit owners. The tax extract published on the same service lists 221,622 records; unit-level condominium data sits in separate tables there, which this layer does not join. The service's ArcGIS Online item (Common Ownership Lots, item 1f6708b1f3774306bef2fa81e612a725, owner DCGISopendata) licenses the data under Creative Commons Attribution 4.0 International, so reuse credits the District of Columbia; the District's open-data terms apply CC0 only where no other license is noted, and this item notes one. OTR's Real Property Public Extract is a different product: a bulk file restricted to mortgage companies."
50
+ }
51
+ ]
52
+ }
package/data/georgia.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "stateSlug": "georgia",
3
3
  "stateName": "Georgia",
4
4
  "stateAbbrev": "GA",
5
- "lastUpdated": "2026-08-25",
5
+ "lastUpdated": "2026-10-03",
6
6
  "counties": [
7
7
  {
8
8
  "id": "ga-fulton",
@@ -369,6 +369,51 @@
369
369
  "email": null
370
370
  },
371
371
  "notes": "Savannah and Chatham County, published by SAGIS. 125,326 parcels with owner names on 124,952 rows (99.7 percent), and the fullest field set in this batch: parcel id, two owner columns, a complete mailing address, a combined situs and split situs parts. IMPORTANT for maintenance: this service holds 28 year-versioned layers, 0 to 17 being Historic Parcels 1998 to 2015 and 18 to 27 being Parcel Digest 2016 to 2025. Layer 27 is the newest today. When SAGIS publishes Parcel Digest 2026 it will be layer 28 and this entry will silently go a year stale, so the layer index needs checking whenever this record is reverified."
372
+ },
373
+ {
374
+ "id": "ga-dougherty",
375
+ "state": "GA",
376
+ "stateName": "Georgia",
377
+ "stateSlug": "georgia",
378
+ "county": "Dougherty",
379
+ "countySlug": "dougherty-county",
380
+ "countyFips": "13095",
381
+ "hasPublicRest": true,
382
+ "endpoints": [
383
+ {
384
+ "url": "https://services6.arcgis.com/VKHi8CC6pMIyYUIs/arcgis/rest/services/Parcels_Public_View/FeatureServer/0",
385
+ "serviceType": "FeatureServer",
386
+ "layerIndex": 0,
387
+ "layerName": "Parcels",
388
+ "supportsQuery": true,
389
+ "corsEnabled": true,
390
+ "searchFields": [
391
+ { "name": "Name", "label": "Owner Name", "searchable": true },
392
+ { "name": "ParcelNum", "label": "Parcel ID", "searchable": true },
393
+ { "name": "Address", "label": "Site Address", "searchable": true },
394
+ { "name": "SiteCity", "label": "Site City", "searchable": true },
395
+ { "name": "SiteZip", "label": "Site ZIP", "searchable": false },
396
+ { "name": "MailAddress1", "label": "Owner Mailing Address", "searchable": true },
397
+ { "name": "MailCity", "label": "Owner Mailing City", "searchable": true },
398
+ { "name": "MailState", "label": "Owner Mailing State", "searchable": false },
399
+ { "name": "MailZip", "label": "Owner Mailing ZIP", "searchable": false },
400
+ { "name": "Jurisdiction", "label": "Jurisdiction (City or County)", "searchable": false },
401
+ { "name": "TotalAcerage", "label": "Acres", "searchable": false }
402
+ ],
403
+ "sampleQuery": "https://services6.arcgis.com/VKHi8CC6pMIyYUIs/arcgis/rest/services/Parcels_Public_View/FeatureServer/0/query?where=UPPER(Name)%20LIKE%20%27SMITH%25%27&outFields=*&returnGeometry=false&resultRecordCount=10&f=json",
404
+ "license": "unknown",
405
+ "licenseUrl": "https://www.arcgis.com/home/item.html?id=9729f520dfab47fab85484908994ef1f",
406
+ "status": "live",
407
+ "lastVerified": "2026-10-03",
408
+ "verifiedBy": "manual"
409
+ }
410
+ ],
411
+ "contact": {
412
+ "department": "Albany GIS (Albany-Dougherty Geographic Information System)",
413
+ "url": null,
414
+ "email": null
415
+ },
416
+ "notes": "Dougherty County, Georgia (county seat Albany) publishes its parcels as the 'Dougherty County Land Parcels Dataset' FeatureServer, maintained by Albany GIS, covering both the CITY and COUNTY jurisdictions (the Jurisdiction column says which). 38,007 parcels as of 2026-10-03. The owner is in Name, the parcel id in ParcelNum, the site address in Address (with SiteCity and SiteZip) and the owner mailing address in MailAddress1/MailCity/MailState/MailZip; MailAddress1 was empty on the first rows sampled. String fields are space padded to their full width, so trim them and search with UPPER(Name) LIKE 'SMITH%', never equality. The layer's spatial reference is wkid 102667 (latestWkid 2240), so send outSR=4326 if you need longitude and latitude. CORS answers Access-Control-Allow-Origin *. No open-data license is stated; the item carries only a disclaimer that Albany GIS makes every effort at accuracy and that all data is subject to change. A third-party count of 39,443 parcels is slightly higher than the layer's, so the public view may be a subset. Verified live 2026-10-03: owner SMITH returned rows (first owner SMITH SHIRLEY PEARL, 0000S/00003/03A, 2803 ELTON ST, Albany)."
372
417
  }
373
418
  ]
374
419
  }
package/data/index.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "version": "0.3.0",
3
- "lastUpdated": "2026-09-26",
3
+ "lastUpdated": "2026-10-03",
4
4
  "totals": {
5
- "states": 50,
6
- "counties": 234,
7
- "endpoints": 246,
8
- "countiesWithEndpoint": 228,
5
+ "states": 51,
6
+ "counties": 239,
7
+ "endpoints": 251,
8
+ "countiesWithEndpoint": 233,
9
9
  "countiesUnprobeable": 1
10
10
  },
11
11
  "states": [
@@ -13,8 +13,8 @@
13
13
  "slug": "alabama",
14
14
  "name": "Alabama",
15
15
  "abbrev": "AL",
16
- "countyCount": 2,
17
- "endpointCount": 2,
16
+ "countyCount": 3,
17
+ "endpointCount": 3,
18
18
  "populated": true
19
19
  },
20
20
  {
@@ -73,6 +73,14 @@
73
73
  "endpointCount": 1,
74
74
  "populated": true
75
75
  },
76
+ {
77
+ "slug": "district-of-columbia",
78
+ "name": "District of Columbia",
79
+ "abbrev": "DC",
80
+ "countyCount": 1,
81
+ "endpointCount": 1,
82
+ "populated": true
83
+ },
76
84
  {
77
85
  "slug": "florida",
78
86
  "name": "Florida",
@@ -85,8 +93,8 @@
85
93
  "slug": "georgia",
86
94
  "name": "Georgia",
87
95
  "abbrev": "GA",
88
- "countyCount": 5,
89
- "endpointCount": 5,
96
+ "countyCount": 6,
97
+ "endpointCount": 6,
90
98
  "populated": true
91
99
  },
92
100
  {
@@ -301,8 +309,8 @@
301
309
  "slug": "oregon",
302
310
  "name": "Oregon",
303
311
  "abbrev": "OR",
304
- "countyCount": 6,
305
- "endpointCount": 5,
312
+ "countyCount": 7,
313
+ "endpointCount": 6,
306
314
  "populated": true
307
315
  },
308
316
  {
@@ -381,8 +389,8 @@
381
389
  "slug": "washington",
382
390
  "name": "Washington",
383
391
  "abbrev": "WA",
384
- "countyCount": 4,
385
- "endpointCount": 4,
392
+ "countyCount": 5,
393
+ "endpointCount": 5,
386
394
  "populated": true
387
395
  },
388
396
  {
package/data/oregon.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "stateSlug": "oregon",
3
3
  "stateName": "Oregon",
4
4
  "stateAbbrev": "OR",
5
- "lastUpdated": "2026-09-26",
5
+ "lastUpdated": "2026-10-03",
6
6
  "counties": [
7
7
  {
8
8
  "id": "or-multnomah",
@@ -250,6 +250,51 @@
250
250
  "email": "gisquestions@clackamas.us"
251
251
  },
252
252
  "notes": "No public REST parcel layer with owner names was found for Clackamas County (county seat Oregon City) as of 2026-09-26. The county states that it does not publish property owner names online and directs owner-information requests to Assessment and Taxation, and its GIS shapefile downloads require accepting a data licensing agreement. No county-hosted ArcGIS REST catalog was found; the public tools, CMap and AscendWeb, are interactive viewers. Two statewide layers cover the county but neither can serve an owner search: the Oregon Department of Forestry's taxlot layer named 'Clackamas County' declares owner fields but has query disabled, and the Oregon Department of Transportation's taxlot layer is queryable but carries only map and taxlot numbers. Metro's regional RLIS 'Taxlots (Public)' dataset, per its listing, excludes ownership."
253
+ },
254
+ {
255
+ "id": "or-malheur",
256
+ "state": "OR",
257
+ "stateName": "Oregon",
258
+ "stateSlug": "oregon",
259
+ "county": "Malheur",
260
+ "countySlug": "malheur-county",
261
+ "countyFips": "41045",
262
+ "hasPublicRest": true,
263
+ "endpoints": [
264
+ {
265
+ "url": "https://services5.arcgis.com/ZfBm5CKxbEBYLP3J/arcgis/rest/services/County_GIS_Portal_WFL1/FeatureServer/16",
266
+ "serviceType": "FeatureServer",
267
+ "layerIndex": 16,
268
+ "layerName": "TL Jun2026",
269
+ "supportsQuery": true,
270
+ "corsEnabled": true,
271
+ "searchFields": [
272
+ { "name": "OWNERSNAME", "label": "Owner Name", "searchable": true },
273
+ { "name": "MapTaxlot", "label": "Map and Taxlot ID", "searchable": true },
274
+ { "name": "Taxlot", "label": "Taxlot", "searchable": false },
275
+ { "name": "SITUSADD", "label": "Site Address", "searchable": true },
276
+ { "name": "CITY", "label": "Site City", "searchable": true },
277
+ { "name": "ADD1", "label": "Owner Mailing Address Line 1", "searchable": true },
278
+ { "name": "ADD2", "label": "Owner Mailing Address Line 2", "searchable": false },
279
+ { "name": "CITYSTATE", "label": "Owner Mailing City and State", "searchable": true },
280
+ { "name": "ZIP", "label": "Owner Mailing ZIP", "searchable": false },
281
+ { "name": "ZONING", "label": "Zoning", "searchable": false },
282
+ { "name": "TOTACRE", "label": "Total Acres", "searchable": false }
283
+ ],
284
+ "sampleQuery": "https://services5.arcgis.com/ZfBm5CKxbEBYLP3J/arcgis/rest/services/County_GIS_Portal_WFL1/FeatureServer/16/query?where=UPPER(OWNERSNAME)%20LIKE%20'SMITH%25'&outFields=MapTaxlot,OWNERSNAME,ADD1,CITYSTATE,SITUSADD,CITY&returnGeometry=false&resultRecordCount=10&f=json",
285
+ "license": "unknown",
286
+ "licenseUrl": "https://www.malheurco.org/gis/",
287
+ "status": "live",
288
+ "lastVerified": "2026-10-03",
289
+ "verifiedBy": "manual"
290
+ }
291
+ ],
292
+ "contact": {
293
+ "department": "Malheur County GIS (GIS Specialist), 251 B St W #2, Vale, OR 97918, (541) 473-5574",
294
+ "url": "https://www.malheurco.org/gis/",
295
+ "email": null
296
+ },
297
+ "notes": "Malheur County, Oregon (county seat Vale) publishes its tax lots as a layer of the County_GIS_Portal_WFL1 FeatureServer, the data source of the county's public Malheur County Tax Lot Map experience (linked from malheurco.org/gis). 20,570 features as of 2026-10-03. The owner is OWNERSNAME, the parcel id MapTaxlot (for example 15S47E28B04702), the site address SITUSADD with CITY, and the owner mailing address ADD1/ADD2/CITYSTATE/ZIP. SITUSADD is sometimes a bare zero and ADD1 is often null. MAINTENANCE QUIRK: the layer name and index are month-stamped (currently layer 16, 'TL Jun2026'; the siblings are 'NonTL Jun2026' at 17 and Zoning_2026 at 25) and the county republishes monthly, so the name or index can change. When the liveness probe flags this record, re-resolve it: list the FeatureServer's layers, pick the one whose name starts with 'TL ' and which carries an OWNERSNAME field, then update layerIndex, layerName and the url. Do not hard-code 16 forever. Named outFields are accepted. CORS answers Access-Control-Allow-Origin *. The layer states no license; the county GIS page links a Data Licensing Agreement for bulk data. The statewide ODF layer for Malheur has an owner line but query disabled, and Malheur is not in the OWRD layer, so there is no usable fallback. Verified live 2026-10-03: owner SMITH returned rows (first owner SMITH, JAMIE LEE, 15S47E28B04702, Ontario)."
253
298
  }
254
299
  ]
255
300
  }
@@ -2,7 +2,7 @@
2
2
  "stateSlug": "washington",
3
3
  "stateName": "Washington",
4
4
  "stateAbbrev": "WA",
5
- "lastUpdated": "2026-06-06",
5
+ "lastUpdated": "2026-10-03",
6
6
  "counties": [
7
7
  {
8
8
  "id": "wa-king",
@@ -178,6 +178,52 @@
178
178
  "email": null
179
179
  },
180
180
  "notes": "45 fields confirmed including PARCEL_NO, ADDRESS1, ADDRESS2, CITY, STATE, ZIP, COUNTRY, SITUS_STRE, SITUS_CITY, SITUS_ZIP, SD_NAME, LEGAL_DESC, TOTAL_ACRES, BLDG_VALUE, LAND_VALUE, TOTAL_VALUE, ANNUAL_TAX, STATUS_IND, PROP_SUBTY, O_NEIGHBOR, PROP_TYPE, INSPCT_CYC, REGION, MULT_PARCL, SALE_DATE, SALE_PRICE, SALE_VRFY, USE_CODE, SIGMA_YEAR, TAXABLE, EXEMPT_TY, LOCAL_IND, TCA, CURR_USE, INCORP, YEAR_BUILT, EFF_YR_BUI, RES_QUAL, RES_COND, REC_VOLPAG, SECTTIE, PARENT, MapSource, GlobalID. Live query confirmed: PARCEL_NO LIKE '%21820%' returns Thurston County parcels with mailing address and value data. NOTE: Owner name is NOT on this public layer per WA State law; ADDRESS1/2 is the mailing address (generally owner's address). Data from ASCEND and SIGMA databases. Item ID: 4ca0091703b345f8a72f68a4d173d9be. maxRecordCount=1000."
181
+ },
182
+ {
183
+ "id": "wa-island",
184
+ "state": "WA",
185
+ "stateName": "Washington",
186
+ "stateSlug": "washington",
187
+ "county": "Island",
188
+ "countySlug": "island-county",
189
+ "countyFips": "53029",
190
+ "hasPublicRest": true,
191
+ "endpoints": [
192
+ {
193
+ "url": "https://maps.islandcountywa.gov/arcgis/rest/services/Geocortex/Base/MapServer/0",
194
+ "serviceType": "MapServer",
195
+ "layerIndex": 0,
196
+ "layerName": "Parcels",
197
+ "supportsQuery": true,
198
+ "corsEnabled": true,
199
+ "searchFields": [
200
+ { "name": "taxpayer", "label": "Owner Name (Taxpayer)", "searchable": true },
201
+ { "name": "ParcelNo", "label": "Parcel ID", "searchable": true },
202
+ { "name": "physical_addr", "label": "Site Address", "searchable": true },
203
+ { "name": "physical_addr_city", "label": "Site City", "searchable": true },
204
+ { "name": "physical_addr_zip", "label": "Site ZIP", "searchable": false },
205
+ { "name": "mailing_addr1", "label": "Owner Mailing Address Line 1", "searchable": true },
206
+ { "name": "mailing_addr2", "label": "Owner Mailing Address Line 2", "searchable": false },
207
+ { "name": "mailing_addr_city", "label": "Owner Mailing City", "searchable": true },
208
+ { "name": "mailing_addr_state", "label": "Owner Mailing State", "searchable": false },
209
+ { "name": "mailing_addr_zip", "label": "Owner Mailing ZIP", "searchable": false },
210
+ { "name": "property_land_use_code", "label": "Land Use Code", "searchable": false },
211
+ { "name": "legal_acreage", "label": "Legal Acreage", "searchable": false }
212
+ ],
213
+ "sampleQuery": "https://maps.islandcountywa.gov/arcgis/rest/services/Geocortex/Base/MapServer/0/query?where=UPPER(taxpayer)%20LIKE%20'SMITH%25'&outFields=ParcelNo,taxpayer,physical_addr,mailing_addr1&returnGeometry=false&resultRecordCount=10&f=json",
214
+ "license": "unknown",
215
+ "licenseUrl": "https://maps.islandcountywa.gov",
216
+ "status": "live",
217
+ "lastVerified": "2026-10-03",
218
+ "verifiedBy": "manual"
219
+ }
220
+ ],
221
+ "contact": {
222
+ "department": "Island County Assessor / GIS",
223
+ "url": "https://maps.islandcountywa.gov",
224
+ "email": null
225
+ },
226
+ "notes": "Island County, Washington (county seat Coupeville) serves its parcels from the Assessor's own ArcGIS Server, joined to the PACS assessor data and exported nightly per the service description. The owner field is called taxpayer, the parcel id ParcelNo (for example R03213-384-4950), the site address physical_addr with its city, state and ZIP parts, and the owner mailing address mailing_addr1 to mailing_addr3 with city, state and ZIP. ParcelNo and taxpayer values carry trailing spaces, so trim on display, and some parcels (vacant land) have a blank physical_addr. Named outFields are accepted. CORS reflects the request Origin and sends Access-Control-Allow-Credentials true, so it is not a wildcard. maxRecordCount is 60000. The layer's copyright text reads DO NOT USE AS LEGAL DOCUMENT and no license is stated. Two sibling services carry the same data and serve as fallbacks: SmartGov/Parcels MapServer and Auditor/BaseMap MapServer layer 0. The contact URL is the county map server root, which answered HTTP 200 on 2026-10-03; no separate Assessor contact page was retrieved. Verified live 2026-10-03: owner SMITH returned rows (first owner SMITH, COLIN, R13334-372-1430)."
181
227
  }
182
228
  ]
183
229
  }
package/dist/index.cjs CHANGED
@@ -15,12 +15,12 @@ var LIVE_STATUS_URL = "https://urbankitstudio.com/api/atlas/status";
15
15
  // data/index.json
16
16
  var data_default = {
17
17
  version: "0.3.0",
18
- lastUpdated: "2026-09-26",
18
+ lastUpdated: "2026-10-03",
19
19
  totals: {
20
- states: 50,
21
- counties: 234,
22
- endpoints: 246,
23
- countiesWithEndpoint: 228,
20
+ states: 51,
21
+ counties: 239,
22
+ endpoints: 251,
23
+ countiesWithEndpoint: 233,
24
24
  countiesUnprobeable: 1
25
25
  },
26
26
  states: [
@@ -28,8 +28,8 @@ var data_default = {
28
28
  slug: "alabama",
29
29
  name: "Alabama",
30
30
  abbrev: "AL",
31
- countyCount: 2,
32
- endpointCount: 2,
31
+ countyCount: 3,
32
+ endpointCount: 3,
33
33
  populated: true
34
34
  },
35
35
  {
@@ -88,6 +88,14 @@ var data_default = {
88
88
  endpointCount: 1,
89
89
  populated: true
90
90
  },
91
+ {
92
+ slug: "district-of-columbia",
93
+ name: "District of Columbia",
94
+ abbrev: "DC",
95
+ countyCount: 1,
96
+ endpointCount: 1,
97
+ populated: true
98
+ },
91
99
  {
92
100
  slug: "florida",
93
101
  name: "Florida",
@@ -100,8 +108,8 @@ var data_default = {
100
108
  slug: "georgia",
101
109
  name: "Georgia",
102
110
  abbrev: "GA",
103
- countyCount: 5,
104
- endpointCount: 5,
111
+ countyCount: 6,
112
+ endpointCount: 6,
105
113
  populated: true
106
114
  },
107
115
  {
@@ -316,8 +324,8 @@ var data_default = {
316
324
  slug: "oregon",
317
325
  name: "Oregon",
318
326
  abbrev: "OR",
319
- countyCount: 6,
320
- endpointCount: 5,
327
+ countyCount: 7,
328
+ endpointCount: 6,
321
329
  populated: true
322
330
  },
323
331
  {
@@ -396,8 +404,8 @@ var data_default = {
396
404
  slug: "washington",
397
405
  name: "Washington",
398
406
  abbrev: "WA",
399
- countyCount: 4,
400
- endpointCount: 4,
407
+ countyCount: 5,
408
+ endpointCount: 5,
401
409
  populated: true
402
410
  },
403
411
  {
@@ -432,7 +440,7 @@ var alabama_default = {
432
440
  stateSlug: "alabama",
433
441
  stateName: "Alabama",
434
442
  stateAbbrev: "AL",
435
- lastUpdated: "2026-06-20",
443
+ lastUpdated: "2026-10-03",
436
444
  counties: [
437
445
  {
438
446
  id: "al-shelby",
@@ -528,6 +536,48 @@ var alabama_default = {
528
536
  email: null
529
537
  },
530
538
  notes: "Jefferson County AL (Birmingham, pop. 670,000; FIPS 01073) Basemap/Parcels layer. Data maintained by Jefferson County Tax Assessor Office and updated nightly. 76 fields in live schema as of 2026-06-27: OBJECTID, Unique_ID, PID, TAX_TOWNSH, ISP_SECTION, SEC, QSECTION, BLOCK, PARCEL, PARCELID, APP_PID, DISTRICT, ESN_NUM, ADDR_PSPR, Bldg_Number, Street_Name, Street_Type, Street_Dir, APARTMENT, ADDRAPT_PS, OWNERNAME, PROP_MAIL, CITYMAIL, ZIP_MAIL, STATE_Mail, Legal_Desc, Property_City, Property_State, NEIGHBOR_N, SUBDIV_NAME, ADDR_APR, ZIP, TotalMHValue, PrevParcelLand/Imp/Total, Water, Sewer, Gas, ACRES_APR, GIS_ACRES, Remarks, Name2, Plat_Book/Page (\xD72), NbhdCd, Ownership, Topography, RoadAcc, MaintDate, CITY, NbhName, PriMunCode, SecMunCode, PriAcreage, SecAcreage, LegalRemarks, ParcelNo, Division, RecordYear, SchDist, MapNumber, Sqft, FIREDEPTNAME, Cls, BLDG_IND, TAX_CODE, OBY_IND, AssdValue, Territory, FireFee_District. NOTE 2026-06-27: ZONING_BOE is no longer in the live schema (schema drift), removed from searchFields. OWNERNAME field returns padded fixed-width strings (trim on use). Note: distinct from Jefferson County CO (FIPS 08059) and Jefferson County KY (Louisville; FIPS 21111) already in atlas. Verified 2026-06-27: metadata 200, query 200, 410K+ parcels."
539
+ },
540
+ {
541
+ id: "al-mobile",
542
+ state: "AL",
543
+ stateName: "Alabama",
544
+ stateSlug: "alabama",
545
+ county: "Mobile",
546
+ countySlug: "mobile-county",
547
+ countyFips: "01097",
548
+ hasPublicRest: true,
549
+ endpoints: [
550
+ {
551
+ url: "https://services8.arcgis.com/HND1NcQt6vgOGn1z/arcgis/rest/services/MCRC_Public_Parcels/FeatureServer/0",
552
+ serviceType: "FeatureServer",
553
+ layerIndex: 0,
554
+ layerName: "MCRC_Public_Parcels",
555
+ supportsQuery: true,
556
+ corsEnabled: true,
557
+ searchFields: [
558
+ { name: "Name1", label: "Owner Name 1", searchable: true },
559
+ { name: "Name2", label: "Owner Name 2", searchable: true },
560
+ { name: "Parcel_Number", label: "Parcel ID", searchable: true },
561
+ { name: "Account_Number", label: "Account Number", searchable: true },
562
+ { name: "PropAddr1", label: "Site Address", searchable: true },
563
+ { name: "PropCity", label: "Site City", searchable: true },
564
+ { name: "PropZip", label: "Site ZIP", searchable: false },
565
+ { name: "Acreage", label: "Acres", searchable: false }
566
+ ],
567
+ sampleQuery: "https://services8.arcgis.com/HND1NcQt6vgOGn1z/arcgis/rest/services/MCRC_Public_Parcels/FeatureServer/0/query?where=UPPER(Name1)%20LIKE%20%27SMITH%25%27&outFields=*&returnGeometry=false&resultRecordCount=10&f=json",
568
+ license: "unknown",
569
+ licenseUrl: "https://www.arcgis.com/home/item.html?id=07c93ca64bbf4fb8a8d49b7ea80ef067",
570
+ status: "live",
571
+ lastVerified: "2026-10-03",
572
+ verifiedBy: "manual"
573
+ }
574
+ ],
575
+ contact: {
576
+ department: "Mapping Department, Mobile County Revenue Commission",
577
+ url: null,
578
+ email: null
579
+ },
580
+ notes: "Mobile County, Alabama (Mobile; FIPS 01097) publishes its parcels as the 'Mobile County Alabama Tax Parcels' FeatureServer, authored by the Mobile County Revenue Commission's Mapping Department and updated 2026-09-22. 214,040 parcels, countywide. The owner is in Name1 (and Name2), the parcel id in Parcel_Number (ParcelNo is the formatted form), and the site address in PropAddr1 with PropCity and PropZip. The layer has NO owner mailing-address fields (its columns are OBJECTID, Parcel_Number, Account_Number, ParcelNo, Name1, Name2, PropAddr1, PropAddr2, PropCity, PropState, PropZip, Acreage, Sqft, KeyNum), so it serves owner names and site addresses, not mailing addresses. String fields are heavily space padded (Name1 is 255 wide), so trim them and search with UPPER(Name1) LIKE 'SMITH%', never equality. The spatial reference is wkid 102630, so send outSR=4326 if you need longitude and latitude. CORS answers Access-Control-Allow-Origin *. No open-data license is stated; the item carries only an informational-use disclaimer. Verified live 2026-10-03: owner SMITH returned rows (first owner SMITH BONNIE G, 0104430000006.000, 20240 HIGHWAY 43, Mount Vernon)."
531
581
  }
532
582
  ]
533
583
  };
@@ -3119,6 +3169,60 @@ var delaware_default = {
3119
3169
  ]
3120
3170
  };
3121
3171
 
3172
+ // data/district-of-columbia.json
3173
+ var district_of_columbia_default = {
3174
+ stateSlug: "district-of-columbia",
3175
+ stateName: "District of Columbia",
3176
+ stateAbbrev: "DC",
3177
+ lastUpdated: "2026-09-26",
3178
+ counties: [
3179
+ {
3180
+ id: "dc-district-of-columbia",
3181
+ state: "DC",
3182
+ stateName: "District of Columbia",
3183
+ stateSlug: "district-of-columbia",
3184
+ county: "District of Columbia",
3185
+ countySlug: "district-of-columbia",
3186
+ countyFips: "11001",
3187
+ hasPublicRest: true,
3188
+ endpoints: [
3189
+ {
3190
+ url: "https://maps2.dcgis.dc.gov/dcgis/rest/services/DCGIS_DATA/Property_and_Land_WebMercator/FeatureServer/40",
3191
+ serviceType: "FeatureServer",
3192
+ layerIndex: 40,
3193
+ layerName: "Owner Polygons (Common Ownership Layer)",
3194
+ supportsQuery: true,
3195
+ corsEnabled: true,
3196
+ searchFields: [
3197
+ { name: "SSL", label: "Square, Suffix, Lot (Parcel ID)", searchable: true },
3198
+ { name: "OWNERNAME", label: "Owner Name", searchable: true },
3199
+ { name: "CAREOFNAME", label: "Care Of Name", searchable: false },
3200
+ { name: "PREMISEADD", label: "Premise (Situs) Address", searchable: true },
3201
+ { name: "ADDRESS1", label: "Owner Mailing Address", searchable: true },
3202
+ { name: "ADDRESS2", label: "Owner Mailing Address 2", searchable: false },
3203
+ { name: "CITYSTZIP", label: "Owner Mailing City/State/ZIP", searchable: true },
3204
+ { name: "USECODE", label: "Use Code", searchable: false },
3205
+ { name: "LANDAREA", label: "Land Area", searchable: false },
3206
+ { name: "ASSESSMENT", label: "Assessment", searchable: false }
3207
+ ],
3208
+ sampleQuery: "https://maps2.dcgis.dc.gov/dcgis/rest/services/DCGIS_DATA/Property_and_Land_WebMercator/FeatureServer/40/query?where=OWNERNAME%20LIKE%20'SMITH%25'&outFields=SSL,OWNERNAME,PREMISEADD,ADDRESS1,CITYSTZIP&returnGeometry=false&f=json&resultRecordCount=10",
3209
+ license: "open-data",
3210
+ licenseUrl: "https://creativecommons.org/licenses/by/4.0/",
3211
+ status: "live",
3212
+ lastVerified: "2026-09-26",
3213
+ verifiedBy: "manual"
3214
+ }
3215
+ ],
3216
+ contact: {
3217
+ department: "DC Office of the Chief Technology Officer (OCTO) GIS and Office of the Surveyor; data attributed daily from the Office of Tax and Revenue's Real Property Tax Administration (RPTA) Integrated Tax System Public Extract (ITSPE)",
3218
+ url: "https://opendata.dc.gov/datasets/DCGIS::common-ownership-lots",
3219
+ email: null
3220
+ },
3221
+ notes: "The District of Columbia is one county-equivalent (FIPS 11001) with no counties inside it. Layer 40, Owner Polygons (Common Ownership Layer), is the District's general ownership layer: 137,400 lot polygons merged from the Record, Tax, Parcel, Reservation and Air Rights lot layers and regenerated daily from the Office of Tax and Revenue's Integrated Tax System Public Extract (ITSPE). Layers 49 (District Land) and 50 (Federal Land) on the same service are narrower views of it. The parcel ID is the SSL (square, suffix, lot), written either as 'SQUARE SUFFIX LOT' (e.g. '1929 7056') or as 'PAR NNNNNNNN' for Parcel-type lots; both answer an SSL LIKE prefix search. The owner mailing address (ADDRESS1, ADDRESS2, CITYSTZIP) is separate from the premise address (PREMISEADD). Verified 2026-09-26: OWNERNAME LIKE 'SMITH%' returns 939 lots, and a PREMISEADD search returns individual homeowners alongside institutions.\n\nCoverage: the layer maps land, one polygon per lot. A condominium building is a single lot on it, and 3,921 of its 4,142 condominium lots carry no owner name, so an owner search finds lot owners, not unit owners. The tax extract published on the same service lists 221,622 records; unit-level condominium data sits in separate tables there, which this layer does not join. The service's ArcGIS Online item (Common Ownership Lots, item 1f6708b1f3774306bef2fa81e612a725, owner DCGISopendata) licenses the data under Creative Commons Attribution 4.0 International, so reuse credits the District of Columbia; the District's open-data terms apply CC0 only where no other license is noted, and this item notes one. OTR's Real Property Public Extract is a different product: a bulk file restricted to mortgage companies."
3222
+ }
3223
+ ]
3224
+ };
3225
+
3122
3226
  // data/florida.json
3123
3227
  var florida_default = {
3124
3228
  stateSlug: "florida",
@@ -12753,7 +12857,7 @@ var georgia_default = {
12753
12857
  stateSlug: "georgia",
12754
12858
  stateName: "Georgia",
12755
12859
  stateAbbrev: "GA",
12756
- lastUpdated: "2026-08-25",
12860
+ lastUpdated: "2026-10-03",
12757
12861
  counties: [
12758
12862
  {
12759
12863
  id: "ga-fulton",
@@ -13120,6 +13224,51 @@ var georgia_default = {
13120
13224
  email: null
13121
13225
  },
13122
13226
  notes: "Savannah and Chatham County, published by SAGIS. 125,326 parcels with owner names on 124,952 rows (99.7 percent), and the fullest field set in this batch: parcel id, two owner columns, a complete mailing address, a combined situs and split situs parts. IMPORTANT for maintenance: this service holds 28 year-versioned layers, 0 to 17 being Historic Parcels 1998 to 2015 and 18 to 27 being Parcel Digest 2016 to 2025. Layer 27 is the newest today. When SAGIS publishes Parcel Digest 2026 it will be layer 28 and this entry will silently go a year stale, so the layer index needs checking whenever this record is reverified."
13227
+ },
13228
+ {
13229
+ id: "ga-dougherty",
13230
+ state: "GA",
13231
+ stateName: "Georgia",
13232
+ stateSlug: "georgia",
13233
+ county: "Dougherty",
13234
+ countySlug: "dougherty-county",
13235
+ countyFips: "13095",
13236
+ hasPublicRest: true,
13237
+ endpoints: [
13238
+ {
13239
+ url: "https://services6.arcgis.com/VKHi8CC6pMIyYUIs/arcgis/rest/services/Parcels_Public_View/FeatureServer/0",
13240
+ serviceType: "FeatureServer",
13241
+ layerIndex: 0,
13242
+ layerName: "Parcels",
13243
+ supportsQuery: true,
13244
+ corsEnabled: true,
13245
+ searchFields: [
13246
+ { name: "Name", label: "Owner Name", searchable: true },
13247
+ { name: "ParcelNum", label: "Parcel ID", searchable: true },
13248
+ { name: "Address", label: "Site Address", searchable: true },
13249
+ { name: "SiteCity", label: "Site City", searchable: true },
13250
+ { name: "SiteZip", label: "Site ZIP", searchable: false },
13251
+ { name: "MailAddress1", label: "Owner Mailing Address", searchable: true },
13252
+ { name: "MailCity", label: "Owner Mailing City", searchable: true },
13253
+ { name: "MailState", label: "Owner Mailing State", searchable: false },
13254
+ { name: "MailZip", label: "Owner Mailing ZIP", searchable: false },
13255
+ { name: "Jurisdiction", label: "Jurisdiction (City or County)", searchable: false },
13256
+ { name: "TotalAcerage", label: "Acres", searchable: false }
13257
+ ],
13258
+ sampleQuery: "https://services6.arcgis.com/VKHi8CC6pMIyYUIs/arcgis/rest/services/Parcels_Public_View/FeatureServer/0/query?where=UPPER(Name)%20LIKE%20%27SMITH%25%27&outFields=*&returnGeometry=false&resultRecordCount=10&f=json",
13259
+ license: "unknown",
13260
+ licenseUrl: "https://www.arcgis.com/home/item.html?id=9729f520dfab47fab85484908994ef1f",
13261
+ status: "live",
13262
+ lastVerified: "2026-10-03",
13263
+ verifiedBy: "manual"
13264
+ }
13265
+ ],
13266
+ contact: {
13267
+ department: "Albany GIS (Albany-Dougherty Geographic Information System)",
13268
+ url: null,
13269
+ email: null
13270
+ },
13271
+ notes: "Dougherty County, Georgia (county seat Albany) publishes its parcels as the 'Dougherty County Land Parcels Dataset' FeatureServer, maintained by Albany GIS, covering both the CITY and COUNTY jurisdictions (the Jurisdiction column says which). 38,007 parcels as of 2026-10-03. The owner is in Name, the parcel id in ParcelNum, the site address in Address (with SiteCity and SiteZip) and the owner mailing address in MailAddress1/MailCity/MailState/MailZip; MailAddress1 was empty on the first rows sampled. String fields are space padded to their full width, so trim them and search with UPPER(Name) LIKE 'SMITH%', never equality. The layer's spatial reference is wkid 102667 (latestWkid 2240), so send outSR=4326 if you need longitude and latitude. CORS answers Access-Control-Allow-Origin *. No open-data license is stated; the item carries only a disclaimer that Albany GIS makes every effort at accuracy and that all data is subject to change. A third-party count of 39,443 parcels is slightly higher than the layer's, so the public view may be a subset. Verified live 2026-10-03: owner SMITH returned rows (first owner SMITH SHIRLEY PEARL, 0000S/00003/03A, 2803 ELTON ST, Albany)."
13123
13272
  }
13124
13273
  ]
13125
13274
  };
@@ -19307,7 +19456,7 @@ var oregon_default = {
19307
19456
  stateSlug: "oregon",
19308
19457
  stateName: "Oregon",
19309
19458
  stateAbbrev: "OR",
19310
- lastUpdated: "2026-09-26",
19459
+ lastUpdated: "2026-10-03",
19311
19460
  counties: [
19312
19461
  {
19313
19462
  id: "or-multnomah",
@@ -19555,6 +19704,51 @@ var oregon_default = {
19555
19704
  email: "gisquestions@clackamas.us"
19556
19705
  },
19557
19706
  notes: "No public REST parcel layer with owner names was found for Clackamas County (county seat Oregon City) as of 2026-09-26. The county states that it does not publish property owner names online and directs owner-information requests to Assessment and Taxation, and its GIS shapefile downloads require accepting a data licensing agreement. No county-hosted ArcGIS REST catalog was found; the public tools, CMap and AscendWeb, are interactive viewers. Two statewide layers cover the county but neither can serve an owner search: the Oregon Department of Forestry's taxlot layer named 'Clackamas County' declares owner fields but has query disabled, and the Oregon Department of Transportation's taxlot layer is queryable but carries only map and taxlot numbers. Metro's regional RLIS 'Taxlots (Public)' dataset, per its listing, excludes ownership."
19707
+ },
19708
+ {
19709
+ id: "or-malheur",
19710
+ state: "OR",
19711
+ stateName: "Oregon",
19712
+ stateSlug: "oregon",
19713
+ county: "Malheur",
19714
+ countySlug: "malheur-county",
19715
+ countyFips: "41045",
19716
+ hasPublicRest: true,
19717
+ endpoints: [
19718
+ {
19719
+ url: "https://services5.arcgis.com/ZfBm5CKxbEBYLP3J/arcgis/rest/services/County_GIS_Portal_WFL1/FeatureServer/16",
19720
+ serviceType: "FeatureServer",
19721
+ layerIndex: 16,
19722
+ layerName: "TL Jun2026",
19723
+ supportsQuery: true,
19724
+ corsEnabled: true,
19725
+ searchFields: [
19726
+ { name: "OWNERSNAME", label: "Owner Name", searchable: true },
19727
+ { name: "MapTaxlot", label: "Map and Taxlot ID", searchable: true },
19728
+ { name: "Taxlot", label: "Taxlot", searchable: false },
19729
+ { name: "SITUSADD", label: "Site Address", searchable: true },
19730
+ { name: "CITY", label: "Site City", searchable: true },
19731
+ { name: "ADD1", label: "Owner Mailing Address Line 1", searchable: true },
19732
+ { name: "ADD2", label: "Owner Mailing Address Line 2", searchable: false },
19733
+ { name: "CITYSTATE", label: "Owner Mailing City and State", searchable: true },
19734
+ { name: "ZIP", label: "Owner Mailing ZIP", searchable: false },
19735
+ { name: "ZONING", label: "Zoning", searchable: false },
19736
+ { name: "TOTACRE", label: "Total Acres", searchable: false }
19737
+ ],
19738
+ sampleQuery: "https://services5.arcgis.com/ZfBm5CKxbEBYLP3J/arcgis/rest/services/County_GIS_Portal_WFL1/FeatureServer/16/query?where=UPPER(OWNERSNAME)%20LIKE%20'SMITH%25'&outFields=MapTaxlot,OWNERSNAME,ADD1,CITYSTATE,SITUSADD,CITY&returnGeometry=false&resultRecordCount=10&f=json",
19739
+ license: "unknown",
19740
+ licenseUrl: "https://www.malheurco.org/gis/",
19741
+ status: "live",
19742
+ lastVerified: "2026-10-03",
19743
+ verifiedBy: "manual"
19744
+ }
19745
+ ],
19746
+ contact: {
19747
+ department: "Malheur County GIS (GIS Specialist), 251 B St W #2, Vale, OR 97918, (541) 473-5574",
19748
+ url: "https://www.malheurco.org/gis/",
19749
+ email: null
19750
+ },
19751
+ notes: "Malheur County, Oregon (county seat Vale) publishes its tax lots as a layer of the County_GIS_Portal_WFL1 FeatureServer, the data source of the county's public Malheur County Tax Lot Map experience (linked from malheurco.org/gis). 20,570 features as of 2026-10-03. The owner is OWNERSNAME, the parcel id MapTaxlot (for example 15S47E28B04702), the site address SITUSADD with CITY, and the owner mailing address ADD1/ADD2/CITYSTATE/ZIP. SITUSADD is sometimes a bare zero and ADD1 is often null. MAINTENANCE QUIRK: the layer name and index are month-stamped (currently layer 16, 'TL Jun2026'; the siblings are 'NonTL Jun2026' at 17 and Zoning_2026 at 25) and the county republishes monthly, so the name or index can change. When the liveness probe flags this record, re-resolve it: list the FeatureServer's layers, pick the one whose name starts with 'TL ' and which carries an OWNERSNAME field, then update layerIndex, layerName and the url. Do not hard-code 16 forever. Named outFields are accepted. CORS answers Access-Control-Allow-Origin *. The layer states no license; the county GIS page links a Data Licensing Agreement for bulk data. The statewide ODF layer for Malheur has an owner line but query disabled, and Malheur is not in the OWRD layer, so there is no usable fallback. Verified live 2026-10-03: owner SMITH returned rows (first owner SMITH, JAMIE LEE, 15S47E28B04702, Ontario)."
19558
19752
  }
19559
19753
  ]
19560
19754
  };
@@ -20953,7 +21147,7 @@ var washington_default = {
20953
21147
  stateSlug: "washington",
20954
21148
  stateName: "Washington",
20955
21149
  stateAbbrev: "WA",
20956
- lastUpdated: "2026-06-06",
21150
+ lastUpdated: "2026-10-03",
20957
21151
  counties: [
20958
21152
  {
20959
21153
  id: "wa-king",
@@ -21129,6 +21323,52 @@ var washington_default = {
21129
21323
  email: null
21130
21324
  },
21131
21325
  notes: "45 fields confirmed including PARCEL_NO, ADDRESS1, ADDRESS2, CITY, STATE, ZIP, COUNTRY, SITUS_STRE, SITUS_CITY, SITUS_ZIP, SD_NAME, LEGAL_DESC, TOTAL_ACRES, BLDG_VALUE, LAND_VALUE, TOTAL_VALUE, ANNUAL_TAX, STATUS_IND, PROP_SUBTY, O_NEIGHBOR, PROP_TYPE, INSPCT_CYC, REGION, MULT_PARCL, SALE_DATE, SALE_PRICE, SALE_VRFY, USE_CODE, SIGMA_YEAR, TAXABLE, EXEMPT_TY, LOCAL_IND, TCA, CURR_USE, INCORP, YEAR_BUILT, EFF_YR_BUI, RES_QUAL, RES_COND, REC_VOLPAG, SECTTIE, PARENT, MapSource, GlobalID. Live query confirmed: PARCEL_NO LIKE '%21820%' returns Thurston County parcels with mailing address and value data. NOTE: Owner name is NOT on this public layer per WA State law; ADDRESS1/2 is the mailing address (generally owner's address). Data from ASCEND and SIGMA databases. Item ID: 4ca0091703b345f8a72f68a4d173d9be. maxRecordCount=1000."
21326
+ },
21327
+ {
21328
+ id: "wa-island",
21329
+ state: "WA",
21330
+ stateName: "Washington",
21331
+ stateSlug: "washington",
21332
+ county: "Island",
21333
+ countySlug: "island-county",
21334
+ countyFips: "53029",
21335
+ hasPublicRest: true,
21336
+ endpoints: [
21337
+ {
21338
+ url: "https://maps.islandcountywa.gov/arcgis/rest/services/Geocortex/Base/MapServer/0",
21339
+ serviceType: "MapServer",
21340
+ layerIndex: 0,
21341
+ layerName: "Parcels",
21342
+ supportsQuery: true,
21343
+ corsEnabled: true,
21344
+ searchFields: [
21345
+ { name: "taxpayer", label: "Owner Name (Taxpayer)", searchable: true },
21346
+ { name: "ParcelNo", label: "Parcel ID", searchable: true },
21347
+ { name: "physical_addr", label: "Site Address", searchable: true },
21348
+ { name: "physical_addr_city", label: "Site City", searchable: true },
21349
+ { name: "physical_addr_zip", label: "Site ZIP", searchable: false },
21350
+ { name: "mailing_addr1", label: "Owner Mailing Address Line 1", searchable: true },
21351
+ { name: "mailing_addr2", label: "Owner Mailing Address Line 2", searchable: false },
21352
+ { name: "mailing_addr_city", label: "Owner Mailing City", searchable: true },
21353
+ { name: "mailing_addr_state", label: "Owner Mailing State", searchable: false },
21354
+ { name: "mailing_addr_zip", label: "Owner Mailing ZIP", searchable: false },
21355
+ { name: "property_land_use_code", label: "Land Use Code", searchable: false },
21356
+ { name: "legal_acreage", label: "Legal Acreage", searchable: false }
21357
+ ],
21358
+ sampleQuery: "https://maps.islandcountywa.gov/arcgis/rest/services/Geocortex/Base/MapServer/0/query?where=UPPER(taxpayer)%20LIKE%20'SMITH%25'&outFields=ParcelNo,taxpayer,physical_addr,mailing_addr1&returnGeometry=false&resultRecordCount=10&f=json",
21359
+ license: "unknown",
21360
+ licenseUrl: "https://maps.islandcountywa.gov",
21361
+ status: "live",
21362
+ lastVerified: "2026-10-03",
21363
+ verifiedBy: "manual"
21364
+ }
21365
+ ],
21366
+ contact: {
21367
+ department: "Island County Assessor / GIS",
21368
+ url: "https://maps.islandcountywa.gov",
21369
+ email: null
21370
+ },
21371
+ notes: "Island County, Washington (county seat Coupeville) serves its parcels from the Assessor's own ArcGIS Server, joined to the PACS assessor data and exported nightly per the service description. The owner field is called taxpayer, the parcel id ParcelNo (for example R03213-384-4950), the site address physical_addr with its city, state and ZIP parts, and the owner mailing address mailing_addr1 to mailing_addr3 with city, state and ZIP. ParcelNo and taxpayer values carry trailing spaces, so trim on display, and some parcels (vacant land) have a blank physical_addr. Named outFields are accepted. CORS reflects the request Origin and sends Access-Control-Allow-Credentials true, so it is not a wildcard. maxRecordCount is 60000. The layer's copyright text reads DO NOT USE AS LEGAL DOCUMENT and no license is stated. Two sibling services carry the same data and serve as fallbacks: SmartGov/Parcels MapServer and Auditor/BaseMap MapServer layer 0. The contact URL is the county map server root, which answered HTTP 200 on 2026-10-03; no separate Assessor contact page was retrieved. Verified live 2026-10-03: owner SMITH returned rows (first owner SMITH, COLIN, R13334-372-1430)."
21132
21372
  }
21133
21373
  ]
21134
21374
  };
@@ -21880,6 +22120,7 @@ var POPULATED_STATES = {
21880
22120
  colorado: colorado_default,
21881
22121
  connecticut: connecticut_default,
21882
22122
  delaware: delaware_default,
22123
+ "district-of-columbia": district_of_columbia_default,
21883
22124
  florida: florida_default,
21884
22125
  georgia: georgia_default,
21885
22126
  hawaii: hawaii_default,
@@ -21969,10 +22210,10 @@ function listCountiesByState(stateSlug) {
21969
22210
  function slugify(s) {
21970
22211
  return s.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
21971
22212
  }
22213
+ var COUNTY_UNIT_SUFFIX = /\b(?:County|Parish|Borough|Municipality|Census Area|City|Statewide|Planning Region|District of Columbia)$/i;
21972
22214
  function countySlugFromName(county) {
21973
- const lc = county.toLowerCase();
21974
- const hasSuffix = lc.endsWith(" county") || lc.endsWith(" parish") || lc.endsWith(" borough") || lc.endsWith(" census area");
21975
- return slugify(hasSuffix ? county : `${county} County`);
22215
+ const name = county.trim();
22216
+ return slugify(COUNTY_UNIT_SUFFIX.test(name) ? name : `${name} County`);
21976
22217
  }
21977
22218
  function buildParcelLookupDeepLink(endpoint, base = "https://urbankitstudio.com/tools/parcel-lookup") {
21978
22219
  const params = new URLSearchParams();
package/dist/index.d.cts CHANGED
@@ -218,8 +218,9 @@ declare function findCountyByFips(fips: string): CountyRecord | undefined;
218
218
  declare function findState(stateSlug: string): StateFile | undefined;
219
219
 
220
220
  /**
221
- * List all 50 US states from the atlas index, including those without
222
- * populated county data yet (use the `populated` flag to filter).
221
+ * List all 50 US states and the District of Columbia from the atlas index,
222
+ * including those without populated county data yet (use the `populated` flag
223
+ * to filter).
223
224
  */
224
225
  declare function listStates(): StateIndexEntry[];
225
226
 
package/dist/index.d.ts CHANGED
@@ -218,8 +218,9 @@ declare function findCountyByFips(fips: string): CountyRecord | undefined;
218
218
  declare function findState(stateSlug: string): StateFile | undefined;
219
219
 
220
220
  /**
221
- * List all 50 US states from the atlas index, including those without
222
- * populated county data yet (use the `populated` flag to filter).
221
+ * List all 50 US states and the District of Columbia from the atlas index,
222
+ * including those without populated county data yet (use the `populated` flag
223
+ * to filter).
223
224
  */
224
225
  declare function listStates(): StateIndexEntry[];
225
226
 
package/dist/index.js CHANGED
@@ -13,12 +13,12 @@ var LIVE_STATUS_URL = "https://urbankitstudio.com/api/atlas/status";
13
13
  // data/index.json
14
14
  var data_default = {
15
15
  version: "0.3.0",
16
- lastUpdated: "2026-09-26",
16
+ lastUpdated: "2026-10-03",
17
17
  totals: {
18
- states: 50,
19
- counties: 234,
20
- endpoints: 246,
21
- countiesWithEndpoint: 228,
18
+ states: 51,
19
+ counties: 239,
20
+ endpoints: 251,
21
+ countiesWithEndpoint: 233,
22
22
  countiesUnprobeable: 1
23
23
  },
24
24
  states: [
@@ -26,8 +26,8 @@ var data_default = {
26
26
  slug: "alabama",
27
27
  name: "Alabama",
28
28
  abbrev: "AL",
29
- countyCount: 2,
30
- endpointCount: 2,
29
+ countyCount: 3,
30
+ endpointCount: 3,
31
31
  populated: true
32
32
  },
33
33
  {
@@ -86,6 +86,14 @@ var data_default = {
86
86
  endpointCount: 1,
87
87
  populated: true
88
88
  },
89
+ {
90
+ slug: "district-of-columbia",
91
+ name: "District of Columbia",
92
+ abbrev: "DC",
93
+ countyCount: 1,
94
+ endpointCount: 1,
95
+ populated: true
96
+ },
89
97
  {
90
98
  slug: "florida",
91
99
  name: "Florida",
@@ -98,8 +106,8 @@ var data_default = {
98
106
  slug: "georgia",
99
107
  name: "Georgia",
100
108
  abbrev: "GA",
101
- countyCount: 5,
102
- endpointCount: 5,
109
+ countyCount: 6,
110
+ endpointCount: 6,
103
111
  populated: true
104
112
  },
105
113
  {
@@ -314,8 +322,8 @@ var data_default = {
314
322
  slug: "oregon",
315
323
  name: "Oregon",
316
324
  abbrev: "OR",
317
- countyCount: 6,
318
- endpointCount: 5,
325
+ countyCount: 7,
326
+ endpointCount: 6,
319
327
  populated: true
320
328
  },
321
329
  {
@@ -394,8 +402,8 @@ var data_default = {
394
402
  slug: "washington",
395
403
  name: "Washington",
396
404
  abbrev: "WA",
397
- countyCount: 4,
398
- endpointCount: 4,
405
+ countyCount: 5,
406
+ endpointCount: 5,
399
407
  populated: true
400
408
  },
401
409
  {
@@ -430,7 +438,7 @@ var alabama_default = {
430
438
  stateSlug: "alabama",
431
439
  stateName: "Alabama",
432
440
  stateAbbrev: "AL",
433
- lastUpdated: "2026-06-20",
441
+ lastUpdated: "2026-10-03",
434
442
  counties: [
435
443
  {
436
444
  id: "al-shelby",
@@ -526,6 +534,48 @@ var alabama_default = {
526
534
  email: null
527
535
  },
528
536
  notes: "Jefferson County AL (Birmingham, pop. 670,000; FIPS 01073) Basemap/Parcels layer. Data maintained by Jefferson County Tax Assessor Office and updated nightly. 76 fields in live schema as of 2026-06-27: OBJECTID, Unique_ID, PID, TAX_TOWNSH, ISP_SECTION, SEC, QSECTION, BLOCK, PARCEL, PARCELID, APP_PID, DISTRICT, ESN_NUM, ADDR_PSPR, Bldg_Number, Street_Name, Street_Type, Street_Dir, APARTMENT, ADDRAPT_PS, OWNERNAME, PROP_MAIL, CITYMAIL, ZIP_MAIL, STATE_Mail, Legal_Desc, Property_City, Property_State, NEIGHBOR_N, SUBDIV_NAME, ADDR_APR, ZIP, TotalMHValue, PrevParcelLand/Imp/Total, Water, Sewer, Gas, ACRES_APR, GIS_ACRES, Remarks, Name2, Plat_Book/Page (\xD72), NbhdCd, Ownership, Topography, RoadAcc, MaintDate, CITY, NbhName, PriMunCode, SecMunCode, PriAcreage, SecAcreage, LegalRemarks, ParcelNo, Division, RecordYear, SchDist, MapNumber, Sqft, FIREDEPTNAME, Cls, BLDG_IND, TAX_CODE, OBY_IND, AssdValue, Territory, FireFee_District. NOTE 2026-06-27: ZONING_BOE is no longer in the live schema (schema drift), removed from searchFields. OWNERNAME field returns padded fixed-width strings (trim on use). Note: distinct from Jefferson County CO (FIPS 08059) and Jefferson County KY (Louisville; FIPS 21111) already in atlas. Verified 2026-06-27: metadata 200, query 200, 410K+ parcels."
537
+ },
538
+ {
539
+ id: "al-mobile",
540
+ state: "AL",
541
+ stateName: "Alabama",
542
+ stateSlug: "alabama",
543
+ county: "Mobile",
544
+ countySlug: "mobile-county",
545
+ countyFips: "01097",
546
+ hasPublicRest: true,
547
+ endpoints: [
548
+ {
549
+ url: "https://services8.arcgis.com/HND1NcQt6vgOGn1z/arcgis/rest/services/MCRC_Public_Parcels/FeatureServer/0",
550
+ serviceType: "FeatureServer",
551
+ layerIndex: 0,
552
+ layerName: "MCRC_Public_Parcels",
553
+ supportsQuery: true,
554
+ corsEnabled: true,
555
+ searchFields: [
556
+ { name: "Name1", label: "Owner Name 1", searchable: true },
557
+ { name: "Name2", label: "Owner Name 2", searchable: true },
558
+ { name: "Parcel_Number", label: "Parcel ID", searchable: true },
559
+ { name: "Account_Number", label: "Account Number", searchable: true },
560
+ { name: "PropAddr1", label: "Site Address", searchable: true },
561
+ { name: "PropCity", label: "Site City", searchable: true },
562
+ { name: "PropZip", label: "Site ZIP", searchable: false },
563
+ { name: "Acreage", label: "Acres", searchable: false }
564
+ ],
565
+ sampleQuery: "https://services8.arcgis.com/HND1NcQt6vgOGn1z/arcgis/rest/services/MCRC_Public_Parcels/FeatureServer/0/query?where=UPPER(Name1)%20LIKE%20%27SMITH%25%27&outFields=*&returnGeometry=false&resultRecordCount=10&f=json",
566
+ license: "unknown",
567
+ licenseUrl: "https://www.arcgis.com/home/item.html?id=07c93ca64bbf4fb8a8d49b7ea80ef067",
568
+ status: "live",
569
+ lastVerified: "2026-10-03",
570
+ verifiedBy: "manual"
571
+ }
572
+ ],
573
+ contact: {
574
+ department: "Mapping Department, Mobile County Revenue Commission",
575
+ url: null,
576
+ email: null
577
+ },
578
+ notes: "Mobile County, Alabama (Mobile; FIPS 01097) publishes its parcels as the 'Mobile County Alabama Tax Parcels' FeatureServer, authored by the Mobile County Revenue Commission's Mapping Department and updated 2026-09-22. 214,040 parcels, countywide. The owner is in Name1 (and Name2), the parcel id in Parcel_Number (ParcelNo is the formatted form), and the site address in PropAddr1 with PropCity and PropZip. The layer has NO owner mailing-address fields (its columns are OBJECTID, Parcel_Number, Account_Number, ParcelNo, Name1, Name2, PropAddr1, PropAddr2, PropCity, PropState, PropZip, Acreage, Sqft, KeyNum), so it serves owner names and site addresses, not mailing addresses. String fields are heavily space padded (Name1 is 255 wide), so trim them and search with UPPER(Name1) LIKE 'SMITH%', never equality. The spatial reference is wkid 102630, so send outSR=4326 if you need longitude and latitude. CORS answers Access-Control-Allow-Origin *. No open-data license is stated; the item carries only an informational-use disclaimer. Verified live 2026-10-03: owner SMITH returned rows (first owner SMITH BONNIE G, 0104430000006.000, 20240 HIGHWAY 43, Mount Vernon)."
529
579
  }
530
580
  ]
531
581
  };
@@ -3117,6 +3167,60 @@ var delaware_default = {
3117
3167
  ]
3118
3168
  };
3119
3169
 
3170
+ // data/district-of-columbia.json
3171
+ var district_of_columbia_default = {
3172
+ stateSlug: "district-of-columbia",
3173
+ stateName: "District of Columbia",
3174
+ stateAbbrev: "DC",
3175
+ lastUpdated: "2026-09-26",
3176
+ counties: [
3177
+ {
3178
+ id: "dc-district-of-columbia",
3179
+ state: "DC",
3180
+ stateName: "District of Columbia",
3181
+ stateSlug: "district-of-columbia",
3182
+ county: "District of Columbia",
3183
+ countySlug: "district-of-columbia",
3184
+ countyFips: "11001",
3185
+ hasPublicRest: true,
3186
+ endpoints: [
3187
+ {
3188
+ url: "https://maps2.dcgis.dc.gov/dcgis/rest/services/DCGIS_DATA/Property_and_Land_WebMercator/FeatureServer/40",
3189
+ serviceType: "FeatureServer",
3190
+ layerIndex: 40,
3191
+ layerName: "Owner Polygons (Common Ownership Layer)",
3192
+ supportsQuery: true,
3193
+ corsEnabled: true,
3194
+ searchFields: [
3195
+ { name: "SSL", label: "Square, Suffix, Lot (Parcel ID)", searchable: true },
3196
+ { name: "OWNERNAME", label: "Owner Name", searchable: true },
3197
+ { name: "CAREOFNAME", label: "Care Of Name", searchable: false },
3198
+ { name: "PREMISEADD", label: "Premise (Situs) Address", searchable: true },
3199
+ { name: "ADDRESS1", label: "Owner Mailing Address", searchable: true },
3200
+ { name: "ADDRESS2", label: "Owner Mailing Address 2", searchable: false },
3201
+ { name: "CITYSTZIP", label: "Owner Mailing City/State/ZIP", searchable: true },
3202
+ { name: "USECODE", label: "Use Code", searchable: false },
3203
+ { name: "LANDAREA", label: "Land Area", searchable: false },
3204
+ { name: "ASSESSMENT", label: "Assessment", searchable: false }
3205
+ ],
3206
+ sampleQuery: "https://maps2.dcgis.dc.gov/dcgis/rest/services/DCGIS_DATA/Property_and_Land_WebMercator/FeatureServer/40/query?where=OWNERNAME%20LIKE%20'SMITH%25'&outFields=SSL,OWNERNAME,PREMISEADD,ADDRESS1,CITYSTZIP&returnGeometry=false&f=json&resultRecordCount=10",
3207
+ license: "open-data",
3208
+ licenseUrl: "https://creativecommons.org/licenses/by/4.0/",
3209
+ status: "live",
3210
+ lastVerified: "2026-09-26",
3211
+ verifiedBy: "manual"
3212
+ }
3213
+ ],
3214
+ contact: {
3215
+ department: "DC Office of the Chief Technology Officer (OCTO) GIS and Office of the Surveyor; data attributed daily from the Office of Tax and Revenue's Real Property Tax Administration (RPTA) Integrated Tax System Public Extract (ITSPE)",
3216
+ url: "https://opendata.dc.gov/datasets/DCGIS::common-ownership-lots",
3217
+ email: null
3218
+ },
3219
+ notes: "The District of Columbia is one county-equivalent (FIPS 11001) with no counties inside it. Layer 40, Owner Polygons (Common Ownership Layer), is the District's general ownership layer: 137,400 lot polygons merged from the Record, Tax, Parcel, Reservation and Air Rights lot layers and regenerated daily from the Office of Tax and Revenue's Integrated Tax System Public Extract (ITSPE). Layers 49 (District Land) and 50 (Federal Land) on the same service are narrower views of it. The parcel ID is the SSL (square, suffix, lot), written either as 'SQUARE SUFFIX LOT' (e.g. '1929 7056') or as 'PAR NNNNNNNN' for Parcel-type lots; both answer an SSL LIKE prefix search. The owner mailing address (ADDRESS1, ADDRESS2, CITYSTZIP) is separate from the premise address (PREMISEADD). Verified 2026-09-26: OWNERNAME LIKE 'SMITH%' returns 939 lots, and a PREMISEADD search returns individual homeowners alongside institutions.\n\nCoverage: the layer maps land, one polygon per lot. A condominium building is a single lot on it, and 3,921 of its 4,142 condominium lots carry no owner name, so an owner search finds lot owners, not unit owners. The tax extract published on the same service lists 221,622 records; unit-level condominium data sits in separate tables there, which this layer does not join. The service's ArcGIS Online item (Common Ownership Lots, item 1f6708b1f3774306bef2fa81e612a725, owner DCGISopendata) licenses the data under Creative Commons Attribution 4.0 International, so reuse credits the District of Columbia; the District's open-data terms apply CC0 only where no other license is noted, and this item notes one. OTR's Real Property Public Extract is a different product: a bulk file restricted to mortgage companies."
3220
+ }
3221
+ ]
3222
+ };
3223
+
3120
3224
  // data/florida.json
3121
3225
  var florida_default = {
3122
3226
  stateSlug: "florida",
@@ -12751,7 +12855,7 @@ var georgia_default = {
12751
12855
  stateSlug: "georgia",
12752
12856
  stateName: "Georgia",
12753
12857
  stateAbbrev: "GA",
12754
- lastUpdated: "2026-08-25",
12858
+ lastUpdated: "2026-10-03",
12755
12859
  counties: [
12756
12860
  {
12757
12861
  id: "ga-fulton",
@@ -13118,6 +13222,51 @@ var georgia_default = {
13118
13222
  email: null
13119
13223
  },
13120
13224
  notes: "Savannah and Chatham County, published by SAGIS. 125,326 parcels with owner names on 124,952 rows (99.7 percent), and the fullest field set in this batch: parcel id, two owner columns, a complete mailing address, a combined situs and split situs parts. IMPORTANT for maintenance: this service holds 28 year-versioned layers, 0 to 17 being Historic Parcels 1998 to 2015 and 18 to 27 being Parcel Digest 2016 to 2025. Layer 27 is the newest today. When SAGIS publishes Parcel Digest 2026 it will be layer 28 and this entry will silently go a year stale, so the layer index needs checking whenever this record is reverified."
13225
+ },
13226
+ {
13227
+ id: "ga-dougherty",
13228
+ state: "GA",
13229
+ stateName: "Georgia",
13230
+ stateSlug: "georgia",
13231
+ county: "Dougherty",
13232
+ countySlug: "dougherty-county",
13233
+ countyFips: "13095",
13234
+ hasPublicRest: true,
13235
+ endpoints: [
13236
+ {
13237
+ url: "https://services6.arcgis.com/VKHi8CC6pMIyYUIs/arcgis/rest/services/Parcels_Public_View/FeatureServer/0",
13238
+ serviceType: "FeatureServer",
13239
+ layerIndex: 0,
13240
+ layerName: "Parcels",
13241
+ supportsQuery: true,
13242
+ corsEnabled: true,
13243
+ searchFields: [
13244
+ { name: "Name", label: "Owner Name", searchable: true },
13245
+ { name: "ParcelNum", label: "Parcel ID", searchable: true },
13246
+ { name: "Address", label: "Site Address", searchable: true },
13247
+ { name: "SiteCity", label: "Site City", searchable: true },
13248
+ { name: "SiteZip", label: "Site ZIP", searchable: false },
13249
+ { name: "MailAddress1", label: "Owner Mailing Address", searchable: true },
13250
+ { name: "MailCity", label: "Owner Mailing City", searchable: true },
13251
+ { name: "MailState", label: "Owner Mailing State", searchable: false },
13252
+ { name: "MailZip", label: "Owner Mailing ZIP", searchable: false },
13253
+ { name: "Jurisdiction", label: "Jurisdiction (City or County)", searchable: false },
13254
+ { name: "TotalAcerage", label: "Acres", searchable: false }
13255
+ ],
13256
+ sampleQuery: "https://services6.arcgis.com/VKHi8CC6pMIyYUIs/arcgis/rest/services/Parcels_Public_View/FeatureServer/0/query?where=UPPER(Name)%20LIKE%20%27SMITH%25%27&outFields=*&returnGeometry=false&resultRecordCount=10&f=json",
13257
+ license: "unknown",
13258
+ licenseUrl: "https://www.arcgis.com/home/item.html?id=9729f520dfab47fab85484908994ef1f",
13259
+ status: "live",
13260
+ lastVerified: "2026-10-03",
13261
+ verifiedBy: "manual"
13262
+ }
13263
+ ],
13264
+ contact: {
13265
+ department: "Albany GIS (Albany-Dougherty Geographic Information System)",
13266
+ url: null,
13267
+ email: null
13268
+ },
13269
+ notes: "Dougherty County, Georgia (county seat Albany) publishes its parcels as the 'Dougherty County Land Parcels Dataset' FeatureServer, maintained by Albany GIS, covering both the CITY and COUNTY jurisdictions (the Jurisdiction column says which). 38,007 parcels as of 2026-10-03. The owner is in Name, the parcel id in ParcelNum, the site address in Address (with SiteCity and SiteZip) and the owner mailing address in MailAddress1/MailCity/MailState/MailZip; MailAddress1 was empty on the first rows sampled. String fields are space padded to their full width, so trim them and search with UPPER(Name) LIKE 'SMITH%', never equality. The layer's spatial reference is wkid 102667 (latestWkid 2240), so send outSR=4326 if you need longitude and latitude. CORS answers Access-Control-Allow-Origin *. No open-data license is stated; the item carries only a disclaimer that Albany GIS makes every effort at accuracy and that all data is subject to change. A third-party count of 39,443 parcels is slightly higher than the layer's, so the public view may be a subset. Verified live 2026-10-03: owner SMITH returned rows (first owner SMITH SHIRLEY PEARL, 0000S/00003/03A, 2803 ELTON ST, Albany)."
13121
13270
  }
13122
13271
  ]
13123
13272
  };
@@ -19305,7 +19454,7 @@ var oregon_default = {
19305
19454
  stateSlug: "oregon",
19306
19455
  stateName: "Oregon",
19307
19456
  stateAbbrev: "OR",
19308
- lastUpdated: "2026-09-26",
19457
+ lastUpdated: "2026-10-03",
19309
19458
  counties: [
19310
19459
  {
19311
19460
  id: "or-multnomah",
@@ -19553,6 +19702,51 @@ var oregon_default = {
19553
19702
  email: "gisquestions@clackamas.us"
19554
19703
  },
19555
19704
  notes: "No public REST parcel layer with owner names was found for Clackamas County (county seat Oregon City) as of 2026-09-26. The county states that it does not publish property owner names online and directs owner-information requests to Assessment and Taxation, and its GIS shapefile downloads require accepting a data licensing agreement. No county-hosted ArcGIS REST catalog was found; the public tools, CMap and AscendWeb, are interactive viewers. Two statewide layers cover the county but neither can serve an owner search: the Oregon Department of Forestry's taxlot layer named 'Clackamas County' declares owner fields but has query disabled, and the Oregon Department of Transportation's taxlot layer is queryable but carries only map and taxlot numbers. Metro's regional RLIS 'Taxlots (Public)' dataset, per its listing, excludes ownership."
19705
+ },
19706
+ {
19707
+ id: "or-malheur",
19708
+ state: "OR",
19709
+ stateName: "Oregon",
19710
+ stateSlug: "oregon",
19711
+ county: "Malheur",
19712
+ countySlug: "malheur-county",
19713
+ countyFips: "41045",
19714
+ hasPublicRest: true,
19715
+ endpoints: [
19716
+ {
19717
+ url: "https://services5.arcgis.com/ZfBm5CKxbEBYLP3J/arcgis/rest/services/County_GIS_Portal_WFL1/FeatureServer/16",
19718
+ serviceType: "FeatureServer",
19719
+ layerIndex: 16,
19720
+ layerName: "TL Jun2026",
19721
+ supportsQuery: true,
19722
+ corsEnabled: true,
19723
+ searchFields: [
19724
+ { name: "OWNERSNAME", label: "Owner Name", searchable: true },
19725
+ { name: "MapTaxlot", label: "Map and Taxlot ID", searchable: true },
19726
+ { name: "Taxlot", label: "Taxlot", searchable: false },
19727
+ { name: "SITUSADD", label: "Site Address", searchable: true },
19728
+ { name: "CITY", label: "Site City", searchable: true },
19729
+ { name: "ADD1", label: "Owner Mailing Address Line 1", searchable: true },
19730
+ { name: "ADD2", label: "Owner Mailing Address Line 2", searchable: false },
19731
+ { name: "CITYSTATE", label: "Owner Mailing City and State", searchable: true },
19732
+ { name: "ZIP", label: "Owner Mailing ZIP", searchable: false },
19733
+ { name: "ZONING", label: "Zoning", searchable: false },
19734
+ { name: "TOTACRE", label: "Total Acres", searchable: false }
19735
+ ],
19736
+ sampleQuery: "https://services5.arcgis.com/ZfBm5CKxbEBYLP3J/arcgis/rest/services/County_GIS_Portal_WFL1/FeatureServer/16/query?where=UPPER(OWNERSNAME)%20LIKE%20'SMITH%25'&outFields=MapTaxlot,OWNERSNAME,ADD1,CITYSTATE,SITUSADD,CITY&returnGeometry=false&resultRecordCount=10&f=json",
19737
+ license: "unknown",
19738
+ licenseUrl: "https://www.malheurco.org/gis/",
19739
+ status: "live",
19740
+ lastVerified: "2026-10-03",
19741
+ verifiedBy: "manual"
19742
+ }
19743
+ ],
19744
+ contact: {
19745
+ department: "Malheur County GIS (GIS Specialist), 251 B St W #2, Vale, OR 97918, (541) 473-5574",
19746
+ url: "https://www.malheurco.org/gis/",
19747
+ email: null
19748
+ },
19749
+ notes: "Malheur County, Oregon (county seat Vale) publishes its tax lots as a layer of the County_GIS_Portal_WFL1 FeatureServer, the data source of the county's public Malheur County Tax Lot Map experience (linked from malheurco.org/gis). 20,570 features as of 2026-10-03. The owner is OWNERSNAME, the parcel id MapTaxlot (for example 15S47E28B04702), the site address SITUSADD with CITY, and the owner mailing address ADD1/ADD2/CITYSTATE/ZIP. SITUSADD is sometimes a bare zero and ADD1 is often null. MAINTENANCE QUIRK: the layer name and index are month-stamped (currently layer 16, 'TL Jun2026'; the siblings are 'NonTL Jun2026' at 17 and Zoning_2026 at 25) and the county republishes monthly, so the name or index can change. When the liveness probe flags this record, re-resolve it: list the FeatureServer's layers, pick the one whose name starts with 'TL ' and which carries an OWNERSNAME field, then update layerIndex, layerName and the url. Do not hard-code 16 forever. Named outFields are accepted. CORS answers Access-Control-Allow-Origin *. The layer states no license; the county GIS page links a Data Licensing Agreement for bulk data. The statewide ODF layer for Malheur has an owner line but query disabled, and Malheur is not in the OWRD layer, so there is no usable fallback. Verified live 2026-10-03: owner SMITH returned rows (first owner SMITH, JAMIE LEE, 15S47E28B04702, Ontario)."
19556
19750
  }
19557
19751
  ]
19558
19752
  };
@@ -20951,7 +21145,7 @@ var washington_default = {
20951
21145
  stateSlug: "washington",
20952
21146
  stateName: "Washington",
20953
21147
  stateAbbrev: "WA",
20954
- lastUpdated: "2026-06-06",
21148
+ lastUpdated: "2026-10-03",
20955
21149
  counties: [
20956
21150
  {
20957
21151
  id: "wa-king",
@@ -21127,6 +21321,52 @@ var washington_default = {
21127
21321
  email: null
21128
21322
  },
21129
21323
  notes: "45 fields confirmed including PARCEL_NO, ADDRESS1, ADDRESS2, CITY, STATE, ZIP, COUNTRY, SITUS_STRE, SITUS_CITY, SITUS_ZIP, SD_NAME, LEGAL_DESC, TOTAL_ACRES, BLDG_VALUE, LAND_VALUE, TOTAL_VALUE, ANNUAL_TAX, STATUS_IND, PROP_SUBTY, O_NEIGHBOR, PROP_TYPE, INSPCT_CYC, REGION, MULT_PARCL, SALE_DATE, SALE_PRICE, SALE_VRFY, USE_CODE, SIGMA_YEAR, TAXABLE, EXEMPT_TY, LOCAL_IND, TCA, CURR_USE, INCORP, YEAR_BUILT, EFF_YR_BUI, RES_QUAL, RES_COND, REC_VOLPAG, SECTTIE, PARENT, MapSource, GlobalID. Live query confirmed: PARCEL_NO LIKE '%21820%' returns Thurston County parcels with mailing address and value data. NOTE: Owner name is NOT on this public layer per WA State law; ADDRESS1/2 is the mailing address (generally owner's address). Data from ASCEND and SIGMA databases. Item ID: 4ca0091703b345f8a72f68a4d173d9be. maxRecordCount=1000."
21324
+ },
21325
+ {
21326
+ id: "wa-island",
21327
+ state: "WA",
21328
+ stateName: "Washington",
21329
+ stateSlug: "washington",
21330
+ county: "Island",
21331
+ countySlug: "island-county",
21332
+ countyFips: "53029",
21333
+ hasPublicRest: true,
21334
+ endpoints: [
21335
+ {
21336
+ url: "https://maps.islandcountywa.gov/arcgis/rest/services/Geocortex/Base/MapServer/0",
21337
+ serviceType: "MapServer",
21338
+ layerIndex: 0,
21339
+ layerName: "Parcels",
21340
+ supportsQuery: true,
21341
+ corsEnabled: true,
21342
+ searchFields: [
21343
+ { name: "taxpayer", label: "Owner Name (Taxpayer)", searchable: true },
21344
+ { name: "ParcelNo", label: "Parcel ID", searchable: true },
21345
+ { name: "physical_addr", label: "Site Address", searchable: true },
21346
+ { name: "physical_addr_city", label: "Site City", searchable: true },
21347
+ { name: "physical_addr_zip", label: "Site ZIP", searchable: false },
21348
+ { name: "mailing_addr1", label: "Owner Mailing Address Line 1", searchable: true },
21349
+ { name: "mailing_addr2", label: "Owner Mailing Address Line 2", searchable: false },
21350
+ { name: "mailing_addr_city", label: "Owner Mailing City", searchable: true },
21351
+ { name: "mailing_addr_state", label: "Owner Mailing State", searchable: false },
21352
+ { name: "mailing_addr_zip", label: "Owner Mailing ZIP", searchable: false },
21353
+ { name: "property_land_use_code", label: "Land Use Code", searchable: false },
21354
+ { name: "legal_acreage", label: "Legal Acreage", searchable: false }
21355
+ ],
21356
+ sampleQuery: "https://maps.islandcountywa.gov/arcgis/rest/services/Geocortex/Base/MapServer/0/query?where=UPPER(taxpayer)%20LIKE%20'SMITH%25'&outFields=ParcelNo,taxpayer,physical_addr,mailing_addr1&returnGeometry=false&resultRecordCount=10&f=json",
21357
+ license: "unknown",
21358
+ licenseUrl: "https://maps.islandcountywa.gov",
21359
+ status: "live",
21360
+ lastVerified: "2026-10-03",
21361
+ verifiedBy: "manual"
21362
+ }
21363
+ ],
21364
+ contact: {
21365
+ department: "Island County Assessor / GIS",
21366
+ url: "https://maps.islandcountywa.gov",
21367
+ email: null
21368
+ },
21369
+ notes: "Island County, Washington (county seat Coupeville) serves its parcels from the Assessor's own ArcGIS Server, joined to the PACS assessor data and exported nightly per the service description. The owner field is called taxpayer, the parcel id ParcelNo (for example R03213-384-4950), the site address physical_addr with its city, state and ZIP parts, and the owner mailing address mailing_addr1 to mailing_addr3 with city, state and ZIP. ParcelNo and taxpayer values carry trailing spaces, so trim on display, and some parcels (vacant land) have a blank physical_addr. Named outFields are accepted. CORS reflects the request Origin and sends Access-Control-Allow-Credentials true, so it is not a wildcard. maxRecordCount is 60000. The layer's copyright text reads DO NOT USE AS LEGAL DOCUMENT and no license is stated. Two sibling services carry the same data and serve as fallbacks: SmartGov/Parcels MapServer and Auditor/BaseMap MapServer layer 0. The contact URL is the county map server root, which answered HTTP 200 on 2026-10-03; no separate Assessor contact page was retrieved. Verified live 2026-10-03: owner SMITH returned rows (first owner SMITH, COLIN, R13334-372-1430)."
21130
21370
  }
21131
21371
  ]
21132
21372
  };
@@ -21878,6 +22118,7 @@ var POPULATED_STATES = {
21878
22118
  colorado: colorado_default,
21879
22119
  connecticut: connecticut_default,
21880
22120
  delaware: delaware_default,
22121
+ "district-of-columbia": district_of_columbia_default,
21881
22122
  florida: florida_default,
21882
22123
  georgia: georgia_default,
21883
22124
  hawaii: hawaii_default,
@@ -21967,10 +22208,10 @@ function listCountiesByState(stateSlug) {
21967
22208
  function slugify(s) {
21968
22209
  return s.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
21969
22210
  }
22211
+ var COUNTY_UNIT_SUFFIX = /\b(?:County|Parish|Borough|Municipality|Census Area|City|Statewide|Planning Region|District of Columbia)$/i;
21970
22212
  function countySlugFromName(county) {
21971
- const lc = county.toLowerCase();
21972
- const hasSuffix = lc.endsWith(" county") || lc.endsWith(" parish") || lc.endsWith(" borough") || lc.endsWith(" census area");
21973
- return slugify(hasSuffix ? county : `${county} County`);
22213
+ const name = county.trim();
22214
+ return slugify(COUNTY_UNIT_SUFFIX.test(name) ? name : `${name} County`);
21974
22215
  }
21975
22216
  function buildParcelLookupDeepLink(endpoint, base = "https://urbankitstudio.com/tools/parcel-lookup") {
21976
22217
  const params = new URLSearchParams();
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@urbankitstudio/atlas",
3
- "version": "0.6.8",
4
- "description": "JS SDK for the UrbanKit County Parcel REST API Atlas: 234 counties across all 50 US states, 246 verified public ArcGIS REST endpoints for county parcel data, with searchable field metadata, sample queries and license info.",
3
+ "version": "0.6.10",
4
+ "description": "JS SDK for the UrbanKit County Parcel REST API Atlas: 239 counties across all 50 US states and DC, 251 verified public ArcGIS REST endpoints for county parcel data, with searchable field metadata, sample queries and license info.",
5
5
  "keywords": [
6
6
  "parcel",
7
7
  "arcgis",
@@ -24,7 +24,7 @@
24
24
  "bugs": {
25
25
  "url": "https://github.com/urbankitstudio/atlas/issues"
26
26
  },
27
- "author": "UrbanKit Studio <urbankitstudio@gmail.com>",
27
+ "author": "UrbanKit Studio <contact@urbankitstudio.com>",
28
28
  "license": "MIT",
29
29
  "type": "module",
30
30
  "main": "./dist/index.cjs",