@urbankitstudio/atlas 0.1.0 → 0.4.0

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.
Files changed (45) hide show
  1. package/README.md +16 -2
  2. package/data/alabama.json +57 -0
  3. package/data/alaska.json +51 -0
  4. package/data/arizona.json +94 -1
  5. package/data/california.json +349 -2
  6. package/data/colorado.json +95 -1
  7. package/data/connecticut.json +62 -0
  8. package/data/florida.json +304 -17
  9. package/data/georgia.json +85 -1
  10. package/data/idaho.json +54 -0
  11. package/data/illinois.json +5 -5
  12. package/data/index.json +404 -54
  13. package/data/indiana.json +132 -0
  14. package/data/iowa.json +51 -0
  15. package/data/kansas.json +49 -0
  16. package/data/kentucky.json +52 -0
  17. package/data/louisiana.json +102 -0
  18. package/data/maine.json +138 -0
  19. package/data/massachusetts.json +78 -0
  20. package/data/michigan.json +92 -0
  21. package/data/minnesota.json +44 -0
  22. package/data/mississippi.json +100 -0
  23. package/data/missouri.json +52 -0
  24. package/data/nebraska.json +137 -0
  25. package/data/nevada.json +53 -2
  26. package/data/new-hampshire.json +42 -0
  27. package/data/new-jersey.json +493 -0
  28. package/data/new-york.json +240 -1
  29. package/data/north-carolina.json +253 -2
  30. package/data/ohio.json +208 -1
  31. package/data/oregon.json +150 -0
  32. package/data/rhode-island.json +25 -0
  33. package/data/south-carolina.json +102 -0
  34. package/data/tennessee.json +153 -0
  35. package/data/texas.json +294 -4
  36. package/data/utah.json +193 -0
  37. package/data/vermont.json +59 -0
  38. package/data/virginia.json +1 -1
  39. package/data/washington.json +140 -2
  40. package/data/wisconsin.json +374 -0
  41. package/dist/index.cjs +6135 -783
  42. package/dist/index.d.cts +12 -1
  43. package/dist/index.d.ts +12 -1
  44. package/dist/index.js +6135 -784
  45. package/package.json +1 -1
package/README.md CHANGED
@@ -45,7 +45,20 @@ if (kane) {
45
45
  }
46
46
  ```
47
47
 
48
- ### 3. Build a parcel-lookup deep-link
48
+ ### 3. Look up a county by FIPS code
49
+
50
+ ```ts
51
+ import { findCountyByFips } from "@urbankitstudio/atlas";
52
+
53
+ const kane = findCountyByFips("17089"); // 5-digit county FIPS (state + county)
54
+ if (kane) {
55
+ console.log(kane.county, kane.stateSlug);
56
+ // → Kane illinois
57
+ }
58
+ // Unknown, malformed, or non-5-digit input returns undefined (never throws).
59
+ ```
60
+
61
+ ### 4. Build a parcel-lookup deep-link
49
62
 
50
63
  ```ts
51
64
  import { findCounty, buildParcelLookupDeepLink } from "@urbankitstudio/atlas";
@@ -62,6 +75,7 @@ const link = buildParcelLookupDeepLink(kane.endpoints[0]);
62
75
  | `listStates()` | `StateIndexEntry[]` — all 50 states + `populated` flag |
63
76
  | `findState(stateSlug)` | `StateFile \| undefined` |
64
77
  | `findCounty(stateSlug, countySlug)` | `CountyRecord \| undefined` |
78
+ | `findCountyByFips(fips)` | `CountyRecord \| undefined` — match by 5-digit county FIPS |
65
79
  | `listCountiesByState(stateSlug)` | `CountyRecord[]` |
66
80
  | `buildParcelLookupDeepLink(endpoint)` | URL string into the UrbanKit lookup tool |
67
81
  | `slugify(s)`, `countySlugFromName(s)` | string helpers matching the atlas slug convention |
@@ -80,7 +94,7 @@ atlas.byStateSlug; // Map<stateSlug, StateFile>
80
94
 
81
95
  ## Coverage today
82
96
 
83
- The atlas currently bundles 15 populated states (Arizona, California, Colorado, Florida, Georgia, Illinois, Minnesota, Nevada, New York, North Carolina, Ohio, Pennsylvania, Texas, Virginia, Washington) covering the largest counties in each. The remaining states are listed in the index with `populated: false`.
97
+ The atlas currently bundles **128 counties across 39 populated states**, covering the largest counties in each. Call `listStates()` and filter on `populated` for the live set; the remaining states are listed in the index with `populated: false`.
84
98
 
