@urbankitstudio/atlas 0.6.11 → 0.6.13

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
@@ -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 **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.
137
+ The atlas bundles **241 counties across all 50 US states and DC** (253 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 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.
139
+ Every state has at least one county on record, and 235 of the 241 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/index.json CHANGED
@@ -3,9 +3,9 @@
3
3
  "lastUpdated": "2026-10-03",
4
4
  "totals": {
5
5
  "states": 51,
6
- "counties": 239,
7
- "endpoints": 251,
8
- "countiesWithEndpoint": 233,
6
+ "counties": 241,
7
+ "endpoints": 253,
8
+ "countiesWithEndpoint": 235,
9
9
  "countiesUnprobeable": 1
10
10
  },
11
11
  "states": [
@@ -197,8 +197,8 @@
197
197
  "slug": "minnesota",
198
198
  "name": "Minnesota",
199
199
  "abbrev": "MN",
200
- "countyCount": 2,
201
- "endpointCount": 2,
200
+ "countyCount": 3,
201
+ "endpointCount": 3,
202
202
  "populated": true
203
203
  },
204
204
  {
@@ -213,8 +213,8 @@
213
213
  "slug": "missouri",
214
214
  "name": "Missouri",
215
215
  "abbrev": "MO",
216
- "countyCount": 2,
217
- "endpointCount": 2,
216
+ "countyCount": 3,
217
+ "endpointCount": 3,
218
218
  "populated": true
219
219
  },
220
220
  {
@@ -111,11 +111,16 @@
111
111
  "layerIndex": 15,
112
112
  "layerName": "Property Information [Parcels]",
113
113
  "supportsQuery": true,
114
- "corsEnabled": null,
114
+ "corsEnabled": true,
115
115
  "searchFields": [
116
+ {
117
+ "name": "PARID",
118
+ "label": "Parcel ID (PARID, per unit)",
119
+ "searchable": true
120
+ },
116
121
  {
117
122
  "name": "PARCELID",
118
- "label": "Parcel ID",
123
+ "label": "GeoPIN (lot id, shared by condo units)",
119
124
  "searchable": true
120
125
  },
121
126
  {
@@ -182,19 +187,15 @@
182
187
  "name": "SQUARE",
183
188
  "label": "Square",
184
189
  "searchable": false
185
- },
186
- {
187
- "name": "PARID",
188
- "label": "Parcel Account ID",
189
- "searchable": true
190
190
  }
191
191
  ],
192
- "sampleQuery": "https://gis.nola.gov/arcgis/rest/services/apps/property3/MapServer/15/query?where=PARCELID+IS+NOT+NULL&outFields=PARCELID,OWNERNME1,SITEADDRESS,PSTLADDRESS,PSTLCITY&returnGeometry=false&f=json&resultRecordCount=5",
192
+ "sampleQuery": "https://gis.nola.gov/arcgis/rest/services/apps/property3/MapServer/15/query?where=PARCELID%3D%2741033176%27&outFields=*&returnGeometry=false&f=json&resultRecordCount=1",
193
193
  "license": "public",
194
194
  "licenseUrl": "https://gis.nola.gov/",
195
- "status": "unreachable",
196
- "lastVerified": "2026-08-29",
197
- "verifiedBy": "manual"
195
+ "status": "live",
196
+ "lastVerified": "2026-10-03",
197
+ "verifiedBy": "manual",
198
+ "attributeSearch": "unsupported"
198
199
  }
199
200
  ],
200
201
  "contact": {
@@ -202,7 +203,7 @@
202
203
  "url": "https://gis.nola.gov/",
203
204
  "email": null
204
205
  },
205
- "notes": "MARKED UNREACHABLE 2026-08-29. Layer 15 metadata answers and lists PARCELID, OWNERNME1, SITEADDRESS, PSTLADDRESS, but ANY query that names those columns in outFields returns ArcGIS 400 \"Failed to execute query\" in ~250 ms (measured 2026-08-29: PARCELID IS NOT NULL, 1=1, OBJECTID=1 and a 30 m spatial query all fail with specific outFields). outFields=* succeeds and takes 27-44 s; even outFields=OBJECTID took 27.5 s. The enrich pipeline requests specific columns, so every paid lookup here fails and refunds; the liveness probe sends the declared sampleQuery and fails the same way, which is why this parish has never once probed ok (463 consecutive failures). Layers 0-14 of the same service are zoning, overlays and address points, not parcels, and ArcGIS Hub lists no city-owned parcel feature service. County-side defect; nothing to re-point to. Liveness keeps watching. Prior notes: Orleans Parish's public parcel layer still serves metadata, but its attribute-query operation is currently failing on the county's ArcGIS server. Owner and address searches are unavailable while the county repairs the service; automatic probes continue to check for recovery. New Orleans uses Square/Lot identifiers for legal parcels. The city also publishes a weekly situs-and-geometry dataset on data.nola.gov, but it does not include owner names. An older 2018 parcel snapshot was not substituted because its ownership data is dated and the service was unstable during verification. LIVENESS 2026-08-04: the layer's metadata still loads, but EVERY query against it times out, including a bare returnCountOnly count. 161 consecutive failed checks and last_ok_at has never been set. This is a county-side outage, not a schema drift; there is nothing to fix on our side and the endpoint stays honestly degraded until New Orleans repairs it."
206
+ "notes": "LIVE 2026-10-03 for lookup by location in clients that complete the TLS chain (see TLS below); no attribute search. Layer 15 refuses any query that NAMES its outFields except an exact PARCELID equality: measured 2026-10-03 on the paid shapes (point + 30 m buffer; 800 m envelope with geometry) and on a scan (OBJECTID>0, resultRecordCount=1), every named column list answers HTTP 200 carrying ArcGIS error 400 \"Failed to execute query.\" in about 0.2 s, while the identical request with outFields=* answers 40 features in 0.28 s and 501 features (957 KB) in 0.65 s. UrbanKit sends outFields=* to this layer (api/_lib/arcgis-quirks.ts, WILDCARD_OUT_FIELDS) and keeps only the role columns. Any predicate that scans the table (1=1, OBJECTID>0, PARCELID IS NOT NULL, an owner LIKE) runs past 40 s even for a single row, so no where-clause search is offered (attributeSearch: unsupported) and owner-name lookup is not available here; the owner columns (OWNERNME1, OWNERNME2) and the mailing address (PSTLADDRESS, PSTLCITY, PSTLSTATE, PSTLZIP5) are returned on every spatial hit (a UrbanKit row keeps PSTLADDRESS, the street line). IDS: PARID is the assessor's per-unit parcel id (e.g. 622-SALEXANDERST) and is listed first so rows key by unit; PARCELID is the GeoPIN, a lot id shared by every condo unit on the lot (a 30 m buffer in the CBD: 40 units, 3 lots, 39 owners), so keying on it would collapse a notice list to one row per lot; TAXBILLID is the tax bill number. Exact PARCELID equality answers in 0.2 s and is the sample query, which is also the predicate the liveness probe falls back to when its first shape (1=1) times out. CORS reflects the request origin. TLS: the server sends an INCOMPLETE certificate chain (leaf without its Sectigo intermediate). Clients that fetch the missing intermediate themselves (curl on Windows, Chromium and Safari through the OS store) connect; Node's fetch fails the handshake with UNABLE_TO_VERIFY_LEAF_SIGNATURE (measured 2026-10-04). UrbanKit's billed bulk-enrichment and radius paths run on Vercel's Edge runtime, which cannot be given a certificate authority and whose handling of an incomplete chain is undocumented and not yet measured, so assume they cannot serve this parish until a keyed test on the deployed function shows otherwise; today an Orleans row ends county-unavailable and is refunded, unchanged from before. The liveness probe pins the intermediate, so its ok reflects the layer, not the paid paths. An agent that fetches this URL from Node must trust the Sectigo intermediate or the request fails before any query runs. Tracked in GitHub issue #906. HISTORY: marked unreachable 2026-08-29 after 463 consecutive failed probes whose predicate (PARCELID IS NOT NULL) is a table scan; the layer was answering spatial queries the whole time. Ownership data looked dated during the 2026-08 checks; the 2026-10-03 rows carry current-looking owner names."
206
207
  }
