{
  "schemaVersion": "1.0",
  "item": {
    "slug": "duffel",
    "name": "Duffel Flights",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/fabiolr/duffel",
    "canonicalUrl": "https://clawhub.ai/fabiolr/duffel",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/duffel",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=duffel",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "references/api-guide.md",
      "references/booking-flow.md",
      "scripts/duffel.py",
      "scripts/requirements.txt"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/duffel"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/duffel",
    "agentPageUrl": "https://openagent3.xyz/skills/duffel/agent",
    "manifestUrl": "https://openagent3.xyz/skills/duffel/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/duffel/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Duffel Flights",
        "body": "Search, book, and manage flights across 300+ airlines via the Duffel API."
      },
      {
        "title": "Setup",
        "body": "Set DUFFEL_TOKEN env var with your Duffel API access token.\nGet one at https://app.duffel.com → Developers → Access Tokens.\nTest tokens (prefix duffel_test_) use sandbox data with unlimited balance."
      },
      {
        "title": "Search flights",
        "body": "python scripts/duffel.py search --from MIA --to LHR --date 2026-04-15\npython scripts/duffel.py search --from MIA --to CDG --date 2026-03-15 --return-date 2026-03-22 --cabin business\npython scripts/duffel.py search --from JFK --to LAX --date 2026-05-01 --nonstop --adults 2\n\nOptions: --cabin economy|premium_economy|business|first, --nonstop, --adults N, --children N, --infants N, --sort price|duration, --max-results N, --json\n\nResults are numbered. Use the number with other commands."
      },
      {
        "title": "View offer details",
        "body": "python scripts/duffel.py offer 3\n\nShows segments, baggage, fare conditions (refund/change), available extras."
      },
      {
        "title": "Book a flight",
        "body": "python scripts/duffel.py book 3 --pax \"RIBEIRO/FABIO MR 1977-01-31 fabio@ribei.ro +13059159687 BR m\"\n\nPax format: LAST/FIRST TITLE DOB EMAIL PHONE NATIONALITY GENDER\n\nTITLE: MR, MRS, MS, MISS, DR\nGENDER: m or f\nMultiple passengers: repeat --pax \"...\" for each\n\nPayment uses Duffel account balance. Top up at https://app.duffel.com."
      },
      {
        "title": "Check order status",
        "body": "python scripts/duffel.py order ord_0000XXXXX"
      },
      {
        "title": "Cancel order",
        "body": "python scripts/duffel.py cancel ord_0000XXXXX           # Quote (shows refund amount)\npython scripts/duffel.py cancel ord_0000XXXXX --confirm  # Execute cancellation"
      },
      {
        "title": "Seat map",
        "body": "python scripts/duffel.py seatmap 3"
      },
      {
        "title": "Airport/city lookup",
        "body": "python scripts/duffel.py places \"new york\""
      },
      {
        "title": "Typical workflow",
        "body": "search → browse numbered results\noffer N → check details, baggage, conditions\nbook N --pax \"...\" → get PNR\norder <id> → verify booking\ncancel <id> → if needed"
      },
      {
        "title": "Notes",
        "body": "Offers expire (usually ~20 min). Re-search if expired.\nTest mode: unlimited balance, bookings on \"Duffel Airways\" (fake airline).\nProduction: real airlines, real tickets. Balance must be funded.\nAll commands support --json for raw API output.\nLast search saved to /tmp/duffel-last-search.json for index reference.\nFor API details, see references/api-guide.md and references/booking-flow.md."
      }
    ],
    "body": "Duffel Flights\n\nSearch, book, and manage flights across 300+ airlines via the Duffel API.\n\nSetup\n\nSet DUFFEL_TOKEN env var with your Duffel API access token. Get one at https://app.duffel.com → Developers → Access Tokens. Test tokens (prefix duffel_test_) use sandbox data with unlimited balance.\n\nCommands\nSearch flights\npython scripts/duffel.py search --from MIA --to LHR --date 2026-04-15\npython scripts/duffel.py search --from MIA --to CDG --date 2026-03-15 --return-date 2026-03-22 --cabin business\npython scripts/duffel.py search --from JFK --to LAX --date 2026-05-01 --nonstop --adults 2\n\n\nOptions: --cabin economy|premium_economy|business|first, --nonstop, --adults N, --children N, --infants N, --sort price|duration, --max-results N, --json\n\nResults are numbered. Use the number with other commands.\n\nView offer details\npython scripts/duffel.py offer 3\n\n\nShows segments, baggage, fare conditions (refund/change), available extras.\n\nBook a flight\npython scripts/duffel.py book 3 --pax \"RIBEIRO/FABIO MR 1977-01-31 fabio@ribei.ro +13059159687 BR m\"\n\n\nPax format: LAST/FIRST TITLE DOB EMAIL PHONE NATIONALITY GENDER\n\nTITLE: MR, MRS, MS, MISS, DR\nGENDER: m or f\nMultiple passengers: repeat --pax \"...\" for each\n\nPayment uses Duffel account balance. Top up at https://app.duffel.com.\n\nCheck order status\npython scripts/duffel.py order ord_0000XXXXX\n\nCancel order\npython scripts/duffel.py cancel ord_0000XXXXX           # Quote (shows refund amount)\npython scripts/duffel.py cancel ord_0000XXXXX --confirm  # Execute cancellation\n\nSeat map\npython scripts/duffel.py seatmap 3\n\nAirport/city lookup\npython scripts/duffel.py places \"new york\"\n\nTypical workflow\nsearch → browse numbered results\noffer N → check details, baggage, conditions\nbook N --pax \"...\" → get PNR\norder <id> → verify booking\ncancel <id> → if needed\nNotes\nOffers expire (usually ~20 min). Re-search if expired.\nTest mode: unlimited balance, bookings on \"Duffel Airways\" (fake airline).\nProduction: real airlines, real tickets. Balance must be funded.\nAll commands support --json for raw API output.\nLast search saved to /tmp/duffel-last-search.json for index reference.\nFor API details, see references/api-guide.md and references/booking-flow.md."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/fabiolr/duffel",
    "publisherUrl": "https://clawhub.ai/fabiolr/duffel",
    "owner": "fabiolr",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/duffel",
    "downloadUrl": "https://openagent3.xyz/downloads/duffel",
    "agentUrl": "https://openagent3.xyz/skills/duffel/agent",
    "manifestUrl": "https://openagent3.xyz/skills/duffel/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/duffel/agent.md"
  }
}