Providers - MikkoParkkola/trvl GitHub Wiki
Providers
trvl has 10 flight integrations, 6 hotel sources, 22 ground/ferry providers, airport-transfer estimates, and optional rental cars. No personal API key is required for the default flight, hotel, or ground paths. A provider that fails or times out reports a typed status; it does not silently turn a provider failure into "no results."
Flights
The default search merges Google Flights, Kiwi, and Skiplagged into one sorted list. The low-cost carriers and AFKLM are solo or opt-in paths.
| Source | How it's reached | In default search? |
|---|---|---|
| Google Flights | batchexecute (gRPC-over-HTTP) with Chrome TLS fingerprint | Yes (default) |
| Kiwi | MCP, virtual-interlining merge | Yes (default) |
| Skiplagged | MCP, hidden-city candidates | Yes (--provider skiplagged to isolate) |
| Ryanair | Public API | Solo --provider ryanair search |
| Wizz Air | Public unauthenticated API | Solo --provider wizzair; self-heals on version rotation |
| easyJet | Opt-in (EASYJET_API_BASE) |
No — public API is bot-defended; returns an honest "blocked" status until configured |
| Air France–KLM | Flying Blue Offers API v3 | Opt-in (award-availability scans) |
| Transavia | Official API | Opt-in |
| Vueling | Availability API | Opt-in (VUELING_API_BASE); public path is bot-defended |
| Norwegian | Availability API | Opt-in (NORWEGIAN_API_BASE); public path is bot-defended |
All flight results are ranked on all-in price — checked-bag fees added, frequent-flyer benefits subtracted, currency normalized.
Hotels
| Source | How it's reached |
|---|---|
| Google Hotels | batchexecute + AF_initDataCallback parsing |
| Booking.com | Direct GraphQL (auto-detects browser cookies) |
| Airbnb | Server-side render (Niobe cache) |
| Hostelworld | Autocomplete + availability API |
| Trivago | Streamable HTTP MCP |
| HomeToGo | Public SSR + JSON (vacation rentals) |
Use search_accommodations for traveller-facing stay decisions. It starts from the requested room/apartment type, occupancy, amenities, location, budget, currency, and refundability, then ranks only criteria-matched room-level offers. Broad search_hotels prices are discovery lead-ins unless verified by search_accommodations, search_hotels_with_details, hotel_rooms, or trvl serpapi.
Hotel results carry cancellation policy, explicit refundability, board type, fees, room metadata, and an upstream official-property-site signal where the provider exposes them. Missing values remain unknown. Price ordering does not use a manually maintained OTA reputation tier.
Ground transport — 22 providers in parallel
| Provider | Protocol | Coverage | From | Auth |
|---|---|---|---|---|
| FlixBus | REST | Pan-European buses (40+ countries) | €5+ | None |
| RegioJet | REST | CZ/SK/AT/HU/DE/PL buses + trains | €5+ | None |
| Eurostar | GraphQL | London ↔ Paris/Brussels/Amsterdam/Cologne | £39+ | Browser cookies |
| Deutsche Bahn | REST (Vendo) | All European rail | €37+ | None |
| ÖBB | REST (shop + HAFAS) | Austrian Railjet + cross-border | €38+ | None |
| NS | REST | Dutch rail | €5+ | Public key (embedded) |
| VR | GraphQL (Digitransit) | Finnish rail | €14+ | Public key (embedded) |
| Renfe | REST | Spanish AVE + regional | €36+ | None |
| SNCF | REST | French TGV, TER, Intercity | Varies | None |
| Trainline | REST | Aggregated SNCF, DB, Eurostar, Trenitalia | Varies | None |
| Transitous | MOTIS2 REST | Pan-European transit (schedule-based) | — | None |
| Trenitalia | REST | Italian high-speed, intercity, and regional rail | Varies | None |
| Italo | REST | Italian high-speed rail | Varies | None |
| European Sleeper | REST | Night trains (Brussels–Berlin–Prague and more) | €49+ | None |
| Snälltåget | REST | Swedish + cross-border night trains | €39+ | None |
| Tallink | REST | Baltic ferries (Helsinki, Tallinn, Stockholm, Riga) | €16+ | None |
| Viking Line | Schedule | Baltic ferries (Helsinki, Tallinn, Stockholm, Turku) | €22+ | None |
| Eckerö Line | Magento AJAX | Helsinki ↔ Tallinn | €19+ | None |
| Finnlines | REST | Baltic + North Sea freight-passenger ferries | €40+ | None |
| Stena Line | Schedule | North Sea + Baltic | €25+ | None |
| DFDS | REST | North Sea + Baltic | €49+ | None |
| Ferryhopper | REST | Mediterranean + Aegean ferries | Varies | None |
Airport transfers add taxi fare estimates on top.
Together, the 22 ground/ferry providers, airport-transfer estimates, and optional Skyscanner Car Hire make 24 marketed transport providers. Flight and hotel sources are separate rosters.
Browser and provider trust controls
Some protected hotel and rail paths reuse cookies from an installed browser, and disabling those reads can materially reduce results. TRVL_NO_BROWSER_COOKIES=1 disables the reads and prevents trvl from opening the user's browser. TRVL_NO_TIER2_CDP=1 separately disables the empty-profile headless fallback used to fetch fresh cookies after a bot challenge. The headless process reads no existing session, opens no window, and takes no focus. Visible-browser recovery is separate, provider-specific, and opt-in.
Optional provider definitions are reviewed files embedded in the binary. trvl providers enable <id> records consent for a shipped definition. Files under ~/.trvl/providers are retained for rollback but are not loaded or executed as of v1.21.0.
Rental cars
| Provider | How it's reached |
|---|---|
| Skyscanner Car Hire | Opt-in (SKYSCANNER_API_KEY); returns a typed "not configured" status when the key is unset |
Destination intelligence (free, keyless)
Used by destination_info, get_weather, and friends:
- Open-Meteo (forecasts up to 14 days) · air quality · sunrise/sunset · bike-share availability
- REST Countries · Nager.Date public holidays · travel-advisory safety · ExchangeRate currency
Rate limiting
Per-provider token buckets with exponential backoff on 429/5xx:
| Provider | Limit |
|---|---|
| FlixBus, RegioJet | 10 req/s |
| Deutsche Bahn | 1 req / 2s |
| SNCF, Transitous | 1 req / 6s |
| Eurostar | 1 req / 20s |