CLI for I-66 inside-the-Beltway toll lookups
Project description
i66tolls
Command-line tool to check tolls on I-66 inside the Capital Beltway (between I-495 and the Theodore Roosevelt Bridge).
Run it with no arguments for an interactive wizard, or pass entry/exit IDs and flags for a quick lookup.
Data comes from VDOT's official toll calculator at vai66tolls.com.
DISCLAIMER: I am not affiliated with i66 or VDOT in any way. I'm just some guy who doesnt like using the website. So I can't make any assurances you will pay what you see in this CLI, it's just relaying what it gets from the (undocumented) API.
How the toll works (in my understanding)
There are 3-4 tolling segments in each direction. The price you pay for driving on a segment is locked in when you enter that segment. This may give you the impression your toll price is locked in when you enter i66. In fact, if you enter on segment 1 the toll for segment 2 can still change while you're driving on segment 1. This is why it's impossible to know your entire toll before you enter i66. And why, in my view, this tolling system should be illegal. The tills provided by the website and this command line tool can only be estimates because it’s physically impossible to enter all 3-4 segments at the same time.
There are more exits and entries than segments. The 3 segments are shown in this graphic
Eastbound segments (AM commute):
- Segment 1: From I-495 to the Dulles Connector Road (Exit 67).
- Segment 2: From the Dulles Connector Road to Fairfax Drive (Exit 71).
- Segment 3: From Fairfax Drive to US 29 in Rosslyn.
Westbound segments (PM commute):
- Segment 1A: From US 29 in Rosslyn to Glebe Road (Exit 72).
- Segment 1B: From Glebe Road to the Dulles Connector Road (Exit 67).
- Segment 2: From the Dulles Connector Road to Sycamore Street.
- Segment 3: From Sycamore Street to I-495.
They are supposed to show you your toll before you enter each segment, but as we all know the signs are broken half the time. So there's often no way for you to know how much you're paying before or during your commute.
Requirements
- Python 3.10+
- Typer for the CLI
- prompt_toolkit and its-a-dt for interactive prompts
Install
From PyPI:
pip install i66tolls
From source:
pip install -e .
Interactive mode
i66tolls
- Direction — current, eastbound, or westbound
- current uses the system clock. If no toll period is active, prints a message and exits.
- Eastbound/westbound continues to entry selection for that direction.
- Entry — choose an entry interchange
- Exit — choose an exit interchange
- When —
current estimateorhistoric(skipped if you already chosecurrent estimatein step 1) - Date/time — for historic lookups, an interactive date/time picker (its-a-dt)
Use ↑/↓ and Enter to select. Press ← to go back to the previous step (even for values pre-filled from the command line).
Provide arguments to skip interactive steps
Provide entry and exit IDs (and any other options) to skip prompts:
i66tolls 1 10 -c
i66tolls 1 10 --current
i66tolls 16 1 -w -c
i66tolls 1 10 -t "06/10/2026 08:00 AM"
When both entry and exit are given, direction is inferred automatically.
Options
| Flag | Description |
|---|---|
-e, --eastbound |
Eastbound route |
-w, --westbound |
Westbound route |
-c, --current |
Use the current toll rate |
-t, --time |
Historic date/time (MM/DD/YYYY HH:MM AM/PM, US/Eastern) |
Conflicts
--eastboundand--westboundcannot be used together--currentand--timecannot be used together- Provide both entry and exit IDs, or neither
Toll hours
| Direction | Hours |
|---|---|
| Eastbound (toward DC) | Weekdays 5:30–9:30 AM |
| Westbound (toward Beltway) | Weekdays 3:00–7:00 PM |
Outside these windows, current tolls show as unavailable. Federal holidays are also toll-free.
Entry and exit IDs
Run i66tolls and browse the interactive lists, or query the API directly:
curl -s "https://vai66tolls.com/Index?handler=BeginIntPartial&rbEastVal=true" | grep option
curl -s "https://vai66tolls.com/Index?handler=ExitIntPartial&bIntId=1&rbEastVal=true" | grep option
Data source
This tool uses the same backend API as vai66tolls.com. Amounts are estimates and can change before you reach the road.
The old public endpoint you might see in other projects is no longer available. Maybe they were hitting it too hard, who knows.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file i66tolls-0.2.0.tar.gz.
File metadata
- Download URL: i66tolls-0.2.0.tar.gz
- Upload date:
- Size: 17.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9fda3ad46e230719654a4ca264546f99cadf842ca343bc3c50914f3a543f5f1f
|
|
| MD5 |
4fb57a7d01bc850ddc48f6c2fe176a2d
|
|
| BLAKE2b-256 |
a0d777bb6364dca89497c57d0c9ed1c10038fb7616d4ecda103020b5a73df450
|
Provenance
The following attestation bundles were made for i66tolls-0.2.0.tar.gz:
Publisher:
publish.yml on alanjschoen/i66tolls
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
i66tolls-0.2.0.tar.gz -
Subject digest:
9fda3ad46e230719654a4ca264546f99cadf842ca343bc3c50914f3a543f5f1f - Sigstore transparency entry: 2175829631
- Sigstore integration time:
-
Permalink:
alanjschoen/i66tolls@49868790b35a2ae340709ef3360b95fb50d1dd88 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/alanjschoen
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@49868790b35a2ae340709ef3360b95fb50d1dd88 -
Trigger Event:
push
-
Statement type:
File details
Details for the file i66tolls-0.2.0-py3-none-any.whl.
File metadata
- Download URL: i66tolls-0.2.0-py3-none-any.whl
- Upload date:
- Size: 15.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
16f1f848eec1f47cca812805a43667e3cfe4d1abd8ff1f21727980450bc03291
|
|
| MD5 |
17e3bf56cab19a23c50ed337f3e8c511
|
|
| BLAKE2b-256 |
c6d23ebb4749f113b9eb8135f296a1bd17d932862734c071c1bf59a74c547b8c
|
Provenance
The following attestation bundles were made for i66tolls-0.2.0-py3-none-any.whl:
Publisher:
publish.yml on alanjschoen/i66tolls
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
i66tolls-0.2.0-py3-none-any.whl -
Subject digest:
16f1f848eec1f47cca812805a43667e3cfe4d1abd8ff1f21727980450bc03291 - Sigstore transparency entry: 2175829692
- Sigstore integration time:
-
Permalink:
alanjschoen/i66tolls@49868790b35a2ae340709ef3360b95fb50d1dd88 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/alanjschoen
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@49868790b35a2ae340709ef3360b95fb50d1dd88 -
Trigger Event:
push
-
Statement type: