Colorado tolls: how to maintain

Files: /srv/toll/draft/CO, last built 2026-10-10 02:14 ET · the CO toll page · map test · facts below are read from the files each time this page is built (python3 /home/geo1/system/handbuilt/maintain_pages.py CO)

Procedure for this state

Colorado: E-470 (five mainline plazas at the operator's own coordinates, ramp tolls per the calculator's exit table, rates from its rate feed), the Northwest Parkway (mainline gantries and the US 287 / Sheridan ramps, day and night by axles, from its 'Current Toll Rates' on nwpky.com; bill by plate adds the $1.35 per-trip Processing Fee), CDOT Express Lanes (told, never charged), the Pikes Peak Highway (driver's admission, May 1 - Nov 30 and Dec 1 - Apr 30 from the City's rate structure PDF pikespeak_rate_structure_2026).

When to check

Rebuild

python3 e470_ramps.py (classifies ramp gantries), then bash chain.sh CO.

Watch out

The chain every state shares

Hosts: geo1 (192.168.50.220) holds the sources, builders, drafts, map and API; b100 (192.168.50.14) is the test client. All times are Eastern.

whatwhere (geo1 unless said)
sources list/home/geo1/maps/toll/CO/urls.txt (name <tab> URL)
archived sources/home/geo1/maps/toll/CO/sources/<name>/<YYYY-MM-DD>/ (file + meta.json: url, fetched, sha256)
builder/home/geo1/system/handbuilt/co_state.py; shared code toll_common.py
OpenStreetMap inputs/home/geo1/system/handbuilt/osm/co_* (cut from /home/geo1/maps/osm/us-latest.osm.pbf)
outputdraft /srv/toll/draft/CO/ (the builders write here); published /srv/toll/CO/ (copied from the draft by promote.py publish). The map and the API read the published page, or the draft while it is listed for review
toll enginesource /home/geo1/maps/web/tolls.js, served copy /srv/maps/tolls.js (the API runs the served copy)
API/home/geo1/maps/api/server.mjs on 127.0.0.1:8090 behind nginx /api/; pid in logs/test.pid
regression tripsb100: ~/apitest/site/cases.json, runner ~/apitest/run.py, browser check ~/apitest/browser.mjs

1. Refresh a source

  1. Fetch into a new dated folder: python3 /home/geo1/system/handbuilt/fetch_list.py CO [name ...] (no names = every line of urls.txt). A new source: add a line to urls.txt first, then fetch it by name.
  2. A site that refuses geo1 (HTTP 403) or scripts: fetch it on b100 in headless Chrome with node ~/apitest/fetch_b100.mjs <out> <name>=<url> ..., then rsync -a <out>/ geo1@192.168.50.220:/home/geo1/maps/toll/CO/sources/. Its meta.json records that it came from b100.
  3. Compare the new file with the previous dated one (diff, pdftotext -layout for PDFs). Same content: nothing to do. Changed amounts or a new effective date: rebuild (step 2) and update the expected amounts of the affected regression trips from the operator's own figures.

1b. The corpus (NJ, PA, VA start from it; DE is published from it)

python3 /home/geo1/maps/toll/bin/tollup.py CO update fetches the adapter's sources (bin/adapters/co.py), stores a document only when its content changes, writes one rate file per version under /home/geo1/maps/toll/CO/rates/ and appends every price change to history.csv (every run to runs.log). TOLL_WEB=/home/geo1/maps/toll/corpus python3 /home/geo1/maps/toll/bin/publish.py CO writes the corpus /home/geo1/maps/toll/corpus/CO from it (DE: plain publish.py DE writes /srv/toll/DE). Never hand-edit either. Then rebuild the draft (step 2) so it picks up the new rates.

2. Rebuild

