@urbankitstudio/atlas 0.6.2 → 0.6.4

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/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 Leo Yong
3
+ Copyright (c) 2026 UrbanKit Studio
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # @urbankitstudio/atlas
2
2
 
3
+ [![Socket Badge](https://badge.socket.dev/npm/package/@urbankitstudio/atlas)](https://socket.dev/npm/package/@urbankitstudio/atlas)
4
+
3
5
  JS SDK for the **UrbanKit County Parcel REST API Atlas** — a curated index of public ArcGIS REST endpoints for US county parcel data, with searchable field metadata, sample queries, and license info.
4
6
 
5
7
  Use it to:
@@ -132,15 +134,23 @@ Omit `?fips=` to get every tracked county in one call.
132
134
 
133
135
  ## Coverage today
134
136
 
135
- The atlas bundles **171 counties across all 50 US states** (174 verified endpoints), covering the largest counties in each. Call `listStates()` to enumerate the full set. Every state is now populated with at least one verified county endpoint.
137
+ The atlas bundles **171 counties across all 50 US states** (174 verified endpoints), covering the largest counties in each. Call `listStates()` to enumerate the full set.
138
+
139
+ Every state has at least one county on record, and 166 of the 171 carry a verified endpoint. The other 5 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. 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.
136
140
 
137
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.
138
142
 
139
143
  The live, browseable atlas lives at [urbankitstudio.com/parcel-atlas](https://urbankitstudio.com/parcel-atlas).
140
144
 
145
+ ## Socket flags `urlStrings` — that's the atlas, not a leak
146
+
147
+ [Socket](https://socket.dev/npm/package/@urbankitstudio/atlas)'s supply-chain scanner flags this package for `urlStrings`: code and data containing many literal URLs. That flag is doing its job correctly, and the answer is not to hide the URLs — **they are the product.** Every one is a public, government-run ArcGIS REST endpoint for county parcel data, plus the two `urbankitstudio.com` URLs this SDK references for live status (`LIVE_STATUS_URL`, above) and parcel-lookup deep links. The package does not call any of them itself; it hands them to you as data (`sideEffects: false`, zero runtime dependencies).
148
+
149
+ Socket also flags `unpopularPackage` — a download-count signal, not a code issue, that install growth resolves on its own.
150
+
141
151
  ## License
142
152
 
143
- MIT — see [LICENSE](./LICENSE). © 2026 Leo Yong.
153
+ MIT — see [LICENSE](./LICENSE). © 2026 UrbanKit Studio.
144
154
 
145
155
  This package's atlas dataset (the open **discovery layer** — county → REST endpoint
146
156
  mappings and field metadata) is provided under MIT. Live, always-fresh and enriched
@@ -218,7 +218,7 @@
218
218
  "status": "restricted",
219
219
  "basis": {
220
220
  "type": "county_cited_statute",
221
- "note": "Every row's OwnerName value is the literal string \"Protected Per CA Gov Code 7928.205\" rather than a name. The county applies the redaction server-side to the whole layer and cites that section itself. The section protects the home address of elected and appointed officials, so this is the county's own reading applied to every parcel, not a statewide rule: San Diego County publishes owner names on its public layer.",
221
+ "note": "Every row's OwnerName value is the literal string \"Protected Per CA Gov Code 7928.205\" rather than a name. The county applies the redaction server-side to the whole layer and cites that section itself. The section protects the home address of elected and appointed officials, so this is the county's own reading applied to every parcel, not a statewide rule. Read narrowly, the section would cover a small number of parcels. The county applies it to every one.",
222
222
  "citation": "Cal. Gov. Code 7928.205",
223
223
  "attributedTo": "San Bernardino County",
224
224
  "sourceUrl": "https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?sectionNum=7928.205&lawCode=GOV"
@@ -238,38 +238,50 @@
238
238
  "hasPublicRest": true,
239
239
  "endpoints": [
240
240
  {
241
- "url": "https://webmaps.sandiego.gov/arcgis/rest/services/GeocoderMerged/MapServer/1",
241
+ "url": "https://gis-public.sandiegocounty.gov/arcgis/rest/services/cosd_warehouse/parcels_all_for_public_use/MapServer/0",
242
242
  "serviceType": "MapServer",
243
- "layerIndex": 1,
244
- "layerName": "PARCELS_ALL",
243
+ "layerIndex": 0,
244
+ "layerName": "Parcels",
245
245
  "supportsQuery": true,
246
246
  "corsEnabled": null,
247
247
  "searchFields": [
248
248
  { "name": "APN", "label": "Assessor Parcel Number", "searchable": true },
249
249
  { "name": "APN_8", "label": "APN (8-digit)", "searchable": true },
250
- { "name": "OWN_NAME1", "label": "Owner Name (Primary)", "searchable": true },
251
- { "name": "OWN_NAME2", "label": "Owner Name 2", "searchable": true },
252
- { "name": "OWN_NAME3", "label": "Owner Name 3", "searchable": true },
253
- { "name": "OWN_ADDR1", "label": "Owner Address 1", "searchable": true },
254
250
  { "name": "SITUS_ADDRESS", "label": "Situs Street Number", "searchable": true },
255
251
  { "name": "SITUS_STREET", "label": "Situs Street Name", "searchable": true },
256
- { "name": "SITUS_COMMUNITY", "label": "Situs Community/City", "searchable": true },
257
- { "name": "SITUS_ZIP", "label": "Situs ZIP", "searchable": true }
252
+ { "name": "SITUS_SUFFIX", "label": "Situs Street Suffix", "searchable": false },
253
+ { "name": "SITUS_PRE_DIR", "label": "Situs Pre-direction", "searchable": false },
254
+ { "name": "SITUS_POST_DIR", "label": "Situs Post-direction", "searchable": false },
255
+ { "name": "SITUS_BUILDING", "label": "Situs Building", "searchable": false },
256
+ { "name": "SITUS_SUITE", "label": "Situs Suite", "searchable": false },
257
+ { "name": "SITUS_ZIP", "label": "Situs ZIP", "searchable": true },
258
+ { "name": "SITUS_JURIS", "label": "Situs Jurisdiction Code", "searchable": false },
259
+ { "name": "ACREAGE", "label": "Acreage", "searchable": false }
258
260
  ],
259
- "sampleQuery": "https://webmaps.sandiego.gov/arcgis/rest/services/GeocoderMerged/MapServer/1/query?where=UPPER(OWN_NAME1)+LIKE+UPPER('%25SMITH%25')&outFields=APN,OWN_NAME1,SITUS_ADDRESS,SITUS_STREET,SITUS_COMMUNITY,SITUS_ZIP&returnGeometry=false&f=json&resultRecordCount=10",
261
+ "sampleQuery": "https://gis-public.sandiegocounty.gov/arcgis/rest/services/cosd_warehouse/parcels_all_for_public_use/MapServer/0/query?where=APN%3D%274982603900%27&outFields=APN,APN_8,SITUS_ADDRESS,SITUS_STREET,SITUS_SUFFIX,SITUS_ZIP&returnGeometry=false&f=json&resultRecordCount=10",
260
262
  "license": "public",
261
- "licenseUrl": "https://gis-public.sandiegocounty.gov/",
263
+ "licenseUrl": "http://web.sangis.org/Legal_Notice.htm",
262
264
  "status": "live",
263
- "lastVerified": "2026-05-15",
265
+ "lastVerified": "2026-09-03",
264
266
  "verifiedBy": "manual"
265
267
  }
266
268
  ],
267
269
  "contact": {
268
- "department": "SanGIS / San Diego County GIS",
270
+ "department": "SanGIS / County of San Diego Assessor",
269
271
  "url": "https://gis-public.sandiegocounty.gov/",
270
272
  "email": null
271
273
  },
272
- "notes": "65 fields confirmed including APN, APN_8, PARCELID, OWN_NAME1/2/3, OWN_ADDR1-4, OWN_ZIP, SITUS_ADDRESS (house number), SITUS_STREET, SITUS_SUFFIX, SITUS_PRE_DIR, SITUS_POST_DIR, SITUS_BUILDING, SITUS_SUITE, SITUS_COMMUNITY, SITUS_ZIP, SITUS_JURIS, OWNEROCC, NUCLEUS_SITUS_FROM_NBR/THRU_NBR, NUCLEUS_USE_CD, NUCLEUS_ZONE_CD. Owner query tested and confirmed, OWN_NAME1 returns real names (e.g., 'SMITH MARY ANN'). The display field is OWN_NAME1. Copyright: 'SanGIS using legal recorded data provided by the County Recorders and Assessor's Office.' This is the GeocoderMerged MapServer layer 1, which combines assessor parcel data. A sibling PARCELS_ALL service exists at gis-public.sandiegocounty.gov/arcgis/rest/services/sdep_warehouse/PARCELS_ALL/MapServer but returns HTTP 403 to external callers; the webmaps.sandiego.gov endpoint is the publicly accessible equivalent."
274
+ "notes": "16 fields confirmed 2026-09-03 on the County of San Diego's public parcel layer (service copyright 'SanGIS, County of San Diego Assessor', service description 'County of San Diego Assessors Parcels (PARCELS_ALL) redacted for public use', ~1.09M rows, maxRecordCount 1000, native State Plane feet, add outSR=4326 for lon/lat): APN, APN_8, SITUS_ADDRESS (house number), SITUS_PRE_DIR, SITUS_STREET, SITUS_SUFFIX, SITUS_POST_DIR, SITUS_FRACTION, SITUS_BUILDING, SITUS_SUITE, SITUS_ZIP, SITUS_JURIS, ACREAGE, QUAL_CLASS_SHAPE and geometry. No owner name, mailing address, sale date, value or community name: the county redacts them on every public derivative. Until 2026-09-03 this entry pointed at the City of San Diego's GeocoderMerged/MapServer/1, which then served owner names (OWN_NAME1-3, OWN_ADDR1-4) and answered ArcGIS error 500 'Service GeocoderMerged/MapServer not started' from 2026-09-02 20:45Z (autoheal #581); a made-up service name on that host errored differently, so the service existed and was stopped. Probed 2026-09-17: the city service is RUNNING again, reports 56 fields, and no longer serves owner names. Asking it for OWN_NAME1/2/3 returns ArcGIS error 400 'Failed to execute query' while the identical request for APN and ASR_TOTAL returns a feature, so the field was withdrawn rather than the service being down. It still reports displayFieldName 'OWN_NAME1' in every response, so a metadata-only or liveness-only check reads this endpoint as owner-bearing and healthy. Do not restore it as the owner source on a restart signal alone: ask for the field.",
275
+ "capabilityOverrides": {
276
+ "owner_name": {
277
+ "status": "not_published",
278
+ "basis": {
279
+ "type": "endpoint_schema",
280
+ "note": "The County of San Diego's public parcel layer (cosd_warehouse/parcels_all_for_public_use) carries APN and situs address only; owner name, owner mailing address, sale date and assessed value are removed by county policy. The county's owner-attributed layer exists but its own metadata says it is not authorized for public use, so the atlas does not point at it.",
281
+ "sourceUrl": "http://web.sangis.org/Legal_Notice.htm"
282
+ }
283
+ }
284
+ }
273
285
  },
274
286
  {
275
287
  "id": "ca-santa-clara",
@@ -5,7 +5,7 @@
5
5
  "lastUpdated": "2026-05-14",
6
6
  "counties": [
7
7
  {
8
- "id": "ny-new-york",
8
+ "id": "ny-bronx",
9
9
  "state": "NY",
10
10
  "stateName": "New York",
11
11
  "stateSlug": "new-york",
@@ -271,7 +271,7 @@
271
271
  "notes": "54 fields confirmed. Includes PIN (21-char unique parcel ID), SBL (section-block-lot key), OWNER1, OWNER2, mailing address (MAILAD1/MAILAD2), property address (STREET, CITY, ZIP, ZIP4), property class (CLASS), property type/description, school district (SCHOOL, SCHL_DIST), SWIS code, lot dimensions (FRONT, DEPTH), acreage (ASSESSACRE, CALCACRES). Owner query tested and confirmed: UPPER(OWNER1) LIKE UPPER('%SMITH%') returns real residential parcels. This is the 2023 vintage Erie County parcel dataset. Erie County, NY is the Buffalo metropolitan area (FIPS 36029)."
272
272
  },
273
273
  {
274
- "id": "ny-new-york",
274
+ "id": "ny-kings",
275
275
  "state": "NY",
276
276
  "stateName": "New York",
277
277
  "stateSlug": "new-york",
@@ -776,7 +776,7 @@
776
776
  "capabilityOverrides": null
777
777
  },
778
778
  {
779
- "id": "ny-new-york",
779
+ "id": "ny-queens",
780
780
  "state": "NY",
781
781
  "stateName": "New York",
782
782
  "stateSlug": "new-york",
@@ -933,7 +933,7 @@
933
933
  "notes": "Queens is served by the same citywide MAPPLUTO layer as the other four boroughs; the registry scopes this county to Borough='QN' so an owner search here does not return another borough's parcels. Address lookups are scoped by geography already."
934
934
  },
935
935
  {
936
- "id": "ny-new-york",
936
+ "id": "ny-richmond",
937
937
  "state": "NY",
938
938
  "stateName": "New York",
939
939
  "stateSlug": "new-york",
@@ -63,9 +63,9 @@
63
63
  "hasPublicRest": true,
64
64
  "endpoints": [
65
65
  {
66
- "url": "https://gisccapps.charlestoncounty.org/arcgis/rest/services/GIS_VIEWER/New_Parcel_Search/MapServer/61",
66
+ "url": "https://gisccapps.charlestoncounty.org/arcgis/rest/services/GIS_VIEWER/New_Parcel_Search/MapServer/4",
67
67
  "serviceType": "MapServer",
68
- "layerIndex": 61,
68
+ "layerIndex": 4,
69
69
  "layerName": "Parcels",
70
70
  "supportsQuery": true,
71
71
  "corsEnabled": null,
@@ -82,11 +82,11 @@
82
82
  { "name": "LEGAL_DESCR", "label": "Legal Description", "searchable": false },
83
83
  { "name": "SUBDIVISION", "label": "Subdivision", "searchable": false }
84
84
  ],
85
- "sampleQuery": "https://gisccapps.charlestoncounty.org/arcgis/rest/services/GIS_VIEWER/New_Parcel_Search/MapServer/61/query?where=UPPER(OWNER1)+LIKE+UPPER(%27%25SMITH%25%27)&outFields=PID,OWNER1,OWNER2,MAIL_ST_NAME&returnGeometry=false&f=json&resultRecordCount=10",
85
+ "sampleQuery": "https://gisccapps.charlestoncounty.org/arcgis/rest/services/GIS_VIEWER/New_Parcel_Search/MapServer/4/query?where=UPPER(OWNER1)+LIKE+UPPER(%27%25SMITH%25%27)&outFields=PID,OWNER1,OWNER2,MAIL_ST_NAME&returnGeometry=false&f=json&resultRecordCount=10",
86
86
  "license": "public",
87
87
  "licenseUrl": "https://charleston-county-gis-chascogis.hub.arcgis.com/",
88
88
  "status": "live",
89
- "lastVerified": "2026-06-06",
89
+ "lastVerified": "2026-09-17",
90
90
  "verifiedBy": "manual"
91
91
  }
92
92
  ],
@@ -95,7 +95,7 @@
95
95
  "url": "https://charleston-county-gis-chascogis.hub.arcgis.com/",
96
96
  "email": null
97
97
  },
98
- "notes": "Charleston County (pop. 430,000; includes Charleston, North Charleston, Mount Pleasant) Parcel_Search MapServer layer 4. This layer is a spatial join of parcel geometry (FEATURES.SDE.P_POLY_PARCEL) with CAMA assessor data (FEATURES.SDE.CAMA), so field names are fully qualified with schema prefix. 20 fields confirmed: PID, GPIN, ACRES_CAL, OWNER1/2, TAX_DISTRICT, CLASS_CODE, MAIL_ST_NO/ST_NAME/ST_TYPE, MAIL_2ND_ADDR/ADDT, MAIL_CITY/STATE/ZIP/COUNTRY, LEGAL_DESCR, SUBDIVISION. IMPORTANT: field names in WHERE clause must be double-quoted due to dot notation (e.g., UPPER(\"FEATURES.SDE.CAMA.OWNER1\") LIKE ...). Verified 2026-05-15: SMITH returns Edisto Island and Spring City area addresses. MIGRATED 2026-06-06: GIS_VIEWER/Parcel_Search/MapServer/4 was retired (ArcGIS 404) -- parcels now at GIS_VIEWER/New_Parcel_Search/MapServer/61 (197,306 parcels; OWNER1 search re-verified live). Field names are unqualified on the new layer (PID, OWNER1, ...); the FEATURES.SDE.* prefixes no longer apply and GPIN is not in the new schema."
98
+ "notes": "Charleston County (pop. 430,000; includes Charleston, North Charleston, Mount Pleasant). Parcels live on GIS_VIEWER/New_Parcel_Search/MapServer layer 4. Field names are unqualified (PID, OWNER1, ...); the FEATURES.SDE.* prefixes an older revision of this entry described no longer apply, and neither GPIN nor ACRES_CAL exists here. Layer 4 carries 27 fields, including several the registry does not map: ACREAGE, CLASS_CODE, DEED_BOOK_PAGE, PLAT_BOOK_PAGE, SALE_PRICE, RECORDED_DATE and DOC_DATE. WATCH THIS COUNTY: it has now renumbered its parcel layer twice. 2026-06-06 moved Parcel_Search/4 to New_Parcel_Search/61 after the old service 404'd; 2026-09-17 moved it again to New_Parcel_Search/4, which is why the endpoint sat down with last_ok_at null. Both times the service name and the field names survived and only the layer index changed, so an index-only drift check would catch the next one. Re-verified live 2026-09-17: layer 61 answers ArcGIS error 404 'Layer not found' while layer 4 returns features for both query shapes the tool sends, UPPER(OWNER1) LIKE and PID LIKE."
99
99
  }
100
100
  ]
101
101
  }
package/data/texas.json CHANGED
@@ -365,18 +365,18 @@
365
365
  "supportsQuery": true,
366
366
  "corsEnabled": null,
367
367
  "searchFields": [
368
- { "name": "CADReferenceNumber", "label": "CAD Reference Number (R-number)", "searchable": true },
369
- { "name": "PropertyNumber", "label": "Property Number", "searchable": true },
370
- { "name": "OwnerName", "label": "Owner Name", "searchable": true },
368
+ { "name": "CAD_Reference_Number", "label": "CAD Reference Number (R-number)", "searchable": true },
369
+ { "name": "Property_Number", "label": "Property Number", "searchable": true },
370
+ { "name": "Owner_Name", "label": "Owner Name", "searchable": true },
371
371
  { "name": "Situs", "label": "Situs Address", "searchable": true },
372
- { "name": "OwnerAddress1", "label": "Owner Mailing Address", "searchable": false },
373
- { "name": "OwnerCity", "label": "Owner City", "searchable": false }
372
+ { "name": "Owner_Address_1", "label": "Owner Mailing Address", "searchable": false },
373
+ { "name": "Owner_City", "label": "Owner City", "searchable": false }
374
374
  ],
375
- "sampleQuery": "https://gisportal.fortbendcountytx.gov/arcgis/rest/services/InteractiveMap/Parcels_Public/FeatureServer/1/query?where=UPPER(OwnerName)%20LIKE%20UPPER('%25SMITH%25')&outFields=CADReferenceNumber,OwnerName,Situs&returnGeometry=false&f=json&resultRecordCount=10",
375
+ "sampleQuery": "https://gisportal.fortbendcountytx.gov/arcgis/rest/services/InteractiveMap/Parcels_Public/FeatureServer/1/query?where=UPPER(Owner_Name)%20LIKE%20UPPER('%25SMITH%25')&outFields=CAD_Reference_Number,Owner_Name,Situs&returnGeometry=false&f=json&resultRecordCount=10",
376
376
  "license": "public",
377
377
  "licenseUrl": "https://fbcad-open-data-hub-fortbend.hub.arcgis.com/",
378
378
  "status": "live",
379
- "lastVerified": "2026-06-06",
379
+ "lastVerified": "2026-09-12",
380
380
  "verifiedBy": "manual"
381
381
  }
