Fast flight and hotel search via Kiwi/Skypicker and Xotelo APIs.
# Build
cargo build --release
# Start daemon
./target/release/fgp-travel start
# Test
echo '{"id":"1","v":1,"method":"travel.find_location","params":{"term":"SFO"}}' \
| nc -U ~/.fgp/services/travel/daemon.sock| Method | Description |
|---|---|
travel.find_location |
Search airports/cities (instant, local DB) |
travel.search_flights |
One-way flight search |
travel.search_roundtrip |
Round-trip flight search |
travel.search_hotels |
Hotel search by city |
travel.hotel_rates |
Real-time hotel rates |
| Method | Description | Token Savings |
|---|---|---|
travel.price_check |
Ultra-light price check (~55 tokens) | 10x vs search_flights |
travel.search_cheapest_day |
Find cheapest day in date range | 30x for month search |
travel.search_cheapest_route |
Find cheapest destination | 5x vs N searches |
travel.search_flexible_dates |
Search ±N days around date | 7x vs N searches |
travel.search_direct_only |
Non-stop flights only | 2-3x (fewer segments) |
travel.batch_search |
Multiple searches in one call | Reduces API overhead |
| Method | Description |
|---|---|
travel.cache_stats |
Cache statistics |
travel.cache_clear |
Clear response cache |
| Method | Tokens | Per Item | Notes |
|---|---|---|---|
find_location |
90-700 | ~70/location | Instant (local DB) |
search_flights |
500-3,500 | ~500/flight | Includes flight segments |
search_roundtrip |
600-6,000 | ~600/trip | Outbound + return |
search_hotels |
750-1,500 | ~150/hotel | Basic hotel info |
hotel_rates |
200-800 | ~100/rate | Real-time pricing |
| Method | Tokens | Comparison |
|---|---|---|
price_check |
~55 | vs ~500 for search_flights |
search_cheapest_day (28 days) |
~470 | vs ~14,000 (28 × search_flights) |
search_cheapest_route (5 dests) |
~110 | vs ~2,500 (5 × search_flights) |
search_flexible_dates (±3 days) |
~185 | vs ~3,500 (7 × search_flights) |
search_direct_only |
~200-500 | vs ~500-1500 (fewer segments) |
batch_search (3 routes) |
~160 | Parallel execution |
| Use Case | Recommended Method |
|---|---|
| "What's the cheapest price?" | price_check |
| "Which day is cheapest?" | search_cheapest_day |
| "Where can I fly for <$X?" | search_cheapest_route |
| "Flexible on dates ±3 days" | search_flexible_dates |
| "Non-stop flights only" | search_direct_only |
| "Check multiple routes" | batch_search |
| "Show me flight options" | search_flights |
echo '{"id":"1","v":1,"method":"travel.price_check","params":{
"origin": "SFO",
"destination": "LAX",
"date": "2026-02-15"
}}' | nc -U ~/.fgp/services/travel/daemon.sockResponse (~55 tokens):
{"origin": "SFO", "destination": "LAX", "date": "2026-02-15", "price": 83.0, "stops": 0}echo '{"id":"1","v":1,"method":"travel.search_cheapest_route","params":{
"origin": "SFO",
"destinations": ["LAX", "SEA", "DEN", "PHX", "LAS"],
"date": "2026-02-15"
}}' | nc -U ~/.fgp/services/travel/daemon.sock | jq '.result.cheapest'Response:
{"destination": "PHX", "price": 50.0}echo '{"id":"1","v":1,"method":"travel.search_cheapest_day","params":{
"origin": "SFO",
"destination": "BER",
"date_from": "2026-02-01",
"date_to": "2026-02-28"
}}' | nc -U ~/.fgp/services/travel/daemon.sock | jq '.result.cheapest'Response:
{"date": "2026-02-04", "price": 225.0}echo '{"id":"1","v":1,"method":"travel.search_flexible_dates","params":{
"origin": "SFO",
"destination": "BER",
"date": "2026-02-15",
"flexibility": 3
}}' | nc -U ~/.fgp/services/travel/daemon.sock | jq '.result.cheapest'echo '{"id":"1","v":1,"method":"travel.batch_search","params":{
"searches": [
{"origin": "SFO", "destination": "LAX", "date": "2026-02-15"},
{"origin": "SFO", "destination": "SEA", "date": "2026-02-15"},
{"origin": "SFO", "destination": "BER", "date": "2026-02-15"}
]
}}' | nc -U ~/.fgp/services/travel/daemon.sock | jq '.result.results[].result.price'echo '{"id":"1","v":1,"method":"travel.search_direct_only","params":{
"origin": "SFO",
"destination": "LAX",
"date": "2026-02-15",
"limit": 3
}}' | nc -U ~/.fgp/services/travel/daemon.sock | jq '.result.flights[].price'The daemon embeds reference data for instant lookups:
| Data | Entries | Size | Purpose |
|---|---|---|---|
| Locations | 7,988 | 1.6 MB | Airport/city search |
| Hotel locations | 224 | 7 KB | TripAdvisor city codes |
| Airlines | 1,094 | 112 KB | IATA codes + names |
| Countries | 249 | 35 KB | ISO 3166 codes |
Location searches are instant (~1-10ms) with zero API calls.
| Operation | Latency | Notes |
|---|---|---|
| Location search | 1-10ms | Local database |
| Price check | 400-600ms | Single API call |
| Flight search | 400-1000ms | Kiwi API |
| Hotel search | 300-700ms | Xotelo API |
| Cheapest day (28 days) | 1-2s | Parallel API calls |
| Cheapest route (5 dests) | 1-2s | Parallel API calls |
| Cache hit | <1ms | In-memory LRU |
| Method | Items | Time | Speedup |
|---|---|---|---|
search_cheapest_day |
28 days | ~1.5s | 10x vs sequential |
search_cheapest_route |
5 dests | ~1s | 5x vs sequential |
search_flexible_dates |
7 days | ~0.5s | 7x vs sequential |
batch_search |
3 routes | ~1s | 3x vs sequential |
Socket: ~/.fgp/services/travel/daemon.sock
Environment variables:
RUST_LOG=debug- Enable debug loggingRUST_LOG=fgp_travel=debug- Debug only this daemon
- Flights: Kiwi/Skypicker GraphQL API
- Hotels: Xotelo REST API