Built on wiziswiz/flight-search-agent (MIT). That project is the flight-search core described below and its licence and copyright are kept intact in LICENSE. Travel Radar is what grew on top of it: hotels, trips, packages, and a set of standing radars that watch for value instead of waiting to be asked.
Stay Radar (stays/) |
Standing watch on hotel award and cash rates, with triggers, verification and opportunity scoring |
Hotel awards (providers/hotel-awards/) |
Award availability, perks, buy-points maths and a consecutive-night stay planner |
Trip Composer (trips/) |
Assembles flights and stays into whole trips rather than isolated bookings |
Packages (packages/) |
Calendar, offers and comparison across package options |
Fare Radar (fareradar/) |
Standing business- and first-class fare watch, including one-way |
Market layer (market/) |
FX handling and verdicts, so prices compare honestly across currencies |
Offers (offers/) |
Bookable offers built from observations, with rechecks |
Discovery / anomaly (discovery/, anomaly/) |
Finds routes and prices worth a second look |
Observer / notifications (observer/, notifications/) |
Unattended scheduling and push, with secrets redacted everywhere |
1,232 tests across 64 files. npm test.
Multi-source flight search that always finds the best value path — whether points or cash. Searches 19+ award programs and Google Flights in parallel, then scores every result with real CPP analysis, sweet spot detection, and transfer path awareness.
You search a route. It tells you:
- "This Flying Blue J is 50K pts, the cash equivalent is $4,200 (actual), that's 8.1¢/pt (exceptional)"
- "You can fund it by transferring 50K Chase UR → Flying Blue (instant)"
- "This is a known sweet spot — book it"
- 🔍 Roame — One GraphQL API searches 19+ mileage programs (United, Alaska, AA, Delta, Flying Blue, Qantas, BA, Emirates, Qatar, Singapore, etc.)
- 🔵 Award Travel Finder (ATF) — REST API covering 5 airlines' own award programs (BA Avios, Qatar Privilege Club, Asia Miles, Virgin Points, Iberia Plus). Cross-referenced against Roame for confidence scoring. 150 calls/month; each full search = 5 calls.
- 💰 SerpAPI — Google Flights cash prices (hard cap at 95/mo to stay on free tier)
- 🏙️ Hidden City Engine — Finds cheaper fares by booking beyond your destination
- 💳 AwardWallet — Real balances from 34 loyalty accounts
- 📊 Real CPP Scoring — Cross-references award fares against actual cash fares for the same route + cabin. No hardcoded estimates — uses Google Flights data from the same search.
- 🎯 Sweet Spot Detection — 18 known high-value redemptions (Flying Blue J to Europe at 55K, ANA F via VS at 120K RT, Alaska→Cathay J at 50K, etc.). Flags matches AND shows route tips for what to look for.
- 🔀 Transfer Path Graph — 40 transfer paths across Chase UR, Amex MR, Bilt, Marriott. Shows how to fund any award: direct balance → single transfer → combinations.
- 🏆 Value Score (0-100) — Composite score weighing CPP (40%), sweet spot match (20%), affordability (15%), product quality (15%), convenience (10%).
- 💡 Insights — Proactive intelligence: "Cash wins here at only 1.2¢/pt", "Exceptional value — book now", "Look for Aeroplan J on this route".
- Search form — Any origin/destination/dates
- Class tabs — All / Economy / Business / First
- Type filter — All / Cash / Award
- Sort options — Best Value, Price ↑, Points ↑, CPP ↓, Duration ↑
- Points balances — Expandable panel showing all loyalty balances
- Recommendations — Top 3 picks with real CPP, funding paths, and sweet spot flags
- Source badges — LIVE (Roame), Google, Hidden City
# Search LAX → London, all classes
npx tsx search.ts --from LAX --to LHR --date 2026-03-15 --class both
# Launch dashboard
npx tsx serve.ts --port 8888
# Open http://localhost:8888search.ts (Orchestrator)
├── roame-scraper.ts → Roame GraphQL API (19+ award programs)
├── atf-scraper.ts → Award Travel Finder REST API (5 airlines, 150 calls/mo)
├── SerpAPI → Google Flights (cash prices)
├── hidden city engine → Beyond-hub savings detection
├── AwardWallet API → 34 loyalty account balances
└── value-engine.ts → Real CPP + sweet spots + transfer paths
├── sweet-spots.ts → 18 known elite redemptions
└── transfer-partners.ts → 40 bank→airline transfer paths
After Roame and ATF complete in parallel, results are merged:
| Scenario | Tag | Behavior |
|---|---|---|
| Same program + cabin + date in both | cross-verified |
Roame data kept (richer); ATF seat count fills any gaps |
| ATF found, Roame missed | ATF-exclusive |
ATF result added; flagged in insights |
| Roame found, outside ATF scope | (none) | Kept as-is (ATF covers only 5 airlines) |
The value engine gives cross-verified fares +5 score points (two sources confirmed seats exist), and ATF-exclusive fares +2 points.
- Search — Roame + ATF + SerpAPI + hidden city run in parallel (~45-65s)
- Cross-reference — ATF and Roame award results are merged; cross-verified fares get +5 confidence boost
- Score — Value engine cross-references every award fare against real cash prices
- Match — Sweet spot database flags known high-value redemptions
- Fund — Transfer partner graph shows how to get miles you need
- Rank — Composite value score (0-100) sorts everything
- Recommend — Top 3 picks with full context
# Full search with all sources (default — includes ATF cross-reference)
npx tsx search.ts --from LAX --to LHR --date 2026-03-15 --class both
# Save ATF calls — skip ATF when searching non-ATF airlines (e.g. Dubai)
npx tsx search.ts --from LAX --to DXB --date 2026-04-28 --class both --sources roame,google,hidden-city
# ATF only — check one route across all 5 airlines (5 calls)
npx tsx atf-scraper.ts --from LAX --to LHR --date 2026-03-15 --unified
# Roame only for award availability
npx tsx roame-scraper.ts --from LAX --to DXB --date 2026-04-28 --class PREM
# Serve dashboard with live search API
npx tsx serve.ts --port 8888# Login to roame.travel in browser, extract session cookie
# Save to ~/.openclaw/credentials/roame.json:
{
"session": "eyJ...",
"csrfSecret": "...",
"sessionExpiresAt": 1771829264892
}# Option 1: .env file (preferred)
ATF_API_KEY=your-key-here
# Option 2: credentials file
# Save to ~/.openclaw/credentials/awardtravelfinder.json:
{ "apiKey": "your-key-here" }
# Budget: 150 calls/month. Each full search = 5 calls (one per airline).
# = ~30 full searches/month. Code warns at <20 remaining calls.
# Airlines covered: BA Avios, Qatar Privilege Club, Asia Miles, Virgin Points, Iberia Plus# In .env file:
SERP_API_KEY=your-key-here
# Free tier: 100/mo, hard-capped at 95 with usage tracking# Save to ~/.openclaw/credentials/awardwallet.json:
{
"apiKey": "your-api-key",
"userId": "your-user-id"
}Known high-value redemptions tracked:
| Program | Route | Cabin | Max Points | Expected CPP |
|---|---|---|---|---|
| Flying Blue | US→Europe | Business | 55K | 7.0¢ |
| Aeroplan | US→Asia | Business | 75K | 7.5¢ |
| Virgin Atlantic | US→Japan | First (ANA) | 120K RT | 12.0¢ |
| Alaska | US→Asia | Business (CX) | 50K | 9.0¢ |
| Alaska | US→Asia | Business (JAL) | 60K | 9.0¢ |
| Alaska | US→ME | First (Emirates) | 115K | 10.0¢ |
| Turkish | US→IST | Business | 45K | 8.0¢ |
| BA Avios | US domestic | Economy | 7.5K | 2.5¢ |
| Qatar | US→DOH | Business (QSuites) | 70K | 7.0¢ |
results.json contains:
{
meta: { origin, destination, departureDate, searchedAt, sources, completionPct },
balances: [{ program, balance, displayBalance }],
flights: [{
// Flight data
source, type, airline, stops, cabinClass, points, cashPrice,
// Value scoring
realCpp, cppRating, cashComparable, cashSource,
sweetSpotMatch, fundingPath, canAfford, affordDetails,
valueScore
}],
recommendations: [{ rank, title, totalCost, cppValue, details }],
insights: [{ type, priority, title, detail }],
routeSweetSpots: [{ program, cabin, maxPoints, description }],
warnings: string[]
}Free tier: 100 searches/month. Hard-capped at 95 with auto-tracking in serpapi-usage.json. Warns at 80. Auto-resets monthly.
MIT