85
99
  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.
86
100
 
@@ -0,0 +1,57 @@
1
+ {
2
+ "stateSlug": "alabama",
3
+ "stateName": "Alabama",
4
+ "stateAbbrev": "AL",
5
+ "lastUpdated": "2026-05-15",
6
+ "counties": [
7
+ {
8
+ "id": "al-jefferson",
9
+ "state": "AL",
10
+ "stateName": "Alabama",
11
+ "stateSlug": "alabama",
12
+ "county": "Jefferson",
13
+ "countySlug": "jefferson-county",
14
+ "countyFips": "01073",
15
+ "hasPublicRest": true,
16
+ "endpoints": [
17
+ {
18
+ "url": "https://jccgis.jccal.org/server/rest/services/Basemap/Parcels/MapServer/0",
19
+ "serviceType": "MapServer",
20
+ "layerIndex": 0,
21
+ "layerName": "Parcels",
22
+ "supportsQuery": true,
23
+ "corsEnabled": null,
24
+ "searchFields": [
25
+ { "name": "PARCELID", "label": "Parcel ID", "searchable": true },
26
+ { "name": "OWNERNAME", "label": "Owner Name", "searchable": true },
27
+ { "name": "PROP_MAIL", "label": "Property Mailing Address", "searchable": false },
28
+ { "name": "Street_Name", "label": "Street Name", "searchable": true },
29
+ { "name": "Bldg_Number", "label": "Building Number", "searchable": false },
30
+ { "name": "ADDR_PSPR", "label": "Address (Street Number+Prefix)", "searchable": false },
31
+ { "name": "APARTMENT", "label": "Apartment", "searchable": false },
32
+ { "name": "CITYMAIL", "label": "Mailing City", "searchable": false },
33
+ { "name": "ZIP_MAIL", "label": "Mailing ZIP", "searchable": false },
34
+ { "name": "STATE_Mail", "label": "Mailing State", "searchable": false },
35
+ { "name": "Legal_Desc", "label": "Legal Description", "searchable": false },
36
+ { "name": "Property_City", "label": "Property City", "searchable": false },
37
+ { "name": "ZONING_BOE", "label": "Zoning (Board of Equalization)", "searchable": false },
38
+ { "name": "ACRES_APR", "label": "Appraised Acres", "searchable": false },
39
+ { "name": "AssdValue", "label": "Assessed Value", "searchable": false }
40
+ ],
41
+ "sampleQuery": "https://jccgis.jccal.org/server/rest/services/Basemap/Parcels/MapServer/0/query?where=UPPER(OWNERNAME)+LIKE+UPPER('%25SMITH%25')&outFields=PARCELID,OWNERNAME,PROP_MAIL,Street_Name,Property_City&returnGeometry=false&f=json&resultRecordCount=10",
42
+ "license": "public",
43
+ "licenseUrl": "https://www.jccal.org/Default.asp?ID=1220&pg=Enterprise+GIS",
44
+ "status": "live",
45
+ "lastVerified": "2026-05-15",
46
+ "verifiedBy": "manual"
47
+ }
48
+ ],
49
+ "contact": {
50
+ "department": "Jefferson County Commission GIS / Information Technology Services — EGIS",
51
+ "url": "https://data-jeffco-al.opendata.arcgis.com/",
52
+ "email": null
53
+ },
54
+ "notes": "Jefferson County AL (Birmingham, pop. 670,000; FIPS 01073) Basemap/Parcels layer. Data maintained by Jefferson County Tax Assessor Office and updated nightly. 70+ fields confirmed including PARCELID, OWNERNAME, Name2, PROP_MAIL, CITYMAIL, ZIP_MAIL, STATE_Mail, Bldg_Number, Street_Name, Street_Type, Street_Dir, ADDR_APR, ZIP, Property_City/State, Legal_Desc, SUBDIV_NAME, ZONING_BOE, Water/Sewer/Gas, ACRES_APR, GIS_ACRES, PrevParcelLand/Imp/Total, AssdValue, TotalMHValue, Cls, TAX_CODE, DISTRICT, ESN_NUM, FIREDEPTNAME, NEIGHBOR_N, SchDist, MapNumber, Sqft. OWNERNAME field returns padded fixed-width strings (trim on use). Note: distinct from Jefferson County CO (FIPS 08059) and Jefferson County KY (Louisville; FIPS 21111) already in atlas. Verified 2026-05-15: SMITH returns Birmingham-area addresses."
55
+ }
56
+ ]
57
+ }
@@ -0,0 +1,51 @@
1
+ {
2
+ "stateSlug": "alaska",
3
+ "stateName": "Alaska",
4
+ "stateAbbrev": "AK",
5
+ "lastUpdated": "2026-05-15",
6
+ "counties": [
7
+ {
8
+ "id": "ak-anchorage",
9
+ "state": "AK",
10
+ "stateName": "Alaska",
11
+ "stateSlug": "alaska",
12
+ "county": "Anchorage",
13
+ "countySlug": "anchorage-municipality",
14
+ "countyFips": "02020",
15
+ "hasPublicRest": true,
16
+ "endpoints": [
17
+ {
18
+ "url": "https://services1.arcgis.com/7HDiw78fcUiM2BWn/arcgis/rest/services/AK_Parcels/FeatureServer/0",
19
+ "serviceType": "FeatureServer",
20
+ "layerIndex": 0,
21
+ "layerName": "AK_Parcels",
22
+ "supportsQuery": true,
23
+ "corsEnabled": null,
24
+ "searchFields": [
25
+ { "name": "parcel_id", "label": "Parcel ID", "searchable": true },
26
+ { "name": "owner", "label": "Owner Name", "searchable": true },
27
+ { "name": "alt_owner", "label": "Alternate Owner Name", "searchable": true },
28
+ { "name": "property_type", "label": "Property Type (Residential/Commercial/etc.)", "searchable": false },
29
+ { "name": "property_use", "label": "Property Use Description", "searchable": false },
30
+ { "name": "land_value", "label": "Land Value", "searchable": false },
31
+ { "name": "building_value", "label": "Building Value", "searchable": false },
32
+ { "name": "total_value", "label": "Total Assessed Value", "searchable": false },
33
+ { "name": "local_gov", "label": "Local Government (filter: Anchorage Municipality)", "searchable": true }
34
+ ],
35
+ "sampleQuery": "https://services1.arcgis.com/7HDiw78fcUiM2BWn/arcgis/rest/services/AK_Parcels/FeatureServer/0/query?where=UPPER(local_gov)+LIKE+'%25ANCHORAGE%25'+AND+UPPER(owner)+LIKE+UPPER('%25SMITH%25')&outFields=parcel_id,owner,alt_owner,property_type,land_value,total_value,local_gov&returnGeometry=false&f=json&resultRecordCount=10",
36
+ "license": "public",
37
+ "licenseUrl": "https://services1.arcgis.com/7HDiw78fcUiM2BWn/arcgis/rest/services/AK_Parcels/FeatureServer",
38
+ "status": "live",
39
+ "lastVerified": "2026-05-15",
40
+ "verifiedBy": "manual"
41
+ }
42
+ ],
43
+ "contact": {
44
+ "department": "Alaska Statewide Parcel Layer (combined from local government sources)",
45
+ "url": "https://services1.arcgis.com/7HDiw78fcUiM2BWn/arcgis/rest/services/AK_Parcels/FeatureServer",
46
+ "email": null
47
+ },
48
+ "notes": "15 fields confirmed: OBJECTID, parcel_id, owner, alt_owner, property_type, property_use, land_value, building_value, total_value, local_gov, datetime_processed, feature_id, Shape__Area, Shape__Length, GlobalID. This is the Alaska Statewide Parcel FeatureServer, combining parcel data from various local government bodies in Alaska. Filter by local_gov field — use UPPER(local_gov) LIKE '%ANCHORAGE%' for Anchorage Municipality parcels (confirmed returning real parcels including United Airlines, residential, etc.). Owner query confirmed working. NOTE: Alaska does not have counties — it has boroughs and a small number of unified municipalities. Anchorage is officially the Municipality of Anchorage (FIPS 02020). This statewide service also covers Fairbanks North Star Borough, Matanuska-Susitna Borough, and other AK jurisdictions via the local_gov field. Coverage and completeness vary by participating jurisdiction."
49
+ }
50
+ ]
51
+ }
package/data/arizona.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "stateSlug": "arizona",
3
3
  "stateName": "Arizona",
