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/LetsFGLast scanned: 5/4/2026
{
"issues": [],
"status": "PASSED",
"scannedAt": "2026-05-04T06:38:23.048Z",
"semgrepRan": false,
"npmAuditRan": true,
"pipAuditRan": true
}LetsFG is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built 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. It has 1,233 GitHub stars.
Yes. LetsFG passed SkillsLLM's automated security scan — a dependency vulnerability audit plus prompt-injection heuristics — with no high-severity issues. You can read the full report in the Security Report section on this page.
Clone the repository with "git clone https://github.com/LetsFG/LetsFG" and add it to your Claude Code skills directory (see the Installation section above). LetsFG ships a SKILL.md manifest, so compatible agents can discover and load it automatically.
LetsFG is primarily written in Python. It is open-source under LetsFG on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh LetsFG against similar tools.
No comments yet. Be the first to share your thoughts!
Machine-readable skill manifest for AI agents and documentation indexers.
https://letsfg.co/developers/api/v1https://letsfg.co/developers/api/mcp (Streamable HTTP)letsfg · npm letsfg · npm letsfg-mcp| Mode | Best for | Speed | Cost |
|---|---|---|---|
| CLI / SDK / MCP (PFS Bearer token) | Personal use, any agent | 60–90 s | Free search; unlock 1% of ticket (min $3) |
Developer API (https://letsfg.co/developers) |
Business / commercial / high-volume | 2–5 s (discover) · 60–90 s (full search) | Prepaid credits; direct booking URLs, no per-booking fee |
Search hundreds of airlines worldwide via the server-side engine. Returns real-time prices with zero markup or bias — $20–50 cheaper than OTAs.
Search hotels worldwide via direct hotel APIs and aggregators.
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.
Confirm live price with airline and reveal the direct booking URL. Reserves the offer for 30 minutes.
POST /api/v1/bookings/unlocksetup_payment) for the Stripe path, or an MPP-capable client for the crypto path.WWW-Authenticate: Payment challenge — pay via Tempo USDC.e and retry. Otherwise add a card via setup_payment.unlocked = 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.
Before your first unlock, attach a payment method via POST /api/v1/agents/setup-payment (or use the MPP crypto path on the 402 challenge).
1. POST /api/v1/agents/register → Get API key (once)
2. POST /api/v1/agents/setup-payment → Attach payment card (once)
3. POST /api/v1/flights/search → Search flights (FREE)
4. POST /api/v1/bookings/unlock → Unlock offer (1% fee, min $3) → returns booking_url
5. 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/hotels/search → Search hotels (FREE)
3. POST /api/v1/hotels/checkrate → Confirm price (if rate_type=RECHECK)
4. POST /api/v1/hotels/book → Book room
5. 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://letsfg.co/developers/api/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 hundreds of airlines via server-side engine | FREE |
resolve_location |
City name → IATA code | FREE |
unlock_flight_offer |
Confirm price, reveal booking URL, reserve 30min | 1% of ticket (min $3) |
book_flight |
Create real airline reservation | Ticket price |
setup_payment |
Attach payment card (required for unlock/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"])
bt.setup_payment(token="tok_visa") # re-attach payment on the new key
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 | No hard limit (billing is the natural governor) | 2–5 s (discover) · 60–90 s (full search) |
| 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 | 1% of ticket (min $3) — Stripe card or MPP crypto. Free with the prepaid Developer API. |
| Book flight (after unlock) | Ticket price (zero markup, Stripe processing fee only) |
| Hotel booking | Room price only |
| Hotel cancellation | Per cancellation policy |
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.
Hundreds of airlines. Real prices. One function call.
LetsFG gives your AI agent flight search and booking superpowers. Our server-side engine scans the entire world for the cheapest price — free with a 90-day Bearer token, or paid with the Developer API for direct booking URLs. Zero markup. Real airline tickets.
The same flight costs $20–$50 less because you skip OTA inflation, cookie tracking, and surge pricing.
CLI or scripts: Run letsfg auth (one-time Twitter/X challenge) to get a 90-day token, then letsfg search hits our cloud engine instantly. Developer API: Paid, but returns direct airline booking URLs with no per-booking fee. → Get started
| Path 1 — CLI / SDK | Path 2 — PFS (Programmatic Flight Search via letsfg.co) | Path 3 — Developer API | |
|---|---|---|---|
| Best for | Developers, personal use, AI agents — easiest way in | Scripts/agents calling the API directly with a Bearer token | Products, teams, and builders who want raw offers, direct booking URLs, and no concierge fee |
| Speed | 60–90 s | 60–90 s | 2–5 s (discover) · 60–90 s (full search) |
| Search cost | Free (Twitter/X auth, one-time) | Free (Twitter/X auth, one-time) | Prepaid credits ($0.50/$0.20/$0.10 per search, monthly tiers) |
| Booking URL | 1% concierge fee (min $3) via letsfg.co | 1% concierge fee (min $3) via letsfg.co | Direct airline URLs, no per-booking fee |
| Setup | pip install letsfg && letsfg auth |
Twitter/X challenge — see below | letsfg.co/developers |
| Runs where | Our servers (auth + ranking local) | Our servers | Our servers |
CLI / SDK (Path 1): pip install letsfg and run letsfg auth once — a 30-second Twitter/X challenge gives you a 90-day Bearer token. After that, letsfg search calls our server-side engine and applies the open-source ranking algorithm locally. Search is free and unlimited. Booking links go through letsfg.co (1% concierge fee, min $3).
PFS — Programmatic Flight Search (Path 2): For scripts and agents that call the API directly. letsfg.co is human-only by default (Cloudflare Turnstile + bot protection). Register a 90-day Bearer token via a one-time Twitter/X challenge:
POST https://letsfg.co/api/agent-access/request → get { challenge_code, tweet_text }POST https://letsfg.co/api/agent-access/verify { "challenge_code": "..." } → receive your Bearer tokenPOST https://letsfg.co/api/search with Authorization: Bearer <token>Full guide and response schema: letsfg.co/for-agents. Search results include live flight offers with booking links via letsfg.co (1% concierge fee, min $3).
Developer API (Path 3): Paid server-side search at letsfg.co/developers. Prepaid credits, direct airline booking URLs (no checkout step), full NL query parsing, and a /discover endpoint that checks 20 destinations in one call for 1 credit (2–5 s). Includes a free sandbox at /sandbox/flights/*. Full docs: letsfg.co/developers/api/docs.
Free server-side search: Use Path 1 or PFS — one Twitter/X challenge gives you a 90-day token and free searches on our servers. No Playwright, no local install beyond the SDK. Direct booking URLs with no per-booking fee: Use the Developer API (Path 3) — prepaid credits, instant results, no checkout layer.
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 — Skyscanner, Kiwi, Kayak, Momondo, plus direct airline websites (Ryanair, United, Southwest, EasyJet, Spirit, Norwegian, AirAsia, and hundreds more). More sources = better prices. And unlike travel websites, LetsFG returns the raw price with zero markup, no tracking, no inflation.
Human users: 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 — no installation needed.
Agents / scripts (free server-side): Register a free Bearer token via a one-time Twitter/X challenge → use POST /api/search. This is PFS — Programmatic Flight Search powered by the letsfg.co engine, free for 90 days per token. See [l