382
382
  ],
@@ -385,7 +385,7 @@
385
385
  "url": "https://www.fbcad.org/",
386
386
  "email": null
387
387
  },
388
- "notes": "Fort Bend County, Texas (Katy / Sugar Land / Missouri City, southwest Houston metro, pop. ~880K) serves parcels from a Fort Bend County GIS MapServer sourced from Fort Bend Central Appraisal District (FBCAD). Owner name is OwnerName (the layer display field); owner mailing is OwnerAddress1/2/3 with OwnerCity/OwnerState/OwnerZip; the site address is Situs; identifiers are CAD_Reference_Number (R-number, e.g. R328356) and PropertyNumber. Owner search uses UPPER(OwnerName) LIKE. Verified live 2026-05-30 (OwnerName = Shimmel John). Under Texas Tax Code §25.025, protected persons (peace officers, judges, family-violence victims) may have their owner/address records withheld. MIGRATED 2026-06-06: gisweb.fortbendcountytx.gov was decommissioned (Cloudflare 522) -- the public service moved to gisportal.fortbendcountytx.gov InteractiveMap/Parcels_Public/FeatureServer/1 (ArcGIS 11.3, 359,954 parcels; OwnerName search re-verified live). Field names dropped underscores (CAD_Reference_Number is now CADReferenceNumber)."
388
+ "notes": "Fort Bend County, Texas (Katy / Sugar Land / Missouri City, southwest Houston metro, pop. ~880K) serves parcels from a Fort Bend County GIS MapServer sourced from Fort Bend Central Appraisal District (FBCAD). Owner name is Owner_Name (the layer display field); owner mailing is Owner_Address_1/2/3 with Owner_City/Owner_State/Owner_Zip; the site address is Situs; identifiers are CAD_Reference_Number (R-number, e.g. R328356) and Property_Number. Owner search uses UPPER(Owner_Name) LIKE. Verified live 2026-05-30 (OwnerName = Shimmel John). Under Texas Tax Code §25.025, protected persons (peace officers, judges, family-violence victims) may have their owner/address records withheld. MIGRATED 2026-06-06: gisweb.fortbendcountytx.gov was decommissioned (Cloudflare 522) -- the public service moved to gisportal.fortbendcountytx.gov InteractiveMap/Parcels_Public/FeatureServer/1 (ArcGIS 11.3, 359,954 parcels; OwnerName search re-verified live), and at that point the field names had dropped their underscores (CADReferenceNumber, OwnerName). RENAMED BACK 2026-09-12: the same layer (the service's only layer) publishes the underscore names again (Owner_Name, CAD_Reference_Number, Property_Number, Owner_Address_1, Owner_City; 49 fields, displayField Owner_Name). The liveness probe read that rename as field-drift on 2026-09-10 and autoheal PR #632 tried to drop the five fields; nothing was removed upstream, so the fields were re-pointed at the current names and owner search re-verified live (10 rows for %SMITH%, e.g. R100208)."
389
389
  },