4
4
  "stateAbbrev": "AZ",
5
- "lastUpdated": "2026-05-11",
5
+ "lastUpdated": "2026-05-15",
6
6
  "counties": [
7
7
  {
8
8
  "id": "az-maricopa",
@@ -51,5 +51,98 @@
51
51
  },
52
52
  "notes": "57 fields confirmed including APN, APN_DASH, BOOK, MAP, ITEM, FLOOR, OWNER_NAME, MAIL_ADDR1/2, MAIL_CITY, MAIL_STATE, MAIL_ZIP, MAIL_CNTRY, PHYSICAL_ADDRESS, PHYSICAL_CITY, PHYSICAL_ZIP, PHYSICAL_STREET_NUM/DIR/NAME/TYPE, DEED_NUMBER, DEED_DATE, SALE_DATE, SALE_PRICE, MCRNUM, SUBNAME, LAND_SIZE, LOT_NUM, CONST_YEAR, LIVING_SPACE, INCAREOF, FCV_CUR/PREV, LPV_CUR/PREV, TAX_YR_CUR/PREV, CITY_ZONING, JURISDICTION, BLOCK, TRACT. Owner query tested and confirmed. The MaricopaDynamicQueryService layer 3 (Parcels) is the full-attribute layer backing the Parcel Viewer at maps.mcassessor.maricopa.gov. A separate 'Parcels' MapServer at gis.mcassessor.maricopa.gov/arcgis/rest/services/Parcels/MapServer also exists but has fewer fields. APN format: 8-digit with no dashes (e.g. '10101347'); APN_DASH adds dashes (e.g. '101-01-347')."
53
53
  }