207
208
  ]
208
209
  }
@@ -2,7 +2,7 @@
2
2
  "stateSlug": "minnesota",
3
3
  "stateName": "Minnesota",
4
4
  "stateAbbrev": "MN",
5
- "lastUpdated": "2026-06-06",
5
+ "lastUpdated": "2026-10-03",
6
6
  "counties": [
7
7
  {
8
8
  "id": "mn-ramsey",
@@ -166,6 +166,50 @@
166
166
  "email": null
167
167
  },
168
168
  "notes": "448,036 polygon parcels covering Minneapolis and the rest of Hennepin County. Verified 2026-05-11: UPPER(OWNER_NM) LIKE '%SMITH%' returns real owners (e.g., 'ALEX D SMITH', 'PAUL LOUIS SMITH'). Owner names are space-padded fixed-width, wrap searches in UPPER() and trim whitespace client-side. Full residential address columns present (HOUSE_NO, FRAC_HOUSE_NO, STREET_NM, MAILING_MUNIC_NM, ZIP_CD). PID is 13-digit composite (parcel-fragment-municipality-section). TORRENS_TYP flag distinguishes Torrens vs. Abstract land per Minnesota's dual-title system. OUTAGE RESOLVED 2026-06-06: the 2026-05 county-side outage cleared -- service re-verified live (448,083 parcels; OWNER_NM queries return real owners)."
169
+ },
170
+ {
171
+ "id": "mn-mille-lacs",
172
+ "state": "MN",
173
+ "stateName": "Minnesota",
174
+ "stateSlug": "minnesota",
175
+ "county": "Mille Lacs",
176
+ "countySlug": "mille-lacs-county",
177
+ "countyFips": "27095",
178
+ "hasPublicRest": true,
179
+ "endpoints": [
180
+ {
181
+ "url": "https://gis.co.mille-lacs.mn.us/arcgis/rest/services/MilleLacs_Public_101/MapServer/35",
182
+ "serviceType": "MapServer",
183
+ "layerIndex": 35,
184
+ "layerName": "Parcels",
185
+ "supportsQuery": true,
186
+ "corsEnabled": true,
187
+ "searchFields": [
188
+ { "name": "TAXPAYER_NAME", "label": "Taxpayer Name", "searchable": true },
189
+ { "name": "PARCELID", "label": "Parcel Number", "searchable": true },
190
+ { "name": "PROPERTY_ADDRESS", "label": "Property Address", "searchable": true },
191
+ { "name": "PROPERTY_ZIP", "label": "Property ZIP", "searchable": false },
192
+ { "name": "CITY_TWP_NAME", "label": "City/Township Name", "searchable": true },
193
+ { "name": "TAXPAYER_ADDRESS_1", "label": "Taxpayer Mailing Address 1", "searchable": true },
194
+ { "name": "TAXPAYER_ADDRESS_2", "label": "Taxpayer Mailing Address 2", "searchable": false },
195
+ { "name": "TAXPAYER_ADDRESS_3", "label": "Taxpayer Mailing Address 3", "searchable": false },
196
+ { "name": "TAXPAYER_ADDRESS_4", "label": "Taxpayer Mailing Address 4", "searchable": false },
197
+ { "name": "DEEDED_ACRES", "label": "Deeded Acres", "searchable": false }
198
+ ],
199
+ "sampleQuery": "https://gis.co.mille-lacs.mn.us/arcgis/rest/services/MilleLacs_Public_101/MapServer/35/query?where=UPPER(TAXPAYER_NAME)%20LIKE%20%27%25SMITH%25%27&outFields=PARCELID,TAXPAYER_NAME,PROPERTY_ADDRESS,TAXPAYER_ADDRESS_1,CITY_TWP_NAME&returnGeometry=false&resultRecordCount=10&f=json",
200
+ "license": "unknown",
201
+ "licenseUrl": "https://www.millelacs.mn.gov/",
202
+ "status": "live",
203
+ "lastVerified": "2026-10-03",
204
+ "verifiedBy": "manual"
205
+ }
206
+ ],
207
+ "contact": {
208
+ "department": "Mille Lacs County GIS / Assessor's Office",
209
+ "url": "https://www.millelacs.mn.gov/1185/Assessors-Office",
210
+ "email": null
211
+ },
212
+ "notes": "Mille Lacs County, Minnesota (county seat Milaca) publishes its parcels on its own ArcGIS Server 11.3 as MilleLacs_Public_101/MapServer layer 35 (Parcels), 20,083 rows with a taxpayer name on 2026-10-03. THE OWNER IS IN TAXPAYER_NAME, stored LAST/FIRST with a slash (SMITH/BRIAN & ASHLEY). A column called OWNER_NAME exists but is an empty string on about 97 percent of rows (544 of 20,083 populated on 2026-10-03; not NULL, so IS NOT NULL passes while the value is blank), and where it is populated it names a different party from TAXPAYER_NAME (a contract-for-deed holder or an LLC, for example), so the taxpayer is not always the owner of record. UPPER(OWNER_NAME) LIKE 'SMITH%' returns 0 features. OWNER_NAME is deliberately NOT listed as a search field here: the enrichment classifier takes the first owner-looking field, so listing it would route owner lookups to a mostly blank column. The mailing address is TAXPAYER_ADDRESS_1 to _4 (use _1 for the street); the matching OWNER_ADDRESS_1 to _4 columns were not checked. The site address is PROPERTY_ADDRESS with PROPERTY_ZIP and CITY_TWP_NAME. Search with UPPER(TAXPAYER_NAME) LIKE '%SMITH%'. maxRecordCount is 2000. CORS reflects the request Origin (Access-Control-Allow-Origin echoed back, credentials true), and named outFields work. No license text was found. Do not use the statewide Minnesota parcel layers for owner search: the DNR plan_parcels_minnesota layer has owner_name but no county, parcel id or address field, so a query bleeds into neighbouring counties, and the MnGeo plan_parcels_open layer filters by co_code 27095 (20,928 rows) but its owner_name is blank for all but 550 rows (control: Itasca 27061, 0 populated). The same county server also lists Assessors/TaxParcels/MapServer/0, which has only a parcel name and geometry. Verified live 2026-10-03: taxpayer SMITH returned rows (first SMITH/BRIAN & ASHLEY, parcel 11-010-0100, 17903 130TH AVE, Milaca Township)."
169
213
  }
170
214
  ]
171
215
  }
@@ -2,7 +2,7 @@
2
2
  "stateSlug": "missouri",
3
3
  "stateName": "Missouri",
4
4
  "stateAbbrev": "MO",
