Skip to main content

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.

CI PyPI Python

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
Email (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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

global_entry_scanner-0.1.1.tar.gz (15.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

global_entry_scanner-0.1.1-py3-none-any.whl (14.8 kB view details)

Uploaded Python 3

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

Hashes for global_entry_scanner-0.1.1.tar.gz
Algorithm Hash digest
SHA256 0218817aced99708ec4f7a1c84a16a99ee8244bbc89152dcbb89e25f2852096e
MD5 fa2c5621368338b55c57bc3e50d7f823
BLAKE2b-256 46fe9e7c2ccdea5d3e3d574e1e6a6b5154f3a89c6f1a3a878ff816731b75a1d0

See more details on using hashes here.

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

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file global_entry_scanner-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for global_entry_scanner-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 7ed38b2083c3f3052296e8b6e753b888d8a86259c3fff3c86233dde6bd15a179
MD5 2f9774f808daebba60b9772a2166d2d2
BLAKE2b-256 815f7300781d8aaf12e63b153eda7b93812d33632e3507e84889aded65124892

See more details on using hashes here.

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

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page