Florida tolls: how to maintain

Files: /srv/toll/draft/FL, last built 2026-10-10 02:05 ET · the FL 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 FL)

Procedure for this state

Florida is the most hand-made state: some operators' amounts are typed into code (below). The printed tables of Florida's Turnpike and CFX are rebuilt from the archived PDFs by one script.

When to check

Sources

Rebuild

  1. Printed rates: /home/geo1/maps/toll/FL/printed_rates.csv (2028 rows). /home/geo1/system/handbuilt/fl_printed.sh rebuilds it from the newest archived PDFs: fl_rows.py dumps the six Turnpike regional PDFs' rows, the CFX schedule's rows are taken by amount count, and fl_build.py writes the table. It prints unchanged or the differences; fl_printed.sh --write takes a changed result (the old file is kept with the date). Rebuilt on 2026-10-09: identical to the file in use. A new regional PDF with a new table or a changed title also needs FTE_TABLES in fl_build.py updated (title, county line, effective date as printed, in PDF order).
  2. Typed in code: THEA, Mid-Bay, Lee, Miami-Dade, Card Sound in fl_build.py hand(); Escambia, Osceola, GIBA, GMX (5), Dunes in fl_state.py HAND; Mercy Drive META_ROW; FTE effective dates in FTE_TABLES.
  3. Express lanes: python3 express_booths.py (reads facility_elements.json, writes osm/fl_express_booths.json, osm/fl_lane_ways.json). Amounts are the calculator's minimums (time_band=dynamic), charged as the floor with a note.
  4. Full chain with tollnode_ways.py FL before toll_ways.py FL. Ramp fixes: register_ramps.py and calc_ramps.py (needs /tmp/fte_elements.json, /tmp/moves.jsonl and Valhalla on 127.0.0.1:8002 — the /tmp inputs are not kept), then toll_ways.py FL again. OSM box -87.7,24.3,-79.8,31.1.

Verify

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

5. Publish

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

Sources (39)

Each fetch is kept in its own dated folder under /home/geo1/maps/toll/FL/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
card_sound_toll_authority
https://www.monroecounty-fl.gov/100/Card-Sound-Toll-Authority
2026-10-071fetch_list.pyyes17
cfx_calculator_register
https://www.cfxway.com/for-travelers/
2026-10-081fetch_list.pyyes8
cfx_toll_facilities_manual_2026
https://www.cfxway.com/wp-content/uploads/2026/09/2026-Toll-Facilities-Reference-Manual-08
2026-10-071fetch_list.pyyes
cfx_toll_rates_2026
https://www.cfxway.com/wp-content/uploads/2026/07/CFX-Toll-Rates-As-of-July-1-2026-FINAL.p
2026-10-071fetch_list.pyyes472
cfx_toll_rates_page
https://www.cfxway.com/for-travelers/tolls/toll-rates/
2026-10-071fetch_list.pyyes
dunescdd_bridge_toll_facility
https://dunescdd.org/hammock-dunes-bridge-toll-facility/
2026-10-081fetch_list.pyyes9
escambia_pensacola_beach
https://www.myescambia.com/pensacola-beach
2026-10-071fetch_list.pyyes3
express_595_index
https://www.595express.info/index.shtm
2026-10-071fetch_list.pyyes
express_95_flyer
https://95express.com/wp-content/uploads/2023/12/I-95-Express-Lanes-Flyer.pdf
2026-10-071fetch_list.pyyes
fdot_interchanges_named
https://services1.arcgis.com/O1JpcwDW8sjYuddV/ArcGIS/rest/services/FDOT_Interchanges/Featu
2026-10-071fetch_list.pyyes
fdot_rci_interchanges
https://gis.fdot.gov/arcgis/rest/services/RCI_Layers/FeatureServer/5/query?where=1%3D1&out
2026-10-071fetch_list.pyyes
fdot_rci_local_names
https://gis.fdot.gov/arcgis/rest/services/RCI_Layers/FeatureServer/13/query?where=COUNTY%2
2026-10-071fetch_list.pyyes
fdot_rci_mile_markers
https://gis.fdot.gov/arcgis/rest/services/RCI_Layers/FeatureServer/27/query?where=1%3D1&ou
2026-10-071fetch_list.pyyes
fdot_rci_toll_plaza_names
https://gis.fdot.gov/arcgis/rest/services/RCI_Layers/FeatureServer/17/query?where=1%3D1&ou
2026-10-071fetch_list.pyyes
fdot_rci_toll_roads
https://gis.fdot.gov/arcgis/rest/services/RCI_Layers/FeatureServer/24/query?where=1%3D1&ou
2026-10-071fetch_list.pyyes
fdot_rule_14_15_0081
https://floridasturnpike.com/wp-content/uploads/2024/10/14-15.0081-Toll-Rate-Schedule_2-25
2026-10-071fetch_list.pyyes
fte_central
https://floridasturnpike.com/wp-content/uploads/2026/08/Central-Florida-08-14-2026.pdf
2026-10-071fetch_list.pyyes648
fte_interchanges
https://services1.arcgis.com/O1JpcwDW8sjYuddV/ArcGIS/rest/services/TurnpikeBaseData/Featur
2026-10-071fetch_list.pyyes
fte_mile_posts
https://services1.arcgis.com/O1JpcwDW8sjYuddV/ArcGIS/rest/services/TurnpikeBaseData/Featur
2026-10-071fetch_list.pyyes
fte_north_east
https://floridasturnpike.com/wp-content/uploads/2026/06/North_East_Florida-6-2026.pdf
2026-10-071fetch_list.pyyes193
fte_panhandle
https://floridasturnpike.com/wp-content/uploads/2025/09/Panhandle-9-2025.pdf
2026-10-071fetch_list.pyyes17
fte_south_central
https://floridasturnpike.com/wp-content/uploads/2023/06/South-Central-Florida.pdf
2026-10-071fetch_list.pyyes161
fte_south_florida
https://floridasturnpike.com/wp-content/uploads/2026/07/South-Florida-8-3-2026.pdf
2026-10-071fetch_list.pyyes700
fte_toll_calculator
https://ftcv3-prd.techworks.dev/api/Map/facility-elements
2026-10-081fetch_list.pyyes79
fte_toll_plazas_gantries
https://services1.arcgis.com/O1JpcwDW8sjYuddV/ArcGIS/rest/services/TurnpikeBaseData/Featur
2026-10-071fetch_list.pyyes
fte_toll_rates_page
https://floridasturnpike.com/toll-rates/
2026-10-071fetch_list.pyyes
fte_west_central
https://floridasturnpike.com/wp-content/uploads/2026/04/West-Central-Florida-4-2026.pdf
2026-10-071fetch_list.pyyes823
giba_home
https://giba.us/
2026-10-071fetch_list.pyyes
giba_toll_rates
https://giba.us/wp-content/uploads/2026/08/Toll-Rates-05.09.25.pdf
2026-10-071fetch_list.pyyes14
gmx_expressway_map
https://www.gmx-way.com/help/expressway-map
2026-10-081fetch_list.pyno
gmx_toll_rate_schedule
https://www.gmx-way.com/pdf/Toll_Rate_Schedule.pdf
2026-10-081fetch_list.pyyes233
i4express_faqs
https://i4express.com/faqs/
2026-10-071fetch_list.pyyes
lee_tolls_cost
https://www.leegov.com/tolls/cost
2026-10-071fetch_list.pyyes50
lee_tolls_locations
https://www.leegov.com/tolls/locations
2026-10-071fetch_list.pyyes
miamidade_causeways
https://www.miamidade.gov/parks/causeways.asp
2026-10-071fetch_list.pyyes34
midbay_toll_information
https://mid-bay.com/toll-information/
2026-10-071fetch_list.pyyes50
osceola_parkway_appendix_q
https://www.osceola.org/files/assets/county/v/1/services/county-fees/documents/2024-10-01_
2026-10-071fetch_list.pyyes
osceola_toll_roads
https://www.osceola.org/Community/Transportation-and-Transit/Toll-Roads
2026-10-071b100 workstation (geo1 gets HTTP 403)yes17
thea_toll_map_calculator
https://tampa-xway.com/for-travelers/tolls/toll-map-calculator/
2026-10-071fetch_list.pyyes17

Facilities (56)

