mcpField
D
duffel

duffel

github.com/borski生产力78081 次安装2 天前更新
代码仓库

关于 duffel

面向开发者和旅行应用的 Duffel API 航班搜索技能,支持单程、往返和多城市查询,并返回实时报价、价格、舱位、行李及订票链接信息。

主要功能

  1. 01单程、往返和多城市搜索
  2. 02直飞与时间范围筛选
  3. 03乘客和舱位选择
  4. 04实时报价与航班详情
  5. 05获取报价详情

适用场景

  1. 01搜索多家航空公司的实时航班
  2. 02按经停次数或时段筛选航班
  3. 03比较票价与舱位信息
  4. 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_offerstrue设为 false 仅获取请求 ID,之后再单独获取报价
supplier_timeout20000等待航空公司响应的最长时间(毫秒,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