Airline alliance membership (Star Alliance, oneworld, SkyTeam) and cross-alliance booking relationships. Maps which loyalty programs book which airlines, including bilateral partnerships outside alliances.
日本語の概要は準備中です。原文の説明を表示しています。
Search Amex travel portal for cash prices, MR points pricing, IAP discounts, and FHR/THC hotel benefits via Patchright. Use when comparing pay-with-points portal pricing to award alternatives.
インストールする前に、エージェントに与えられる指示の中身を確認できます。
Search the American Express travel portal for flights and hotels via Patchright. Returns cash prices, MR points pricing, International Airline Program (IAP) discounts, and Fine Hotels & Resorts / The Hotel Collection benefits.
Requires Patchright (undetected Playwright fork). Amex blocks standard Playwright and agent-browser.
Must run headed (headless=False). Amex detects headless browsers. On macOS, a Chrome window briefly appears. For background operation, use Docker.
pip install patchright && patchright install chromium
Or use Docker (no local install needed):
docker pull ghcr.io/borski/amex-travel:latest
# or build locally:
docker build -t amex-travel skills/amex-travel/
# Local (opens a Chrome window briefly)
python3 scripts/search_flights.py --origin SFO --dest CDG --depart 2026-08-11
# Round-trip business
python3 scripts/search_flights.py --origin SFO --dest CDG --depart 2026-08-11 --return 2026-09-02 --cabin business
# JSON output
python3 scripts/search_flights.py --origin SFO --dest CDG --depart 2026-08-11 --json
# Docker
docker run --rm \
-v ~/.amex-travel-profiles:/profiles \
-e AMEX_USERNAME -e AMEX_PASSWORD \
amex-travel script /app/search_flights.py \
--origin SFO --dest CDG --depart 2026-08-11 --cabin business --json
# Local
python3 scripts/search_flights.py --hotel --dest "Oslo" --checkin 2026-08-13 --checkout 2026-08-15
# Docker
docker run --rm \
-v ~/.amex-travel-profiles:/profiles \
-e AMEX_USERNAME -e AMEX_PASSWORD \
amex-travel script /app/search_flights.py \
--hotel --dest "Oslo" --checkin 2026-08-13 --checkout 2026-08-15 --json
Capture network traffic during a manual search:
python3 scripts/search_flights.py --record
Save and re-parse hotel results without re-running the browser:
# Save page HTML after hotel search
python3 scripts/search_flights.py --hotel --dest "Paris" --checkin 2026-08-11 --checkout 2026-08-15 --save-html /tmp/amex-hotels.json
# Re-parse locally (instant, no browser)
python3 scripts/search_flights.py --parse-html /tmp/amex-hotels.json
Amex uses email OTP for 2FA. After first login with "Add This Device", subsequent runs skip 2FA from the same profile.
How it works: When 2FA is triggered, the script prints 2FA_CODE_NEEDED to stdout and 2FA REQUIRED to stderr, then polls for the code. It will wait up to 2 minutes.
For agents: When you see 2FA_CODE_NEEDED in the script output, ask the user for the verification code Amex just emailed them. Once they provide it, write it to the code file:
echo "123456" > /tmp/amex-2fa-code.txt
The script picks up the file automatically and continues login.
Command hook (optional, for full automation): Set AMEX_2FA_COMMAND to a command that blocks until it has the code, then prints it to stdout. The script runs this instead of polling the file.
After first login with "Add This Device", 2FA is skipped on repeat runs from the same profile.
As of Amex's May 2026 overhaul, submitting a flight search redirects through a separate travel-portal login gate (/account/travel/login) — even when already signed in to americanexpress.com — protected by a risk-based captcha layer. The script fills and submits the gate automatically, and the outcome depends on how Amex scores the session that run:
#loginSubmit was clicked, no error renders, captcha markers sit in the DOM, and the page never advances. Also verified live, same day, same credentials, same container.The travel session is also short-lived (next-auth token, ~1 hour), so warm sessions expire quickly and the gate re-appears often. On gate failure the script prints a Gate diag: line (field/button/alert state) so breakage is diagnosable from logs, then exits promptly instead of waiting out the results timeout. Hotel search may be affected similarly.
The wall only exists on fresh logins. With a warm saved session (valid cookies + trusted device), the gate passes automatically and searches work end to end. So the recovery is a one-time human step, not a dead end:
When the gate rejects the automated login (captcha or otherwise), the script prints AMEX_HUMAN_LOGIN_NEEDED to stdout (and writes HUMAN_LOGIN_NEEDED to /tmp/amex-2fa-status.txt). For agents: stop retrying and tell the user to run the refresh script. (A separate sentinel, AMEX_BAD_CREDENTIALS, means the credential env vars contained an unresolved secret-manager reference instead of real values — fix the credential injection, not the login.)
The user runs, locally, not in Docker:
python3 scripts/refresh_login.py
A real Chrome window opens on the travel portal. They log in themselves (password, captcha, email code, "Add This Device"), and the script saves the refreshed cookies/profile automatically, printing AMEX_SESSION_REFRESHED when done.
Subsequent runs — including Docker runs mounting ~/.amex-travel-profiles — reuse the warm session and skip the gate.
To keep the session from going stale, run any cheap search (or refresh_login.py, which exits as soon as it sees a logged-in page) every week or two. Prefer a residential IP; datacenter and hotel IPs draw extra Akamai scrutiny.
travel.americanexpress.com/en-us/book/flights/search-results, a Next.js app with no usable window.appData (__NEXT_DATA__ is config only). The script parses the DOM's [data-testid="offer-card-wrapper"] cards — airline, times, airports, duration, stops, cash, points, was/now discounts all carry dedicated data-testids.window.appData Redux-store extraction (627KB JSON blob).private-fare-banner-PEP* banner with a "was $X now it's $Y" cash discount are IAP (Platinum Member Airfares), typically 10-15% off front-of-cabin international. Alaska "Insider Fares" (points-only discounts) are flagged separately via insider_fare/points_discount.window.appData. Script parses the DOM using data-testid="hotel-offer-card" elements.data-testid="offer-banner" text ("Fine Hotels and Resorts" or "The Hotel Collection")data-testid="offer-amenities-item" elementsFlight results (from window.appData.flightSearch.itineraries[]):
pricing_information[] with fare_type = PEP (IAP) or PUB (public)total_price.cents (cash), total_price_in_points (MR points = 1 cent per point)segment.legs[] with carrier, times, duration, cabin, equipment, amenitiessegment.seats_left, is_refundable, cancellation_policyHotel results (from DOM parsing):
Platinum Card benefit. Lower fares on premium cabin seats for international flights on select airlines. Shows as a separate PEP fare type alongside PUB (public fare).
Always use markdown tables.
| # | Airline | Route | Stops | Duration | Cash | IAP Cash | Points | Seats |
|---|---|---|---|---|---|---|---|---|
| 1 | Turkish | SFO-IST-CDG | 1 | 20h 10m | $5,044 | $4,381 | 438,113 | 3 |
| # | Hotel | Program | Stars | Per Night | Total | Points | Benefits |
|---|---|---|---|---|---|---|---|
| 1 | Hotel Continental | FHR | 5 | $471 | $942 | 94,200 | Breakfast, $100 credit, upgrade, 4pm checkout |
| CLI Value | Amex Code | Description |
|---|---|---|
economy | ECONOMY | Standard economy |
premium | PREMIUM_ECONOMY | Premium economy |
business | BUSINESS | Business class |
first | FIRST | First class |
| Variable | Required | Description |
|---|---|---|
AMEX_USERNAME | Yes | Amex online account username |
AMEX_PASSWORD | Yes | Amex online account password |
AMEX_PROFILE | No | Browser profile directory (default: ~/.amex-travel-profiles/default) |
AMEX_2FA_COMMAND | No | Command that blocks until email code is ready, prints to stdout |
data-testid selectors may need updating.div[role="button"] for calendar days (not <button>). The script uses class patterns automation-date-picker-month-{year}-{month} to find the right month container.__NEXT_DATA__). Parser depends on data-testid attributes.まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
Airline alliance membership (Star Alliance, oneworld, SkyTeam) and cross-alliance booking relationships. Maps which loyalty programs book which airlines, including bilateral partnerships outside alliances.
日本語の概要は準備中です。原文の説明を表示しています。
Check American Airlines AAdvantage balance, elite status, and loyalty points via Patchright. Handles email 2FA with 6-box code entry. Uses persistent browser profiles to skip 2FA on subsequent runs.
日本語の概要は準備中です。原文の説明を表示しています。
Search Atlas Obscura for weird, wonderful, and hidden gem places near any destination. Find the interesting stuff, not boring plaques. Search by coordinates, get full details with descriptions and images.
日本語の概要は準備中です。原文の説明を表示しています。
Find the cheapest award dates for a route over a date range. Searches seats.aero across all programs, groups by date, and shows a calendar grid of the best deals. Use when dates are flexible and you want to find the sweet spot.
日本語の概要は準備中です。原文の説明を表示しています。
Per-program rules for placing award flights on hold before transferring points. Covers programs with holds (AA, Lufthansa, Flying Blue, Cathay, Turkish, Virgin Atlantic, ANA, Emirates, EVA Air) and those without. Includes transfer-speed reference.
日本語の概要は準備中です。原文の説明を表示しています。
Catalog of high-value award redemptions where points dramatically outvalue cash. Tiered by legendary/excellent/good with current rates, devaluation history, and booking caveats. Includes Oceania and South Pacific plays (Australia, New Zealand, Tahiti, Fiji) and transatlantic business-class sweet spots.
日本語の概要は準備中です。原文の説明を表示しています。