Agent skill

Duffel

by borski in borski/travel-hacking-toolkit

Real-time GDS flight search via Duffel API. An agent skill from borski/travel-hacking-toolkit.

MITAuto-check passed

Install Duffel

skills CLI
$ npx skills add borski/travel-hacking-toolkit --skill duffel -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install borski/travel-hacking-toolkit duffel --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/borski/travel-hacking-toolkit.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/travel-hacking-toolkit/skills/duffel .claude/skills/duffel && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
duffel
GitHub stars
688
Token cost
~1.9k tokens
SKILL.md length
264 words
Files
1
Skills in repo
46
Repo updated
First seen
Licence
MIT

At a glance

Real-time GDS flight search via Duffel API. An agent skill from borski/travel-hacking-toolkit.

  • SKILL.md covers Prerequisites, API Basics, Search Flights (One-Way) and Search Flights (Round-Trip), plus 10 more sections
  • Calls curl and jq; reaches api.duffel.com

What it does

Duffel is an agent skill from borski/travel-hacking-toolkit. Real-time GDS flight search via Duffel API. Accurate per-fare-class pricing, cabin selection, multi-city, time preferences. Primary cash price source. Does not include Southwest.

Its SKILL.md is about 1.9k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

The repository describes itself as: AI-powered travel hacking and search with cash, points, miles, and award flights. Drop-in skills and MCP servers for Claude, Codex, and OpenCode. The licence is MIT.

Example prompts

  • “/duffel”

Requirements

  • Pre-approved tools (allowed-tools): Bash(curl *)

What it can do on your machine

Read from SKILL.md and the folder at commit db82131. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves these tools, so the agent can use them without asking each time:

    • Bash(curl *)

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • curl
    • jq

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • api.duffel.com

    Also links to:

    • duffel.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Duffel loads about 1.9k tokens when it runs. Until then it costs about 46 tokens; SKILL.md has 264 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~46
When it runs · the whole SKILL.md, loaded when a task matches
~1.9k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from borski/travel-hacking-toolkit at commit db82131, republished under its MIT licence (© borski). 264 words, ~1,865 tokens.

Download SKILL.mdSave it as .claude/skills/duffel/SKILL.md (or your agent's skills folder).
name
duffel
description
Real-time GDS flight search via Duffel API. Accurate per-fare-class pricing, cabin selection, multi-city, time preferences. Primary cash price source. Does not include Southwest.
allowed-tools
Bash(curl *)
category
flights
summary
Primary cash prices. Real GDS per-fare-class data.
api_key
Duffel

Duffel Flights

Search for real-time flight offers across airlines via the Duffel API. Returns live pricing, cabin details, baggage info, and booking links. Supports one-way, round-trip, and multi-city searches.

Source: duffel.com

Prerequisites

  • DUFFEL_API_KEY_LIVE environment variable set with a live API token
  • Token needs air.offer_requests.create permission

API Basics

  • Base URL: https://api.duffel.com
  • Version header: Duffel-Version: v2 (REQUIRED, v1 is deprecated)
  • Auth: Authorization: Bearer $DUFFEL_API_KEY_LIVE
  • Content-Type: application/json
  • Rate limit: 60 requests per 60 seconds

Search Flights (One-Way)

bash
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"
    }
  }'

Search Flights (Round-Trip)

Add a second slice with origin/destination reversed:

bash
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"
    }
  }'

Search Flights (Multi-City)

Add as many slices as needed:

bash
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"
    }
  }'

Nonstop Only

Set max_connections to 0:

bash
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
    }
  }'

Multiple Passengers

json
"passengers": [
  {"type": "adult"},
  {"type": "adult"},
  {"age": 10},
  {"type": "infant_without_seat"}
]

Use age instead of type for children to avoid passenger type mismatches between search and booking.

Time Preferences

Constrain departure or arrival times:

json
"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"}
}]

Query Parameters

ParameterDefaultDescription
return_offerstrueSet to false to get just the request ID, then fetch offers separately
supplier_timeout20000Max ms to wait for airline responses (2000 to 60000)

Reading the Response

The response is nested under data. Key fields:

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

Get Offer Details

Retrieve full details for a specific offer:

bash
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"

Parsing Tips

Extract the 5 cheapest offers with jq:

bash
| 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
}]'

Cabin Classes

ValueDescription
economyStandard economy
premium_economyPremium economy
businessBusiness class
firstFirst class

Important Notes

  • Offers expire quickly (usually 15 to 30 minutes). Check expires_at.
  • Always show the operating carrier name (US DOT regulation).
  • Set supplier_timeout lower than your HTTP client timeout.
  • Use age for child passengers instead of type to avoid airline mismatch errors.
  • The API returns real GDS prices. These are bookable, not estimates.
  • Duffel aggregates across multiple airlines in a single search.

© borski, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in plugins/travel-hacking-toolkit/skills/duffel of borski/travel-hacking-toolkit.

Open the folder on GitHubat commit db82131

Compare with similar skills

Duffel next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Duffel compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Duffel this skillborski/travel-hacking-toolkit688—~1.9kAutomated safety check: PassMIT
Flightsasgeirtj/system_prompts_leaks69k—~2.1kAutomated safety check: PassCC0-1.0
Flightscodewhale-hq/Codewhale41k—~258Automated safety check: PassMIT
Duffel Flight Bookingwin4r/MuseAI-Skills3321 repos~7kAutomated safety check: PassNone
Flight Booking AItourmind-com/Tourmind-Booking-Skills1.7k—~11kAutomated safety check: PassMIT
Navifare Flight ValidatorLeoYeAI/openclaw-master-skills2.2k—~4.7kAutomated safety check: PassMIT