390
390
  {
391
391
  "id": "tx-williamson",
package/dist/index.cjs CHANGED
@@ -1235,7 +1235,7 @@ var california_default = {
1235
1235
  status: "restricted",
1236
1236
  basis: {
1237
1237
  type: "county_cited_statute",
1238
- note: `Every row's OwnerName value is the literal string "Protected Per CA Gov Code 7928.205" rather than a name. The county applies the redaction server-side to the whole layer and cites that section itself. The section protects the home address of elected and appointed officials, so this is the county's own reading applied to every parcel, not a statewide rule: San Diego County publishes owner names on its public layer.`,
1238
+ note: `Every row's OwnerName value is the literal string "Protected Per CA Gov Code 7928.205" rather than a name. The county applies the redaction server-side to the whole layer and cites that section itself. The section protects the home address of elected and appointed officials, so this is the county's own reading applied to every parcel, not a statewide rule. Read narrowly, the section would cover a small number of parcels. The county applies it to every one.`,
1239
1239
  citation: "Cal. Gov. Code 7928.205",
1240
1240
  attributedTo: "San Bernardino County",
1241
1241
  sourceUrl: "https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?sectionNum=7928.205&lawCode=GOV"
@@ -1255,38 +1255,50 @@ var california_default = {
1255
1255
  hasPublicRest: true,
1256
1256
  endpoints: [
1257
1257
  {
1258
- url: "https://webmaps.sandiego.gov/arcgis/rest/services/GeocoderMerged/MapServer/1",
1258
+ url: "https://gis-public.sandiegocounty.gov/arcgis/rest/services/cosd_warehouse/parcels_all_for_public_use/MapServer/0",
1259
1259
  serviceType: "MapServer",
1260
- layerIndex: 1,
1261
- layerName: "PARCELS_ALL",
1260
+ layerIndex: 0,
1261
+ layerName: "Parcels",
1262
1262
  supportsQuery: true,
1263
1263
  corsEnabled: null,
1264
1264
  searchFields: [
1265
1265
  { name: "APN", label: "Assessor Parcel Number", searchable: true },
1266
1266
  { name: "APN_8", label: "APN (8-digit)", searchable: true },
1267
- { name: "OWN_NAME1", label: "Owner Name (Primary)", searchable: true },
1268
- { name: "OWN_NAME2", label: "Owner Name 2", searchable: true },
1269
- { name: "OWN_NAME3", label: "Owner Name 3", searchable: true },
1270
- { name: "OWN_ADDR1", label: "Owner Address 1", searchable: true },
1271
1267
  { name: "SITUS_ADDRESS", label: "Situs Street Number", searchable: true },
1272
1268
  { name: "SITUS_STREET", label: "Situs Street Name", searchable: true },
1273
- { name: "SITUS_COMMUNITY", label: "Situs Community/City", searchable: true },
1274
- { name: "SITUS_ZIP", label: "Situs ZIP", searchable: true }
1269
+ { name: "SITUS_SUFFIX", label: "Situs Street Suffix", searchable: false },
1270
+ { name: "SITUS_PRE_DIR", label: "Situs Pre-direction", searchable: false },
1271
+ { name: "SITUS_POST_DIR", label: "Situs Post-direction", searchable: false },
1272
+ { name: "SITUS_BUILDING", label: "Situs Building", searchable: false },
1273
+ { name: "SITUS_SUITE", label: "Situs Suite", searchable: false },
1274
+ { name: "SITUS_ZIP", label: "Situs ZIP", searchable: true },
1275
+ { name: "SITUS_JURIS", label: "Situs Jurisdiction Code", searchable: false },
1276
+ { name: "ACREAGE", label: "Acreage", searchable: false }
1275
1277
  ],
1276
- sampleQuery: "https://webmaps.sandiego.gov/arcgis/rest/services/GeocoderMerged/MapServer/1/query?where=UPPER(OWN_NAME1)+LIKE+UPPER('%25SMITH%25')&outFields=APN,OWN_NAME1,SITUS_ADDRESS,SITUS_STREET,SITUS_COMMUNITY,SITUS_ZIP&returnGeometry=false&f=json&resultRecordCount=10",
1278
+ sampleQuery: "https://gis-public.sandiegocounty.gov/arcgis/rest/services/cosd_warehouse/parcels_all_for_public_use/MapServer/0/query?where=APN%3D%274982603900%27&outFields=APN,APN_8,SITUS_ADDRESS,SITUS_STREET,SITUS_SUFFIX,SITUS_ZIP&returnGeometry=false&f=json&resultRecordCount=10",
1277
1279
  license: "public",
1278
- licenseUrl: "https://gis-public.sandiegocounty.gov/",
1280
+ licenseUrl: "http://web.sangis.org/Legal_Notice.htm",
1279
1281
  status: "live",
1280
- lastVerified: "2026-05-15",
1282
+ lastVerified: "2026-09-03",
1281
1283
  verifiedBy: "manual"
1282
1284
  }
1283
1285
  ],
1284
1286
  contact: {
1285
- department: "SanGIS / San Diego County GIS",
1287
+ department: "SanGIS / County of San Diego Assessor",
1286
1288
  url: "https://gis-public.sandiegocounty.gov/",
1287
1289
  email: null
1288
1290
  },
1289
- notes: "65 fields confirmed including APN, APN_8, PARCELID, OWN_NAME1/2/3, OWN_ADDR1-4, OWN_ZIP, SITUS_ADDRESS (house number), SITUS_STREET, SITUS_SUFFIX, SITUS_PRE_DIR, SITUS_POST_DIR, SITUS_BUILDING, SITUS_SUITE, SITUS_COMMUNITY, SITUS_ZIP, SITUS_JURIS, OWNEROCC, NUCLEUS_SITUS_FROM_NBR/THRU_NBR, NUCLEUS_USE_CD, NUCLEUS_ZONE_CD. Owner query tested and confirmed, OWN_NAME1 returns real names (e.g., 'SMITH MARY ANN'). The display field is OWN_NAME1. Copyright: 'SanGIS using legal recorded data provided by the County Recorders and Assessor's Office.' This is the GeocoderMerged MapServer layer 1, which combines assessor parcel data. A sibling PARCELS_ALL service exists at gis-public.sandiegocounty.gov/arcgis/rest/services/sdep_warehouse/PARCELS_ALL/MapServer but returns HTTP 403 to external callers; the webmaps.sandiego.gov endpoint is the publicly accessible equivalent."
1291
+ notes: "16 fields confirmed 2026-09-03 on the County of San Diego's public parcel layer (service copyright 'SanGIS, County of San Diego Assessor', service description 'County of San Diego Assessors Parcels (PARCELS_ALL) redacted for public use', ~1.09M rows, maxRecordCount 1000, native State Plane feet, add outSR=4326 for lon/lat): APN, APN_8, SITUS_ADDRESS (house number), SITUS_PRE_DIR, SITUS_STREET, SITUS_SUFFIX, SITUS_POST_DIR, SITUS_FRACTION, SITUS_BUILDING, SITUS_SUITE, SITUS_ZIP, SITUS_JURIS, ACREAGE, QUAL_CLASS_SHAPE and geometry. No owner name, mailing address, sale date, value or community name: the county redacts them on every public derivative. Until 2026-09-03 this entry pointed at the City of San Diego's GeocoderMerged/MapServer/1, which then served owner names (OWN_NAME1-3, OWN_ADDR1-4) and answered ArcGIS error 500 'Service GeocoderMerged/MapServer not started' from 2026-09-02 20:45Z (autoheal #581); a made-up service name on that host errored differently, so the service existed and was stopped. Probed 2026-09-17: the city service is RUNNING again, reports 56 fields, and no longer serves owner names. Asking it for OWN_NAME1/2/3 returns ArcGIS error 400 'Failed to execute query' while the identical request for APN and ASR_TOTAL returns a feature, so the field was withdrawn rather than the service being down. It still reports displayFieldName 'OWN_NAME1' in every response, so a metadata-only or liveness-only check reads this endpoint as owner-bearing and healthy. Do not restore it as the owner source on a restart signal alone: ask for the field.",
1292
+ capabilityOverrides: {
1293
+ owner_name: {
1294
+ status: "not_published",
1295
+ basis: {
1296
+ type: "endpoint_schema",
1297
+ note: "The County of San Diego's public parcel layer (cosd_warehouse/parcels_all_for_public_use) carries APN and situs address only; owner name, owner mailing address, sale date and assessed value are removed by county policy. The county's owner-attributed layer exists but its own metadata says it is not authorized for public use, so the atlas does not point at it.",
1298
+ sourceUrl: "http://web.sangis.org/Legal_Notice.htm"
1299
+ }
1300
+ }
1301
+ }
1290
1302
  },
1291
1303
  {
1292
1304
  id: "ca-santa-clara",
@@ -7806,7 +7818,7 @@ var new_york_default = {
7806
7818
  lastUpdated: "2026-05-14",
7807
7819
  counties: [
7808
7820
  {
7809
- id: "ny-new-york",
7821
+ id: "ny-bronx",
7810
7822
  state: "NY",
7811
7823
  stateName: "New York",
7812
7824
  stateSlug: "new-york",
@@ -8072,7 +8084,7 @@ var new_york_default = {
8072
8084
  notes: "54 fields confirmed. Includes PIN (21-char unique parcel ID), SBL (section-block-lot key), OWNER1, OWNER2, mailing address (MAILAD1/MAILAD2), property address (STREET, CITY, ZIP, ZIP4), property class (CLASS), property type/description, school district (SCHOOL, SCHL_DIST), SWIS code, lot dimensions (FRONT, DEPTH), acreage (ASSESSACRE, CALCACRES). Owner query tested and confirmed: UPPER(OWNER1) LIKE UPPER('%SMITH%') returns real residential parcels. This is the 2023 vintage Erie County parcel dataset. Erie County, NY is the Buffalo metropolitan area (FIPS 36029)."
8073
8085
  },
8074
8086
  {
8075
- id: "ny-new-york",
8087
+ id: "ny-kings",
8076
8088
  state: "NY",
8077
8089
  stateName: "New York",
8078
8090
  stateSlug: "new-york",
@@ -8577,7 +8589,7 @@ var new_york_default = {
8577
8589
  capabilityOverrides: null
8578
8590
  },
8579
8591
  {
8580
- id: "ny-new-york",
8592
+ id: "ny-queens",
8581
8593
  state: "NY",
8582
8594
  stateName: "New York",
8583
8595
  stateSlug: "new-york",
@@ -8734,7 +8746,7 @@ var new_york_default = {
8734
8746
  notes: "Queens is served by the same citywide MAPPLUTO layer as the other four boroughs; the registry scopes this county to Borough='QN' so an owner search here does not return another borough's parcels. Address lookups are scoped by geography already."
8735
8747
  },
8736
8748
  {
8737
- id: "ny-new-york",
8749
+ id: "ny-richmond",
8738
8750
  state: "NY",
8739
8751
  stateName: "New York",
8740
8752
  stateSlug: "new-york",
@@ -10622,9 +10634,9 @@ var south_carolina_default = {
10622
10634
  hasPublicRest: true,
10623
10635
  endpoints: [
10624
10636
  {
10625
- url: "https://gisccapps.charlestoncounty.org/arcgis/rest/services/GIS_VIEWER/New_Parcel_Search/MapServer/61",
10637
+ url: "https://gisccapps.charlestoncounty.org/arcgis/rest/services/GIS_VIEWER/New_Parcel_Search/MapServer/4",
10626
10638
  serviceType: "MapServer",
10627
- layerIndex: 61,
10639
+ layerIndex: 4,
10628
10640
  layerName: "Parcels",
10629
10641
  supportsQuery: true,
10630
10642
  corsEnabled: null,
@@ -10641,11 +10653,11 @@ var south_carolina_default = {
10641
10653
  { name: "LEGAL_DESCR", label: "Legal Description", searchable: false },
10642
10654
  { name: "SUBDIVISION", label: "Subdivision", searchable: false }
10643
10655
  ],
10644
- sampleQuery: "https://gisccapps.charlestoncounty.org/arcgis/rest/services/GIS_VIEWER/New_Parcel_Search/MapServer/61/query?where=UPPER(OWNER1)+LIKE+UPPER(%27%25SMITH%25%27)&outFields=PID,OWNER1,OWNER2,MAIL_ST_NAME&returnGeometry=false&f=json&resultRecordCount=10",
10656
+ sampleQuery: "https://gisccapps.charlestoncounty.org/arcgis/rest/services/GIS_VIEWER/New_Parcel_Search/MapServer/4/query?where=UPPER(OWNER1)+LIKE+UPPER(%27%25SMITH%25%27)&outFields=PID,OWNER1,OWNER2,MAIL_ST_NAME&returnGeometry=false&f=json&resultRecordCount=10",
10645
10657
  license: "public",
10646
10658
  licenseUrl: "https://charleston-county-gis-chascogis.hub.arcgis.com/",
10647
10659
  status: "live",
10648
- lastVerified: "2026-06-06",
10660
+ lastVerified: "2026-09-17",
10649
10661
  verifiedBy: "manual"
10650
10662
  }
10651
10663
  ],
@@ -10654,7 +10666,7 @@ var south_carolina_default = {
10654
10666
  url: "https://charleston-county-gis-chascogis.hub.arcgis.com/",
10655
10667
  email: null
10656
10668
  },
10657
- notes: 'Charleston County (pop. 430,000; includes Charleston, North Charleston, Mount Pleasant) Parcel_Search MapServer layer 4. This layer is a spatial join of parcel geometry (FEATURES.SDE.P_POLY_PARCEL) with CAMA assessor data (FEATURES.SDE.CAMA), so field names are fully qualified with schema prefix. 20 fields confirmed: PID, GPIN, ACRES_CAL, OWNER1/2, TAX_DISTRICT, CLASS_CODE, MAIL_ST_NO/ST_NAME/ST_TYPE, MAIL_2ND_ADDR/ADDT, MAIL_CITY/STATE/ZIP/COUNTRY, LEGAL_DESCR, SUBDIVISION. IMPORTANT: field names in WHERE clause must be double-quoted due to dot notation (e.g., UPPER("FEATURES.SDE.CAMA.OWNER1") LIKE ...). Verified 2026-05-15: SMITH returns Edisto Island and Spring City area addresses. MIGRATED 2026-06-06: GIS_VIEWER/Parcel_Search/MapServer/4 was retired (ArcGIS 404) -- parcels now at GIS_VIEWER/New_Parcel_Search/MapServer/61 (197,306 parcels; OWNER1 search re-verified live). Field names are unqualified on the new layer (PID, OWNER1, ...); the FEATURES.SDE.* prefixes no longer apply and GPIN is not in the new schema.'
10669
+ notes: "Charleston County (pop. 430,000; includes Charleston, North Charleston, Mount Pleasant). Parcels live on GIS_VIEWER/New_Parcel_Search/MapServer layer 4. Field names are unqualified (PID, OWNER1, ...); the FEATURES.SDE.* prefixes an older revision of this entry described no longer apply, and neither GPIN nor ACRES_CAL exists here. Layer 4 carries 27 fields, including several the registry does not map: ACREAGE, CLASS_CODE, DEED_BOOK_PAGE, PLAT_BOOK_PAGE, SALE_PRICE, RECORDED_DATE and DOC_DATE. WATCH THIS COUNTY: it has now renumbered its parcel layer twice. 2026-06-06 moved Parcel_Search/4 to New_Parcel_Search/61 after the old service 404'd; 2026-09-17 moved it again to New_Parcel_Search/4, which is why the endpoint sat down with last_ok_at null. Both times the service name and the field names survived and only the layer index changed, so an index-only drift check would catch the next one. Re-verified live 2026-09-17: layer 61 answers ArcGIS error 404 'Layer not found' while layer 4 returns features for both query shapes the tool sends, UPPER(OWNER1) LIKE and PID LIKE."
10658
10670
  }
10659
10671
  ]
10660
10672
  };
@@ -11243,18 +11255,18 @@ var texas_default = {
11243
11255
  supportsQuery: true,
11244
11256
  corsEnabled: null,
11245
11257
  searchFields: [
11246
- { name: "CADReferenceNumber", label: "CAD Reference Number (R-number)", searchable: true },
11247
- { name: "PropertyNumber", label: "Property Number", searchable: true },
11248
- { name: "OwnerName", label: "Owner Name", searchable: true },
11258
+ { name: "CAD_Reference_Number", label: "CAD Reference Number (R-number)", searchable: true },
11259
+ { name: "Property_Number", label: "Property Number", searchable: true },
11260
+ { name: "Owner_Name", label: "Owner Name", searchable: true },
11249
11261
  { name: "Situs", label: "Situs Address", searchable: true },
11250
- { name: "OwnerAddress1", label: "Owner Mailing Address", searchable: false },
11251
- { name: "OwnerCity", label: "Owner City", searchable: false }
11262
+ { name: "Owner_Address_1", label: "Owner Mailing Address", searchable: false },
11263
+ { name: "Owner_City", label: "Owner City", searchable: false }
11252
11264
  ],
11253
- sampleQuery: "https://gisportal.fortbendcountytx.gov/arcgis/rest/services/InteractiveMap/Parcels_Public/FeatureServer/1/query?where=UPPER(OwnerName)%20LIKE%20UPPER('%25SMITH%25')&outFields=CADReferenceNumber,OwnerName,Situs&returnGeometry=false&f=json&resultRecordCount=10",
11265
+ sampleQuery: "https://gisportal.fortbendcountytx.gov/arcgis/rest/services/InteractiveMap/Parcels_Public/FeatureServer/1/query?where=UPPER(Owner_Name)%20LIKE%20UPPER('%25SMITH%25')&outFields=CAD_Reference_Number,Owner_Name,Situs&returnGeometry=false&f=json&resultRecordCount=10",
11254
11266
  license: "public",
11255
11267
  licenseUrl: "https://fbcad-open-data-hub-fortbend.hub.arcgis.com/",
11256
11268
  status: "live",
11257
- lastVerified: "2026-06-06",
11269
+ lastVerified: "2026-09-12",
11258
11270
  verifiedBy: "manual"
11259
11271
  }
11260
11272
  ],
@@ -11263,7 +11275,7 @@ var texas_default = {
11263
11275
  url: "https://www.fbcad.org/",
11264
11276
  email: null
11265
11277
  },
11266
- notes: "Fort Bend County, Texas (Katy / Sugar Land / Missouri City, southwest Houston metro, pop. ~880K) serves parcels from a Fort Bend County GIS MapServer sourced from Fort Bend Central Appraisal District (FBCAD). Owner name is OwnerName (the layer display field); owner mailing is OwnerAddress1/2/3 with OwnerCity/OwnerState/OwnerZip; the site address is Situs; identifiers are CAD_Reference_Number (R-number, e.g. R328356) and PropertyNumber. Owner search uses UPPER(OwnerName) LIKE. Verified live 2026-05-30 (OwnerName = Shimmel John). Under Texas Tax Code \xA725.025, protected persons (peace officers, judges, family-violence victims) may have their owner/address records withheld. MIGRATED 2026-06-06: gisweb.fortbendcountytx.gov was decommissioned (Cloudflare 522) -- the public service moved to gisportal.fortbendcountytx.gov InteractiveMap/Parcels_Public/FeatureServer/1 (ArcGIS 11.3, 359,954 parcels; OwnerName search re-verified live). Field names dropped underscores (CAD_Reference_Number is now CADReferenceNumber)."
11278
+ notes: "Fort Bend County, Texas (Katy / Sugar Land / Missouri City, southwest Houston metro, pop. ~880K) serves parcels from a Fort Bend County GIS MapServer sourced from Fort Bend Central Appraisal District (FBCAD). Owner name is Owner_Name (the layer display field); owner mailing is Owner_Address_1/2/3 with Owner_City/Owner_State/Owner_Zip; the site address is Situs; identifiers are CAD_Reference_Number (R-number, e.g. R328356) and Property_Number. Owner search uses UPPER(Owner_Name) LIKE. Verified live 2026-05-30 (OwnerName = Shimmel John). Under Texas Tax Code \xA725.025, protected persons (peace officers, judges, family-violence victims) may have their owner/address records withheld. MIGRATED 2026-06-06: gisweb.fortbendcountytx.gov was decommissioned (Cloudflare 522) -- the public service moved to gisportal.fortbendcountytx.gov InteractiveMap/Parcels_Public/FeatureServer/1 (ArcGIS 11.3, 359,954 parcels; OwnerName search re-verified live), and at that point the field names had dropped their underscores (CADReferenceNumber, OwnerName). RENAMED BACK 2026-09-12: the same layer (the service's only layer) publishes the underscore names again (Owner_Name, CAD_Reference_Number, Property_Number, Owner_Address_1, Owner_City; 49 fields, displayField Owner_Name). The liveness probe read that rename as field-drift on 2026-09-10 and autoheal PR #632 tried to drop the five fields; nothing was removed upstream, so the fields were re-pointed at the current names and owner search re-verified live (10 rows for %SMITH%, e.g. R100208)."
11267
11279
  },
11268
11280
  {
11269
11281
  id: "tx-williamson",
package/dist/index.js CHANGED
@@ -1233,7 +1233,7 @@ var california_default = {
1233
1233
  status: "restricted",
1234
1234
  basis: {
1235
1235
  type: "county_cited_statute",
1236
- note: `Every row's OwnerName value is the literal string "Protected Per CA Gov Code 7928.205" rather than a name. The county applies the redaction server-side to the whole layer and cites that section itself. The section protects the home address of elected and appointed officials, so this is the county's own reading applied to every parcel, not a statewide rule: San Diego County publishes owner names on its public layer.`,
1236
+ note: `Every row's OwnerName value is the literal string "Protected Per CA Gov Code 7928.205" rather than a name. The county applies the redaction server-side to the whole layer and cites that section itself. The section protects the home address of elected and appointed officials, so this is the county's own reading applied to every parcel, not a statewide rule. Read narrowly, the section would cover a small number of parcels. The county applies it to every one.`,
1237
1237
  citation: "Cal. Gov. Code 7928.205",
1238
1238
  attributedTo: "San Bernardino County",
1239
1239
  sourceUrl: "https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?sectionNum=7928.205&lawCode=GOV"
@@ -1253,38 +1253,50 @@ var california_default = {
1253
1253
  hasPublicRest: true,
1254
1254
  endpoints: [
1255
1255
  {
1256
- url: "https://webmaps.sandiego.gov/arcgis/rest/services/GeocoderMerged/MapServer/1",
1256
+ url: "https://gis-public.sandiegocounty.gov/arcgis/rest/services/cosd_warehouse/parcels_all_for_public_use/MapServer/0",
1257
1257
  serviceType: "MapServer",
1258
- layerIndex: 1,
1259
- layerName: "PARCELS_ALL",
1258
+ layerIndex: 0,
1259
+ layerName: "Parcels",
1260
1260
  supportsQuery: true,
1261
1261
  corsEnabled: null,
1262
1262
  searchFields: [
1263
1263
  { name: "APN", label: "Assessor Parcel Number", searchable: true },
1264
1264
  { name: "APN_8", label: "APN (8-digit)", searchable: true },
1265
- { name: "OWN_NAME1", label: "Owner Name (Primary)", searchable: true },
1266
- { name: "OWN_NAME2", label: "Owner Name 2", searchable: true },
1267
- { name: "OWN_NAME3", label: "Owner Name 3", searchable: true },
1268
- { name: "OWN_ADDR1", label: "Owner Address 1", searchable: true },
1269
1265
  { name: "SITUS_ADDRESS", label: "Situs Street Number", searchable: true },
1270
1266
  { name: "SITUS_STREET", label: "Situs Street Name", searchable: true },
1271
- { name: "SITUS_COMMUNITY", label: "Situs Community/City", searchable: true },
1272
- { name: "SITUS_ZIP", label: "Situs ZIP", searchable: true }
1267
+ { name: "SITUS_SUFFIX", label: "Situs Street Suffix", searchable: false },
1268
+ { name: "SITUS_PRE_DIR", label: "Situs Pre-direction", searchable: false },
1269
+ { name: "SITUS_POST_DIR", label: "Situs Post-direction", searchable: false },
1270
+ { name: "SITUS_BUILDING", label: "Situs Building", searchable: false },
1271
+ { name: "SITUS_SUITE", label: "Situs Suite", searchable: false },
1272
+ { name: "SITUS_ZIP", label: "Situs ZIP", searchable: true },
1273
+ { name: "SITUS_JURIS", label: "Situs Jurisdiction Code", searchable: false },
1274
+ { name: "ACREAGE", label: "Acreage", searchable: false }
1273
1275
  ],
1274
- sampleQuery: "https://webmaps.sandiego.gov/arcgis/rest/services/GeocoderMerged/MapServer/1/query?where=UPPER(OWN_NAME1)+LIKE+UPPER('%25SMITH%25')&outFields=APN,OWN_NAME1,SITUS_ADDRESS,SITUS_STREET,SITUS_COMMUNITY,SITUS_ZIP&returnGeometry=false&f=json&resultRecordCount=10",
1276
+ sampleQuery: "https://gis-public.sandiegocounty.gov/arcgis/rest/services/cosd_warehouse/parcels_all_for_public_use/MapServer/0/query?where=APN%3D%274982603900%27&outFields=APN,APN_8,SITUS_ADDRESS,SITUS_STREET,SITUS_SUFFIX,SITUS_ZIP&returnGeometry=false&f=json&resultRecordCount=10",
1275
1277
  license: "public",
1276
- licenseUrl: "https://gis-public.sandiegocounty.gov/",
1278
+ licenseUrl: "http://web.sangis.org/Legal_Notice.htm",
1277
1279
  status: "live",
1278
- lastVerified: "2026-05-15",
1280
+ lastVerified: "2026-09-03",
1279
1281
  verifiedBy: "manual"
1280
1282
  }
1281
1283
  ],
1282
1284
  contact: {
1283
- department: "SanGIS / San Diego County GIS",
1285
+ department: "SanGIS / County of San Diego Assessor",
1284
1286
  url: "https://gis-public.sandiegocounty.gov/",
1285
1287
  email: null
1286
1288
  },
1287
- notes: "65 fields confirmed including APN, APN_8, PARCELID, OWN_NAME1/2/3, OWN_ADDR1-4, OWN_ZIP, SITUS_ADDRESS (house number), SITUS_STREET, SITUS_SUFFIX, SITUS_PRE_DIR, SITUS_POST_DIR, SITUS_BUILDING, SITUS_SUITE, SITUS_COMMUNITY, SITUS_ZIP, SITUS_JURIS, OWNEROCC, NUCLEUS_SITUS_FROM_NBR/THRU_NBR, NUCLEUS_USE_CD, NUCLEUS_ZONE_CD. Owner query tested and confirmed, OWN_NAME1 returns real names (e.g., 'SMITH MARY ANN'). The display field is OWN_NAME1. Copyright: 'SanGIS using legal recorded data provided by the County Recorders and Assessor's Office.' This is the GeocoderMerged MapServer layer 1, which combines assessor parcel data. A sibling PARCELS_ALL service exists at gis-public.sandiegocounty.gov/arcgis/rest/services/sdep_warehouse/PARCELS_ALL/MapServer but returns HTTP 403 to external callers; the webmaps.sandiego.gov endpoint is the publicly accessible equivalent."
1289
+ notes: "16 fields confirmed 2026-09-03 on the County of San Diego's public parcel layer (service copyright 'SanGIS, County of San Diego Assessor', service description 'County of San Diego Assessors Parcels (PARCELS_ALL) redacted for public use', ~1.09M rows, maxRecordCount 1000, native State Plane feet, add outSR=4326 for lon/lat): APN, APN_8, SITUS_ADDRESS (house number), SITUS_PRE_DIR, SITUS_STREET, SITUS_SUFFIX, SITUS_POST_DIR, SITUS_FRACTION, SITUS_BUILDING, SITUS_SUITE, SITUS_ZIP, SITUS_JURIS, ACREAGE, QUAL_CLASS_SHAPE and geometry. No owner name, mailing address, sale date, value or community name: the county redacts them on every public derivative. Until 2026-09-03 this entry pointed at the City of San Diego's GeocoderMerged/MapServer/1, which then served owner names (OWN_NAME1-3, OWN_ADDR1-4) and answered ArcGIS error 500 'Service GeocoderMerged/MapServer not started' from 2026-09-02 20:45Z (autoheal #581); a made-up service name on that host errored differently, so the service existed and was stopped. Probed 2026-09-17: the city service is RUNNING again, reports 56 fields, and no longer serves owner names. Asking it for OWN_NAME1/2/3 returns ArcGIS error 400 'Failed to execute query' while the identical request for APN and ASR_TOTAL returns a feature, so the field was withdrawn rather than the service being down. It still reports displayFieldName 'OWN_NAME1' in every response, so a metadata-only or liveness-only check reads this endpoint as owner-bearing and healthy. Do not restore it as the owner source on a restart signal alone: ask for the field.",
1290
+ capabilityOverrides: {
1291
+ owner_name: {
1292
+ status: "not_published",
1293
+ basis: {
1294
+ type: "endpoint_schema",
1295
+ note: "The County of San Diego's public parcel layer (cosd_warehouse/parcels_all_for_public_use) carries APN and situs address only; owner name, owner mailing address, sale date and assessed value are removed by county policy. The county's owner-attributed layer exists but its own metadata says it is not authorized for public use, so the atlas does not point at it.",
1296
+ sourceUrl: "http://web.sangis.org/Legal_Notice.htm"
1297
+ }
1298
+ }
1299
+ }
1288
1300
  },
1289
1301
  {
1290
1302
  id: "ca-santa-clara",
@@ -7804,7 +7816,7 @@ var new_york_default = {
7804
7816
  lastUpdated: "2026-05-14",
7805
7817
  counties: [
7806
7818
  {
7807
- id: "ny-new-york",
7819
+ id: "ny-bronx",
7808
7820
  state: "NY",
7809
7821
  stateName: "New York",
7810
7822
  stateSlug: "new-york",
@@ -8070,7 +8082,7 @@ var new_york_default = {
8070
8082
  notes: "54 fields confirmed. Includes PIN (21-char unique parcel ID), SBL (section-block-lot key), OWNER1, OWNER2, mailing address (MAILAD1/MAILAD2), property address (STREET, CITY, ZIP, ZIP4), property class (CLASS), property type/description, school district (SCHOOL, SCHL_DIST), SWIS code, lot dimensions (FRONT, DEPTH), acreage (ASSESSACRE, CALCACRES). Owner query tested and confirmed: UPPER(OWNER1) LIKE UPPER('%SMITH%') returns real residential parcels. This is the 2023 vintage Erie County parcel dataset. Erie County, NY is the Buffalo metropolitan area (FIPS 36029)."
8071
8083
  },
8072
8084
  {
8073
- id: "ny-new-york",
8085
+ id: "ny-kings",
8074
8086
  state: "NY",
8075
8087
  stateName: "New York",
8076
8088
  stateSlug: "new-york",
@@ -8575,7 +8587,7 @@ var new_york_default = {
8575
8587
  capabilityOverrides: null
8576
8588
  },
8577
8589
  {
8578
- id: "ny-new-york",
8590
+ id: "ny-queens",
8579
8591
  state: "NY",
8580
8592
  stateName: "New York",
8581
8593
  stateSlug: "new-york",
@@ -8732,7 +8744,7 @@ var new_york_default = {
8732
8744
  notes: "Queens is served by the same citywide MAPPLUTO layer as the other four boroughs; the registry scopes this county to Borough='QN' so an owner search here does not return another borough's parcels. Address lookups are scoped by geography already."
8733
8745
  },
8734
8746
  {
8735
- id: "ny-new-york",
8747
+ id: "ny-richmond",
8736
8748
  state: "NY",
8737
8749
  stateName: "New York",
8738
8750
  stateSlug: "new-york",
@@ -10620,9 +10632,9 @@ var south_carolina_default = {
10620
10632
  hasPublicRest: true,
10621
10633
  endpoints: [
10622
10634
  {
10623
- url: "https://gisccapps.charlestoncounty.org/arcgis/rest/services/GIS_VIEWER/New_Parcel_Search/MapServer/61",
10635
+ url: "https://gisccapps.charlestoncounty.org/arcgis/rest/services/GIS_VIEWER/New_Parcel_Search/MapServer/4",
10624
10636
  serviceType: "MapServer",
10625
- layerIndex: 61,
10637
+ layerIndex: 4,
10626
10638
  layerName: "Parcels",
10627
10639
  supportsQuery: true,
10628
10640
  corsEnabled: null,
@@ -10639,11 +10651,11 @@ var south_carolina_default = {
10639
10651
  { name: "LEGAL_DESCR", label: "Legal Description", searchable: false },
10640
10652
  { name: "SUBDIVISION", label: "Subdivision", searchable: false }
10641
10653
  ],
10642
- sampleQuery: "https://gisccapps.charlestoncounty.org/arcgis/rest/services/GIS_VIEWER/New_Parcel_Search/MapServer/61/query?where=UPPER(OWNER1)+LIKE+UPPER(%27%25SMITH%25%27)&outFields=PID,OWNER1,OWNER2,MAIL_ST_NAME&returnGeometry=false&f=json&resultRecordCount=10",
10654
+ sampleQuery: "https://gisccapps.charlestoncounty.org/arcgis/rest/services/GIS_VIEWER/New_Parcel_Search/MapServer/4/query?where=UPPER(OWNER1)+LIKE+UPPER(%27%25SMITH%25%27)&outFields=PID,OWNER1,OWNER2,MAIL_ST_NAME&returnGeometry=false&f=json&resultRecordCount=10",
10643
10655
  license: "public",
10644
10656
  licenseUrl: "https://charleston-county-gis-chascogis.hub.arcgis.com/",
10645
10657
  status: "live",
10646
- lastVerified: "2026-06-06",
10658
+ lastVerified: "2026-09-17",
10647
10659
  verifiedBy: "manual"
10648
10660
  }
10649
10661
  ],
@@ -10652,7 +10664,7 @@ var south_carolina_default = {
10652
10664
  url: "https://charleston-county-gis-chascogis.hub.arcgis.com/",
10653
10665
  email: null
10654
10666
  },
10655
- notes: 'Charleston County (pop. 430,000; includes Charleston, North Charleston, Mount Pleasant) Parcel_Search MapServer layer 4. This layer is a spatial join of parcel geometry (FEATURES.SDE.P_POLY_PARCEL) with CAMA assessor data (FEATURES.SDE.CAMA), so field names are fully qualified with schema prefix. 20 fields confirmed: PID, GPIN, ACRES_CAL, OWNER1/2, TAX_DISTRICT, CLASS_CODE, MAIL_ST_NO/ST_NAME/ST_TYPE, MAIL_2ND_ADDR/ADDT, MAIL_CITY/STATE/ZIP/COUNTRY, LEGAL_DESCR, SUBDIVISION. IMPORTANT: field names in WHERE clause must be double-quoted due to dot notation (e.g., UPPER("FEATURES.SDE.CAMA.OWNER1") LIKE ...). Verified 2026-05-15: SMITH returns Edisto Island and Spring City area addresses. MIGRATED 2026-06-06: GIS_VIEWER/Parcel_Search/MapServer/4 was retired (ArcGIS 404) -- parcels now at GIS_VIEWER/New_Parcel_Search/MapServer/61 (197,306 parcels; OWNER1 search re-verified live). Field names are unqualified on the new layer (PID, OWNER1, ...); the FEATURES.SDE.* prefixes no longer apply and GPIN is not in the new schema.'
10667
+ notes: "Charleston County (pop. 430,000; includes Charleston, North Charleston, Mount Pleasant). Parcels live on GIS_VIEWER/New_Parcel_Search/MapServer layer 4. Field names are unqualified (PID, OWNER1, ...); the FEATURES.SDE.* prefixes an older revision of this entry described no longer apply, and neither GPIN nor ACRES_CAL exists here. Layer 4 carries 27 fields, including several the registry does not map: ACREAGE, CLASS_CODE, DEED_BOOK_PAGE, PLAT_BOOK_PAGE, SALE_PRICE, RECORDED_DATE and DOC_DATE. WATCH THIS COUNTY: it has now renumbered its parcel layer twice. 2026-06-06 moved Parcel_Search/4 to New_Parcel_Search/61 after the old service 404'd; 2026-09-17 moved it again to New_Parcel_Search/4, which is why the endpoint sat down with last_ok_at null. Both times the service name and the field names survived and only the layer index changed, so an index-only drift check would catch the next one. Re-verified live 2026-09-17: layer 61 answers ArcGIS error 404 'Layer not found' while layer 4 returns features for both query shapes the tool sends, UPPER(OWNER1) LIKE and PID LIKE."
10656
10668
  }
10657
10669
  ]
10658
10670
  };
@@ -11241,18 +11253,18 @@ var texas_default = {
11241
11253
  supportsQuery: true,
11242
11254
  corsEnabled: null,
11243
11255
  searchFields: [
11244
- { name: "CADReferenceNumber", label: "CAD Reference Number (R-number)", searchable: true },
11245
- { name: "PropertyNumber", label: "Property Number", searchable: true },
11246
- { name: "OwnerName", label: "Owner Name", searchable: true },
11256
+ { name: "CAD_Reference_Number", label: "CAD Reference Number (R-number)", searchable: true },
11257
+ { name: "Property_Number", label: "Property Number", searchable: true },
11258
+ { name: "Owner_Name", label: "Owner Name", searchable: true },
11247
11259
  { name: "Situs", label: "Situs Address", searchable: true },
11248
- { name: "OwnerAddress1", label: "Owner Mailing Address", searchable: false },
11249
- { name: "OwnerCity", label: "Owner City", searchable: false }
11260
+ { name: "Owner_Address_1", label: "Owner Mailing Address", searchable: false },
11261
+ { name: "Owner_City", label: "Owner City", searchable: false }
11250
11262
  ],
11251
- sampleQuery: "https://gisportal.fortbendcountytx.gov/arcgis/rest/services/InteractiveMap/Parcels_Public/FeatureServer/1/query?where=UPPER(OwnerName)%20LIKE%20UPPER('%25SMITH%25')&outFields=CADReferenceNumber,OwnerName,Situs&returnGeometry=false&f=json&resultRecordCount=10",
11263
+ sampleQuery: "https://gisportal.fortbendcountytx.gov/arcgis/rest/services/InteractiveMap/Parcels_Public/FeatureServer/1/query?where=UPPER(Owner_Name)%20LIKE%20UPPER('%25SMITH%25')&outFields=CAD_Reference_Number,Owner_Name,Situs&returnGeometry=false&f=json&resultRecordCount=10",
11252
11264
  license: "public",
11253
11265
  licenseUrl: "https://fbcad-open-data-hub-fortbend.hub.arcgis.com/",
11254
11266
  status: "live",
11255
- lastVerified: "2026-06-06",
11267
+ lastVerified: "2026-09-12",
11256
11268
  verifiedBy: "manual"
11257
11269
  }
11258
11270
  ],
@@ -11261,7 +11273,7 @@ var texas_default = {
11261
11273
  url: "https://www.fbcad.org/",
11262
11274
  email: null
11263
11275
  },
11264
- notes: "Fort Bend County, Texas (Katy / Sugar Land / Missouri City, southwest Houston metro, pop. ~880K) serves parcels from a Fort Bend County GIS MapServer sourced from Fort Bend Central Appraisal District (FBCAD). Owner name is OwnerName (the layer display field); owner mailing is OwnerAddress1/2/3 with OwnerCity/OwnerState/OwnerZip; the site address is Situs; identifiers are CAD_Reference_Number (R-number, e.g. R328356) and PropertyNumber. Owner search uses UPPER(OwnerName) LIKE. Verified live 2026-05-30 (OwnerName = Shimmel John). Under Texas Tax Code \xA725.025, protected persons (peace officers, judges, family-violence victims) may have their owner/address records withheld. MIGRATED 2026-06-06: gisweb.fortbendcountytx.gov was decommissioned (Cloudflare 522) -- the public service moved to gisportal.fortbendcountytx.gov InteractiveMap/Parcels_Public/FeatureServer/1 (ArcGIS 11.3, 359,954 parcels; OwnerName search re-verified live). Field names dropped underscores (CAD_Reference_Number is now CADReferenceNumber)."
11276
+ notes: "Fort Bend County, Texas (Katy / Sugar Land / Missouri City, southwest Houston metro, pop. ~880K) serves parcels from a Fort Bend County GIS MapServer sourced from Fort Bend Central Appraisal District (FBCAD). Owner name is Owner_Name (the layer display field); owner mailing is Owner_Address_1/2/3 with Owner_City/Owner_State/Owner_Zip; the site address is Situs; identifiers are CAD_Reference_Number (R-number, e.g. R328356) and Property_Number. Owner search uses UPPER(Owner_Name) LIKE. Verified live 2026-05-30 (OwnerName = Shimmel John). Under Texas Tax Code \xA725.025, protected persons (peace officers, judges, family-violence victims) may have their owner/address records withheld. MIGRATED 2026-06-06: gisweb.fortbendcountytx.gov was decommissioned (Cloudflare 522) -- the public service moved to gisportal.fortbendcountytx.gov InteractiveMap/Parcels_Public/FeatureServer/1 (ArcGIS 11.3, 359,954 parcels; OwnerName search re-verified live), and at that point the field names had dropped their underscores (CADReferenceNumber, OwnerName). RENAMED BACK 2026-09-12: the same layer (the service's only layer) publishes the underscore names again (Owner_Name, CAD_Reference_Number, Property_Number, Owner_Address_1, Owner_City; 49 fields, displayField Owner_Name). The liveness probe read that rename as field-drift on 2026-09-10 and autoheal PR #632 tried to drop the five fields; nothing was removed upstream, so the fields were re-pointed at the current names and owner search re-verified live (10 rows for %SMITH%, e.g. R100208)."
11265
11277
  },
11266
11278
  {
11267
11279
  id: "tx-williamson",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@urbankitstudio/atlas",
3
- "version": "0.6.2",
3
+ "version": "0.6.4",
4
4
  "description": "JS SDK for the UrbanKit County Parcel REST API Atlas: 171 counties across all 50 US states, 174 verified public ArcGIS REST endpoints for county parcel data, with searchable field metadata, sample queries and license info.",
5
5
  "keywords": [
6
6
  "parcel",
@@ -12,18 +12,19 @@
12
12
  "api",
13
13
  "geojson",
14
14
  "featureserver",
15
- "mapserver"
15
+ "mapserver",
16
+ "real-estate",
17
+ "property"
16
18
  ],
17
19
  "homepage": "https://urbankitstudio.com/parcel-atlas",
18
20
  "repository": {
19
21
  "type": "git",
20
- "url": "git+https://github.com/LEOyrh/urbankitstudio.git",
21
- "directory": "packages/atlas"
22
+ "url": "git+https://github.com/urbankitstudio/atlas.git"
22
23
  },
23
24
  "bugs": {
24
- "url": "https://github.com/LEOyrh/urbankitstudio/issues"
25
+ "url": "https://github.com/urbankitstudio/atlas/issues"
25
26
  },
26
- "author": "Leo Yong <leoyrhbiz@gmail.com>",
27
+ "author": "UrbanKit Studio <urbankitstudio@gmail.com>",
27
28
  "license": "MIT",
28
29
  "type": "module",
29
30
  "main": "./dist/index.cjs",
@@ -55,6 +56,7 @@
55
56
  "prepublishOnly": "npm run typecheck && npm run test && npm run build"
56
57
  },
57
58
  "devDependencies": {
59
+ "@types/node": "^26.0.0",
58
60
  "tsup": "^8.3.5",
59
61
  "typescript": "^5.8.3",
60
62
  "vitest": "^4.1.10"