3. Load it into the API and test from b100

  1. The API reads the toll pages and tolls.js when it starts. Restart it: cd /home/geo1/maps/api && kill $(cat logs/test.pid); (nohup /home/geo1/maps/node/bin/node server.mjs > logs/server.log 2>&1 & echo $! > logs/test.pid) (it is started by hand, not a service).
  2. From b100 only: python3 ~/apitest/run.py ~/apitest/site/cases.json. Every trip must be OK. Add a trip for every rate or rule you change, with the amount taken from the operator's own source.
  3. Engine change (tolls.js): edit /home/geo1/maps/web/tolls.js, check with /home/geo1/maps/node/bin/node --check, copy to /srv/maps/tolls.js with sudo install -o www-data -g www-data -m 644, restart the API, run the trips.

4. OpenStreetMap refresh (all states at once)

The builders match toll points to the OSM way ids the router drives, so the extracts here must come from the same us-latest.osm.pbf the router (Valhalla, /home/geo1/maps/valhalla_data) was built from (now 2026-09-27). New OSM data means: rebuild the router tiles, then for each state cut the box, rebuild its OSM inputs and run the full chain, then compare untied_toll_nodes.csv and the estimated positions below. The box for CO and the cutting commands are in the state's procedure above; the toll-node and way index comes from python3 tollnode_ways.py CO.

5. Publish

A rebuild writes the draft (/srv/toll/draft/CO); the published page (/srv/toll/CO) does not change. python3 /home/geo1/maps/toll/bin/promote.py review CO lists the draft for review: the map and the API then read it instead of the published page. Run the regression trips from b100. After approval, python3 /home/geo1/maps/toll/bin/promote.py publish CO copies the draft to /srv/toll/CO (the previous page is kept under /home/geo1/maps/toll/CO/published/<time>/) and takes it off the review list. After a change, update the coverage line for CO in the API page (/api.html, generator /home/geo1/maps/api/doc/api_page.py) and rebuild this page: python3 /home/geo1/system/handbuilt/maintain_pages.py CO.

Sources (27)

Each fetch is kept in its own dated folder under /home/geo1/maps/toll/CO/sources/<name>/; the builder always reads the newest one, so a new fetch takes effect at the next rebuild and the old one stays for comparison.

sourcefetched (newest)fetches kepthowlisted in urls.txtrows using it
cdot_dynamic_tolling_nov2024
https://www.codot.gov/news/2024/november/dynamic-tolling-nov25-i25-westbound-i70
2026-10-101fetch_list.pyyes
cdot_el_c470
https://www.codot.gov/programs/expresslanes/c470
2026-10-101fetch_list.pyyes5
cdot_el_central_70_express_lanes
https://www.codot.gov/programs/expresslanes/central-70-express-lanes
2026-10-101fetch_list.pyyes5
cdot_el_eastbound_i_70_mountain_express_lane
https://www.codot.gov/programs/expresslanes/eastbound-i-70-mountain-express-lane
2026-10-101fetch_list.pyyes
cdot_el_frequently_asked_questions
https://www.codot.gov/programs/expresslanes/frequently-asked-questions
2026-10-101fetch_list.pyyes
cdot_el_i_25_central_express_lanes
https://www.codot.gov/programs/expresslanes/i-25-central-express-lanes
2026-10-101fetch_list.pyyes9
cdot_el_i_25_express_lanes_us_36_to_e_470_northw
https://www.codot.gov/programs/expresslanes/i-25-express-lanes-us-36-to-e-470-northwest-pa
2026-10-101fetch_list.pyyes5
cdot_el_i_25_north_express_lanes_johnstown_to_fo
https://www.codot.gov/programs/expresslanes/i-25-north-express-lanes-johnstown-to-fort-col
2026-10-101fetch_list.pyyes7
cdot_el_i_25_north_express_lanes_mead_to_berthou
https://www.codot.gov/programs/expresslanes/i-25-north-express-lanes-mead-to-berthoud
2026-10-101fetch_list.pyyes
cdot_el_i_25_south_gap
https://www.codot.gov/programs/expresslanes/i-25-south-gap
2026-10-101fetch_list.pyyes7
cdot_el_us_36_express_lanes
https://www.codot.gov/programs/expresslanes/us-36-express-lanes
2026-10-101fetch_list.pyyes7
cdot_el_use
https://www.codot.gov/programs/expresslanes/use
2026-10-101fetch_list.pyyes
cdot_el_westboundi70
https://www.codot.gov/programs/expresslanes/westboundi70
2026-10-101fetch_list.pyyes5
cdot_expresslanes
https://www.codot.gov/programs/expresslanes
2026-10-101fetch_list.pyyes
cdot_southgap_tolls_begin_2024
https://www.codot.gov/news/2024/january/tolls-begin-jan-17-on-the-i-25-south-gap-express-l
2026-10-101fetch_list.pyyes
e470_api_toll_rates
https://e470.com/wp-json/e470/v1/toll-rates
2026-10-101fetch_list.pyyes336
e470_calc_data
https://e470.com/app/themes/fru_timber/calculator/data.json
2026-10-101fetch_list.pyyes
e470_calculator
https://www.e-470.com/toll-rates/calculator/
2026-10-101fetch_list.pyyes
e470_calculator_js
https://e470.com/app/themes/fru_timber/calculator/scripts-es5.js
2026-10-101fetch_list.pyyes
e470_discount
https://www.e-470.com/discount/
2026-10-101fetch_list.pyyes
e470_how_tolling_works
https://www.e-470.com/how-tolling-works/
2026-10-101fetch_list.pyyes
e470_partner_roads
https://www.e-470.com/partner-roads/
2026-10-101fetch_list.pyyes
e470_toll_rates
https://www.e-470.com/toll-rates/
2026-10-101fetch_list.pyyes1
expresstoll_roads_rates
https://www.expresstoll.com/content-pages/roads-and-rates
2026-10-101fetch_list.pyyes
nwp_driver_information
https://www.nwpky.com/driver-information/
2026-10-101b100 (192.168.50.14), headless Chrome, rendered page: the site refuses scripts (Cloudflare)yes61
pikespeak_hours_rates
https://coloradosprings.gov/pikes-peak-americas-mountain/page/pikes-peak-hours-and-rates
2026-10-101fetch_list.pyyes2
pikespeak_rate_structure_2026
https://drivepikespeak.b-cdn.net/app/uploads/2026/09/PPAM-Rate-Structure-and-Hours-of-Oper
2026-10-101fetched on b100 (192.168.50.14): City of Colorado Springs (Pikes Peak - America's Mountain) 'PPAM Highway Rate Structureyes1

Facilities (11)

idfacilityoperatorpointsrate / trip rowseffective dates in the rowssource
CO-E470E-470E-470 Public Highway Authority243362026-10-10_observede470_toll_rates
CO-EL-C470C-470 Express Lanes (I-25 - Wadsworth Blvd)Colorado Transportation Investment Office (CTIO, CDOT)44(none printed)cdot_el_c470
CO-EL-C70Central 70 Express Lanes (I-25 - Chambers Rd)Colorado Transportation Investment Office (CTIO, CDOT)44(none printed)cdot_el_central_70_express_lanes
CO-EL-I25NI-25 Express Lanes (US 36 - E-470)Colorado Transportation Investment Office (CTIO, CDOT)44(none printed)cdot_el_i_25_express_lanes_us_36_to_e_470_northw
CO-EL-I25NCI-25 North Express Lanes (Berthoud - Fort Collins)Colorado Transportation Investment Office (CTIO, CDOT)66(none printed)cdot_el_i_25_north_express_lanes_johnstown_to_fo
CO-EL-I25SGI-25 South Gap Express Lanes (Monument - Castle Rock)Colorado Transportation Investment Office (CTIO, CDOT)56(none printed)cdot_el_i_25_south_gap
CO-EL-US36US 36 Express Lanes (Federal Blvd - Table Mesa Dr)Colorado Transportation Investment Office (CTIO, CDOT)66(none printed)cdot_el_us_36_express_lanes
CO-EL-I25CI-25 Central Express Lanes (reversible, US 36 - downtown Denver)Colorado Transportation Investment Office (CTIO, CDOT)38(none printed)cdot_el_i_25_central_express_lanes
CO-EL-I70MI-70 Mountain Express Lanes (Veterans Memorial Tunnels - Empire)Colorado Transportation Investment Office (CTIO, CDOT)44(none printed)cdot_el_westboundi70
CO-PPHPikes Peak HighwayCity of Colorado Springs (Pikes Peak - America's Mountain)122026-10-10_observedpikespeak_hours_rates
CO-NWPNorthwest ParkwayNorthwest Parkway Public Highway Authority (concession operator)3602026-05-01nwp_driver_information

Positions placed by estimate (34): re-check when OpenStreetMap or the operator changes

pointfacilitylocationplaced onwhy
CO-EL-C470-01C-470 Express Lanes (I-25 - Wadsworth Blvd)beside: C-470 Express Lanes (I-25 - Wadsworth Blvd), eastboundthe eastbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-C470-02C-470 Express Lanes (I-25 - Wadsworth Blvd)beside: C-470 Express Lanes (I-25 - Wadsworth Blvd), westboundthe westbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-C470-03C-470 Express Lanes (I-25 - Wadsworth Blvd)beside: C-470 Express Lanes (I-25 - Wadsworth Blvd), eastboundthe eastbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-C470-04C-470 Express Lanes (I-25 - Wadsworth Blvd)beside: C-470 Express Lanes (I-25 - Wadsworth Blvd), westboundthe westbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-C70-01Central 70 Express Lanes (I-25 - Chambers Rd)beside: Central 70 Express Lanes (I-25 - Chambers Rd), eastboundthe eastbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-C70-02Central 70 Express Lanes (I-25 - Chambers Rd)beside: Central 70 Express Lanes (I-25 - Chambers Rd), westboundthe westbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-C70-03Central 70 Express Lanes (I-25 - Chambers Rd)beside: Central 70 Express Lanes (I-25 - Chambers Rd), eastboundthe eastbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-C70-04Central 70 Express Lanes (I-25 - Chambers Rd)beside: Central 70 Express Lanes (I-25 - Chambers Rd), westboundthe westbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-I25N-01I-25 Express Lanes (US 36 - E-470)beside: I-25 Express Lanes (US 36 - E-470), northboundthe northbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-I25N-02I-25 Express Lanes (US 36 - E-470)beside: I-25 Express Lanes (US 36 - E-470), southboundthe southbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-I25N-03I-25 Express Lanes (US 36 - E-470)beside: I-25 Express Lanes (US 36 - E-470), northboundthe northbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-I25N-04I-25 Express Lanes (US 36 - E-470)beside: I-25 Express Lanes (US 36 - E-470), southboundthe southbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-I25NC-01I-25 North Express Lanes (Berthoud - Fort Collins)beside: I-25 North Express Lanes (Berthoud - Fort Collins), northboundthe northbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-I25NC-02I-25 North Express Lanes (Berthoud - Fort Collins)beside: I-25 North Express Lanes (Berthoud - Fort Collins), southboundthe southbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-I25NC-03I-25 North Express Lanes (Berthoud - Fort Collins)beside: I-25 North Express Lanes (Berthoud - Fort Collins), northboundthe northbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-I25NC-04I-25 North Express Lanes (Berthoud - Fort Collins)beside: I-25 North Express Lanes (Berthoud - Fort Collins), southboundthe southbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-I25NC-05I-25 North Express Lanes (Berthoud - Fort Collins)beside: I-25 North Express Lanes (Berthoud - Fort Collins), northboundthe northbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-I25NC-06I-25 North Express Lanes (Berthoud - Fort Collins)beside: I-25 North Express Lanes (Berthoud - Fort Collins), southboundthe southbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-I25SG-01I-25 South Gap Express Lanes (Monument - Castle Rock)beside: I-25 South Gap Express Lanes (Monument - Castle Rock), northboundthe northbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-I25SG-02I-25 South Gap Express Lanes (Monument - Castle Rock)beside: I-25 South Gap Express Lanes (Monument - Castle Rock), southboundthe southbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-I25SG-03I-25 South Gap Express Lanes (Monument - Castle Rock)beside: I-25 South Gap Express Lanes (Monument - Castle Rock), northboundthe northbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-I25SG-04I-25 South Gap Express Lanes (Monument - Castle Rock)beside: I-25 South Gap Express Lanes (Monument - Castle Rock), southboundthe southbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-US36-01US 36 Express Lanes (Federal Blvd - Table Mesa Dr)beside: US 36 Express Lanes (Federal Blvd - Table Mesa Dr), eastboundthe eastbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-US36-02US 36 Express Lanes (Federal Blvd - Table Mesa Dr)beside: US 36 Express Lanes (Federal Blvd - Table Mesa Dr), westboundthe westbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-US36-03US 36 Express Lanes (Federal Blvd - Table Mesa Dr)beside: US 36 Express Lanes (Federal Blvd - Table Mesa Dr), eastboundthe eastbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-US36-04US 36 Express Lanes (Federal Blvd - Table Mesa Dr)beside: US 36 Express Lanes (Federal Blvd - Table Mesa Dr), westboundthe westbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-US36-05US 36 Express Lanes (Federal Blvd - Table Mesa Dr)beside: US 36 Express Lanes (Federal Blvd - Table Mesa Dr), eastboundthe eastbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-US36-06US 36 Express Lanes (Federal Blvd - Table Mesa Dr)beside: US 36 Express Lanes (Federal Blvd - Table Mesa Dr), westboundthe westbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-I25C-01I-25 Central Express Lanes (reversible, US 36 - downtown Denver)beside: I-25 Central Express Lanes (reversible, US 36 - downtown Denver), southboundthe southbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-I25C-02I-25 Central Express Lanes (reversible, US 36 - downtown Denver)beside: I-25 Central Express Lanes (reversible, US 36 - downtown Denver), northboundthe northbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-I70M-01I-70 Mountain Express Lanes (Veterans Memorial Tunnels - Empire)beside: I-70 Mountain Express Lanes (Veterans Memorial Tunnels - Empire), eastboundthe eastbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-I70M-02I-70 Mountain Express Lanes (Veterans Memorial Tunnels - Empire)beside: I-70 Mountain Express Lanes (Veterans Memorial Tunnels - Empire), westboundthe westbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-I70M-03I-70 Mountain Express Lanes (Veterans Memorial Tunnels - Empire)beside: I-70 Mountain Express Lanes (Veterans Memorial Tunnels - Empire), eastboundthe eastbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names
CO-EL-I70M-04I-70 Mountain Express Lanes (Veterans Memorial Tunnels - Empire)beside: I-70 Mountain Express Lanes (Veterans Memorial Tunnels - Empire), westboundthe westbound general-lane carriageway beside the Express LaneR3 estimate: a notice point on the general-lane carriageway within the corridor CDOT names

Decisions by rule

R1: 5, R2: 3, R2a: 3, R2d: 19, R3: 34, direction: 5, not: 6, optional,: 8, per: 1, plan: 1, position: 1 (all in decisions.csv).

Open gaps (0)

None.

Untied OSM toll nodes: 0

Toll booths / gantries mapped in OpenStreetMap on or near this state's roads that no toll point claims; a route through one lists it under unpriced. After an OSM refresh, look at new ones here (untied_toll_nodes.csv): a new gantry on a priced road means a point is missing.

Regression trips for CO (9)

Run from b100 (never on geo1): python3 ~/apitest/run.py ~/apitest/site/cases.json. Every trip must come back OK; a changed amount is either a rate change (update the expected amount from the operator's own source) or a fault.

tripexpected
CO E-470 Plaza A only, ExpressToll (account_co) car ($2.60)$2.60
CO E-470 Plaza A only, License Plate Toll car ($4.20)$4.20
CO Pikes Peak Highway to the summit, cash car (driver, $18)$18.00
CO US 36 Express Lanes beside the route: told, not charged ($0)$0.00
CO E-470 Jordan Rd on + Gartrell Rd off (northbound), ExpressToll car ($1.25 + $1.25)$2.50
CO Northwest Parkway US 36 -> I-25 (mainline), ExpressToll car, 10:30 ET$8.75
CO Northwest Parkway US 36 -> I-25 (mainline), plate car, 02:00 ET (night)$6.90
CO E-470 on at exit 22 (38th Ave) northbound -> off at exit 28 (Pena Blvd), ExpressToll car$1.25
CO E-470 northbound off at exit 36 (Sable Blvd), ExpressToll car$2.50