关于 letsfg
LetsFG 是面向 AI Agent 的机票与酒店搜索预订技能,也支持搜索接送和活动。它通过 MCP、SDK、命令行和 API 提供访问,并支持异步预订状态查询。
主要功能
- 01跨航空公司和订票网站搜索航班
- 02搜索酒店、接送和活动
- 03解析城市名与机场代码
- 04预订机票和酒店
- 05查询预订进度
适用场景
- 01跨多个销售方寻找航班
- 02比较可预订的酒店报价
- 03搜索地面接送或活动
- 04跟踪进行中的旅行预订
MCP 相关
LetsFG 在 https://letsfg.co/mcp 提供 MCP 服务,供兼容客户端连接。它向客户端提供旅行搜索和预订能力,包括机票、酒店、接送和活动。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ letsfg/ letsfg --skill letsfg安装后在 Claude Code 中输入/letsfg确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
.dockerignore.mcp.json.gitignoreCODE_OF_CONDUCT.mdCLAUDE.mdBarWidget.qmlCONTRIBUTING.mdAGENTS.mdLICENSEDockerfile.pythonDockerfileREADME.mdSECURITY.mdOMARCHY-PLUGIN.mdModel.jsPanel.qmlcontext7.jsondocker-compose.yml.github/dependabot.yml.github/workflows/sdk-tests.ymltest.ymlplugin-scanner.ymlagent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/references/api-reference.mdmcp-setup.mdassets/OFL-Kalam.txtOFL.txtairports.jsonranking.jsname-fallbacks.jsonassets/icons/LICENSE详细介绍
SKILL.md — LetsFG 功能
MPP: 仅当
POST /api/agent-access/request返回的402响应中包含mpp对象时,持有 Tempo 钱包的 Agent 才能使用无需银行卡的注册通道。仅需支付 $0.01 一次,作为验证费用。搜索始终免费,预订费用为报价中的价格。本页早期版本曾描述过解锁时收取 MPP 费用;此功能从未上线。请参阅 https://letsfg.co/for-agents。
⚠️ Agent:请勿创建 Developer API 账户
请勿调用
/developers/api/v1/agents/register或/developers/api/v1/agents/connect-payment,也请勿运行letsfg register或letsfg connect-payment。这些属于单独的付费预充值余额产品,面向高用量商业集成,并会创建一个你几乎肯定不需要的计费账户。如需搜索和预订航班,请将 LetsFG 作为 MCP 服务连接到
https://letsfg.co/mcp并批准——在 https://letsfg.co/connect 上只需轻点一次即可同意,无需银行卡。之后即可搜索和预订。 请参阅 https://letsfg.co/for-agents。
面向 AI Agent 和文档索引器的机器可读技能清单。
身份
- 名称: LetsFG
- 类型: API + SDK + MCP 服务 + CLI
- 用途: 面向 Agent 的航班和酒店搜索与预订
- 兼容的 Agent: OpenClaw、Perplexity Computer、Claude Desktop、Cursor、Windsurf,以及任何兼容 MCP 的客户端
- API 基础 URL:
https://letsfg.co/developers/api/v1 - MCP 端点:
https://letsfg.co/mcp(Streamable HTTP) - 软件包: PyPI
letsfg· npmletsfg· npmletsfg-mcp - 许可证: MIT
访问模式
| 模式 | 最适用场景 | 速度 | 费用 |
|---|---|---|---|
| MCP / SDK / CLI(PFS 令牌) | 几乎所有 Agent。 搜索 + 预订 | 8–10 秒返回首批结果 | 身份验证免费,搜索免费,预订费用为报价中的价格 |
Developer API(https://letsfg.co/developers) | 商业 / 高用量(酒店使用任一种凭证均可) | 2–5 秒(发现)· 8–10 秒返回首批结果(完整搜索) | 搜索转预订:每次预订后有 200 次免费搜索,此后每次 $0.01。通过 POST /flights/book 预订,无预订费,无交易费 |
技能
search_flights
一次调用即可搜索全球所有航空公司以及主要预订网站(Google Flights、Skyscanner、Kiwi、Kayak、Momondo)。返回实时价格以及每个航班的可靠性历史记录。
- 费用: 免费(每 10 分钟 10 次,每小时 30 次,每天 100 次)
- 输入: 出发地(IATA)、目的地(IATA)、date_from;可选项:date_to、return_from、return_to、adults、children、infants、cabin_class(M/W/C/F)、max_stopovers、currency、sort、limit
- 输出: 航班报价列表,包含价格、航空公司、时间、航段、条件、passenger_ids
- 注意: 使用 PFS(Bearer 令牌)时,直接调用
book_flight——无需解锁步骤——然后轮询get_flight_booking。Developer API 同样无需解锁步骤:使用POST /flights/book预订,并轮询GET /flights/bookings/{id}。 - 速率限制(PFS): 每个账户每 10 分钟 10 次搜索、每小时 30 次、每天 100 次(添加银行卡后按卡计算)。轮询结果不计入次数。
resolve_hotel_city
将地点名称解析为酒店搜索所需的供应商城市 ID。
- 费用: 免费(但账户中仍须留存银行卡)
- 端点:
POST /api/v1/hotels/destinations - 输入: text(地点名称,例如 “Warsaw”)
- 输出: 匹配结果,最佳结果排在最前。将
Id用作 city_id,将Name用作 city_name。
search_hotels
搜索真实可预订的酒店库存。
- 费用: 免费。搜索无需银行卡;未绑定银行卡的账户每天可搜索一定次数的酒店。预订需要绑定支付方式,否则会返回 HTTP 402。
- 身份验证: 使用 Developer API 密钥(
X-API-Key)或连接流程中的 PFS 令牌均可。同一张卡可授权预订航班和酒店。 - 端点:
POST /api/v1/hotels/search - 输入: city_id、city_name、check_in、check_out、adults、children、child_ages、nationality、currency(默认为 USD)、limit
- 输出: hotels[],其中每项包含 offers[];每个 offer 均包含
price(住客需支付的全包总价,以currency计价)、fx_rate、expected_cost、refundable、free_cancellation_until(仅限可退款房价)、cancellation_policy、combination_id_v2和session_id - 注意: 所有房价类型均可售,且有可退款和不可退款之分——预订前请展示
refundable和free_cancellation_until。请保留所选 offer 的session_id和combination_id_v2;预订时两者缺一不可。price是住客需支付的金额。 - 额度: 每次酒店预订后可免费搜索酒店 1,000 次,之后可使用预付余额购买额度,每 1,000 次收费 $5.00。
search_transfers
搜索地面接送服务——专车、出租车、共享班车、机场快线。
- 费用: 免费
- 输入: origin、destination、date、passengers
- 输出: 接送选项及价格和车型
search_activities
搜索活动——旅游团、门票、一日游(供应商覆盖范围有限)。
- 费用: 免费
- 输入: location、date_from、date_to
- 输出: 活动选项及价格、描述和可订情况
resolve_location
将城市名称解析为 IATA 机场/城市代码。
- 费用: 免费
- 输入: query(城市名称,例如 “London”)
- 输出: 匹配的 IATA 代码列表(例如 LON、LHR、LGW、STN、LTN、LCY)
unlock_flight_offer
已于 2026-09-08 停用——该路由会返回 410 Gone。
- 两种接入方式均无需解锁步骤。预订时会锁定票价,且只有在生成真实 PNR 后才会扣款;这正是解锁功能原本要防范的问题。请改用
/api/agent-book(PFS)或POST /flights/book(Developer API)。 - 端点:
POST /api/v1/bookings/unlock——会返回410 Gone,SDK 中的unlock()也会以相同方式失败。
预订航班
预订报价。
- PFS(Bearer token):
POST /api/agent-book。无需解锁步骤——搜索后即可直接预订。 适用于搜索结果中的所有报价,无论报价来自哪个卖家。这与网站上的结账流程完全相同:显示的价格会在关联卡上预授权(不会扣款),LetsFG 预订 Agent 会向卖家购买机票,只有在获得真实航空公司 PNR 后才会扣款。如果预订失败,预授权会解除,不会扣款。- 输入:
search_id和offer_id(必须与搜索结果原样一致;报价约 15 分钟后过期)、contact_email,以及每次调用一个passenger:given_name、family_name、born_on、gender(m/f)、nationality(ISO-2)、phone_number 和 phone_country、address_line1、address_city、address_postal、address_country;passport_number/country/expiry 为可选项。 - 输出(秒级):
{"state": "booking_in_progress", "booking_ref": "eyJ...", "held": {"amount": 93, "currency": "EUR", "card": "visa ending 5709"}, "charged": 0}。 预订本身需要 4–11 分钟——轮询get_flight_booking。 - 不会扣款的情况:
{"error": "missing_details", "missing_fields": [...]}(询问缺少的信息,然后再次调用)、payment_method_required和payment_declined(两者都会提供add_card_url: https://letsfg.co/connect)。 - 同一趟行程有预订正在进行时,切勿再次调用——这会再次预授权。
- CLI:
letsfg book ws_off_xxx --search-id ws_xxx --passenger '{...}' --email [email protected] - Python:
bt.book(offer_id=..., passengers=[{...}], contact_email=..., search_id=...)
- 输入:
- 开发者 API:
POST /api/v1/flights/book。流程相同,无需解锁步骤:票价会在关联的 Revolut 付款方式上预授权,LetsFG 预订 Agent 会购买机票,只有在获得真实航空公司 PNR 后才会扣款。不收取预订费或交易费。- 前提条件: 已通过
POST /api/v1/agents/connect-payment关联 Revolut 付款方式(关联时不会扣款)。 - 输入: search_id、offer_id、passengers(given_name、family_name、born_on、gender、email、phone_number、nationality 等)、contact_email、idempotency_key
- 输出: 返回
202,包含booking_id、held、charged: 0和poll_url。轮询GET /api/v1/flights/bookings/{booking_id},直到状态为terminal:completed(pnr、charged_amount)|failed(预授权已解除,不会扣款)|needs_attention。
- 前提条件: 已通过
- 重要(两种方式均适用): 使用旅客的真实姓名(必须与护照/身份证件一致)和真实电子邮箱(航空公司会向此邮箱发送电子机票)。
查询航班预订状态
查看通过 book_flight 发起的预订进度(PFS)。POST /api/agent-book/status {"booking_ref": "eyJ..."}。
- 费用: 免费。每隔 20–30 秒轮询一次。
- 状态:
booking_in_progress(Agent 正在卖家的结账页面操作——继续等待)→completed(pnr、charged_amount、currency——已预订)|failed(failure_reason;预授权已解除,不会扣款)|needs_attention(LetsFG 的人工人员正在检查——请勿再次预订;系统会向旅客发送电子邮件)。updated_at_ms表示状态最近一次变更的时间。 - 只有状态为
completed且包含 PNR,才表示预订成功。
book_hotel
开始预订酒店。返回一个任务,而不是预订结果。
- 费用:报价中的
price。该金额会在已连接的银行卡上预授权(不会扣款),由 LetsFG 预订客房并向供应商付款,只有酒店确认后才会扣款。预订失败时会解除预授权。无预订费、无押金、无支付链接。 - 端点:
POST /api/v1/hotels/book - **输入:**session_id(所选报价的)、hotel_code、combination_id_v2、expected_price、 expected_cost、currency、fx_rate、city_id、city_name、check_in、check_out、adults、 guests[{title, first_name, last_name}]、email、phone;可选 phone_country_code、 special_requests、idempotency_key
- **输出:**booking_job_id、booking_id、状态 "in_progress"、预授权金额、轮询 URL
- **异步操作:**实际预订需要几分钟——供应商会重新锁定房价、确认客房并完成付款。轮询
get_hotel_booking,直到状态变为succeeded、failed或attention。 - **重要:**请原样传回所选报价返回的
expected_price、expected_cost、currency和fx_rate,否则预订会因price_mismatch被拒绝——绝不会向客人收取其未同意的价格。没有expected_balance。 - **本地软件包:**酒店预订需要
letsfg-mcp2026.5.77+、letsfg2026.5.101+(Python)或letsfg2026.5.74+(npm)。较早版本会发送已弃用的expected_balance契约,因此它们发起的每笔酒店预订都会被拒绝。托管版 MCP 无需更新。 - **重要:**任务运行期间,切勿再次调用此工具——请轮询任务。使用相同的
idempotency_key重试时,会返回现有任务,而不会重复预订。 - **注意:**在预授权之前会检查客人姓名、电话和电子邮件(
400 invalid_details)。 - 重要:
guests必须包含房间内每个人的姓名,包括儿童:先列成人,再按child_ages的顺序列儿童。姓名数量少于搜索时的同行人数,预订会在提交给酒店之前失败,并解除预授权。
get_hotel_booking
获取通过 book_hotel 发起的预订结果。
- **费用:**免费
- 端点:
GET /api/v1/hotels/booking/{booking_job_id} - **输出:**状态——
in_progress,随后为succeeded(确认信息、total_price + currency = 向客人收取的金额、是否可退款、free_cancellation_until、包含完整取消阶梯的条款)|failed(error;预授权已解除,未收取任何费用)|attention(error;LetsFG 的工作人员正在向供应商确认结果,预授权会保留——请勿再次预订) - **注意:**无论预订以何种结果结束,都会向客人发送电子邮件。
cancel_hotel_booking
取消酒店预订。
- **费用:**在
free_cancellation_until之前取消可退款房价时免费——费用将全额退还。若酒店会因取消而收费(不可退款房价,或已超过该日期),则会以409拒绝;酒店自己的取消阶梯列于预订的terms中。 - 端点:
POST /api/v1/hotels/cancel - **输入:**confirmation(仅限你自己的预订)
- **输出:**confirmation、charge、refund
- **注意:**此操作会在供应商处驱动浏览器,需要一分钟以上。如果超时,不要假定操作失败——请在重试前重新检查。
register
注册一个新的 AI Agent。
- **费用:**免费
- **输入:**agent_name、email
- **输出:**api_key(永久凭证)
connect_payment
仅限开发者 API。POST /api/v1/agents/connect-payment 会返回一次性 connect_url;用户在浏览器中打开该链接并保存银行卡或 Revolut Pay。使用 PFS 通道的 Agent 不调用此接口——访问 https://letsfg.co/connect 即可完成连接,无需银行卡,首次预订时才会要求提供银行卡。
- **费用:**免费——连接不会产生任何扣款
- 输出:
connect_url(有效期一小时) - **注意:**Stripe 于 2026-09-08 停用后,
setup_payment(POST /agents/setup-payment)已弃用,并会返回410 Gone。
get_agent_profile
获取当前 Agent 的资料、使用统计和付款状态。
- 费用: 免费
- 输出: Agent 详情、搜索次数、预订次数、付款状态
身份验证
PFS(推荐——几乎适用于所有 Agent): 来自连接流程的 Bearer 令牌。 连接无需银行卡,也不会产生任何费用。首次预订时才需要提供银行卡,届时会在 https://letsfg.co/connect 完成 0.00 Revolut 验证(可使用任何银行卡,或 Revolut Pay / Google Pay;无需 Revolut 账户;银行卡信息绝不会传给 LetsFG)。使用该方式可进行搜索、预订航班和预订酒店。
Authorization: Bearer eyJ...
获取令牌——唯一的接入方式:
- 将 LetsFG 添加为远程 MCP 服务:
https://letsfg.co/mcp。 - 批准连接。OAuth 授权步骤会打开 https://letsfg.co/connect:轻点一次,无需银行卡。
- 通过 MCP 时,OAuth 令牌会自动随请求传递;通过原始 HTTP 时,请将其作为
Authorization: Bearer <token>发送。
POST /api/agent-access/request 会以 JSON 返回 402 响应,其中包含这些步骤
(add_card_url、how)。Stripe 注册流程(setup_url、setup_intent、
card_token)已于 2026-09-02 停用,其签发的所有令牌均已撤销
(401 TOKEN_REVOKED;Stripe 凭据调用 /api/agent-access/verify 会返回 410)——请在 letsfg.co/connect 重新连接。letsfg auth(npm 或 PyPI)现在可在终端中引导你完成连接流程并保存令牌;除此之外,CLI 和 SDK 会从 LETSFG_BEARER_TOKEN 读取令牌。一张银行卡对应一个账户;配额按账户计算,添加银行卡后也会按银行卡计算。完整流程:
https://letsfg.co/for-agents。
开发者 API(企业/高用量): 除 register 外,每个端点都需要
X-API-Key 标头。
X-API-Key: letsfg_...
调用 POST /api/v1/agents/register,并提供 agent_name 和 email,即可获取密钥。密钥永久有效——请保存好。
然后调用 POST /api/v1/agents/connect-payment 连接付款方式,并打开返回的 connect_url 一次(不会产生任何费用)。
完整工作流
预订航班——PFS(3 次 API 调用)
1. POST /api/search → Search flights (FREE), returns search_id; poll GET /api/results/{search_id}
2. POST /api/agent-book → Book directly — no unlock step. Holds the fare on the connected card, returns booking_ref in seconds
3. POST /api/agent-book/status → Poll every 20–30 s (4–11 min) → completed (PNR) | failed (hold released) | needs_attention
预订航班——开发者 API(5 次 API 调用)
1. POST /api/v1/agents/register → Get API key (once)
2. POST /api/v1/agents/connect-payment → Open the connect_url once to save a card (nothing charged)
3. POST /api/v1/flights/search → Search flights (look-to-book: 200 free after every booking)
4. POST /api/v1/flights/book → Hold the fare, dispatch the booking agent → booking_id (202)
5. GET /api/v1/flights/bookings/{id} → Poll until terminal → completed (PNR) | failed (hold released) | needs_attention
预订酒店(PFS Bearer 令牌或开发者 API 密钥——同一张银行卡授权两者使用)
1. Card on file (to book; search needs none) → PFS: asked for at the first booking; Developer API: POST /api/v1/agents/connect-payment
2. POST /api/v1/hotels/destinations → Place name → city_id
3. POST /api/v1/hotels/search → Bookable rates (card required; 1,000 free after every hotel booking)
4. POST /api/v1/hotels/book → Holds the price; returns booking_job_id — NOT a booking
5. GET /api/v1/hotels/booking/{job_id} → Poll ~20s until succeeded / failed / attention
→ confirmation + total_price + currency
6. POST /api/v1/hotels/cancel → Optional; free on a refundable rate before free_cancellation_until
第 4 步会从银行卡中预授权全额,只有酒店确认后才会扣款;预订失败则会解除预授权。没有预订费、押金或付款链接。任务运行期间切勿重复执行第 4 步——请轮询任务状态。
CLI 用法
pip install -U letsfg # 2026.5.101 or later books hotels
export LETSFG_BEARER_TOKEN=eyJ... # token from the connect flow (see Authentication)
# Search flights — prints search_id, needed for book
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"
# Book — price shown on the offer, no unlock step. Holds the fare on the connected
# card and prints a booking_ref; poll POST /api/agent-book/status every 20–30 s
letsfg book ws_off_xxx --search-id ws_xxx \
--passenger '{"given_name":"John","family_name":"Doe","born_on":"1990-01-15","gender":"m","nationality":"GB","phone_number":"+447123456789","phone_country":"GB","address_line1":"1 High St","address_city":"London","address_postal":"N1 9GU","address_country":"GB"}' \
--email [email protected]
# Machine-readable output
letsfg search GDN BER 2026-03-03 --json
要改用开发者 API?执行一次 letsfg register + letsfg connect-payment(打开打印出的链接),然后执行 letsfg search ... --api-key letsfg_... 和
letsfg book off_xxx --search-id <search_id> --api-key letsfg_... --passenger '{...}' --email ...。
无需解锁步骤。
Python SDK 用法
from letsfg import LetsFG
bt = LetsFG() # reads LETSFG_BEARER_TOKEN — the token from the connect flow
# Search
results = bt.search("LHR", "JFK", "2026-04-15")
for offer in results.offers:
print(f"{offer.price} {offer.currency} — {', '.join(offer.airlines)}")
# Book — price shown on the offer, no unlock step. Holds the fare on the
# connected card; a LetsFG agent buys the ticket; captured only on a real PNR.
result = bt.book(
offer_id=results.offers[0].id,
passengers=[{
"given_name": "John", "family_name": "Doe",
"born_on": "1990-01-15", "gender": "m", "nationality": "GB",
"phone_number": "+447123456789", "phone_country": "GB",
"address_line1": "1 High St", "address_city": "London",
"address_postal": "N1 9GU", "address_country": "GB",
}],
contact_email="[email protected]",
search_id=results.search_id,
)
if "missing_fields" in result:
print("Nothing charged — ask for:", result["missing_fields"])
else:
print("Started:", result["booking_ref"], result["held"])
# poll POST /api/agent-book/status {"booking_ref": ...} every 20–30 s
# until state is completed (pnr) | failed (hold released) | needs_attention
要改用开发者 API?使用 LetsFG(api_key="letsfg_..."),然后调用 bt.book(offer_id, passengers, contact_email, search_id=..., idempotency_key=...)——无需解锁步骤。该调用会启动预订;可使用 bt.get_booking(booking_id) 轮询状态,或调用 bt.book_and_wait(...) 阻塞等待预订完成。
MCP 服务设置
远程(Streamable HTTP)——Agent 的入口:
{
"mcpServers": {
"letsfg": { "url": "https://letsfg.co/mcp" }
}
}
Claude Code:claude mcp add --transport http letsfg https://letsfg.co/mcp。
Claude:从 Claude 官方连接器目录添加,https://claude.ai/directory/letsfg——无需粘贴 URL(添加后,也可在 Claude Desktop 和 Claude 手机应用中使用)。
ChatGPT:在浏览器中访问 chatgpt.com(ChatGPT 手机应用无法添加),依次选择 Plugins > Add >
Add custom MCP server,输入该 URL,并将身份验证设为 OAuth;添加后,也可在手机应用中使用。Windsurf 使用
"serverUrl",而非 "url"。客户端会运行 OAuth;同意步骤会打开
https://letsfg.co/connect:点一下即可,无需银行卡。客户端收到令牌后即可立即搜索;首次预订时才会要求提供银行卡。
Developer API 账户可以使用相同的 URL,并通过
"headers": {"X-API-Key": "letsfg_..."} 代替 OAuth。
本地(stdio)——需要你已有的令牌:
npm install -g letsfg-mcp@latest # 2026.5.77 or later books hotels
LETSFG_BEARER_TOKEN=eyJ... letsfg-mcp # token from the connect flow
本地服务也接受 LETSFG_API_KEY,用于 Developer API。
book_flight 会根据已设置的凭据自动分派。其
authenticate 工具会返回当前的连接说明(add_card_url、
how);运行 letsfg auth 可在终端中生成令牌。
MCP 工具
| 工具 | 说明 | 费用 |
|---|---|---|
search_flights | 通过服务器端引擎搜索全球所有航空公司 | 免费 |
resolve_location | 城市名称 → IATA 代码 | 免费 |
book_flight | 开始预订。PFS:直接预订,无需解锁步骤——从已连接的银行卡中冻结票价,并返回 booking_ref。Developer API 密钥:调用方式相同,无需解锁步骤 | 报价显示的价格,无额外 LetsFG 费用(PFS) |
get_flight_booking | 每隔 20–30 s 轮询一次 PFS 预订:booking_in_progress → completed(PNR)/ failed(已解除冻结)/ needs_attention | 免费 |
unlock_flight_offer | 已于 2026-09-08 退役——返回 410 Gone。请直接调用 book_flight | — |
connect_payment | [仅限 Developer API] 生成一次性链接,将银行卡连接到付费账户(不会扣款)。PFS Agent 请改为访问 letsfg.co/connect 进行连接 | 免费 |
resolve_hotel_city | 地名 → search_hotels 使用的供应商城市 ID | 免费 |
search_hotels | 可预订的酒店房价,包括可退款和不可退款选项 | 免费(每次酒店预订 1,000) |
book_hotel | 开始酒店预订:冻结房价,酒店确认后扣款。返回 booking_job_id | 报价显示的价格 |
get_hotel_booking | 轮询,直到状态变为 succeeded / failed / attention | 免费 |
cancel_hotel_booking | 在 free_cancellation_until 之前取消可退款预订(退还 98%,收取 2% 费用) | 免费 |
get_agent_profile | 查看用量统计 | 免费 |
搜索标志参考
| 标志 | API 字段 | 值 | 默认值 |
|---|---|---|---|
--adults | adults | 1–9 | 1 |
--children | children | 0–9 | 0 |
--infants | infants | 0–9 | 0 |
--cabin | cabin_class | M(经济舱)、W(超级经济舱)、C(商务舱)、F(头等舱) | (任意) |
--return | return_from | YYYY-MM-DD | — |
--max-stops | max_stopovers | 0–4 | 2 |
--sort | sort | 价格、时长 | 价格 |
--limit | limit | 1–100 | 20 |
--currency | currency | EUR、USD、GBP 等 | EUR |
舱位等级代码说明
| 代码 | 等级 | 说明 | 典型使用场景 |
|---|---|---|---|
M | 经济舱 | 标准座位 | 经济出行、大多数预订 |
W | 超级经济舱 | 更多腿部空间、优先登机 | 长途旅行,舒适度高于经济舱,但价格低于商务舱 |
C | 商务舱 | 长途航班可平躺,享有贵宾室使用权 | 商务出行、6 小时以上航班 |
F | 头等舱 | 私人套间、高级餐饮 | 超高端航线(航空公司有限) |
--json | — | 以 JSON 格式输出 | — |
错误处理
| 异常 | HTTP 状态码 | 情况 |
|---|---|---|
AuthenticationError | 401 | API 密钥无效或缺失 |
PaymentRequiredError | 402 | 未关联付款方式,或搜索额度已用完 |
OfferExpiredError | 410 | 优惠已不可用 |
LetsFGError | 422 | 请求参数无效 |
LetsFGError | 429 | 请求过多(采用退避策略重试) |
LetsFGError | 502 | 上游航空公司/酒店 API 错误 |
认证失败后的恢复
from letsfg import LetsFG
from letsfg.connectors.auth import BearerTokenError
try:
bt = LetsFG() # reads LETSFG_BEARER_TOKEN — the token from the connect flow
flights = bt.search("LHR", "JFK", "2026-04-15")
except BearerTokenError:
print("Token expired, revoked or missing — reconnect at https://letsfg.co/connect")
开发者 API:
from letsfg import LetsFG, AuthenticationError
try:
bt = LetsFG(api_key="letsfg_...")
flights = bt.search("LHR", "JFK", "2026-04-15")
except AuthenticationError:
# API key invalid or expired — re-register, then connect a payment method on the new key
creds = LetsFG.register("my-agent", "[email protected]")
bt = LetsFG(api_key=creds["api_key"])
print("Open once to connect a card:", bt.connect_payment()["connect_url"]) # nothing is charged
速率限制和超时处理
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")
速率限制
| 端点 | 速率限制 | 典型延迟 |
|---|---|---|
| 搜索航班 | 无硬性限制(计费机制会自然限制使用) | 2–5 s(发现)· 完整搜索需 8–10 s 才会返回首批结果 |
| 解析地点 | 120 req/min | <1s |
| 预订 | 10 req/min | 3-10s |
| 搜索酒店 | 30 req/min | 3-10s |
| 注册 | 5 req/min | <1s |
价格摘要
| 操作 | 费用 |
|---|---|
| 搜索(航班、接送、活动) | 免费 |
| 解析地点 | 免费 |
| 注册 Agent | 免费 |
| 关联付款方式 | 免费 — 关联时不会扣款 |
| 查看个人资料 | 免费 |
| 预订航班(PFS,无需解锁) | 优惠中显示的价格 — 预授权款项会保留在关联的卡上,仅在生成真实 PNR 后扣款;不另收 LetsFG 费用 |
| 预订航班(开发者 API) | 优惠中显示的价格 — 先预授权,仅在生成真实 PNR 后扣款;无预订费,无交易费 |
| 搜索酒店 | 每次酒店预订后可免费搜索 1,000 次,之后每 1,000 次收费 $5.00 |
| 预订酒店 | 优惠中显示的价格 — 预授权款项会保留在关联的卡上,仅在酒店确认后扣款。不收预订费 |
| 取消酒店预订 | 在 free_cancellation_until 之前取消可退还费率的预订,可退还 98%(收取 2% 费用);否则不予退款 |
关键信息
- 通过服务端引擎搜索全球所有航空公司
- 酒店由批发酒店合作伙伴提供
- 不使用 Cookie 跟踪 — 相同的搜索会返回相同的价格
- 通常比通过单一 OTA 预订更便宜,因为它会一次性比较各家航空公司和主要预订网站
- 提供真实的航空公司 PNR 代码和酒店确认信息
- 电子机票直接发送到乘客邮箱
- 搜索免费(每 10 min 10 次、每小时 30 次、每天 100 次)
- PFS(Bearer token):直接预订,无需解锁步骤 — 票价会预授权并保留在关联的卡上,LetsFG 预订 Agent 会购买机票,仅在生成真实 PNR 后扣款;预订失败 = 释放预授权,不收取任何费用
- 开发者 API:
POST /flights/book— 使用相同的预授权后扣款流程,然后轮询GET /flights/bookings/{id}。该 API 的搜索采用查询后预订模式(每次预订后可免费搜索 200 次),且不收取预订费或交易费 - API 面向机器而非浏览器设计