5
- "lastUpdated": "2026-06-20",
5
+ "lastUpdated": "2026-10-03",
6
6
  "counties": [
7
7
  {
8
8
  "id": "mo-jackson",
@@ -94,6 +94,49 @@
94
94
  "email": null
95
95
  },
96
96
  "notes": "St. Louis County MO (St. Louis metro west/south, county seat Clayton, NOT the independent City of St. Louis) provides AGS_Parcels/MapServer/0 with 30+ fields: LOCATOR (parcel ID), PARENT_LOC, TAXYR, OWNER_NAME, PROP_ADRNUM, PROP_ADD, PROP_ZIP, OWN_ADD, OWN_CITY, OWN_STATE, OWN_ZIP, SCHSUB (school subdivision), MUNYCODE (municipality code), TAXCODE, ASSTIMPVAL, TOTASSMT, APPLANDVAL, APPIMPVAL, TOTAPVAL, PROPCLASS, LUC, LANDUSE2, LUCODE, TENURE, BLDGNAME, TWPNAME. Query confirmed live: UPPER(OWNER_NAME) LIKE '%SMITH%' returns real results (e.g., 'SMITH KIMBERLY & ANTHONY T/E' at '11041 LILAC AVE'). St. Louis County MO (FIPS 29189) is a separate entity from the City of St. Louis (FIPS 29510, an independent city not part of any county). The GeoData portal at data-stlcogis.opendata.arcgis.com provides open data downloads and GeoServices API links. The maps.stlouisco.com server is the live REST host."
97
+ },
98
+ {
99
+ "id": "mo-st-louis-city",
100
+ "state": "MO",
101
+ "stateName": "Missouri",
102
+ "stateSlug": "missouri",
103
+ "county": "St. Louis city",
104
+ "countySlug": "st-louis-city",
105
+ "countyFips": "29510",
106
+ "hasPublicRest": true,
107
+ "endpoints": [
108
+ {
109
+ "url": "https://maps8.stlouis-mo.gov/arcgis/rest/services/ASSESSOR/Assessor_Public_Parcels/MapServer/11",
110
+ "serviceType": "MapServer",
111
+ "layerIndex": 11,
112
+ "layerName": "Parcels",
113
+ "supportsQuery": true,
114
+ "corsEnabled": false,
115
+ "searchFields": [
116
+ { "name": "OwnerName", "label": "Owner Name", "searchable": true },
117
+ { "name": "OwnerName2", "label": "Owner Name 2", "searchable": false },
118
+ { "name": "ParcelId", "label": "Parcel ID", "searchable": true },
119
+ { "name": "SITEADDR", "label": "Site Address", "searchable": true },
120
+ { "name": "OwnerAddr", "label": "Owner Mailing Address", "searchable": true },
121
+ { "name": "OwnerCity", "label": "Owner Mailing City", "searchable": false },
122
+ { "name": "OwnerState", "label": "Owner Mailing State", "searchable": false },
123
+ { "name": "OwnerZIP", "label": "Owner Mailing ZIP", "searchable": false },
124
+ { "name": "ZIP", "label": "Site ZIP", "searchable": false }
125
+ ],
126
+ "sampleQuery": "https://maps8.stlouis-mo.gov/arcgis/rest/services/ASSESSOR/Assessor_Public_Parcels/MapServer/11/query?where=UPPER(OwnerName)%20LIKE%20%27SMITH%25%27&outFields=ParcelId,OwnerName,OwnerAddr,OwnerCity,SITEADDR&returnGeometry=false&resultRecordCount=10&f=json",
127
+ "license": "unknown",
128
+ "licenseUrl": "https://www.stlouis-mo.gov/data/parcels.cfm",
129
+ "status": "live",
130
+ "lastVerified": "2026-10-03",
131
+ "verifiedBy": "manual"
132
+ }
133
+ ],
134
+ "contact": {
135
+ "department": "City of St. Louis Assessor's Office",
136
+ "url": "https://www.stlouis-mo.gov/data/parcels.cfm",
137
+ "email": null
138
+ },
139
+ "notes": "City of St. Louis, Missouri (FIPS 29510) is an independent city that belongs to no county, and it is NOT St. Louis County (29189, a separate record in this file on a different server). The Assessor's public parcels layer is ASSESSOR/Assessor_Public_Parcels/MapServer layer 11 (Parcels) on ArcGIS Server 11.2, listed on the city's data page. SERVER-SIDE ONLY: the server sends Access-Control-Allow-Origin only to its own origin (www.stlouis-mo.gov); for any other Origin a GET and its preflight return only Vary: Origin and Access-Control-Allow-Private-Network: true, so a browser on another site cannot read it and corsEnabled is false. Query it from a server, the metered API or the MCP, not from page script. The owner is OwnerName (max 40 characters, so long names are truncated at the source) with OwnerName2; the mailing address is OwnerAddr plus OwnerCity (max 13 characters, can read ST LOUIS MO) with OwnerState, OwnerZIP and OwnerCountry; the parcel id is ParcelId (11 digits, LowerParcelId also exists). SITEADDR carries runs of internal spaces (2233 PARK AV) and trailing padding, so a LIKE on a full street string misses; search on the house number plus a street word, or collapse whitespace on the client. Search with UPPER(OwnerName) LIKE 'SMITH%'; broad searches return exceededTransferLimit true at the 2000-row page. The layer has 194 fields and this record lists a subset. Layer 11 includes condominium master parcels, and the sub-accounts are layer 10 (not examined). No license or terms text is published on the data page. Verified live 2026-10-03: owner SMITH returned rows (first SMITH, DAVID E & SANDRA L TRS, parcel 22669130000, 2233 PARK AVE)."
97
140
  }
98
141
  ]
99
142
  }
