by LetsFG
Agent-native flight search & booking. Saved $116 across 5 routes vs Google Flights (verified). 400+ airlines in 5 seconds. Join the community - Star and spread the word
# Add to your Claude Code skills
git clone https://github.com/LetsFG/LetsFGMachine-readable skill manifest for AI agents and documentation indexers.
https://api.letsfg.cohttps://api.letsfg.co/mcp (Streamable HTTP)letsfg · npm letsfg · npm letsfg-mcpSearch 180+ airlines worldwide via local connectors. Returns real-time prices with zero markup or bias — $20–50 cheaper than OTAs.
Search hotels worldwide via direct hotel APIs and aggregators.
Last scanned: 5/4/2026
{
"issues": [],
"status": "PASSED",
"scannedAt": "2026-05-04T06:38:23.048Z",
"semgrepRan": false,
"npmAuditRan": true,
"pipAuditRan": true
}Finding a flight shouldn't mean checking 47 websites. Or 3 hours of searching. Or having that feeling you could've got a better deal if you'd just waited a little longer.
So we built something about it. No markup. No tracking. No price that goes up because you looked twice.
400+ airlines. Real prices. One function call.
LetsFG gives your AI agent flight search and booking superpowers. 200+ connectors fire in parallel on your machine, scanning the entire world for the cheapest price. Zero markup. Real airline tickets.
The same flight costs $20–$50 less because you skip OTA inflation, cookie tracking, and surge pricing.
No comments yet. Be the first to share your thoughts!
Search ground transfers — private cars, taxis, shared shuttles, airport express.
Search activities — tours, museum tickets, day trips via direct APIs and aggregators.
Resolve city names to IATA airport/city codes.
Get system resource profile and recommended browser concurrency for local search.
from letsfg import get_system_profile; profile = get_system_profile()letsfg system-info or letsfg system-info --jsonsystem_info toolimport { systemInfo } from 'letsfg'; const info = await systemInfo();Override auto-detected browser concurrency limit for local search.
LETSFG_MAX_BROWSERS > explicit config > auto-detect from RAMfrom letsfg import configure_max_browsers; configure_max_browsers(4)letsfg search LHR BCN 2026-04-15 --max-browsers 4search_flights tool with max_browsers parameterawait searchLocal('LHR', 'BCN', '2026-04-15', { maxBrowsers: 4 })Confirm live price with airline and reserve offer for 30 minutes. FREE with GitHub star.
POST /api/v1/bookings/unlocklink_github firstunlocked = bt.unlock(offer_id) → returns UnlockResultletsfg unlock off_xxxconst unlocked = await bt.unlock(offerId)Create a real airline reservation with PNR code. Charges ticket price via Stripe before booking.
setup_payment first.Confirm hotel rate before booking (required if rate_type=RECHECK).
Book a hotel room.
Get guest voucher for hotel check-in.
Cancel a hotel booking or simulate cancellation.
Register a new AI agent.
Attach a payment card for booking. Required before booking flights.
Get current agent's profile, usage stats, and payment status.
All endpoints except register require an X-API-Key header.
X-API-Key: trav_...
Get your key by calling POST /api/v1/agents/register with agent_name and email. The key is permanent — save it once.
After registration, star the GitHub repo and link your account via POST /api/v1/agents/link-github to unlock and book for free.
1. POST /api/v1/agents/register → Get API key (once)
2. POST /api/v1/agents/link-github → Star repo + verify (once)
3. POST /api/v1/agents/setup-payment → Attach payment card (once)
4. POST /api/v1/flights/search → Search flights (FREE)
5. POST /api/v1/bookings/unlock → Unlock offer (FREE)
6. POST /api/v1/bookings/book → Book flight (ticket price charged via Stripe)
1. POST /api/v1/agents/register → Get API key (once)
2. POST /api/v1/agents/link-github → Star repo + verify (once)
3. POST /api/v1/hotels/search → Search hotels (FREE)
4. POST /api/v1/hotels/checkrate → Confirm price (if rate_type=RECHECK)
5. POST /api/v1/hotels/book → Book room
6. GET /api/v1/hotels/voucher/{ref} → Get guest voucher
pip install letsfg
letsfg register --name my-agent --email me@example.com
export LETSFG_API_KEY=trav_...
# Search flights
letsfg search LHR JFK 2026-04-15
letsfg search LON BCN 2026-04-01 --return 2026-04-08 --cabin C --sort price
letsfg search GDN BER 2026-05-10 --adults 2 --children 1
# Resolve locations
letsfg locations "New York"
# Unlock and book
letsfg unlock off_xxx
letsfg book off_xxx \
--passenger '{"id":"pas_0","given_name":"John","family_name":"Doe","born_on":"1990-01-15","gender":"m","title":"mr"}' \
--email john.doe@example.com
# Machine-readable output
letsfg search GDN BER 2026-03-03 --json
from letsfg import LetsFG
bt = LetsFG(api_key="trav_...")
# Search
results = bt.search("LHR", "JFK", "2026-04-15")
for offer in results.offers:
print(f"{offer.price} {offer.currency} — {', '.join(offer.airlines)}")
# Unlock
unlocked = bt.unlock(results.offers[0].id)
print(f"Confirmed: {unlocked.confirmed_price} {unlocked.confirmed_currency}")
# Book
booking = bt.book(
offer_id=results.offers[0].id,
passengers=[{
"id": results.passenger_ids[0],
"given_name": "John",
"family_name": "Doe",
"born_on": "1990-01-15",
"gender": "m",
"title": "mr",
"email": "john@example.com",
"phone_number": "+447123456789",
}],
contact_email="john@example.com",
)
print(f"PNR: {booking.booking_reference}")
{
"mcpServers": {
"letsfg": {
"url": "https://api.letsfg.co/mcp",
"headers": {
"X-API-Key": "trav_..."
}
}
}
}
Or run locally:
npm install -g letsfg-mcp
LETSFG_API_KEY=trav_... letsfg-mcp
| Tool | Description | Cost |
|------|-------------|------|
| search_flights | Search 400+ airlines worldwide | FREE |
| resolve_location | City name → IATA code | FREE |
| link_github | Star repo for free access (once) | FREE |
| unlock_flight_offer | Confirm price, reserve 30min | FREE |
| book_flight | Create real airline reservation | Ticket price |
| setup_payment | Attach payment card (required for booking) | FREE |
| get_agent_profile | View usage stats | FREE |
| Flag | API Field | Values | Default |
|------|-----------|--------|---------|
| --adults | adults | 1–9 | 1 |
| --children | children | 0–9 | 0 |
| --infants | infants | 0–9 | 0 |
| --cabin | cabin_class | M (economy), W (premium), C (business), F (first) | (any) |
| --return | return_from | YYYY-MM-DD | — |
| --max-stops | max_stopovers | 0–4 | 2 |
| --sort | sort | price, duration | price |
| --limit | limit | 1–100 | 20 |
| --currency | currency | EUR, USD, GBP, etc. | EUR |
| Code | Class | Description | Typical Use Case |
|------|-------|-------------|------------------|
| M | Economy | Standard seating | Budget travel, most bookings |
| W | Premium Economy | Extra legroom, priority boarding | Long-haul comfort without business price |
| C | Business | Lie-flat on long-haul, lounge access | Corporate travel, 6+ hour flights |
| F | First | Private suites, premium dining | Ultra-premium routes (limited airlines) |
| --json | — | Output as JSON | — |
| Exception | HTTP Code | When |
|-----------|-----------|------|
| AuthenticationError | 401 | Invalid or missing API key |
| PaymentRequiredError | 402 | No payment method (legacy flow) |
| OfferExpiredError | 410 | Offer no longer available |
| LetsFGError | 422 | Invalid request parameters |
| LetsFGError | 429 | Too many requests (retry with backoff) |
| LetsFGError | 502 | Upstream airline/hotel API error |
from letsfg import LetsFG, AuthenticationError
try:
bt = LetsFG(api_key="trav_...")
flights = bt.search("LHR", "JFK", "2026-04-15")
except AuthenticationError:
# API key invalid or expired — re-register
creds = LetsFG.register("my-agent", "agent@example.com")
bt = LetsFG(api_key=creds["api_key"])
# Don't forget to link GitHub
bt.link_github("your-github-username")
import time
from letsfg import LetsFG, LetsFGError
def search_with_retry(bt, origin, dest, date, max_retries=3):
for attempt in range(max_retries):
try:
return bt.search(origin, dest, date)
except LetsFGError as e:
if "429" in str(e) or "rate limit" in str(e).lower():
time.sleep(2 ** attempt) # exponential backoff
elif "timeout" in str(e).lower() or "504" in str(e):
time.sleep(1)
else:
raise
raise LetsFGError("Max retries exceeded")
| Endpoint | Rate Limit | Typical Latency | |----------|-----------|------------------| | Search flights | 60 req/min | 2-15s | | Resolve location | 120 req/min | <1s | | Unlock | 20 req/min | 2-5s | | Book | 10 req/min | 3-10s | | Search hotels | 30 req/min | 3-10s | | Register | 5 req/min | <1s |
| Action | Cost | |--------|------| | Search (flights, hotels, transfers, activities) | Free | | Resolve locations | Free | | Register agent | Free | | Setup payment | Free | | View profile | Free | | Unlock offer | Free | | Book flight (after unlock) | Ticket price (zero markup, Stripe processing fee only) | | Hotel booking | Room price only | | Hotel cancellation | Per cancellation policy |
We searched 5 routes on Google Flights and LetsFG on the same day (June 15, 2026). Same airline, same itinerary — LetsFG was cheaper every time:
| Route | Airline | Google Flights | LetsFG | You Save | |-------|---------|---------------|--------|----------| | LAX → Paris (CDG) | WestJet, 1 stop | $723 | $687 | $36 | | Warsaw → Bali (DPS) | Etihad, 1 stop | $876 | $842 | $34 | | SFO → London (LHR) | WestJet, 1 stop | $669 | $636 | $33 | | Chicago → Miami | Spirit, nonstop | $120 | $114 | $6 | | London → Barcelona | Vueling, nonstop | $62 | $56 | $6 | | LA → New York (JFK) | Frontier, 1 stop | $125 | $124 | $1 |
$116 saved across 6 flights. Google Flights inflates further on repeat searches. LetsFG returns the raw airline price every time.
Why the difference? Google Flights only searches its own limited set of airline partners. LetsFG searches everywhere — 200+ connectors including Skyscanner, Kiwi, Kayak, Momondo, plus direct airline websites (Ryanair, United, Southwest, EasyJet, Spirit, Norwegian, AirAsia, and 190+ more). More sources = better prices. And unlike travel websites, LetsFG returns the raw price with zero markup, no tracking, no inflation.
Don't want to install anything? Use letsfg.co and search flights instantly in your browser:
Search any route, compare live results, and unlock the booking links for the flights you want without installing anything.
When you're ready to integrate it into your own agent, keep reading.
| How you use it | Search | Unlock | Book | Runs where? | |----------------|--------|--------|------|-------------| | CLI / Python SDK / npm | ✅ Free | ✅ Free | Ticket price only | Your machine | | MCP Server (local) | ✅ Free | ✅ Free | Ticket price only | Your machine | | letsfg.co | ✅ Free | Small one-time fee per search | Ticket price only | Our servers |
Local = 100% free. The CLI, Python SDK, npm packages, and local MCP server run 200+ connectors covering 400+ airlines on your machine. No API key needed, no fees, no limits.
letsfg.co = free search + small unlock fee. Search is free, and when you unlock a search you get the booking links for all flights from that search. Booking stays at the raw airline price — zero markup.
💡 Know someone who travels? The more people discover LetsFG, the more airlines we cover — and the better it gets for everyone. ⭐ Star · Share with a friend
| | Google Flights / Expedia | LetsFG | |---|---|---| | Price | Inflated (tracking, cookies, surge) | Raw airline price. $116 cheaper across 6 verified routes. | | Coverage | Misses budget airlines | 200+ connectors, 400+ airlines | | Speed | 30s+ (loading, ads, redirects) | ~10 seconds | | Repeat search raises price? | Yes | Never | | Works in AI agents? | No | Native (CLI, MCP, SDK) | | Booking | Redirects to OTA checkout | Real airline PNR, e-ticket to inbox | | Cabin class filter | No | Economy, premium, business, first | | Cost to you | Hidden markup | CLI/local: 100% free. Server: free search, 1% unlock. |
pip install letsfg
Search flights immediately — no API key, no registration, no account needed:
letsfg search LHR BCN 2026-06-15
That single command fires 200+ connectors on your machine and returns real-time prices from 400+ airlines. Free. Unlimited. Zero setup.
Short on time? Use --mode fast to search only OTAs + key airlines (~25 connectors, 20-40s instead of 6+ min):
letsfg search LHR BCN 2026-06-15 --mode fast
Flying business or first? Filter by cabin class — only get results that match:
letsfg search LHR JFK 2026-06-15 --cabin C # business class
letsfg search LHR JFK 2026-06-15 --cabin F # first class
letsfg search LHR JFK 2026-06-15 --cabin W # premium economy
Want to unlock and book? Star the repo for free access:
# Star the repo on GitHub, then verify
letsfg star --github your-username
The CLI auto-registers behind the scenes and saves your API key to ~/.letsfg/config.json. No manual steps.
# Search (free, unlimited)
letsfg search LON BCN 2026-04-01 --return 2026-04-08 --sort price
# Unlock (confirms live price, holds for 30 min — free)
letsfg unlock off_xxx
# Book (ticket price only, zero markup)
letsfg book off_xxx \
--passenger '{"id":"pas_0","given_name":"John","family_name":"Doe","born_on":"1990-01-15","gender":"m","title":"mr