关于 duffel
面向开发者和旅行应用的 Duffel API 航班搜索技能,支持单程、往返和多城市查询,并返回实时报价、价格、舱位、行李及订票链接信息。
主要功能
- 01单程、往返和多城市搜索
- 02直飞与时间范围筛选
- 03乘客和舱位选择
- 04实时报价与航班详情
- 05获取报价详情
适用场景
- 01搜索多家航空公司的实时航班
- 02按经停次数或时段筛选航班
- 03比较票价与舱位信息
- 04获取选定报价的详细信息
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ borski/ travel-hacking-toolkit --skill duffel安装后在 Claude Code 中输入/duffel确认已加载。
详细介绍
Duffel 航班
通过 Duffel API 搜索各航空公司的实时航班报价。返回实时价格、客舱详情、行李信息和预订链接。支持单程、往返和多城市搜索。
来源: duffel.com
前提条件
- 设置
DUFFEL_API_KEY_LIVE环境变量,并填入有效的实时 API 令牌 - 令牌需要具备
air.offer_requests.create权限
API 基础信息
- 基础 URL:
https://api.duffel.com - 版本标头:
Duffel-Version: v2(必需,v1 已弃用) - 身份验证:
Authorization: Bearer $DUFFEL_API_KEY_LIVE - 内容类型:
application/json - 速率限制: 每 60 秒 60 个请求
搜索航班(单程)
curl -s -X POST "https://api.duffel.com/air/offer_requests?return_offers=true&supplier_timeout=15000" \
-H "Accept: application/json" \
-H "Duffel-Version: v2" \
-H "Authorization: Bearer $DUFFEL_API_KEY_LIVE" \
-H "Content-Type: application/json" \
-d '{
"data": {
"slices": [{
"origin": "SFO",
"destination": "NRT",
"departure_date": "2026-08-15"
}],
"passengers": [{"type": "adult"}],
"cabin_class": "economy"
}
}'
搜索航班(往返)
添加第二个行程段,并反转出发地和目的地:
curl -s -X POST "https://api.duffel.com/air/offer_requests?return_offers=true&supplier_timeout=15000" \
-H "Accept: application/json" \
-H "Duffel-Version: v2" \
-H "Authorization: Bearer $DUFFEL_API_KEY_LIVE" \
-H "Content-Type: application/json" \
-d '{
"data": {
"slices": [
{
"origin": "SFO",
"destination": "NRT",
"departure_date": "2026-08-15"
},
{
"origin": "NRT",
"destination": "SFO",
"departure_date": "2026-08-22"
}
],
"passengers": [{"type": "adult"}],
"cabin_class": "business"
}
}'
搜索航班(多城市)
按需添加任意数量的行程段:
curl -s -X POST "https://api.duffel.com/air/offer_requests?return_offers=true&supplier_timeout=15000" \
-H "Accept: application/json" \
-H "Duffel-Version: v2" \
-H "Authorization: Bearer $DUFFEL_API_KEY_LIVE" \
-H "Content-Type: application/json" \
-d '{
"data": {
"slices": [
{"origin": "SFO", "destination": "NRT", "departure_date": "2026-08-15"},
{"origin": "NRT", "destination": "ICN", "departure_date": "2026-08-20"},
{"origin": "ICN", "destination": "SFO", "departure_date": "2026-08-25"}
],
"passengers": [{"type": "adult"}],
"cabin_class": "economy"
}
}'
仅限直飞
将 max_connections 设为 0:
curl -s -X POST "https://api.duffel.com/air/offer_requests?return_offers=true&supplier_timeout=15000" \
-H "Accept: application/json" \
-H "Duffel-Version: v2" \
-H "Authorization: Bearer $DUFFEL_API_KEY_LIVE" \
-H "Content-Type: application/json" \
-d '{
"data": {
"slices": [{
"origin": "SFO",
"destination": "NRT",
"departure_date": "2026-08-15"
}],
"passengers": [{"type": "adult"}],
"cabin_class": "business",
"max_connections": 0
}
}'
多位乘客
"passengers": [
{"type": "adult"},
{"type": "adult"},
{"age": 10},
{"type": "infant_without_seat"}
]
儿童乘客请使用 age 而非 type,以避免搜索和预订时的乘客类型不匹配。
时间偏好
限制出发或到达时间:
"slices": [{
"origin": "SFO",
"destination": "NRT",
"departure_date": "2026-08-15",
"departure_time": {"from": "08:00", "to": "14:00"},
"arrival_time": {"from": "06:00", "to": "18:00"}
}]
查询参数
| 参数 | 默认值 | 说明 |
|---|---|---|
return_offers | true | 设为 false 仅获取请求 ID,之后再单独获取报价 |
supplier_timeout | 20000 | 等待航空公司响应的最长时间(毫秒,2000 至 60000) |
读取响应
响应嵌套在 data 中。重要字段:
data.id -> offer request ID
data.offers[] -> array of flight offers
.id -> offer ID (use to get details or book)
.total_amount / .total_currency -> total price
.base_amount / .base_currency -> base fare (before tax)
.tax_amount / .tax_currency -> taxes
.owner.name -> airline selling this
.expires_at -> when offer expires
.slices[] -> journey legs
.origin.iata_code -> departure airport
.destination.iata_code -> arrival airport
.duration -> e.g. "PT11H30M"
.segments[] -> individual flights
.marketing_carrier.name -> airline name
.marketing_carrier_flight_number
.operating_carrier.name -> actual operating airline
.departing_at / .arriving_at -> datetime
.duration -> segment duration
.origin.iata_code / .destination.iata_code
.passengers[].cabin_class -> economy/business/first
.passengers[].cabin.amenities -> wifi, power, seat info
.passengers[].baggages[] -> checked/carry_on allowances
.conditions -> refund/change policies
.refund_before_departure.allowed
.change_before_departure.allowed
.change_before_departure.penalty_amount
获取报价详情
获取特定报价的完整详情:
curl -s "https://api.duffel.com/air/offers/$OFFER_ID" \
-H "Accept: application/json" \
-H "Duffel-Version: v2" \
-H "Authorization: Bearer $DUFFEL_API_KEY_LIVE"
解析技巧
使用 jq 提取价格最低的 5 个报价:
| jq '[.data.offers | sort_by(.total_amount | tonumber) | .[:5][] | {
price: (.total_amount + " " + .total_currency),
airline: .owner.name,
route: [.slices[] | (.origin.iata_code + " -> " + .destination.iata_code)],
segments: [.slices[].segments[] | {
flight: (.marketing_carrier.iata_code + .marketing_carrier_flight_number),
carrier: .operating_carrier.name,
depart: .departing_at,
arrive: .arriving_at,
cabin: .passengers[0].cabin_class,
duration: .duration
}],
stops: ([.slices[].segments | length] | map(. - 1)),
expires: .expires_at
}]'
客舱等级
| 值 | 说明 |
|---|---|
economy | 标准经济舱 |
premium_economy | 高端经济舱 |
business | 商务舱 |
first | 头等舱 |
重要说明
- 报价很快就会过期(通常为 15 至 30 分钟)。请检查
expires_at。 - 务必显示实际承运航空公司的名称(美国交通部规定)。
- 将
supplier_timeout设为小于 HTTP 客户端超时的值。 - 儿童乘客请使用
age而非type,以避免航空公司不匹配错误。 - API 返回真实的 GDS 价格,可直接预订,并非估算价格。
- Duffel 在一次搜索中汇总多家航空公司的报价。
评论
支持 Markdown