idfacilityoperatorpointsrate / trip rowseffective dates in the rowssource
FL-T01Turnpike Mainline (SR 821)Florida Department of Transportation / Florida’s Turnpike Enterprise193042026-04-21fte_south_florida
FL-T02Turnpike Mainline - SR 91 (MP 0X - MP 88)Florida Department of Transportation / Florida’s Turnpike Enterprise162562023-07-01fte_south_florida
FL-T03Sawgrass Expressway (SR 869)Florida Department of Transportation / Florida’s Turnpike Enterprise101042023-07-01fte_south_florida
FL-T04Alligator Alley (I-75) — ALLIGATOR ALLEY (EVERGLADES PARKWAY)Florida Department of Transportation / Florida’s Turnpike Enterprise2322026-08-03fte_south_florida
FL-T05Turnpike Mainline – SR 91 (MP 88 - MP 236)Florida Department of Transportation / Florida’s Turnpike Enterprise101602023-07-01fte_south_central
FL-T06Turnpike Mainline - SR 91 (MP 236 - MP 309)Florida Department of Transportation / Florida’s Turnpike Enterprise142562026-08-14fte_central
FL-T07Beachline West Expressway (SR 528) — TURNPIKE MAINLINE: BEACHLINE WEST EXPRESSWAY (SR 528)Florida Department of Transportation / Florida’s Turnpike Enterprise1162026-07-01fte_central
FL-T08Beachline East Expressway (SR 528)Florida Department of Transportation / Florida’s Turnpike Enterprise182026-07-01fte_central
FL-T09BEACHLINE EAST EXPRESSWAY (SR 520 RAMPS)Florida Department of Transportation / Florida’s Turnpike Enterprise182026-07-01fte_central
FL-T10Seminole Expressway (SR 417)Florida Department of Transportation / Florida’s Turnpike Enterprise71282024-06-01fte_central
FL-T11Southern Connector Extension (SR 417)Florida Department of Transportation / Florida’s Turnpike Enterprise3482025-02-21fte_central
FL-T12Daniel Webster Western Beltway, Part C (SR 429)Florida Department of Transportation / Florida’s Turnpike Enterprise41122025-02-21fte_central
FL-T13Wekiva Parkway (SR 429)Florida Department of Transportation / Florida’s Turnpike Enterprise4642023-07-01fte_central
FL-T14Veterans Expressway (SR 589)Florida Department of Transportation / Florida’s Turnpike Enterprise82242023-07-01fte_west_central
FL-T15Suncoast Parkway (SR 589)Florida Department of Transportation / Florida’s Turnpike Enterprise112562025-08-25fte_west_central
FL-T16Polk Parkway (SR 570)Florida Department of Transportation / Florida’s Turnpike Enterprise121922024-03-28fte_west_central
FL-T17I-4 ConnectorFlorida Department of Transportation / Florida’s Turnpike Enterprise2322023-07-01fte_west_central
FL-T18Sunshine Skyway Bridge (I - 275)Florida Department of Transportation / Florida’s Turnpike Enterprise2322026-04-12fte_west_central
FL-T19Pinellas Bayway System (SR 682 and SR 679)Florida Department of Transportation / Florida’s Turnpike Enterprise3482023-09-22fte_west_central
FL-T20Gateway Expressway (SR 690 and SR 686A) — PINELLAS BAYWAY SYSTEM (SR 690 and SR 686A)Florida Department of Transportation / Florida’s Turnpike Enterprise2322024-05-03fte_west_central
FL-T21First Coast Expressway (SR 23)Florida Department of Transportation / Florida’s Turnpike Enterprise101922026-06-29fte_north_east
FL-T22Garcon Point Bridge (SR 281)Florida Department of Transportation / Florida’s Turnpike Enterprise1162025-09-28fte_panhandle
FL-T23SR 528 — CFX Toll Rates as of July 1, 2026Central Florida Expressway Authority (CFX)6482026-07-01cfx_toll_rates_2026
FL-T24SR 408 — CFX Toll Rates as of July 1, 2026Central Florida Expressway Authority (CFX)171362026-07-01, 2026-10-07_observedcfx_toll_rates_2026
FL-T25SR 417 — CFX Toll Rates as of July 1, 2026Central Florida Expressway Authority (CFX)161282026-07-01cfx_toll_rates_2026
FL-T26SR 429 — CFX Toll Rates as of July 1, 2026Central Florida Expressway Authority (CFX)11882026-07-01cfx_toll_rates_2026
FL-T27SR 414 — CFX Toll Rates as of July 1, 2026Central Florida Expressway Authority (CFX)3402026-07-01cfx_toll_rates_2026
FL-T28SR 453 — CFX Toll Rates as of July 1, 2026Central Florida Expressway Authority (CFX)182026-07-01cfx_toll_rates_2026
FL-T29SR 538 — CFX Toll Rates as of July 1, 2026Central Florida Expressway Authority (CFX)2162026-07-01cfx_toll_rates_2026
FL-T30Selmon Expressway — Toll Rates (2-axle vehicles)Tampa Hillsborough Expressway Authority (THEA)8162026-07-01thea_toll_map_calculator
FL-T31MID-BAY BRIDGE TOLL PLAZAMid-Bay Bridge Authority1242026-10-07_observedmidbay_toll_information
FL-T32SPENCE PARKWAY ALL ELECTRONIC TOLL GANTRYMid-Bay Bridge Authority1242026-10-07_observedmidbay_toll_information
FL-T33Midpoint & Cape Coral Toll PlazasLee County2322026-10-07_observedlee_tolls_cost
FL-T34Sanibel Toll PlazaLee County1162026-10-07_observedlee_tolls_cost
FL-T35Rickenbacker CausewayMiami-Dade County Department of Transportation & Public Works1162025-10-01miamidade_causeways
FL-T36Venetian CausewayMiami-Dade County Department of Transportation & Public Works1162025-10-01miamidade_causeways
FL-T37Card Sound BridgeCard Sound Toll Authority (Monroe County)1162026-10-01card_sound_toll_authority
FL-T38Bob Sikes BridgeEscambia County122026-10-07_observedescambia_pensacola_beach
FL-T39Osceola ParkwayOsceola County2162026-10-07_observedosceola_toll_roads
FL-T40Boca Grande CausewayGasparilla Island Bridge Authority1132026-10-07_observedgiba_toll_rates
FL-T41Gratigny Parkway (SR 924)Greater Miami Expressway Agency (GMX)2242026-10-07_observedgmx_toll_rate_schedule
FL-T42Don Shula Expressway (SR 874)Greater Miami Expressway Agency (GMX)3362026-10-07_observedgmx_toll_rate_schedule
FL-T43Snapper Creek Expressway (SR 878)Greater Miami Expressway Agency (GMX)2242026-10-07_observedgmx_toll_rate_schedule
FL-T44Airport Expressway (SR 112)Greater Miami Expressway Agency (GMX)2242026-10-07_observedgmx_toll_rate_schedule
FL-T45Dolphin Expressway (SR 836)Greater Miami Expressway Agency (GMX)101202026-10-07_observedgmx_toll_rate_schedule
FL-T56Hammock Dunes BridgeDunes Community Development District182022-11-01dunescdd_bridge_toll_facility
FL-T46SR 551 (Goldenrod Road) — CFX Toll Rates as of July 1, 2026Central Florida Expressway Authority (CFX)182026-07-01cfx_toll_rates_2026
FL-T4795 Express (I-95 express lanes)Florida Department of Transportation14142026-10-07_observedfte_toll_calculator
FL-T48I-4 Express (I-4 express lanes)Florida Department of Transportation992026-10-07_observedfte_toll_calculator
FL-T49295 Express (I-295 express lanes)Florida Department of Transportation662026-10-07_observedfte_toll_calculator
FL-T5075 Express (I-75 express lanes)Florida Department of Transportation442026-10-07_observedfte_toll_calculator
FL-T51275 Express (I-275 express lanes)Florida Department of Transportation442026-10-07_observedfte_toll_calculator
FL-T52Palmetto Express (SR 826 express lanes)Florida Department of Transportation442026-10-07_observedfte_toll_calculator
FL-T53595 Express (I-595 reversible express lanes)Florida Department of Transportation112026-10-07_observedfte_toll_calculator
FL-T54Broad Causeway (SR 922)Town of Bay Harbor Islands1142026-10-07_observedfte_toll_calculator
FL-T55Orchard Pond Parkway (CR 0344)Orchard Pond Parkway (private toll road)1142026-10-07_observedfte_toll_calculator

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

None: every position comes from an official layer or a mapped toll node.

Decisions by rule

R0: 9, R1: 38, R2a: 44, R2b: 72, R2c: 1, R2d: 22, R2e: 10, R2f: 56, R3: 7, direction: 221, mile: 1, positions: 5, source: 1, statewide: 44 (all in decisions.csv).

Open gaps (0)

None.

Untied OSM toll nodes: 225

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 FL (2)

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
FL MCO->Disney-
FL Turnpike Orlando->Fort Pierce-