Similar skills

  • Flights

    asgeirtj/system_prompts_leaks

    Research, book, or manage flights, including check-in. An agent skill from asgeirtj/system_prompts_leaks.

    69k GitHub stars~2.1k tokensUpdated yesterday
    Auto-check passed
  • Flights

    codewhale-hq/Codewhale

    Track flights and look up status and schedules. An agent skill from codewhale-hq/Codewhale.

    41k GitHub stars~258 tokensUpdated today
    Auto-check passed
  • Duffel Flight Booking

    win4r/MuseAI-Skills

    Defines how an agent searches, books and manages flights through the Duffel CLI, and watches a booked fare when you ask for ongoing price monitoring.

    332 GitHub starsUsed in 1 repo~7k tokens
    Productivity & AutomationAuto-check passed
  • Flight Booking AI

    tourmind-com/Tourmind-Booking-Skills

    A skill your agent uses when a user wants to resolve airports, search live flight offers, verify a selected airfare, create a flight booking, query a flight order, or safely create or query a…

    1.7k GitHub stars~11k tokensUpdated 14 days ago
    Auto-check passed
  • Navifare Flight Validator

    LeoYeAI/openclaw-master-skills

    Verify and compare flight prices across multiple booking sites using Navifare.

    2.2k GitHub stars~4.7k tokensUpdated 2 mo ago
    Auto-check passed
  • Flight Plan Parser

    benchflow-ai/skillsbench

    A skill your agent uses when converting natural language flight commands into waypoints and timing for a drone simulator.

    1.8k GitHub stars~770 tokensUpdated 2 mo ago
    Auto-check passed

More from borski/travel-hacking-toolkit

All 46 skills in this repo
  • Amex Travel

    borski/travel-hacking-toolkit

    Search Amex travel portal for cash prices, MR points pricing, IAP discounts, and FHR/THC hotel benefits via Patchright.

    688 GitHub stars~3.1k tokensUpdated 3 days ago
    Auto-check passed
  • Chase Travel

    borski/travel-hacking-toolkit

    Search Chase UR travel portal via Patchright for cash prices, points pricing, Points Boost offers, and Chase Edit hotel benefits.

    688 GitHub stars~2.8k tokensUpdated 3 days ago
    Auto-check passed
  • Deutsche Bahn

    borski/travel-hacking-toolkit

    Deutsche Bahn train schedules, journey planning, and departures across Germany and into neighboring countries (Austria, Switzerland, Netherlands, France, Belgium).

    688 GitHub stars~1.5k tokensUpdated 3 days ago
    Auto-check passed
  • Sutochno

    borski/travel-hacking-toolkit

    Search Sutochno.ru (СУТОЧНО.РУ), a Russian short-term apartment-rental platform where you book directly from owners and pay in rubles (Mir card / bank transfer).

    688 GitHub stars~2.1k tokensUpdated 3 days ago
    Auto-check passed
  • Ticketsatwork

    borski/travel-hacking-toolkit

    Search TicketsAtWork (EBG corporate perks) for hotels, theme park tickets, attractions, and rental cars via Patchright.

    688 GitHub stars~4.2k tokensUpdated 3 days ago
    Auto-check passed
  • Vrbo

    borski/travel-hacking-toolkit

    Search VRBO (Vrbo / Expedia Group) vacation rentals including entire homes, condos, and cabins via Patchright browser automation.

    688 GitHub stars~1.7k tokensUpdated 3 days ago
    Auto-check passed

Questions about Duffel

What does Duffel do?

Real-time GDS flight search via Duffel API. An agent skill from borski/travel-hacking-toolkit. Duffel is an agent skill from borski/travel-hacking-toolkit. Real-time GDS flight search via Duffel API.

How do I install Duffel in Claude Code?

Run `npx skills add borski/travel-hacking-toolkit --skill duffel -a claude-code`. Or copy the skill folder (plugins/travel-hacking-toolkit/skills/duffel in borski/travel-hacking-toolkit) into .claude/skills/duffel in your project. Claude Code loads it when a task matches its description.

How do I install Duffel in Codex?

Run `npx skills add borski/travel-hacking-toolkit --skill duffel -a codex`. Or copy the skill folder (plugins/travel-hacking-toolkit/skills/duffel in borski/travel-hacking-toolkit) into .agents/skills/duffel in your project. Codex loads it when a task matches its description.

Can I use Duffel in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add borski/travel-hacking-toolkit --skill duffel -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/duffel, .gemini/skills/duffel, .github/skills/duffel and .opencode/skills/duffel in your project.

What does Duffel need to run?

Going by SKILL.md and its folder, Duffel needs the command-line tools its instructions call (curl and jq). Its frontmatter pre-approves these tools: Bash(curl *).

Does Duffel access the network?

SKILL.md names 2 domains. In commands or code: api.duffel.com; the agent is likely to contact it when it follows the instructions. As links in the text: duffel.com. This is read from the text; nothing was executed.

Is Duffel safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Duffel use?

Duffel is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Duffel use?

About 1.9k tokens (SKILL.md is roughly 7.5k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Duffel?

Skills that share tags, products or a category with Duffel: Flights (asgeirtj/system_prompts_leaks, 69k stars), Flights (codewhale-hq/Codewhale, 41k stars), Duffel Flight Booking (win4r/MuseAI-Skills, 332 stars) and Flight Booking AI (tourmind-com/Tourmind-Booking-Skills, 1.7k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Duffel?

borski (a GitHub user) maintains it in borski/travel-hacking-toolkit, which has 688 GitHub stars. The repository holds 46 skills in this directory. The repository was last updated on October 5, 2026.

Source: borski/travel-hacking-toolkit on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.