54
+ ,
55
+ {
56
+ "id": "az-pima",
57
+ "state": "AZ",
58
+ "stateName": "Arizona",
59
+ "stateSlug": "arizona",
60
+ "county": "Pima",
61
+ "countySlug": "pima-county",
62
+ "countyFips": "04019",
63
+ "hasPublicRest": true,
64
+ "endpoints": [
65
+ {
66
+ "url": "https://mapdata.tucsonaz.gov/public/rest/services/PublicMaps/PropertyHousing/MapServer/17",
67
+ "serviceType": "MapServer",
68
+ "layerIndex": 17,
69
+ "layerName": "PAREGION",
70
+ "supportsQuery": true,
71
+ "corsEnabled": null,
72
+ "searchFields": [
73
+ { "name": "PARCEL", "label": "Parcel Number (Pima County APN)", "searchable": true },
74
+ { "name": "ADDRESSEE", "label": "Owner / Addressee Name", "searchable": true },
75
+ { "name": "SITE_ADDRESS", "label": "Site Address", "searchable": true },
76
+ { "name": "SITE_ZIPCITY", "label": "Site City", "searchable": false },
77
+ { "name": "TAXAREA", "label": "Tax Area Code", "searchable": false },
78
+ { "name": "FCV", "label": "Full Cash Value", "searchable": false },
79
+ { "name": "USE_DESC", "label": "Use Description", "searchable": false },
80
+ { "name": "TAXYR", "label": "Tax Year", "searchable": false },
81
+ { "name": "YearBuilt", "label": "Year Built", "searchable": false },
82
+ { "name": "MAIL1", "label": "Mailing Address Line 1", "searchable": true },
83
+ { "name": "MAIL2", "label": "Mailing Address Line 2", "searchable": true },
84
+ { "name": "legal_desc", "label": "Legal Description", "searchable": false }
85
+ ],
86
+ "sampleQuery": "https://mapdata.tucsonaz.gov/public/rest/services/PublicMaps/PropertyHousing/MapServer/17/query?where=UPPER(ADDRESSEE)%20LIKE%20UPPER('%25SMITH%25')&outFields=PARCEL,ADDRESSEE,SITE_ADDRESS,SITE_ZIPCITY,TAXYR,FCV,USE_DESC&returnGeometry=false&f=json&resultRecordCount=10",
87
+ "license": "public",
88
+ "licenseUrl": "https://mapdata.tucsonaz.gov/public/rest/services/PublicMaps/PropertyHousing/MapServer",
89
+ "status": "live",
90
+ "lastVerified": "2026-05-14",
91
+ "verifiedBy": "automated"
92
+ }
93
+ ],
94
+ "contact": {
95
+ "department": "City of Tucson / Pima County GIS — PropertyHousing MapServer (Pima Assessor PAREGION data)",
96
+ "url": "https://www.pima.gov/1796/Geographic-Information-Systems",
97
+ "email": null
98
+ },
99
+ "notes": "75 fields confirmed. The PAREGION layer (layer 17) is the county-wide Pima County Assessor parcel layer, hosted on the City of Tucson mapdata.tucsonaz.gov ArcGIS server, which aggregates both City of Tucson and unincorporated Pima County parcels. Layer 40 (PAREGION_TUCSON) is the Tucson-only subset; use layer 17 for full county coverage. Owner-name field is ADDRESSEE (holds the assessor's addressee/taxpayer name — equivalent to owner name for most records). PARCEL format is alphanumeric (e.g. '101013880'). Also exposes FCV (Full Cash Value), TAXYR, USE_DESC, MAIL1-5 (mailing address), LEGAL1-5 (legal description), SITE_ADDRESS, SITE_ZIPCITY, SITE_ZIP, TAXAREA, GISACRES, CURZONE_OL (zoning), and YearBuilt. The supportsQuery field reads null in layer metadata (ArcGIS 11.3 quirk), but the service capabilities string is 'Map,Query,Data' — queries work as confirmed by live testing. maxRecordCount=2000. The gisweb.pima.gov hostname NXDOMAINs; mapdata.tucsonaz.gov is the correct publicly accessible host."
100
+ },
101
+ {
102
+ "id": "az-pinal",
103
+ "state": "AZ",
104
+ "stateName": "Arizona",
105
+ "stateSlug": "arizona",
106
+ "county": "Pinal",
107
+ "countySlug": "pinal-county",
108
+ "countyFips": "04021",
109
+ "hasPublicRest": true,
110
+ "endpoints": [
111
+ {
112
+ "url": "https://rogue.casagrandeaz.gov/arcgis/rest/services/Pinal_County/Pinal_County_Parcels/MapServer/0",
113
+ "serviceType": "MapServer",
114
+ "layerIndex": 0,
115
+ "layerName": "Pinal County Parcels",
116
+ "supportsQuery": true,
117
+ "corsEnabled": null,
118
+ "searchFields": [
119
+ { "name": "PARCELID", "label": "Parcel ID (APN)", "searchable": true },
120
+ { "name": "LOWPARCELID", "label": "Lower Parcel ID", "searchable": true },
121
+ { "name": "OWNERNME1", "label": "Owner Name (Primary)", "searchable": true },
122
+ { "name": "OWNERNME2", "label": "Owner Name (Secondary)", "searchable": true },
123
+ { "name": "SITEADDRESS", "label": "Site Address", "searchable": true },
124
+ { "name": "CVTTXCD", "label": "Converted Tax Code", "searchable": false },
125
+ { "name": "CVTTXDSCRP", "label": "Tax Code Description", "searchable": false },
126
+ { "name": "USECD", "label": "Use Code", "searchable": false },
127
+ { "name": "USEDSCRP", "label": "Use Description", "searchable": false },
128
+ { "name": "CLASSCD", "label": "Class Code", "searchable": false },
129
+ { "name": "CLASSDSCRP", "label": "Class Description", "searchable": false },
130
+ { "name": "PRPRTYDSCRP", "label": "Property Description", "searchable": false }
131
+ ],
132
+ "sampleQuery": "https://rogue.casagrandeaz.gov/arcgis/rest/services/Pinal_County/Pinal_County_Parcels/MapServer/0/query?where=PARCELID+LIKE+'%25302%25'&outFields=PARCELID,SITEADDRESS,OWNERNME1,CLASSCD,CLASSDSCRP&returnGeometry=false&f=json&resultRecordCount=10",
133
+ "license": "public",
134
+ "licenseUrl": "https://www.pinal.gov/630/GIS",
135
+ "status": "live",
136
+ "lastVerified": "2026-05-15",
137
+ "verifiedBy": "manual"
138
+ }
139
+ ],
140
+ "contact": {
141
+ "department": "Pinal County GIS / Assessor's Office",
142
+ "url": "https://www.pinal.gov/630/GIS",
143
+ "email": null
144
+ },
145
+ "notes": "74 fields confirmed including OBJECTID, LOWPARCELID, PARCELID, BUILDING, UNIT, LGLSTARTDT, CVTTXCD, CVTTXDSCRP, SCHLTXCD, SCHLDSCRP, USECD, USEDSCRP, NGHBRHDCD, CLASSCD, CLASSDSCRP, SITEADDRESS, PRPRTYDSCRP, CNVYNAME, OWNERNME1, OWNERNME2. Owner name confirmed live: PARCELID LIKE '%302%' returns OWNERNME1='FELDMEIER BRIAN' in Arizona City AZ 85123. PARCELID format is typically 9-digit numeric string. Hosted on the City of Casa Grande ArcGIS server (rogue.casagrandeaz.gov) which serves Pinal County parcel data for the Phoenix metro south area (Chandler/Gilbert/Queen Creek/Maricopa City/Casa Grande). Capabilities: Query, Map, Data. maxRecordCount=1000. Note: the gismaps.pinalcountyaz.gov server is currently not externally accessible (HTTP 000); the Casa Grande mirror is the reliable public endpoint."
146
+ }
54
147
  ]
55
148
  }