by LetsFG
Agent-native flight search & booking. Saved $116 across 5 routes vs Google Flights (verified). 400+ airlines in 5 seconds. Star = free forever for first 1,000 stargazers.
# 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 400+ airlines worldwide via NDC and GDS. Returns real-time prices with zero markup or bias — $20–50 cheaper than OTAs.
Search 300,000+ hotels worldwide via Amadeus GDS + Hotelbeds B2B wholesale net rates.
Search ground transfers — private cars, taxis, shared shuttles, airport express.
Search 300,000+ activities — tours, museum tickets, day trips via Amadeus + Hotelbeds wholesale.
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-local 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 Duffel/GDS 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 |
First 1,000 stargazers get lifetime free access. Search 400+ airlines, book at raw prices, zero fees — forever.
After 1,000 stars: 1% unlock fee (min $1) • Founding members: always free
195 airlines. Real prices. One function call.
LetsFG gives your AI agent flight search and booking superpowers — 195 airline connectors fire in parallel, enterprise GDS sources (Amadeus, Sabre, Duffel) fill in the rest, and your agent gets the cheapest price on the planet. Zero markup. Real airline tickets.
The same flight costs $20–$50 less because you skip OTA inflation, cookie tracking, and surge pricing.
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+ website connectors including Google Flights itself, Skyscanner, Kiwi, Kayak, Momondo, plus direct airline websites (Ryanair, United, Southwest, EasyJet, etc.) and enterprise GDS/NDC sources (Amadeus, Sabre, Duffel). 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? Message our AI assistant and search flights instantly:
Ask it anything: "Find me the cheapest flight from London to Barcelona next month" — it searches 195 airlines in real time and gives you the best deals.
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 | | API / Messenger / Instagram | ✅ Free | 1% (min $1) | Ticket price only | Our servers |
Local = 100% free. The CLI, Python SDK, npm packages, and local MCP server run 195 airline connectors on your machine. No API key needed, no fees, no limits.
Server = free search + small unlock fee. When you use our hosted API (or chat with us on Messenger/Instagram), search is completely free. We charge 1% of the ticket price (min $1) to unlock offer details. Booking is at the raw airline price — zero markup.
⭐ First 1,000 stargazers get lifetime free access everywhere — including server unlock. Star → verify → free forever.
| | Google Flights / Expedia | LetsFG | |---|---|---| | Price | Inflated (tracking, cookies, surge) | Raw airline price. $116 cheaper across 6 verified routes. | | Coverage | Misses budget airlines | 195 connectors + 400 GDS 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 | | Cost to you | Hidden markup | CLI/local: 100% free. Server: free search, 1% unlock. |
pip install letsfg
letsfg star --github your-username # ⭐ verify your star (one-time)
Search flights immediately:
letsfg search-local LHR BCN 2026-06-15
That single command fires 195 airline connectors on your machine and returns real-time prices. Free. Unlimited. Zero setup.
Want enterprise GDS coverage too? One more command:
letsfg register --name my-agent --email you@example.com
export LETSFG_API_KEY=trav_...
letsfg search LHR JFK 2026-04-15
# 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"}' \
--email john.doe@example.com
⭐ Star this repo → verify → get unlimited access forever. No trial, no catch. First 1,000 stars only.
{
"mcpServers": {
"letsfg": {
"command": "npx",
"args": ["-y", "letsfg-mcp"]
}
}
}
That's it — search works immediately, no API key needed. 195 airline connectors run locally.
{
"mcpServers": {
"letsfg": {
"command": "npx",
"args": ["-y", "letsfg-mcp"],
"env": {
"LETSFG_API_KEY": "trav_your_api_key"
}
}
}
}
Get a key: letsfg register --name my-agent --email you@example.com
5-minute quickstarts: Claude Desktop · Cursor · Windsurf
from letsfg import LetsFG
bt = LetsFG() # reads LETSFG_API_KEY from env
flights = bt.search("LHR", "JFK", "2026-04-15")
print(f"{flights.total_results} offers, cheapest: {flights.cheapest.summary()}")
import { LetsFG } from 'letsfg';
const bt = new LetsFG({ apiKey: 'trav_...' });
const flights = await bt.search('LHR', 'JFK', '2026-04-15');
console.log(`${flights.totalResults} offers`);
from letsfg.local import search_local
result = await search_local("GDN", "BCN", "2026-06-15")
for offer in result.offers[:5]:
print(f"{offer.airlines[0]}: {offer.currency} {offer.price}")
| Package | Command | What you get |
|---------|---------|--------------|
| Python SDK + CLI | pip install letsfg | SDK + CLI + 195 local airline connectors |
| MCP Server | npx letsfg-mcp | Claude, Cursor, Windsurf — no API key needed |
| JS/TS SDK | npm install -g letsfg | SDK + CLI |
| Remote MCP | https://api.letsfg.co/mcp | No install (API key required) |
| Smithery | smithery.ai/servers/letsfg | One-click MCP install |
| Command | Description |
|---------|-------------|
| letsfg star --github <username> | ⭐ Verify GitHub star (required for free access) |
| letsfg search <origin> <dest> <date> | Search flights (free) |
| letsfg search-local <origin> <dest> <date> | Search locally, no API key |
| letsfg register | Get your API key |
| letsfg locations <query> | Resolve city/airport to IATA codes |
| letsfg unlock <offer_id> | Confirm live price & reserve 30 min |
| letsfg book <offer_id> | Book the flight |
| letsfg me | View profile & usage stats |
All commands accept --json for structured output and `-
No comments yet. Be the first to share your thoughts!