Sources
These tools use publicly available Arapahoe County and Colorado records bundled into static JSON in this project. Nothing is scraped from county websites when you click buttons in the app. This page serves two needs: verification without code (compare the app to county sources step by step) and transparent methodology for reviewers who want the full path from mart exports and DOLA files through offline build scripts to bundled JSON and what appears in the UI — including finance, tax, GIS, and engineering readers. Sections below follow one path: metro district tax share, then property tax levy breakdown, then code and definitions. Use the links at the top to jump. Always verify against official sources and your tax notice.
Metro district tax share
Metro district tax share on the home page compares your total mill rate to metro district rates from the county mill file. After a successful PIN load, the metro card uses the same total mills as your stack (sum of the breakdown above the card) and detects metro districts from the stackwhen a row's LG ID (from the DOLA bundle, or the digits before the slash in the LGIS tax entity ID when the export omits a separate LG ID) matches the lgid on a metro row in metro-levies-2025.json. There is no manual district picker; if no row carries a matching ID, the card explains that and links to the statewide special districts map. When more than one metro district appears on your stack, the headline uses combined certified metro mills and the rate split shows one stacked bar and legend, in county stack order. The metro card shows the same total mills as your levy stack (no separate mills field on that card). Use Start over in the address card to reset the home page flow. Old URL /metro-tax-lookup redirects to /.
Check the numbers yourself (no code)
Use your tax bill or the county website; match mills and authority names to the same documents we cite in this section.
- From your paper bill or the county site, identify your total mill levy and the metro-related parts of your rate (for example debt service and operations), using the county's labels — wording varies. For a quick manual check, total mills and metro debt are usually the easiest figures to compare first. In the app, the metro card always uses your full stack total as the denominator for every percentage and picks up every metro that matches an LG ID on your stack — not a hand-chosen pair of numbers.
- Open the county's Mill Levies and Tax Districts (Assessor hub) (opens in a new tab). That page is where the county lists the Mill Levy Public Information (opens in a new tab) PDF with related levy documents. You can also use the direct PDF link (same file as under Official sources below). Find your metropolitan district by name or LGID. That schedule shows how the county publishes operations vs debt service mills — the same split the app uses when it shows metro debt share (when applicable).
- If the in-app snapshot date is older than the county's current PDF, treat the current county PDF as authoritative for disputes.
In the app
The tool loads public/data/metro-levies-2025.json. That file is built offline from the county PDF below using tools/extract_metro_levies_*.py. Metro rows in that JSON include lgid; the home-page match uses the same LG ID values attached to each row in your stack when tools/build_arapahoe_parcel_levy_index.py aligns county mart data with DOLA (see levy breakdown methodology below). The metro card does not offer a manual district choice; it only uses LG IDs that appear on your loaded stack.
Data snapshot: Metro levy rates in this tool were last bundled on (when our copy of the county PDF was processed into JSON). That date is not necessarily when the county last amended the form. The authoritative schedule is the county's current PDF.
Official sources
- Authoritative PDF (feeds JSON): Mill Levy Public Information Form (C.R.S. 39-1-125(1)(c)) (opens in a new tab). District names, levy lines, and aggregated debt service and total mills are extracted offline into
public/data/metro-levies-2025.json. - Assessor hub (same page as step 2): Mill Levies and Tax Districts (Assessor hub) (opens in a new tab). The in-app tool also links here from expanded results so you can open related county PDFs. Additional county PDFs (not imported into bundled JSON) are in the next subsection.
Reference PDFs (not used for bundled metro levy JSON)
These are official Arapahoe County publications. They are not read by extract_metro_levies_*.py when generating public/data/metro-levies-*.json. URLs are versioned by tax year; update src/lib/arapahoeCountyUrls.ts when the county publishes new files.
The county lists these and other levy PDFs on its Mill Levies and Tax Districts (Assessor hub) (opens in a new tab) page (same hub as in Check the numbers yourself step 2). The links in the cards below open each file directly.
Certification of Levies and Revenues (example: 2025)
County certification document; useful for cross-checking totals and context. Not an input to the metro levy extractor.
Taxing District Levy Percentage (example: 2025)
County summary by tax area; not an input to the metro levy extractor.
Your property tax bill (Arapahoe)
On the home page, the levy breakdown can load your taxing lines from your parcel PIN using offline county data mart-style exports joined in this repo, then match lines to Colorado's public district and property-tax-entity data where possible. Clicking Load stack only reads bundled JSON from this site — no live requests to the county.
Check the numbers yourself (no code)
Use the county parcel record and online levy table; compare to what the app shows after you load by PIN or add lines with Add tile.
- Use the county Search Residential, Commercial, Ag and Vacant (opens in a new tab) to find your parcel. Note the PIN shown on the record.
- Open Tax District Levies for that parcel (linked from the parcel page). You will see a table: each taxing authority and its mills, plus a total. Compare that list to what the tool shows after you load by PIN or add lines with Add tile — they should align.
- The tool may omit one assessor fee row that appears in some county data exports but not on the online levy table. The Assessor fee line bullet under Sources and how they connect (below) explains why. School districts, cities, and counties often will not appear in optional state "special district" reference data even though they are on your bill.
In the app
public/data/arapahoe-levy-stacks-by-tag-id.jsonpublic/data/arapahoe-pin-to-tag.json— large PIN → TAG lookup; built offline from county mart exports.public/data/arapahoe-situs-to-pins.json— lookup key from Main Parcel situs fields: merged house number (martSAAddrNumber+ optionalSAStreetNumberSfx, same join as the home form), normalized street name (direction and street-type tokens stripped, including spelled-out compass words when typed), optional unit → matching PINs and labels. One address can match many parcels (for example large buildings); the home page lists candidates for you to compare.public/data/colorado-special-district-directory.json— LG ID contact rows from DOLA's LG tabular export, filtered to LGIDs referenced in bundled levy stacks (tools/build_district_directory_from_lg_export.py).
Built with npm run build:arapahoe-index, which runs tools/build_arapahoe_parcel_levy_index.py on county CSV exports, optional DOLA LGIS export as supporting-data/property-tax-entities-export.csv (or .xlsx locally when the CSV is absent), and tools/arapahoe_dola_authority_overrides.json.
District contact bundle: npm run build:district-directory (after npm run build:arapahoe-index, or when you refresh the LG CSV). See DOLA LG directory (tabular CSV).
Sources and how they connect
- Parcel and PIN: On the home page you can match a PIN for real property using bundled situs fields: main house number plus optional number suffix (mart
SAStreetNumberSfx, e.g. a fraction), street name with direction and type stripped for matching, and optional unit. Submit with Search or Enter from any field. The browser loadsarapahoe-situs-to-pins.jsonand matches keys the same waytools/build_arapahoe_parcel_levy_index.pybuilds them fromMain Parcel; use the county Search Residential, Commercial, Ag and Vacant (opens in a new tab) if you need to verify a PIN or legal description. When exactly one parcel matches, the home page loads the levy stack (tiles and optional levy-lines table) from your PIN automatically. When several parcels match, use View levy breakdown on the row you want. If the home address form finds no match, the same county search steps (same PIN help as on the home page) appear under the error so you can open your parcel record and read the PIN, then paste that PIN below to load the stack. Business personal property is out of scope (different county workflow; not in this situs index). Levy stack loading by PIN usesarapahoe-pin-to-tag.json, which includes each parcel'sainfrom Main Parcel when you rebuild the index so the levy panel can link to the county comps grid PDF (FileDownload.ashx?AIN=…). Nothing is sent to our servers. Address fields are length-capped in the browser; bundled situs JSON is validated for expected shape after load before lookup runs. - Taxing authority (TAGId): Your parcel maps to a county taxing authority (TAGId). The county's online levy table uses the same id in
Levy.aspx?id=…on parcelsearch.arapahoegov.com. It is not a private per-parcel serial number. - Property classification (field lineage): The home page tile copies the
PropertyClassDescrcolumn fromMain Parcel Table.csvintoarapahoe-pin-to-tag.jsonat build time. A paper notice may still say Residential or Commercial for the same parcel; see Property classification in Definitions. - Build inputs (offline): The Python builder reads county mart CSVs from the Arapahoe Assessor Data Mart (opens in a new tab):
Main Parcel Table.csvandTax Authority Groups and Tax Authorities.csv(export those tables from the mart one at a time, Data Format Comma-delimited Text File, then place undersupporting-data/in the repo), optionally export Property Tax Entities from DOLA LGIS (publicLGTaxEntities (opens in a new tab)) asproperty-tax-entities-export.csv(or.xlsxlocally; the build script prefers CSV when both exist) for certified mills and entity IDs when matching is safe, andtools/arapahoe_dola_authority_overrides.jsonfor known edge cases. See the script docstring intools/build_arapahoe_parcel_levy_index.pyfor exact paths and ASSRFEES handling. - County parcel GIS (optional): The file geodatabase
AssessorParcels_WGS.gdbcomes from the county GIS Data Download (opens in a new tab) page (Arapahoe County Open GIS Data; Assessor Maps/GIS). For our export we selected PARCELS as the GIS layer, FILE GEODATABASE as the data format, and DECIMAL DEGREES (WGS84) as the projection — that matches the parcels + WGS +.gdbnaming. The current PIN and levy-stack JSON builder uses mart CSVs, not this GDB; keep it for local GIS or future map work. - District directory and levy line details:
colorado-special-district-directory.jsondoes not change mills or share on the tile. The line-detail modal shows one assembled answer: tax name/IDs from the DOLA join at build time plus address and website frommatchSpecialDistrict()insrc/lib/specialDistrictMatch.tsagainst the bundled LG directory (rows keyed by LG ID, filtered to LGIDs referenced in levy stacks). Those are still independent data paths for audit: (1) Tax record / DOLA linkage intools/build_arapahoe_parcel_levy_index.py(tax entity ID, LG ID, fuzzy name scores from county-to-DOLA only). (2) Directory contact match against bundled district JSON (Arapahoe boundary filtering for fuzzy matches). When the levy line has a bill LG ID from the DOLA join, that ID selects the directory row first; if no row exists for that ID, the matcher may fall back to fuzzy name matching so users still see typical registry contact patterns. Bill LG ID and directory LG ID may differ — public mail often reflects administrative or management contacts. When LG ID matches across both, the UI treats that as the strongest link; if only the name is fuzzy or IDs differ, contact is shown with explanation. See LG ID in Definitions below. If an LGID is missing from the DOLA LG export used for the bundle, you may see no contact listing while tile mills still match your bill. - Assessor fee line: The mart export can include an assessor fee code that does not appear on the online levy table. The PIN loader omits that row so the list matches the table you can copy from.
Colorado statewide special districts (CSV, optional tooling)
The file supporting-data/colorado-all-special-districts.json can be produced offline from a tabular CSV export of the state's All Special Districts in Colorado layer via tools/import_colorado_district_layer_csv.py. The app runtime bundle uses tools/build_district_directory_from_lg_export.py instead (see below). Canonical marketplace URL: COLORADO_DATA_GOV_ALL_SPECIAL_DISTRICTS_DATASET in src/lib/dataSourceUrls.ts.
Map of All Special Districts in Colorado (data.colorado.gov) (opens in a new tab)
DOLA LG directory (tabular CSV)
The file public/data/colorado-special-district-directory.json is built with tools/build_district_directory_from_lg_export.py from a full-state DOLA LG export (for example lg-export-all.csv under supporting-data-phase-2/), keeping only rows whose LGID appears in arapahoe-levy-stacks-by-tag-id.json so bill-side LG IDs align with contact listings. The JSON _meta field records the LG export file name, the optional property-tax-entities-export.csv fallback file name when present, which levy LGIDs were filled from that fallback (name-only rows when the LG CSV has no row), whether the property-tax CSV certifying-county filter actually ran, the county label when it did, and any LGIDs still missing from both sources.
Optional legacy tooling: dlall.dbf via tools/export_special_district_directory.py (place the extract under supporting-data/dlall/, gitignored). Colorado Special District Mapping Project (DOLA GIS) (opens in a new tab).
Census TIGER (optional enrichment)
The optional statewide layer merged into the district directory has many special districts with similar names across counties. When the app matches a county levy line to that layer by fuzzy name, it should only consider districts that actually intersect Arapahoe County— otherwise the wrong district's contact info or LG ID could win a text-only match. The enrichment step records which Census county GEOIDs (for example 08005for Arapahoe) each district's boundary touches, so the matcher can filter candidates geographically, not only by string similarity.
To attach those county GEOIDs to each row in supporting-data/colorado-all-special-districts.json, tools/enrich_district_json_county_geoids.py intersects district geometry with the Census County layer inside the Colorado file geodatabase tlgdb_2025_a_08_co.gdb. Download the official zip, unzip into supporting-data/ (gitignored). Update src/lib/dataSourceUrls.ts when you switch TIGER vintages.
Census TIGER/Line GDB — Colorado (tlgdb_2025_a_08_co.gdb.zip) (opens in a new tab)
Code
Source code is available on GitHub (opens in a new tab).
Definitions
Your paper notice and this site may use different words for the same parcel. The county prints notices for residents and maintains separate data for tools like this one, so labels do not always match. That is normal and does not mean your parcel record is wrong.
Levy-specific definitions (government level, what is it, sources) appear only in the levy tile detail modal, from public/data/levy-explainer-entries.json, not in this list.
New rows follow the same JSON shape as the existing explainers. The app picks which entry applies in this order: levy line code when present, then LG ID with label keywords (when the file does not set a line code), then source TAG id, then label keywords.
Explainers can link a phrase to a definition below (for example Special districts) using a {{term:term-id|label}} token in levy-explainer-entries.json.