package/dist/index.cjs CHANGED
@@ -18,9 +18,9 @@ var data_default = {
18
18
  lastUpdated: "2026-10-03",
19
19
  totals: {
20
20
  states: 51,
21
- counties: 239,
22
- endpoints: 251,
23
- countiesWithEndpoint: 233,
21
+ counties: 241,
22
+ endpoints: 253,
23
+ countiesWithEndpoint: 235,
24
24
  countiesUnprobeable: 1
25
25
  },
26
26
  states: [
@@ -212,8 +212,8 @@ var data_default = {
212
212
  slug: "minnesota",
213
213
  name: "Minnesota",
214
214
  abbrev: "MN",
215
- countyCount: 2,
216
- endpointCount: 2,
215
+ countyCount: 3,
216
+ endpointCount: 3,
217
217
  populated: true
218
218
  },
219
219
  {
@@ -228,8 +228,8 @@ var data_default = {
228
228
  slug: "missouri",
229
229
  name: "Missouri",
230
230
  abbrev: "MO",
231
- countyCount: 2,
232
- endpointCount: 2,
231
+ countyCount: 3,
232
+ endpointCount: 3,
233
233
  populated: true
234
234
  },
235
235
  {
@@ -14228,11 +14228,16 @@ var louisiana_default = {
14228
14228
  layerIndex: 15,
14229
14229
  layerName: "Property Information [Parcels]",
14230
14230
  supportsQuery: true,
14231
- corsEnabled: null,
14231
+ corsEnabled: true,
14232
14232
  searchFields: [
14233
+ {
14234
+ name: "PARID",
14235
+ label: "Parcel ID (PARID, per unit)",
14236
+ searchable: true
14237
+ },
14233
14238
  {
14234
14239
  name: "PARCELID",
14235
- label: "Parcel ID",
14240
+ label: "GeoPIN (lot id, shared by condo units)",
14236
14241
  searchable: true
14237
14242
  },
14238
14243
  {
@@ -14299,19 +14304,15 @@ var louisiana_default = {
14299
14304
  name: "SQUARE",
14300
14305
  label: "Square",
14301
14306
  searchable: false
14302
- },
14303
- {
14304
- name: "PARID",
14305
- label: "Parcel Account ID",
14306
- searchable: true
14307
14307
  }
14308
14308
  ],
14309
- sampleQuery: "https://gis.nola.gov/arcgis/rest/services/apps/property3/MapServer/15/query?where=PARCELID+IS+NOT+NULL&outFields=PARCELID,OWNERNME1,SITEADDRESS,PSTLADDRESS,PSTLCITY&returnGeometry=false&f=json&resultRecordCount=5",
14309
+ sampleQuery: "https://gis.nola.gov/arcgis/rest/services/apps/property3/MapServer/15/query?where=PARCELID%3D%2741033176%27&outFields=*&returnGeometry=false&f=json&resultRecordCount=1",
14310
14310
  license: "public",
14311
14311
  licenseUrl: "https://gis.nola.gov/",
14312
- status: "unreachable",
14313
- lastVerified: "2026-08-29",
14314
- verifiedBy: "manual"
14312
+ status: "live",
14313
+ lastVerified: "2026-10-03",
14314
+ verifiedBy: "manual",
14315
+ attributeSearch: "unsupported"
14315
14316
  }
14316
14317
  ],
14317
14318
  contact: {
@@ -14319,7 +14320,7 @@ var louisiana_default = {
14319
14320
  url: "https://gis.nola.gov/",
14320
14321
  email: null
14321
14322
  },
14322
- notes: `MARKED UNREACHABLE 2026-08-29. Layer 15 metadata answers and lists PARCELID, OWNERNME1, SITEADDRESS, PSTLADDRESS, but ANY query that names those columns in outFields returns ArcGIS 400 "Failed to execute query" in ~250 ms (measured 2026-08-29: PARCELID IS NOT NULL, 1=1, OBJECTID=1 and a 30 m spatial query all fail with specific outFields). outFields=* succeeds and takes 27-44 s; even outFields=OBJECTID took 27.5 s. The enrich pipeline requests specific columns, so every paid lookup here fails and refunds; the liveness probe sends the declared sampleQuery and fails the same way, which is why this parish has never once probed ok (463 consecutive failures). Layers 0-14 of the same service are zoning, overlays and address points, not parcels, and ArcGIS Hub lists no city-owned parcel feature service. County-side defect; nothing to re-point to. Liveness keeps watching. Prior notes: Orleans Parish's public parcel layer still serves metadata, but its attribute-query operation is currently failing on the county's ArcGIS server. Owner and address searches are unavailable while the county repairs the service; automatic probes continue to check for recovery. New Orleans uses Square/Lot identifiers for legal parcels. The city also publishes a weekly situs-and-geometry dataset on data.nola.gov, but it does not include owner names. An older 2018 parcel snapshot was not substituted because its ownership data is dated and the service was unstable during verification. LIVENESS 2026-08-04: the layer's metadata still loads, but EVERY query against it times out, including a bare returnCountOnly count. 161 consecutive failed checks and last_ok_at has never been set. This is a county-side outage, not a schema drift; there is nothing to fix on our side and the endpoint stays honestly degraded until New Orleans repairs it.`
14323
+ notes: `LIVE 2026-10-03 for lookup by location in clients that complete the TLS chain (see TLS below); no attribute search. Layer 15 refuses any query that NAMES its outFields except an exact PARCELID equality: measured 2026-10-03 on the paid shapes (point + 30 m buffer; 800 m envelope with geometry) and on a scan (OBJECTID>0, resultRecordCount=1), every named column list answers HTTP 200 carrying ArcGIS error 400 "Failed to execute query." in about 0.2 s, while the identical request with outFields=* answers 40 features in 0.28 s and 501 features (957 KB) in 0.65 s. UrbanKit sends outFields=* to this layer (api/_lib/arcgis-quirks.ts, WILDCARD_OUT_FIELDS) and keeps only the role columns. Any predicate that scans the table (1=1, OBJECTID>0, PARCELID IS NOT NULL, an owner LIKE) runs past 40 s even for a single row, so no where-clause search is offered (attributeSearch: unsupported) and owner-name lookup is not available here; the owner columns (OWNERNME1, OWNERNME2) and the mailing address (PSTLADDRESS, PSTLCITY, PSTLSTATE, PSTLZIP5) are returned on every spatial hit (a UrbanKit row keeps PSTLADDRESS, the street line). IDS: PARID is the assessor's per-unit parcel id (e.g. 622-SALEXANDERST) and is listed first so rows key by unit; PARCELID is the GeoPIN, a lot id shared by every condo unit on the lot (a 30 m buffer in the CBD: 40 units, 3 lots, 39 owners), so keying on it would collapse a notice list to one row per lot; TAXBILLID is the tax bill number. Exact PARCELID equality answers in 0.2 s and is the sample query, which is also the predicate the liveness probe falls back to when its first shape (1=1) times out. CORS reflects the request origin. TLS: the server sends an INCOMPLETE certificate chain (leaf without its Sectigo intermediate). Clients that fetch the missing intermediate themselves (curl on Windows, Chromium and Safari through the OS store) connect; Node's fetch fails the handshake with UNABLE_TO_VERIFY_LEAF_SIGNATURE (measured 2026-10-04). UrbanKit's billed bulk-enrichment and radius paths run on Vercel's Edge runtime, which cannot be given a certificate authority and whose handling of an incomplete chain is undocumented and not yet measured, so assume they cannot serve this parish until a keyed test on the deployed function shows otherwise; today an Orleans row ends county-unavailable and is refunded, unchanged from before. The liveness probe pins the intermediate, so its ok reflects the layer, not the paid paths. An agent that fetches this URL from Node must trust the Sectigo intermediate or the request fails before any query runs. Tracked in GitHub issue #906. HISTORY: marked unreachable 2026-08-29 after 463 consecutive failed probes whose predicate (PARCELID IS NOT NULL) is a table scan; the layer was answering spatial queries the whole time. Ownership data looked dated during the 2026-08 checks; the 2026-10-03 rows carry current-looking owner names.`
14323
14324
  }
14324
14325
  ]
14325
14326
  };
@@ -15449,7 +15450,7 @@ var minnesota_default = {
15449
15450
  stateSlug: "minnesota",
15450
15451
  stateName: "Minnesota",
15451
15452
  stateAbbrev: "MN",
15452
- lastUpdated: "2026-06-06",
15453
+ lastUpdated: "2026-10-03",
15453
15454
  counties: [
15454
15455
  {
15455
15456
  id: "mn-ramsey",
@@ -15613,6 +15614,50 @@ var minnesota_default = {
15613
15614
  email: null
15614
15615
  },
15615
15616
  notes: "448,036 polygon parcels covering Minneapolis and the rest of Hennepin County. Verified 2026-05-11: UPPER(OWNER_NM) LIKE '%SMITH%' returns real owners (e.g., 'ALEX D SMITH', 'PAUL LOUIS SMITH'). Owner names are space-padded fixed-width, wrap searches in UPPER() and trim whitespace client-side. Full residential address columns present (HOUSE_NO, FRAC_HOUSE_NO, STREET_NM, MAILING_MUNIC_NM, ZIP_CD). PID is 13-digit composite (parcel-fragment-municipality-section). TORRENS_TYP flag distinguishes Torrens vs. Abstract land per Minnesota's dual-title system. OUTAGE RESOLVED 2026-06-06: the 2026-05 county-side outage cleared -- service re-verified live (448,083 parcels; OWNER_NM queries return real owners)."
15617
+ },
15618
+ {
15619
+ id: "mn-mille-lacs",
15620
+ state: "MN",
15621
+ stateName: "Minnesota",
15622
+ stateSlug: "minnesota",
15623
+ county: "Mille Lacs",
15624
+ countySlug: "mille-lacs-county",
15625
+ countyFips: "27095",
15626
+ hasPublicRest: true,
15627
+ endpoints: [
15628
+ {
15629
+ url: "https://gis.co.mille-lacs.mn.us/arcgis/rest/services/MilleLacs_Public_101/MapServer/35",
15630
+ serviceType: "MapServer",
15631
+ layerIndex: 35,
15632
+ layerName: "Parcels",
15633
+ supportsQuery: true,
15634
+ corsEnabled: true,
15635
+ searchFields: [
15636
+ { name: "TAXPAYER_NAME", label: "Taxpayer Name", searchable: true },
15637
+ { name: "PARCELID", label: "Parcel Number", searchable: true },
15638
+ { name: "PROPERTY_ADDRESS", label: "Property Address", searchable: true },
15639
+ { name: "PROPERTY_ZIP", label: "Property ZIP", searchable: false },
15640
+ { name: "CITY_TWP_NAME", label: "City/Township Name", searchable: true },
15641
+ { name: "TAXPAYER_ADDRESS_1", label: "Taxpayer Mailing Address 1", searchable: true },
15642
+ { name: "TAXPAYER_ADDRESS_2", label: "Taxpayer Mailing Address 2", searchable: false },
15643
+ { name: "TAXPAYER_ADDRESS_3", label: "Taxpayer Mailing Address 3", searchable: false },
15644
+ { name: "TAXPAYER_ADDRESS_4", label: "Taxpayer Mailing Address 4", searchable: false },
15645
+ { name: "DEEDED_ACRES", label: "Deeded Acres", searchable: false }
15646
+ ],
15647
+ sampleQuery: "https://gis.co.mille-lacs.mn.us/arcgis/rest/services/MilleLacs_Public_101/MapServer/35/query?where=UPPER(TAXPAYER_NAME)%20LIKE%20%27%25SMITH%25%27&outFields=PARCELID,TAXPAYER_NAME,PROPERTY_ADDRESS,TAXPAYER_ADDRESS_1,CITY_TWP_NAME&returnGeometry=false&resultRecordCount=10&f=json",
15648
+ license: "unknown",
15649
+ licenseUrl: "https://www.millelacs.mn.gov/",
15650
+ status: "live",
15651
+ lastVerified: "2026-10-03",
15652
+ verifiedBy: "manual"
15653
+ }
15654
+ ],
15655
+ contact: {
15656
+ department: "Mille Lacs County GIS / Assessor's Office",
15657
+ url: "https://www.millelacs.mn.gov/1185/Assessors-Office",
15658
+ email: null
15659
+ },
15660
+ notes: "Mille Lacs County, Minnesota (county seat Milaca) publishes its parcels on its own ArcGIS Server 11.3 as MilleLacs_Public_101/MapServer layer 35 (Parcels), 20,083 rows with a taxpayer name on 2026-10-03. THE OWNER IS IN TAXPAYER_NAME, stored LAST/FIRST with a slash (SMITH/BRIAN & ASHLEY). A column called OWNER_NAME exists but is an empty string on about 97 percent of rows (544 of 20,083 populated on 2026-10-03; not NULL, so IS NOT NULL passes while the value is blank), and where it is populated it names a different party from TAXPAYER_NAME (a contract-for-deed holder or an LLC, for example), so the taxpayer is not always the owner of record. UPPER(OWNER_NAME) LIKE 'SMITH%' returns 0 features. OWNER_NAME is deliberately NOT listed as a search field here: the enrichment classifier takes the first owner-looking field, so listing it would route owner lookups to a mostly blank column. The mailing address is TAXPAYER_ADDRESS_1 to _4 (use _1 for the street); the matching OWNER_ADDRESS_1 to _4 columns were not checked. The site address is PROPERTY_ADDRESS with PROPERTY_ZIP and CITY_TWP_NAME. Search with UPPER(TAXPAYER_NAME) LIKE '%SMITH%'. maxRecordCount is 2000. CORS reflects the request Origin (Access-Control-Allow-Origin echoed back, credentials true), and named outFields work. No license text was found. Do not use the statewide Minnesota parcel layers for owner search: the DNR plan_parcels_minnesota layer has owner_name but no county, parcel id or address field, so a query bleeds into neighbouring counties, and the MnGeo plan_parcels_open layer filters by co_code 27095 (20,928 rows) but its owner_name is blank for all but 550 rows (control: Itasca 27061, 0 populated). The same county server also lists Assessors/TaxParcels/MapServer/0, which has only a parcel name and geometry. Verified live 2026-10-03: taxpayer SMITH returned rows (first SMITH/BRIAN & ASHLEY, parcel 11-010-0100, 17903 130TH AVE, Milaca Township)."
15616
15661
  }
15617
15662
  ]
15618
15663
  };
@@ -15718,7 +15763,7 @@ var missouri_default = {
15718
15763
  stateSlug: "missouri",
15719
15764
  stateName: "Missouri",
15720
15765
  stateAbbrev: "MO",
15721
- lastUpdated: "2026-06-20",
15766
+ lastUpdated: "2026-10-03",
15722
15767
  counties: [
15723
15768
  {
15724
15769
  id: "mo-jackson",
@@ -15810,6 +15855,49 @@ var missouri_default = {
15810
15855
  email: null
15811
15856
  },
15812
15857
  notes: "St. Louis County MO (St. Louis metro west/south, county seat Clayton, NOT the independent City of St. Louis) provides AGS_Parcels/MapServer/0 with 30+ fields: LOCATOR (parcel ID), PARENT_LOC, TAXYR, OWNER_NAME, PROP_ADRNUM, PROP_ADD, PROP_ZIP, OWN_ADD, OWN_CITY, OWN_STATE, OWN_ZIP, SCHSUB (school subdivision), MUNYCODE (municipality code), TAXCODE, ASSTIMPVAL, TOTASSMT, APPLANDVAL, APPIMPVAL, TOTAPVAL, PROPCLASS, LUC, LANDUSE2, LUCODE, TENURE, BLDGNAME, TWPNAME. Query confirmed live: UPPER(OWNER_NAME) LIKE '%SMITH%' returns real results (e.g., 'SMITH KIMBERLY & ANTHONY T/E' at '11041 LILAC AVE'). St. Louis County MO (FIPS 29189) is a separate entity from the City of St. Louis (FIPS 29510, an independent city not part of any county). The GeoData portal at data-stlcogis.opendata.arcgis.com provides open data downloads and GeoServices API links. The maps.stlouisco.com server is the live REST host."
15858
+ },
15859
+ {
15860
+ id: "mo-st-louis-city",
15861
+ state: "MO",
15862
+ stateName: "Missouri",
15863
+ stateSlug: "missouri",
15864
+ county: "St. Louis city",
15865
+ countySlug: "st-louis-city",
15866
+ countyFips: "29510",
15867
+ hasPublicRest: true,
15868
+ endpoints: [
15869
+ {
15870
+ url: "https://maps8.stlouis-mo.gov/arcgis/rest/services/ASSESSOR/Assessor_Public_Parcels/MapServer/11",
15871
+ serviceType: "MapServer",
15872
+ layerIndex: 11,
15873
+ layerName: "Parcels",
15874
+ supportsQuery: true,
15875
+ corsEnabled: false,
15876
+ searchFields: [
15877
+ { name: "OwnerName", label: "Owner Name", searchable: true },
15878
+ { name: "OwnerName2", label: "Owner Name 2", searchable: false },
15879
+ { name: "ParcelId", label: "Parcel ID", searchable: true },
15880
+ { name: "SITEADDR", label: "Site Address", searchable: true },
15881
+ { name: "OwnerAddr", label: "Owner Mailing Address", searchable: true },
15882
+ { name: "OwnerCity", label: "Owner Mailing City", searchable: false },
15883
+ { name: "OwnerState", label: "Owner Mailing State", searchable: false },
15884
+ { name: "OwnerZIP", label: "Owner Mailing ZIP", searchable: false },
15885
+ { name: "ZIP", label: "Site ZIP", searchable: false }
15886
+ ],
15887
+ sampleQuery: "https://maps8.stlouis-mo.gov/arcgis/rest/services/ASSESSOR/Assessor_Public_Parcels/MapServer/11/query?where=UPPER(OwnerName)%20LIKE%20%27SMITH%25%27&outFields=ParcelId,OwnerName,OwnerAddr,OwnerCity,SITEADDR&returnGeometry=false&resultRecordCount=10&f=json",
15888
+ license: "unknown",
15889
+ licenseUrl: "https://www.stlouis-mo.gov/data/parcels.cfm",
15890
+ status: "live",
15891
+ lastVerified: "2026-10-03",
15892
+ verifiedBy: "manual"
15893
+ }
15894
+ ],
15895
+ contact: {
15896
+ department: "City of St. Louis Assessor's Office",
15897
+ url: "https://www.stlouis-mo.gov/data/parcels.cfm",
15898
+ email: null
15899
+ },
15900
+ notes: "City of St. Louis, Missouri (FIPS 29510) is an independent city that belongs to no county, and it is NOT St. Louis County (29189, a separate record in this file on a different server). The Assessor's public parcels layer is ASSESSOR/Assessor_Public_Parcels/MapServer layer 11 (Parcels) on ArcGIS Server 11.2, listed on the city's data page. SERVER-SIDE ONLY: the server sends Access-Control-Allow-Origin only to its own origin (www.stlouis-mo.gov); for any other Origin a GET and its preflight return only Vary: Origin and Access-Control-Allow-Private-Network: true, so a browser on another site cannot read it and corsEnabled is false. Query it from a server, the metered API or the MCP, not from page script. The owner is OwnerName (max 40 characters, so long names are truncated at the source) with OwnerName2; the mailing address is OwnerAddr plus OwnerCity (max 13 characters, can read ST LOUIS MO) with OwnerState, OwnerZIP and OwnerCountry; the parcel id is ParcelId (11 digits, LowerParcelId also exists). SITEADDR carries runs of internal spaces (2233 PARK AV) and trailing padding, so a LIKE on a full street string misses; search on the house number plus a street word, or collapse whitespace on the client. Search with UPPER(OwnerName) LIKE 'SMITH%'; broad searches return exceededTransferLimit true at the 2000-row page. The layer has 194 fields and this record lists a subset. Layer 11 includes condominium master parcels, and the sub-accounts are layer 10 (not examined). No license or terms text is published on the data page. Verified live 2026-10-03: owner SMITH returned rows (first SMITH, DAVID E & SANDRA L TRS, parcel 22669130000, 2233 PARK AVE)."
15813
15901
  }
15814
15902
  ]
15815
15903
  };
package/dist/index.js CHANGED
@@ -16,9 +16,9 @@ var data_default = {
16
16
  lastUpdated: "2026-10-03",
17
17
  totals: {
18
18
  states: 51,
19
- counties: 239,
20
- endpoints: 251,
21
- countiesWithEndpoint: 233,
19
+ counties: 241,
20
+ endpoints: 253,
21
+ countiesWithEndpoint: 235,
22
22
  countiesUnprobeable: 1
23
23
  },
24
24
  states: [
@@ -210,8 +210,8 @@ var data_default = {
210
210
  slug: "minnesota",
211
211
  name: "Minnesota",
212
212
  abbrev: "MN",
213
- countyCount: 2,
214
- endpointCount: 2,
213
+ countyCount: 3,
214
+ endpointCount: 3,
215
215
  populated: true
216
216
  },
217
217
  {
@@ -226,8 +226,8 @@ var data_default = {
226
226
  slug: "missouri",
227
227
  name: "Missouri",
228
228
  abbrev: "MO",
229
- countyCount: 2,
230
- endpointCount: 2,
229
+ countyCount: 3,
230
+ endpointCount: 3,
231
231
  populated: true
232
232
  },
233
233
  {
@@ -14226,11 +14226,16 @@ var louisiana_default = {
14226
14226
  layerIndex: 15,
14227
14227
  layerName: "Property Information [Parcels]",
14228
14228
  supportsQuery: true,
14229
- corsEnabled: null,
14229
+ corsEnabled: true,
14230
14230
  searchFields: [
14231
+ {
14232
+ name: "PARID",
14233
+ label: "Parcel ID (PARID, per unit)",
14234
+ searchable: true
14235
+ },
14231
14236
  {
14232
14237
  name: "PARCELID",
14233
- label: "Parcel ID",
14238
+ label: "GeoPIN (lot id, shared by condo units)",
14234
14239
  searchable: true
14235
14240
  },
14236
14241
  {
@@ -14297,19 +14302,15 @@ var louisiana_default = {
14297
14302
  name: "SQUARE",
14298
14303
  label: "Square",
14299
14304
  searchable: false
14300
- },
14301
- {
14302
- name: "PARID",
14303
- label: "Parcel Account ID",
14304
- searchable: true
14305
14305
  }
14306
14306
  ],
14307
- sampleQuery: "https://gis.nola.gov/arcgis/rest/services/apps/property3/MapServer/15/query?where=PARCELID+IS+NOT+NULL&outFields=PARCELID,OWNERNME1,SITEADDRESS,PSTLADDRESS,PSTLCITY&returnGeometry=false&f=json&resultRecordCount=5",
14307
+ sampleQuery: "https://gis.nola.gov/arcgis/rest/services/apps/property3/MapServer/15/query?where=PARCELID%3D%2741033176%27&outFields=*&returnGeometry=false&f=json&resultRecordCount=1",
14308
14308
  license: "public",
14309
14309
  licenseUrl: "https://gis.nola.gov/",
14310
- status: "unreachable",
14311
- lastVerified: "2026-08-29",
14312
- verifiedBy: "manual"
14310
+ status: "live",
14311
+ lastVerified: "2026-10-03",
14312
+ verifiedBy: "manual",
14313
+ attributeSearch: "unsupported"
14313
14314
  }
14314
14315
  ],
14315
14316
  contact: {
@@ -14317,7 +14318,7 @@ var louisiana_default = {
14317
14318
  url: "https://gis.nola.gov/",
14318
14319
  email: null
14319
14320
  },
14320
- notes: `MARKED UNREACHABLE 2026-08-29. Layer 15 metadata answers and lists PARCELID, OWNERNME1, SITEADDRESS, PSTLADDRESS, but ANY query that names those columns in outFields returns ArcGIS 400 "Failed to execute query" in ~250 ms (measured 2026-08-29: PARCELID IS NOT NULL, 1=1, OBJECTID=1 and a 30 m spatial query all fail with specific outFields). outFields=* succeeds and takes 27-44 s; even outFields=OBJECTID took 27.5 s. The enrich pipeline requests specific columns, so every paid lookup here fails and refunds; the liveness probe sends the declared sampleQuery and fails the same way, which is why this parish has never once probed ok (463 consecutive failures). Layers 0-14 of the same service are zoning, overlays and address points, not parcels, and ArcGIS Hub lists no city-owned parcel feature service. County-side defect; nothing to re-point to. Liveness keeps watching. Prior notes: Orleans Parish's public parcel layer still serves metadata, but its attribute-query operation is currently failing on the county's ArcGIS server. Owner and address searches are unavailable while the county repairs the service; automatic probes continue to check for recovery. New Orleans uses Square/Lot identifiers for legal parcels. The city also publishes a weekly situs-and-geometry dataset on data.nola.gov, but it does not include owner names. An older 2018 parcel snapshot was not substituted because its ownership data is dated and the service was unstable during verification. LIVENESS 2026-08-04: the layer's metadata still loads, but EVERY query against it times out, including a bare returnCountOnly count. 161 consecutive failed checks and last_ok_at has never been set. This is a county-side outage, not a schema drift; there is nothing to fix on our side and the endpoint stays honestly degraded until New Orleans repairs it.`
14321
+ notes: `LIVE 2026-10-03 for lookup by location in clients that complete the TLS chain (see TLS below); no attribute search. Layer 15 refuses any query that NAMES its outFields except an exact PARCELID equality: measured 2026-10-03 on the paid shapes (point + 30 m buffer; 800 m envelope with geometry) and on a scan (OBJECTID>0, resultRecordCount=1), every named column list answers HTTP 200 carrying ArcGIS error 400 "Failed to execute query." in about 0.2 s, while the identical request with outFields=* answers 40 features in 0.28 s and 501 features (957 KB) in 0.65 s. UrbanKit sends outFields=* to this layer (api/_lib/arcgis-quirks.ts, WILDCARD_OUT_FIELDS) and keeps only the role columns. Any predicate that scans the table (1=1, OBJECTID>0, PARCELID IS NOT NULL, an owner LIKE) runs past 40 s even for a single row, so no where-clause search is offered (attributeSearch: unsupported) and owner-name lookup is not available here; the owner columns (OWNERNME1, OWNERNME2) and the mailing address (PSTLADDRESS, PSTLCITY, PSTLSTATE, PSTLZIP5) are returned on every spatial hit (a UrbanKit row keeps PSTLADDRESS, the street line). IDS: PARID is the assessor's per-unit parcel id (e.g. 622-SALEXANDERST) and is listed first so rows key by unit; PARCELID is the GeoPIN, a lot id shared by every condo unit on the lot (a 30 m buffer in the CBD: 40 units, 3 lots, 39 owners), so keying on it would collapse a notice list to one row per lot; TAXBILLID is the tax bill number. Exact PARCELID equality answers in 0.2 s and is the sample query, which is also the predicate the liveness probe falls back to when its first shape (1=1) times out. CORS reflects the request origin. TLS: the server sends an INCOMPLETE certificate chain (leaf without its Sectigo intermediate). Clients that fetch the missing intermediate themselves (curl on Windows, Chromium and Safari through the OS store) connect; Node's fetch fails the handshake with UNABLE_TO_VERIFY_LEAF_SIGNATURE (measured 2026-10-04). UrbanKit's billed bulk-enrichment and radius paths run on Vercel's Edge runtime, which cannot be given a certificate authority and whose handling of an incomplete chain is undocumented and not yet measured, so assume they cannot serve this parish until a keyed test on the deployed function shows otherwise; today an Orleans row ends county-unavailable and is refunded, unchanged from before. The liveness probe pins the intermediate, so its ok reflects the layer, not the paid paths. An agent that fetches this URL from Node must trust the Sectigo intermediate or the request fails before any query runs. Tracked in GitHub issue #906. HISTORY: marked unreachable 2026-08-29 after 463 consecutive failed probes whose predicate (PARCELID IS NOT NULL) is a table scan; the layer was answering spatial queries the whole time. Ownership data looked dated during the 2026-08 checks; the 2026-10-03 rows carry current-looking owner names.`
14321
14322
  }
14322
14323
  ]
14323
14324
  };
@@ -15447,7 +15448,7 @@ var minnesota_default = {
15447
15448
  stateSlug: "minnesota",
15448
15449
  stateName: "Minnesota",
15449
15450
  stateAbbrev: "MN",
15450
- lastUpdated: "2026-06-06",
15451
+ lastUpdated: "2026-10-03",
15451
15452
  counties: [
15452
15453
  {
15453
15454
  id: "mn-ramsey",
@@ -15611,6 +15612,50 @@ var minnesota_default = {
15611
15612
  email: null
15612
15613
  },
15613
15614
  notes: "448,036 polygon parcels covering Minneapolis and the rest of Hennepin County. Verified 2026-05-11: UPPER(OWNER_NM) LIKE '%SMITH%' returns real owners (e.g., 'ALEX D SMITH', 'PAUL LOUIS SMITH'). Owner names are space-padded fixed-width, wrap searches in UPPER() and trim whitespace client-side. Full residential address columns present (HOUSE_NO, FRAC_HOUSE_NO, STREET_NM, MAILING_MUNIC_NM, ZIP_CD). PID is 13-digit composite (parcel-fragment-municipality-section). TORRENS_TYP flag distinguishes Torrens vs. Abstract land per Minnesota's dual-title system. OUTAGE RESOLVED 2026-06-06: the 2026-05 county-side outage cleared -- service re-verified live (448,083 parcels; OWNER_NM queries return real owners)."
15615
+ },
15616
+ {
15617
+ id: "mn-mille-lacs",
15618
+ state: "MN",
15619
+ stateName: "Minnesota",
15620
+ stateSlug: "minnesota",
15621
+ county: "Mille Lacs",
15622
+ countySlug: "mille-lacs-county",
15623
+ countyFips: "27095",
15624
+ hasPublicRest: true,
15625
+ endpoints: [
15626
+ {
15627
+ url: "https://gis.co.mille-lacs.mn.us/arcgis/rest/services/MilleLacs_Public_101/MapServer/35",
15628
+ serviceType: "MapServer",
15629
+ layerIndex: 35,
15630
+ layerName: "Parcels",
15631
+ supportsQuery: true,
15632
+ corsEnabled: true,
15633
+ searchFields: [
15634
+ { name: "TAXPAYER_NAME", label: "Taxpayer Name", searchable: true },
15635
+ { name: "PARCELID", label: "Parcel Number", searchable: true },
15636
+ { name: "PROPERTY_ADDRESS", label: "Property Address", searchable: true },
15637
+ { name: "PROPERTY_ZIP", label: "Property ZIP", searchable: false },
15638
+ { name: "CITY_TWP_NAME", label: "City/Township Name", searchable: true },
15639
+ { name: "TAXPAYER_ADDRESS_1", label: "Taxpayer Mailing Address 1", searchable: true },
15640
+ { name: "TAXPAYER_ADDRESS_2", label: "Taxpayer Mailing Address 2", searchable: false },
15641
+ { name: "TAXPAYER_ADDRESS_3", label: "Taxpayer Mailing Address 3", searchable: false },
15642
+ { name: "TAXPAYER_ADDRESS_4", label: "Taxpayer Mailing Address 4", searchable: false },
15643
+ { name: "DEEDED_ACRES", label: "Deeded Acres", searchable: false }
15644
+ ],
15645
+ sampleQuery: "https://gis.co.mille-lacs.mn.us/arcgis/rest/services/MilleLacs_Public_101/MapServer/35/query?where=UPPER(TAXPAYER_NAME)%20LIKE%20%27%25SMITH%25%27&outFields=PARCELID,TAXPAYER_NAME,PROPERTY_ADDRESS,TAXPAYER_ADDRESS_1,CITY_TWP_NAME&returnGeometry=false&resultRecordCount=10&f=json",
15646
+ license: "unknown",
15647
+ licenseUrl: "https://www.millelacs.mn.gov/",
15648
+ status: "live",
15649
+ lastVerified: "2026-10-03",
15650
+ verifiedBy: "manual"
15651
+ }
15652
+ ],
15653
+ contact: {
15654
+ department: "Mille Lacs County GIS / Assessor's Office",
15655
+ url: "https://www.millelacs.mn.gov/1185/Assessors-Office",
15656
+ email: null
15657
+ },
15658
+ notes: "Mille Lacs County, Minnesota (county seat Milaca) publishes its parcels on its own ArcGIS Server 11.3 as MilleLacs_Public_101/MapServer layer 35 (Parcels), 20,083 rows with a taxpayer name on 2026-10-03. THE OWNER IS IN TAXPAYER_NAME, stored LAST/FIRST with a slash (SMITH/BRIAN & ASHLEY). A column called OWNER_NAME exists but is an empty string on about 97 percent of rows (544 of 20,083 populated on 2026-10-03; not NULL, so IS NOT NULL passes while the value is blank), and where it is populated it names a different party from TAXPAYER_NAME (a contract-for-deed holder or an LLC, for example), so the taxpayer is not always the owner of record. UPPER(OWNER_NAME) LIKE 'SMITH%' returns 0 features. OWNER_NAME is deliberately NOT listed as a search field here: the enrichment classifier takes the first owner-looking field, so listing it would route owner lookups to a mostly blank column. The mailing address is TAXPAYER_ADDRESS_1 to _4 (use _1 for the street); the matching OWNER_ADDRESS_1 to _4 columns were not checked. The site address is PROPERTY_ADDRESS with PROPERTY_ZIP and CITY_TWP_NAME. Search with UPPER(TAXPAYER_NAME) LIKE '%SMITH%'. maxRecordCount is 2000. CORS reflects the request Origin (Access-Control-Allow-Origin echoed back, credentials true), and named outFields work. No license text was found. Do not use the statewide Minnesota parcel layers for owner search: the DNR plan_parcels_minnesota layer has owner_name but no county, parcel id or address field, so a query bleeds into neighbouring counties, and the MnGeo plan_parcels_open layer filters by co_code 27095 (20,928 rows) but its owner_name is blank for all but 550 rows (control: Itasca 27061, 0 populated). The same county server also lists Assessors/TaxParcels/MapServer/0, which has only a parcel name and geometry. Verified live 2026-10-03: taxpayer SMITH returned rows (first SMITH/BRIAN & ASHLEY, parcel 11-010-0100, 17903 130TH AVE, Milaca Township)."
15614
15659
  }
15615
15660
  ]
15616
15661
  };
@@ -15716,7 +15761,7 @@ var missouri_default = {
15716
15761
  stateSlug: "missouri",
15717
15762
  stateName: "Missouri",
15718
15763
  stateAbbrev: "MO",
15719
- lastUpdated: "2026-06-20",
15764
+ lastUpdated: "2026-10-03",
15720
15765
  counties: [
15721
15766
  {
15722
15767
  id: "mo-jackson",
@@ -15808,6 +15853,49 @@ var missouri_default = {
15808
15853
  email: null
15809
15854
  },
15810
15855
  notes: "St. Louis County MO (St. Louis metro west/south, county seat Clayton, NOT the independent City of St. Louis) provides AGS_Parcels/MapServer/0 with 30+ fields: LOCATOR (parcel ID), PARENT_LOC, TAXYR, OWNER_NAME, PROP_ADRNUM, PROP_ADD, PROP_ZIP, OWN_ADD, OWN_CITY, OWN_STATE, OWN_ZIP, SCHSUB (school subdivision), MUNYCODE (municipality code), TAXCODE, ASSTIMPVAL, TOTASSMT, APPLANDVAL, APPIMPVAL, TOTAPVAL, PROPCLASS, LUC, LANDUSE2, LUCODE, TENURE, BLDGNAME, TWPNAME. Query confirmed live: UPPER(OWNER_NAME) LIKE '%SMITH%' returns real results (e.g., 'SMITH KIMBERLY & ANTHONY T/E' at '11041 LILAC AVE'). St. Louis County MO (FIPS 29189) is a separate entity from the City of St. Louis (FIPS 29510, an independent city not part of any county). The GeoData portal at data-stlcogis.opendata.arcgis.com provides open data downloads and GeoServices API links. The maps.stlouisco.com server is the live REST host."
15856
+ },
15857
+ {
15858
+ id: "mo-st-louis-city",
15859
+ state: "MO",
15860
+ stateName: "Missouri",
15861
+ stateSlug: "missouri",
15862
+ county: "St. Louis city",
15863
+ countySlug: "st-louis-city",
15864
+ countyFips: "29510",
15865
+ hasPublicRest: true,
15866
+ endpoints: [
15867
+ {
15868
+ url: "https://maps8.stlouis-mo.gov/arcgis/rest/services/ASSESSOR/Assessor_Public_Parcels/MapServer/11",
15869
+ serviceType: "MapServer",
15870
+ layerIndex: 11,
15871
+ layerName: "Parcels",
15872
+ supportsQuery: true,
15873
+ corsEnabled: false,
15874
+ searchFields: [
15875
+ { name: "OwnerName", label: "Owner Name", searchable: true },
15876
+ { name: "OwnerName2", label: "Owner Name 2", searchable: false },
15877
+ { name: "ParcelId", label: "Parcel ID", searchable: true },
15878
+ { name: "SITEADDR", label: "Site Address", searchable: true },
15879
+ { name: "OwnerAddr", label: "Owner Mailing Address", searchable: true },
15880
+ { name: "OwnerCity", label: "Owner Mailing City", searchable: false },
15881
+ { name: "OwnerState", label: "Owner Mailing State", searchable: false },
15882
+ { name: "OwnerZIP", label: "Owner Mailing ZIP", searchable: false },
15883
+ { name: "ZIP", label: "Site ZIP", searchable: false }
15884
+ ],
15885
+ sampleQuery: "https://maps8.stlouis-mo.gov/arcgis/rest/services/ASSESSOR/Assessor_Public_Parcels/MapServer/11/query?where=UPPER(OwnerName)%20LIKE%20%27SMITH%25%27&outFields=ParcelId,OwnerName,OwnerAddr,OwnerCity,SITEADDR&returnGeometry=false&resultRecordCount=10&f=json",
15886
+ license: "unknown",
15887
+ licenseUrl: "https://www.stlouis-mo.gov/data/parcels.cfm",
15888
+ status: "live",
15889
+ lastVerified: "2026-10-03",
15890
+ verifiedBy: "manual"
15891
+ }
15892
+ ],
15893
+ contact: {
15894
+ department: "City of St. Louis Assessor's Office",
15895
+ url: "https://www.stlouis-mo.gov/data/parcels.cfm",
15896
+ email: null
15897
+ },
15898
+ notes: "City of St. Louis, Missouri (FIPS 29510) is an independent city that belongs to no county, and it is NOT St. Louis County (29189, a separate record in this file on a different server). The Assessor's public parcels layer is ASSESSOR/Assessor_Public_Parcels/MapServer layer 11 (Parcels) on ArcGIS Server 11.2, listed on the city's data page. SERVER-SIDE ONLY: the server sends Access-Control-Allow-Origin only to its own origin (www.stlouis-mo.gov); for any other Origin a GET and its preflight return only Vary: Origin and Access-Control-Allow-Private-Network: true, so a browser on another site cannot read it and corsEnabled is false. Query it from a server, the metered API or the MCP, not from page script. The owner is OwnerName (max 40 characters, so long names are truncated at the source) with OwnerName2; the mailing address is OwnerAddr plus OwnerCity (max 13 characters, can read ST LOUIS MO) with OwnerState, OwnerZIP and OwnerCountry; the parcel id is ParcelId (11 digits, LowerParcelId also exists). SITEADDR carries runs of internal spaces (2233 PARK AV) and trailing padding, so a LIKE on a full street string misses; search on the house number plus a street word, or collapse whitespace on the client. Search with UPPER(OwnerName) LIKE 'SMITH%'; broad searches return exceededTransferLimit true at the 2000-row page. The layer has 194 fields and this record lists a subset. Layer 11 includes condominium master parcels, and the sub-accounts are layer 10 (not examined). No license or terms text is published on the data page. Verified live 2026-10-03: owner SMITH returned rows (first SMITH, DAVID E & SANDRA L TRS, parcel 22669130000, 2233 PARK AVE)."
15811
15899
  }
15812
15900
  ]
15813
15901
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@urbankitstudio/atlas",
3
- "version": "0.6.11",
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.",
3
+ "version": "0.6.13",
4
+ "description": "JS SDK for the UrbanKit County Parcel REST API Atlas: 241 counties across all 50 US states and DC, 253 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",