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.
urls.txt carry dated file names: edit them by hand.fte_south_florida, fte_south_central, fte_central, fte_west_central, fte_north_east, fte_panhandle; CFX: cfx_toll_rates_2026 (FL-T23..29, T46); other operators THEA, Mid-Bay, Lee, Miami-Dade causeways, Card Sound, Escambia, Osceola, GIBA, GMX, Dunes; express-lane rule pages. All via python3 fetch_list.py FL [names].fte_toll_plazas_gantries layer 10, fte_interchanges layer 3, fte_mile_posts) and FDOT RCI layers (fdot_rci_*); fetch_layer.py FL <name> <url> pages through ArcGIS layers. FTE layer positions win over RCI.fte_toll_calculator/…/facility_elements.json from https://ftcv3-prd.techworks.dev/api/Map/facility-elements (express lanes FL-T47..T55, Broad Causeway, Orchard Pond); cfx_calculator_register/…/mapdata.json (the var mapData on cfxway.com/for-travelers). gmx_expressway_map is not in urls.txt./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).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.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.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.python3 fl_verify.py compares transcribed amounts with the archived PDFs' text (2026-10-09: 206 of 206 rows verified, 0 mismatched).fl_pricecheck.py compares the printed 2-axle amount with OSM price tags within 150 m (last: 328 checked, 35 differ, 2026-10-07).FETCHED and SRC_FETCHED dates are hard-coded in fl_state.py; cfx_calculator_register is missing from SRC_FETCHED.PTS uses glob(...)[0]: the oldest RCI fetch, not the newest.HAND_POS) are tied to OSM node ids: re-check after an OSM refresh. Wekiva "53 - ORANGE PLAZA" is geometry only; Hammock Dunes eastbound comes from an OSM note._observed.fl_cross.py, fl_gapcand.py, fl_osmline.py read ~/system/scratch/fl_toll.osm; fl_rateblocks.py needs /tmp/llm_exp/s1f_exp.py; fl_xcheck.py and fl_gapcand.py read a calc/ folder that does not exist.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.
| what | where (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) |
| output | draft /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 engine | source /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 trips | b100: ~/apitest/site/cases.json, runner ~/apitest/run.py, browser check ~/apitest/browser.mjs |
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.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.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.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.
cd /home/geo1/system/handbuilt && python3 fl_state.pybash /home/geo1/system/handbuilt/chain.sh FL (logs in /tmp/fl1.log ... fl6.log; it prints the points, any point on no road and the untied count). The builders written since October 2026 share state_kit.py (sources, booths, terms, rows, write) and own_state.py (keeps a state's untied list to toll nodes inside the state, by the local geocoder; cache osm/node_state.json).cd /home/geo1/system/handbuilt; H=$(ls osm/fl_highways_*.geojsonseq); J=$(ls osm/fl_junctions_*.geojsonseq)
python3 fl_state.py && python3 osm_streets.py FL $H $J && python3 fl_state.py && python3 osm_snap.py FL && python3 toll_ways.py FL && python3 fl_state.pytoll_ways.py's output: nodes claimed by two points: {} and points on no road: [] must both be empty.OSM way <id>) needs that way in osm/fl_lane_ways.json (the builder writes it). A point on a road priced entry to exit needs gantry in its location name, or toll_ways.py treats it as a position-only exit marker.osm/ny_not_toll_nodes.json (congestion-zone gantries that are not tolls); every state's untied list leaves those out, so rebuild NJ and PA after NY.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).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.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.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.
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.
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.
| id | facility | operator | points | rate / trip rows | effective dates in the rows | source |
|---|---|---|---|---|---|---|
FL-T01 | Turnpike Mainline (SR 821) | Florida Department of Transportation / Florida’s Turnpike Enterprise | 19 | 304 | 2026-04-21 | fte_south_florida |
FL-T02 | Turnpike Mainline - SR 91 (MP 0X - MP 88) | Florida Department of Transportation / Florida’s Turnpike Enterprise | 16 | 256 | 2023-07-01 | fte_south_florida |
FL-T03 | Sawgrass Expressway (SR 869) | Florida Department of Transportation / Florida’s Turnpike Enterprise | 10 | 104 | 2023-07-01 | fte_south_florida |
FL-T04 | Alligator Alley (I-75) — ALLIGATOR ALLEY (EVERGLADES PARKWAY) | Florida Department of Transportation / Florida’s Turnpike Enterprise | 2 | 32 | 2026-08-03 | fte_south_florida |
FL-T05 | Turnpike Mainline – SR 91 (MP 88 - MP 236) | Florida Department of Transportation / Florida’s Turnpike Enterprise | 10 | 160 | 2023-07-01 | fte_south_central |
FL-T06 | Turnpike Mainline - SR 91 (MP 236 - MP 309) | Florida Department of Transportation / Florida’s Turnpike Enterprise | 14 | 256 | 2026-08-14 | fte_central |
FL-T07 | Beachline West Expressway (SR 528) — TURNPIKE MAINLINE: BEACHLINE WEST EXPRESSWAY (SR 528) | Florida Department of Transportation / Florida’s Turnpike Enterprise | 1 | 16 | 2026-07-01 | fte_central |
FL-T08 | Beachline East Expressway (SR 528) | Florida Department of Transportation / Florida’s Turnpike Enterprise | 1 | 8 | 2026-07-01 | fte_central |
FL-T09 | BEACHLINE EAST EXPRESSWAY (SR 520 RAMPS) | Florida Department of Transportation / Florida’s Turnpike Enterprise | 1 | 8 | 2026-07-01 | fte_central |
FL-T10 | Seminole Expressway (SR 417) | Florida Department of Transportation / Florida’s Turnpike Enterprise | 7 | 128 | 2024-06-01 | fte_central |
FL-T11 | Southern Connector Extension (SR 417) | Florida Department of Transportation / Florida’s Turnpike Enterprise | 3 | 48 | 2025-02-21 | fte_central |
FL-T12 | Daniel Webster Western Beltway, Part C (SR 429) | Florida Department of Transportation / Florida’s Turnpike Enterprise | 4 | 112 | 2025-02-21 | fte_central |
FL-T13 | Wekiva Parkway (SR 429) | Florida Department of Transportation / Florida’s Turnpike Enterprise | 4 | 64 | 2023-07-01 | fte_central |
FL-T14 | Veterans Expressway (SR 589) | Florida Department of Transportation / Florida’s Turnpike Enterprise | 8 | 224 | 2023-07-01 | fte_west_central |
FL-T15 | Suncoast Parkway (SR 589) | Florida Department of Transportation / Florida’s Turnpike Enterprise | 11 | 256 | 2025-08-25 | fte_west_central |
FL-T16 | Polk Parkway (SR 570) | Florida Department of Transportation / Florida’s Turnpike Enterprise | 12 | 192 | 2024-03-28 | fte_west_central |
FL-T17 | I-4 Connector | Florida Department of Transportation / Florida’s Turnpike Enterprise | 2 | 32 | 2023-07-01 | fte_west_central |
FL-T18 | Sunshine Skyway Bridge (I - 275) | Florida Department of Transportation / Florida’s Turnpike Enterprise | 2 | 32 | 2026-04-12 | fte_west_central |
FL-T19 | Pinellas Bayway System (SR 682 and SR 679) | Florida Department of Transportation / Florida’s Turnpike Enterprise | 3 | 48 | 2023-09-22 | fte_west_central |
FL-T20 | Gateway Expressway (SR 690 and SR 686A) — PINELLAS BAYWAY SYSTEM (SR 690 and SR 686A) | Florida Department of Transportation / Florida’s Turnpike Enterprise | 2 | 32 | 2024-05-03 | fte_west_central |
FL-T21 | First Coast Expressway (SR 23) | Florida Department of Transportation / Florida’s Turnpike Enterprise | 10 | 192 | 2026-06-29 | fte_north_east |
FL-T22 | Garcon Point Bridge (SR 281) | Florida Department of Transportation / Florida’s Turnpike Enterprise | 1 | 16 | 2025-09-28 | fte_panhandle |
FL-T23 | SR 528 — CFX Toll Rates as of July 1, 2026 | Central Florida Expressway Authority (CFX) | 6 | 48 | 2026-07-01 | cfx_toll_rates_2026 |
FL-T24 | SR 408 — CFX Toll Rates as of July 1, 2026 | Central Florida Expressway Authority (CFX) | 17 | 136 | 2026-07-01, 2026-10-07_observed | cfx_toll_rates_2026 |
FL-T25 | SR 417 — CFX Toll Rates as of July 1, 2026 | Central Florida Expressway Authority (CFX) | 16 | 128 | 2026-07-01 | cfx_toll_rates_2026 |
FL-T26 | SR 429 — CFX Toll Rates as of July 1, 2026 | Central Florida Expressway Authority (CFX) | 11 | 88 | 2026-07-01 | cfx_toll_rates_2026 |
FL-T27 | SR 414 — CFX Toll Rates as of July 1, 2026 | Central Florida Expressway Authority (CFX) | 3 | 40 | 2026-07-01 | cfx_toll_rates_2026 |
FL-T28 | SR 453 — CFX Toll Rates as of July 1, 2026 | Central Florida Expressway Authority (CFX) | 1 | 8 | 2026-07-01 | cfx_toll_rates_2026 |
FL-T29 | SR 538 — CFX Toll Rates as of July 1, 2026 | Central Florida Expressway Authority (CFX) | 2 | 16 | 2026-07-01 | cfx_toll_rates_2026 |
FL-T30 | Selmon Expressway — Toll Rates (2-axle vehicles) | Tampa Hillsborough Expressway Authority (THEA) | 8 | 16 | 2026-07-01 | thea_toll_map_calculator |
FL-T31 | MID-BAY BRIDGE TOLL PLAZA | Mid-Bay Bridge Authority | 1 | 24 | 2026-10-07_observed | midbay_toll_information |
FL-T32 | SPENCE PARKWAY ALL ELECTRONIC TOLL GANTRY | Mid-Bay Bridge Authority | 1 | 24 | 2026-10-07_observed | midbay_toll_information |
FL-T33 | Midpoint & Cape Coral Toll Plazas | Lee County | 2 | 32 | 2026-10-07_observed | lee_tolls_cost |
FL-T34 | Sanibel Toll Plaza | Lee County | 1 | 16 | 2026-10-07_observed | lee_tolls_cost |
FL-T35 | Rickenbacker Causeway | Miami-Dade County Department of Transportation & Public Works | 1 | 16 | 2025-10-01 | miamidade_causeways |
FL-T36 | Venetian Causeway | Miami-Dade County Department of Transportation & Public Works | 1 | 16 | 2025-10-01 | miamidade_causeways |
FL-T37 | Card Sound Bridge | Card Sound Toll Authority (Monroe County) | 1 | 16 | 2026-10-01 | card_sound_toll_authority |
FL-T38 | Bob Sikes Bridge | Escambia County | 1 | 2 | 2026-10-07_observed | escambia_pensacola_beach |
FL-T39 | Osceola Parkway | Osceola County | 2 | 16 | 2026-10-07_observed | osceola_toll_roads |
FL-T40 | Boca Grande Causeway | Gasparilla Island Bridge Authority | 1 | 13 | 2026-10-07_observed | giba_toll_rates |
FL-T41 | Gratigny Parkway (SR 924) | Greater Miami Expressway Agency (GMX) | 2 | 24 | 2026-10-07_observed | gmx_toll_rate_schedule |
FL-T42 | Don Shula Expressway (SR 874) | Greater Miami Expressway Agency (GMX) | 3 | 36 | 2026-10-07_observed | gmx_toll_rate_schedule |
FL-T43 | Snapper Creek Expressway (SR 878) | Greater Miami Expressway Agency (GMX) | 2 | 24 | 2026-10-07_observed | gmx_toll_rate_schedule |
FL-T44 | Airport Expressway (SR 112) | Greater Miami Expressway Agency (GMX) | 2 | 24 | 2026-10-07_observed | gmx_toll_rate_schedule |
FL-T45 | Dolphin Expressway (SR 836) | Greater Miami Expressway Agency (GMX) | 10 | 120 | 2026-10-07_observed | gmx_toll_rate_schedule |
FL-T56 | Hammock Dunes Bridge | Dunes Community Development District | 1 | 8 | 2022-11-01 | dunescdd_bridge_toll_facility |
FL-T46 | SR 551 (Goldenrod Road) — CFX Toll Rates as of July 1, 2026 | Central Florida Expressway Authority (CFX) | 1 | 8 | 2026-07-01 | cfx_toll_rates_2026 |
FL-T47 | 95 Express (I-95 express lanes) | Florida Department of Transportation | 14 | 14 | 2026-10-07_observed | fte_toll_calculator |
FL-T48 | I-4 Express (I-4 express lanes) | Florida Department of Transportation | 9 | 9 | 2026-10-07_observed | fte_toll_calculator |
FL-T49 | 295 Express (I-295 express lanes) | Florida Department of Transportation | 6 | 6 | 2026-10-07_observed | fte_toll_calculator |
FL-T50 | 75 Express (I-75 express lanes) | Florida Department of Transportation | 4 | 4 | 2026-10-07_observed | fte_toll_calculator |
FL-T51 | 275 Express (I-275 express lanes) | Florida Department of Transportation | 4 | 4 | 2026-10-07_observed | fte_toll_calculator |
FL-T52 | Palmetto Express (SR 826 express lanes) | Florida Department of Transportation | 4 | 4 | 2026-10-07_observed | fte_toll_calculator |
FL-T53 | 595 Express (I-595 reversible express lanes) | Florida Department of Transportation | 1 | 1 | 2026-10-07_observed | fte_toll_calculator |
FL-T54 | Broad Causeway (SR 922) | Town of Bay Harbor Islands | 1 | 14 | 2026-10-07_observed | fte_toll_calculator |
FL-T55 | Orchard Pond Parkway (CR 0344) | Orchard Pond Parkway (private toll road) | 1 | 14 | 2026-10-07_observed | fte_toll_calculator |
None: every position comes from an official layer or a mapped toll node.
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).
None.
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.
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.
| trip | expected |
|---|---|
| FL MCO->Disney | - |
| FL Turnpike Orlando->Fort Pierce | - |