Scan for Global Entry / NEXUS appointment slots and get notified
Project description
Global Entry Appointment Scanner
Scan for open Global Entry / NEXUS appointment slots and get notified the moment one appears.
Install
pip install global-entry-scanner # core (email only)
pip install global-entry-scanner[slack] # + Slack
pip install global-entry-scanner[discord] # + Discord
pip install global-entry-scanner[sms] # + Twilio SMS
pip install global-entry-scanner[mcp] # + MCP server for AI agents
pip install global-entry-scanner[all] # everything
Quick start
# 1. Interactive setup — pick locations and configure notifications
global-entry-scanner setup
# 2. Run the scanner
global-entry-scanner scan
CLI
global-entry-scanner locations # list all enrollment centers
global-entry-scanner setup # interactive config wizard
global-entry-scanner scan # run with saved config
global-entry-scanner scan --locations "Chicago, Dallas" # override locations
global-entry-scanner scan --notify email,slack # override channels
global-entry-scanner mcp # start MCP server
Config is saved to ~/.config/global-entry-scanner/config.toml.
Python API
from global_entry_scanner import Scanner
from global_entry_scanner.notifications import SlackNotifier, DiscordNotifier, EmailNotifier
scanner = Scanner(location_ids=[5001, 5140])
scanner.add_notifier(SlackNotifier(webhook_url="https://hooks.slack.com/..."))
scanner.add_notifier(DiscordNotifier(webhook_url="https://discord.com/api/webhooks/..."))
scanner.add_notifier(EmailNotifier(from_email="you@gmail.com", to_email="you@gmail.com", password="app-password"))
scanner.start() # blocking; Ctrl+C to stop
Scanner options:
| Parameter | Default | Description |
|---|---|---|
location_ids |
required | List of enrollment center IDs |
check_interval |
900 |
Seconds between polls (no errors) |
error_interval |
60 |
Seconds between polls (on error) |
limit |
5 |
Max appointments to fetch per location |
Notification channels
| Channel | Extra | Credentials |
|---|---|---|
| (core) | Gmail address + app password | |
| Discord | [discord] |
Webhook URL |
| Slack | [slack] |
Webhook URL |
| SMS | [sms] |
Twilio account SID, auth token, phone numbers |
All configured channels fire concurrently. One failing channel does not block the others.
MCP server
Install with pip install global-entry-scanner[mcp], then run global-entry-scanner mcp.
Exposes six tools to AI agents: get_locations, search_locations, check_appointments, start_scan, stop_scan, get_scan_status.
Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"global-entry-scanner": {
"command": "global-entry-scanner",
"args": ["mcp"]
}
}
}
Configuration file
~/.config/global-entry-scanner/config.toml
[scanner]
check_interval = 900
error_interval = 60
limit = 5
[locations]
ids = [5001, 5140]
[notifications.discord]
webhook_url = "https://discord.com/api/webhooks/..."
[notifications.slack]
webhook_url = "https://hooks.slack.com/..."
[notifications.email]
from_email = "you@gmail.com"
to_email = "you@gmail.com"
password = "app-password"
[notifications.sms]
account_sid = "..."
auth_token = "..."
to_number = "+12125551234"
from_number = "+12125550000"
Development
git clone https://github.com/JaiminBrahmbhatt/Global-Entry-Appointment-Scanner
cd Global-Entry-Appointment-Scanner
pip install -e ".[all,dev]"
# Run tests
pytest
# Run live API tests
pytest -m integration
# Lint + type check
ruff check .
mypy global_entry_scanner/
Credits
Inspired by:
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 global_entry_scanner-0.1.1.tar.gz.
File metadata
- Download URL: global_entry_scanner-0.1.1.tar.gz
- Upload date:
- Size: 15.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0218817aced99708ec4f7a1c84a16a99ee8244bbc89152dcbb89e25f2852096e
|
|
| MD5 |
fa2c5621368338b55c57bc3e50d7f823
|
|
| BLAKE2b-256 |
46fe9e7c2ccdea5d3e3d574e1e6a6b5154f3a89c6f1a3a878ff816731b75a1d0
|
Provenance
The following attestation bundles were made for global_entry_scanner-0.1.1.tar.gz:
Publisher:
publish.yml on JaiminBrahmbhatt/Global-Entry-Appointment-Scanner
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
global_entry_scanner-0.1.1.tar.gz -
Subject digest:
0218817aced99708ec4f7a1c84a16a99ee8244bbc89152dcbb89e25f2852096e - Sigstore transparency entry: 1191488587
- Sigstore integration time:
-
Permalink:
JaiminBrahmbhatt/Global-Entry-Appointment-Scanner@f3b30fb5948b05d8be1a6b7ffc5a63de319531ce -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/JaiminBrahmbhatt
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f3b30fb5948b05d8be1a6b7ffc5a63de319531ce -
Trigger Event:
release
-
Statement type:
File details
Details for the file global_entry_scanner-0.1.1-py3-none-any.whl.
File metadata
- Download URL: global_entry_scanner-0.1.1-py3-none-any.whl
- Upload date:
- Size: 14.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7ed38b2083c3f3052296e8b6e753b888d8a86259c3fff3c86233dde6bd15a179
|
|
| MD5 |
2f9774f808daebba60b9772a2166d2d2
|
|
| BLAKE2b-256 |
815f7300781d8aaf12e63b153eda7b93812d33632e3507e84889aded65124892
|
Provenance
The following attestation bundles were made for global_entry_scanner-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on JaiminBrahmbhatt/Global-Entry-Appointment-Scanner
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
global_entry_scanner-0.1.1-py3-none-any.whl -
Subject digest:
7ed38b2083c3f3052296e8b6e753b888d8a86259c3fff3c86233dde6bd15a179 - Sigstore transparency entry: 1191488588
- Sigstore integration time:
-
Permalink:
JaiminBrahmbhatt/Global-Entry-Appointment-Scanner@f3b30fb5948b05d8be1a6b7ffc5a63de319531ce -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/JaiminBrahmbhatt
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f3b30fb5948b05d8be1a6b7ffc5a63de319531ce -
Trigger Event:
release
-
Statement type: