California tolls: how to maintain

Files: /srv/toll/draft/CA, last built 2026-10-10 01:57 ET · the CA 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 CA)

Procedure for this state

California, built in parts (ca_state.py runs ca_bridges.py, ca_tca.py, ca_sr125.py, ca_express.py): the seven BATA bridges and the Golden Gate (one direction each), 17-Mile Drive, The Toll Roads of Orange County (rate card by point, day, direction, time; Pacific times written in Eastern), South Bay Expressway (SR 125, priced by trip), and the express lanes (told, never charged).

When to check

Rebuild

bash chain.sh CA (long: the California highways file has 3.3 million ways). TCA ramp positions: tca_ramps.py; SR 261 ramps are assigned by hand in ca_tca.py (POS) with the reason.

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/CA/urls.txt (name <tab> URL)
archived sources/home/geo1/maps/toll/CA/sources/<name>/<YYYY-MM-DD>/ (file + meta.json: url, fetched, sha256)
builder/home/geo1/system/handbuilt/ca_state.py; shared code toll_common.py
OpenStreetMap inputs/home/geo1/system/handbuilt/osm/ca_* (cut from /home/geo1/maps/osm/us-latest.osm.pbf)
outputdraft /srv/toll/draft/CA/ (the builders write here); published /srv/toll/CA/ (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 CA [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/CA/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 CA update fetches the adapter's sources (bin/adapters/ca.py), stores a document only when its content changes, writes one rate file per version under /home/geo1/maps/toll/CA/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 CA writes the corpus /home/geo1/maps/toll/corpus/CA 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 CA and the cutting commands are in the state's procedure above; the toll-node and way index comes from python3 tollnode_ways.py CA.

5. Publish

A rebuild writes the draft (/srv/toll/draft/CA); the published page (/srv/toll/CA) does not change. python3 /home/geo1/maps/toll/bin/promote.py review CA 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 CA copies the draft to /srv/toll/CA (the previous page is kept under /home/geo1/maps/toll/CA/published/<time>/) and takes it off the review list. After a change, update the coverage line for CA 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 CA.

Sources (41)

Each fetch is kept in its own dated folder under /home/geo1/maps/toll/CA/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
bata_2026_toll_increase
https://mtc.ca.gov/about-mtc/authorities/bay-area-toll-authority/2026-toll-increase-high-o
2026-10-101fetch_list.pyyes133
bata_faq_2026
https://mtc.ca.gov/sites/default/files/documents/2025-01/FAQs%20BATA%202026%20Toll%20Incre
2026-10-101fetch_list.pyyes
fastrak_antioch_bridge
https://www.bayareafastrak.org/en/toll-locations/antioch-bridge.shtml
2026-10-101fetch_list.pyyes
fastrak_benicia_martinez_bridge
https://www.bayareafastrak.org/en/toll-locations/benicia-martinez-bridge.shtml
2026-10-101fetch_list.pyyes
fastrak_carquinez_bridge
https://www.bayareafastrak.org/en/toll-locations/carquinez-bridge.shtml
2026-10-101fetch_list.pyyes
fastrak_dumbarton_bridge
https://www.bayareafastrak.org/en/toll-locations/dumbarton-bridge.shtml
2026-10-101fetch_list.pyyes
fastrak_express_lanes
https://www.bayareafastrak.org/en/toll-locations/express-lanes.shtml
2026-10-091b100 (192.168.50.14), headless Chrome, rendered page: the site refuses scripts (Cloudflare)yes
fastrak_express_lanes_101_san_mateo
https://www.bayareafastrak.org/en/toll-locations/express-lanes-101-san-mateo.shtml
2026-10-091b100 (192.168.50.14), headless Chrome, rendered page: the site refuses scripts (Cloudflare)yes5
fastrak_express_lanes_101_sr85_santa_clara
https://www.bayareafastrak.org/en/toll-locations/express-lanes-101-sr85-santa-clara.shtml
2026-10-091b100 (192.168.50.14), headless Chrome, rendered page: the site refuses scripts (Cloudflare)yes5
fastrak_express_lanes_i_580
https://www.bayareafastrak.org/en/toll-locations/express-lanes-i-580.shtml
2026-10-091b100 (192.168.50.14), headless Chrome, rendered page: the site refuses scripts (Cloudflare)yes5
fastrak_express_lanes_i_680_contra_costa
https://www.bayareafastrak.org/en/toll-locations/express-lanes-i-680-contra-costa.shtml
2026-10-091b100 (192.168.50.14), headless Chrome, rendered page: the site refuses scripts (Cloudflare)yes5
fastrak_express_lanes_i_680_sunol
https://www.bayareafastrak.org/en/toll-locations/express-lanes-i-680-sunol.shtml
2026-10-091b100 (192.168.50.14), headless Chrome, rendered page: the site refuses scripts (Cloudflare)yes5
fastrak_express_lanes_i_80
https://www.bayareafastrak.org/en/toll-locations/express-lanes-i-80.shtml
2026-10-091b100 (192.168.50.14), headless Chrome, rendered page: the site refuses scripts (Cloudflare)yes5
fastrak_express_lanes_i_880
https://www.bayareafastrak.org/en/toll-locations/express-lanes-i-880.shtml
2026-10-091b100 (192.168.50.14), headless Chrome, rendered page: the site refuses scripts (Cloudflare)yes5
fastrak_express_lanes_southern_california
https://www.bayareafastrak.org/en/toll-locations/express-lanes-southern-california.shtml
2026-10-091b100 (192.168.50.14), headless Chrome, rendered page: the site refuses scripts (Cloudflare)yes
fastrak_express_lanes_sr237
https://www.bayareafastrak.org/en/toll-locations/express-lanes-sr237.shtml
2026-10-091b100 (192.168.50.14), headless Chrome, rendered page: the site refuses scripts (Cloudflare)yes5
fastrak_golden_gate_bridge
https://www.bayareafastrak.org/en/toll-locations/golden-gate-bridge.shtml
2026-10-091b100 (192.168.50.14), headless Chrome, rendered page: the site refuses scripts (Cloudflare)yes
fastrak_richmond_san_rafael_bridge
https://www.bayareafastrak.org/en/toll-locations/richmond-san-rafael-bridge.shtml
2026-10-091b100 (192.168.50.14), headless Chrome, rendered page: the site refuses scripts (Cloudflare)yes
fastrak_san_francisco_oakland_bridge
https://www.bayareafastrak.org/en/toll-locations/san-francisco-oakland-bridge.shtml
2026-10-091b100 (192.168.50.14), headless Chrome, rendered page: the site refuses scripts (Cloudflare)yes
fastrak_san_mateo_hayward_bridge
https://www.bayareafastrak.org/en/toll-locations/san-mateo-hayward-bridge.shtml
2026-10-091b100 (192.168.50.14), headless Chrome, rendered page: the site refuses scripts (Cloudflare)yes
fastrak_toll_bridges
https://www.bayareafastrak.org/en/toll-locations/toll-bridges.shtml
2026-10-101fetch_list.pyyes
ggb_payment_options
https://www.goldengate.org/bridge/tolls-payment/toll-payment-options/
2026-10-101fetch_list.pyyes
ggb_toll_increase_2026
https://www.goldengate.org/golden-gate-bridge-toll-rates-increase-july-1-2026/
2026-10-101fetch_list.pyyes19
ggb_tolls_payment
https://www.goldengate.org/bridge/tolls-payment/
2026-10-101fetch_list.pyyes
la_metro_expresslanes_factsheet
https://www.metro.net/documents/2025/01/metro-expresslanes-fact-sheetpdf/
2026-10-101fetch_list.pyyes6
octa_405_how_it_works
https://405expresslanes.com/en/how-it-works/how-it-works/
2026-10-091b100 (192.168.50.14), headless Chrome, rendered page: the site refuses scripts (Cloudflare)no3
octa_91_faqs
https://www.91expresslanes.com/faqs/
2026-10-091b100 (192.168.50.14), headless Chrome, rendered page: the site refuses scripts (Cloudflare)no2
octa_91_toll_schedules
https://www.91expresslanes.com/general-info/toll-schedules/
2026-10-091b100 (192.168.50.14), headless Chrome, rendered page: the site refuses scripts (Cloudflare)no
pebblebeach_17mile
https://www.pebblebeach.com/17-mile-drive/
2026-10-091b100 (192.168.50.14), headless Chrome, rendered page: the site refuses scripts (Cloudflare)yes2
rctc_15_91_connector_open
https://www.rctc.org/new-15-91-express-lanes-connector-is-open/
2026-10-101fetch_list.pyyes3
sandag_511sd_toll_calculator
https://www.myfastrak.511sd.com/en/learn/toll-calculator
2026-10-091fetched on b100 (192.168.50.14), headless Chrome, rendered pageyes
sandag_i15_how_to
https://511sd.com/fastrak511sd/how-to-use-the-I-15-Express-Lanes
2026-10-091b100 (192.168.50.14), headless Chrome, rendered page: the site refuses scripts (Cloudflare)no3
sandag_sr125
https://www.sandag.org/projects-and-programs/roads-and-highways/sr-125
2026-10-101fetch_list.pyyes
sbx_511sd_pay_by_plate
https://www.myfastrak.511sd.com/en/pay-by-plate/license-plate
2026-10-101fetched on b100 (192.168.50.14), headless Chrome, rendered page: SANDAG FasTrak 'Pay-by-Plate'yes64
sbx_toll_schedule_2020
https://www.myfastrak.511sd.com/en/assets/documents/SBX_Toll_Schedule_2020.pdf
2026-10-101fetch_list.pyyes129
tca_calculator_js
https://www.thetollroads.com/js/toll-calculator.js
2026-10-091fetched on b100 (192.168.50.14)yes
tca_calculator_loclist
https://www.thetollroads.com/api/tollcalculator?action=loclist
2026-10-091fetched on b100 (192.168.50.14)yes
tca_map_rates
https://www.thetollroads.com/driving-the-toll-roads/planning-ahead/map-rates
2026-10-101fetch_list.pyyes
tca_peak_adjustment_2026
https://thetollroads.com/news/newsroom/press-releases/select-peak-hour-toll-rate-adjustmen
2026-10-101fetch_list.pyyes
tca_ratecard_2axle
https://thetollroads.com/media/0nybilxr/ratecard.pdf
2026-10-101fetch_list.pyyes484
tca_system_map
https://www.thetollroads.com/media/svpljrcy/system-map.pdf
2026-10-101fetch_list.pyyes

Facilities (28)

idfacilityoperatorpointsrate / trip rowseffective dates in the rowssource
CA-BATA-SFOBBSan Francisco-Oakland Bay BridgeBay Area Toll Authority (BATA)1182026-01-01bata_2026_toll_increase
CA-BATA-CARQCarquinez BridgeBay Area Toll Authority (BATA)1182026-01-01bata_2026_toll_increase
CA-BATA-BENIBenicia-Martinez BridgeBay Area Toll Authority (BATA)1182026-01-01bata_2026_toll_increase
CA-BATA-RSRRichmond-San Rafael BridgeBay Area Toll Authority (BATA)1182026-01-01bata_2026_toll_increase
CA-BATA-ANTAntioch BridgeBay Area Toll Authority (BATA)1182026-01-01bata_2026_toll_increase
CA-BATA-SMHSan Mateo-Hayward BridgeBay Area Toll Authority (BATA)1182026-01-01bata_2026_toll_increase
CA-BATA-DUMBDumbarton BridgeBay Area Toll Authority (BATA)1182026-01-01bata_2026_toll_increase
CA-GGBGolden Gate BridgeGolden Gate Bridge, Highway and Transportation District1182026-07-01ggb_toll_increase_2026
CA-17MILE17-Mile DrivePebble Beach Company112026-10-09_observedpebblebeach_17mile
CA-TCA-7373 Toll Road (San Joaquin Hills)Transportation Corridor Agencies (The Toll Roads)6962026-07-01tca_ratecard_2axle
CA-TCA-133133 Toll Road (Eastern)Transportation Corridor Agencies (The Toll Roads)2722026-07-01tca_ratecard_2axle
CA-TCA-241241 Toll Road (Foothill / Eastern)Transportation Corridor Agencies (The Toll Roads)92102026-07-01tca_ratecard_2axle
CA-TCA-261261 Toll Road (Eastern)Transportation Corridor Agencies (The Toll Roads)71022026-07-01tca_ratecard_2axle
CA-SBXSouth Bay Expressway (SR 125)San Diego Association of Governments (SANDAG)71922012-06-30sbx_toll_schedule_2020
CA-EL-I580I-580 Express Lanes (Pleasanton - Livermore)Bay Area Infrastructure Financing Authority / VTA / ACTC / SMCEL-JPA (FasTrak express lanes)24(none printed)fastrak_express_lanes_i_580
CA-EL-I680CCI-680 Contra Costa Express LanesBay Area Infrastructure Financing Authority / VTA / ACTC / SMCEL-JPA (FasTrak express lanes)24(none printed)fastrak_express_lanes_i_680_contra_costa
CA-EL-I680SI-680 Sunol Express LanesBay Area Infrastructure Financing Authority / VTA / ACTC / SMCEL-JPA (FasTrak express lanes)24(none printed)fastrak_express_lanes_i_680_sunol
CA-EL-I880I-880 Express LanesBay Area Infrastructure Financing Authority / VTA / ACTC / SMCEL-JPA (FasTrak express lanes)24(none printed)fastrak_express_lanes_i_880
CA-EL-SR237SR-237 Express LanesBay Area Infrastructure Financing Authority / VTA / ACTC / SMCEL-JPA (FasTrak express lanes)24(none printed)fastrak_express_lanes_sr237
CA-EL-US101SMUS-101 Express Lanes (San Mateo County)Bay Area Infrastructure Financing Authority / VTA / ACTC / SMCEL-JPA (FasTrak express lanes)24(none printed)fastrak_express_lanes_101_san_mateo
CA-EL-US101SCUS-101 / SR-85 Express Lanes (Santa Clara County)Bay Area Infrastructure Financing Authority / VTA / ACTC / SMCEL-JPA (FasTrak express lanes)24(none printed)fastrak_express_lanes_101_sr85_santa_clara
CA-EL-I80I-80 Express Lanes (Solano County)Bay Area Infrastructure Financing Authority / VTA / ACTC / SMCEL-JPA (FasTrak express lanes)24(none printed)fastrak_express_lanes_i_80
CA-EL-I10Metro ExpressLanes I-10Los Angeles County Metropolitan Transportation Authority22(none printed)la_metro_expresslanes_factsheet
CA-EL-I110Metro ExpressLanes I-110Los Angeles County Metropolitan Transportation Authority22(none printed)la_metro_expresslanes_factsheet
CA-EL-SR9191 Express Lanes (OCTA / RCTC)OCTA / RCTC11(none printed)octa_91_faqs
CA-EL-I15RC15 Express Lanes (RCTC)RCTC22(none printed)rctc_15_91_connector_open
CA-EL-I15SDI-15 Express Lanes (SANDAG)SANDAG22(none printed)sandag_i15_how_to
CA-EL-I405405 Express Lanes (OCTA)OCTA22(none printed)octa_405_how_it_works

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

pointfacilitylocationplaced onwhy
CA-EL-I580-01I-580 Express Lanes (Pleasanton - Livermore)beside: I-580 Express Lanes (Pleasanton - Livermore), eastboundthe eastbound general-lane carriageway beside the express laneR3 estimate: a notice point on the general lanes within the corridor FasTrak names
CA-EL-I580-02I-580 Express Lanes (Pleasanton - Livermore)beside: I-580 Express Lanes (Pleasanton - Livermore), westboundthe westbound general-lane carriageway beside the express laneR3 estimate: a notice point on the general lanes within the corridor FasTrak names
CA-EL-I680CC-01I-680 Contra Costa Express Lanesbeside: I-680 Contra Costa Express Lanes, northboundthe northbound general-lane carriageway beside the express laneR3 estimate: a notice point on the general lanes within the corridor FasTrak names
CA-EL-I680CC-02I-680 Contra Costa Express Lanesbeside: I-680 Contra Costa Express Lanes, southboundthe southbound general-lane carriageway beside the express laneR3 estimate: a notice point on the general lanes within the corridor FasTrak names
CA-EL-I680S-01I-680 Sunol Express Lanesbeside: I-680 Sunol Express Lanes, northboundthe northbound general-lane carriageway beside the express laneR3 estimate: a notice point on the general lanes within the corridor FasTrak names
CA-EL-I680S-02I-680 Sunol Express Lanesbeside: I-680 Sunol Express Lanes, southboundthe southbound general-lane carriageway beside the express laneR3 estimate: a notice point on the general lanes within the corridor FasTrak names
CA-EL-I880-01I-880 Express Lanesbeside: I-880 Express Lanes, northboundthe northbound general-lane carriageway beside the express laneR3 estimate: a notice point on the general lanes within the corridor FasTrak names
CA-EL-I880-02I-880 Express Lanesbeside: I-880 Express Lanes, southboundthe southbound general-lane carriageway beside the express laneR3 estimate: a notice point on the general lanes within the corridor FasTrak names
CA-EL-SR237-01SR-237 Express Lanesbeside: SR-237 Express Lanes, eastboundthe eastbound general-lane carriageway beside the express laneR3 estimate: a notice point on the general lanes within the corridor FasTrak names
CA-EL-SR237-02SR-237 Express Lanesbeside: SR-237 Express Lanes, westboundthe westbound general-lane carriageway beside the express laneR3 estimate: a notice point on the general lanes within the corridor FasTrak names
CA-EL-US101SM-01US-101 Express Lanes (San Mateo County)beside: US-101 Express Lanes (San Mateo County), northboundthe northbound general-lane carriageway beside the express laneR3 estimate: a notice point on the general lanes within the corridor FasTrak names
CA-EL-US101SM-02US-101 Express Lanes (San Mateo County)beside: US-101 Express Lanes (San Mateo County), southboundthe southbound general-lane carriageway beside the express laneR3 estimate: a notice point on the general lanes within the corridor FasTrak names
CA-EL-US101SC-01US-101 / SR-85 Express Lanes (Santa Clara County)beside: US-101 / SR-85 Express Lanes (Santa Clara County), northboundthe northbound general-lane carriageway beside the express laneR3 estimate: a notice point on the general lanes within the corridor FasTrak names
CA-EL-US101SC-02US-101 / SR-85 Express Lanes (Santa Clara County)beside: US-101 / SR-85 Express Lanes (Santa Clara County), southboundthe southbound general-lane carriageway beside the express laneR3 estimate: a notice point on the general lanes within the corridor FasTrak names
CA-EL-I80-01I-80 Express Lanes (Solano County)beside: I-80 Express Lanes (Solano County), eastboundthe eastbound general-lane carriageway beside the express laneR3 estimate: a notice point on the general lanes within the corridor FasTrak names
CA-EL-I80-02I-80 Express Lanes (Solano County)beside: I-80 Express Lanes (Solano County), westboundthe westbound general-lane carriageway beside the express laneR3 estimate: a notice point on the general lanes within the corridor FasTrak names

Decisions by rule

R2: 31, R2a: 11, R2b: 9, R3: 16, direction: 9, not: 3, optional,: 14, plan: 4 (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 CA (11)

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
CA Bay Bridge westbound, FasTrak (account_ca) car ($8.50)$8.50
CA Bay Bridge eastbound: not tolled ($0)$0.00
CA Golden Gate southbound, invoice car ($11.25)$11.25
CA Golden Gate northbound: not tolled ($0)$0.00
CA Carquinez (I-80 east, compass north), FasTrak 5-axle ($30.50)$30.50
CA 17-Mile Drive via the Pacific Grove gate, cash ($12.50 once)$12.50
CA SR 73 Catalina View southbound Wed 7:30 a.m. PT, FasTrak car ($7.46)$7.46
CA SR 125 SR 54 -> Otay Mesa Rd southbound, FasTrak car ($2.75)$2.75
CA SR 125 Otay Mesa Rd -> SR 54 northbound, cash car ($3.50)$3.50
CA I-880 express lanes weekday 7:30 a.m. PT: told ($0)$0.00
CA SR 125 Otay Mesa Rd -> SR 54 northbound, Pay-by-Plate car ($3.50 + $2.00)$5.50