{
  "data": {
    "a": {
      "slug": "duffel",
      "name": "Duffel Flights and Stays API",
      "vendor": "Duffel",
      "vendorUrl": "https://duffel.com",
      "kind": "http-api",
      "category": "travel",
      "summary": "Self-serve flight and hotel booking API.",
      "url": "https://www.anchorterminal.com/tools/duffel",
      "markdownUrl": "https://www.anchorterminal.com/tools/duffel.md",
      "slimMarkdownUrl": "https://www.anchorterminal.com/tools/duffel.min.md",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/duffel.json",
      "repo": "https://github.com/duffelhq/duffel-api-javascript",
      "license": "MIT (SDK)",
      "transports": [
        "http"
      ],
      "remoteUrl": "https://api.duffel.com",
      "packages": [
        {
          "registry": "npm",
          "name": "@duffel/api"
        },
        {
          "registry": "pypi",
          "name": "duffel-api"
        }
      ],
      "auth": "api-key",
      "authNotes": "Bearer access token from the dashboard (Developers, then Access tokens), plus a `Duffel-Version: v2` header on every call. Test and live tokens are separate and come from the same page. Every response carries an `x-request-id` for support.",
      "pricing": "usage",
      "pricingNotes": "Pay as you go with no set-up cost. Flights are $3.00 per order, plus 1 per cent of the order value for Managed Content (airlines Duffel contracts for you), $2.00 per paid ancillary, 2 per cent on currency conversion and $0.005 per search once you pass a 1,500 to 1 search to book ratio. Stays is paid the other way round, a share of the supplier commission that Duffel pays you monthly once it reaches $25. Enterprise is bespoke (https://duffel.com/pricing).",
      "priceSummary": "$3 / tx",
      "where": "hosted",
      "x402": {
        "level": "no",
        "endpoints": []
      },
      "toolCount": null,
      "popularity": {
        "githubStars": 55,
        "npmWeekly": 87322,
        "pypiWeekly": null,
        "asOf": "2026-09-30"
      },
      "docsUrl": "https://duffel.com/docs",
      "capabilities": [
        "travel.flights",
        "travel.stays",
        "travel.booking",
        "travel.changes",
        "travel.search"
      ],
      "tags": [
        "hosted",
        "closed-source",
        "usage-priced",
        "typescript",
        "webhooks",
        "enterprise",
        "uk"
      ],
      "lastRelease": "2026-09-28",
      "graded": true,
      "anchor": {
        "graded": true,
        "score": 66.9,
        "grade": "B",
        "agentReady": false,
        "rank": 153,
        "ranked": true,
        "rankOf": 452,
        "categoryRank": 1,
        "methodology": "0.3",
        "run": "2026-10-01",
        "scores": {
          "ergonomics": 80,
          "maintenance": 92,
          "payments": 40,
          "reliability": 70,
          "schema": 59,
          "security": 60,
          "transparency": 77
        },
        "pending": [
          "performance",
          "tasks"
        ],
        "assessment": {
          "confidence": "high",
          "date": "2026-10-01"
        },
        "negative": 0,
        "verdict": "Self-serve sign-up and test mode with no card or contract. No OpenAPI document, llms.txt or official MCP server.",
        "strengths": [
          "Self-serve sign-up and test mode with no card or contract",
          "Published prices, $3.00 an order, $2.00 a paid ancillary, $0.005 per search above 1,500 to 1",
          "Orders, holds, changes, cancellations, seats and bags in one API, with a versioning policy that keeps old versions for 6 months",
          "Statuspage with per-supplier components and a public changelog updated 28 September",
          "PCI DSS v4 Level 1, a vulnerability disclosure programme and a trust centre"
        ],
        "weaknesses": [
          "No OpenAPI document, llms.txt or official MCP server",
          "Default rate limit of 60 requests a minute, which Duffel says can change without notice",
          "Searches above 1,500 per order cost $0.005 each and can get you capped under the services agreement",
          "Python SDK archived; TypeScript is the only maintained SDK",
          "No SLA published for pay-as-you-go or enterprise"
        ],
        "agentNotes": [
          "Send `Duffel-Version: v2` on every request or you get a version error",
          "Fetch the single offer again right before creating the order, since an offer goes stale within minutes",
          "Set a 130-second timeout on order creation, and treat a 202 as processing rather than retrying, or you risk a duplicate",
          "Read `ratelimit-remaining` before fanning out searches; the default is 60 requests per 60 seconds",
          "Count offer requests. Above 1,500 per order the surcharge starts and the agreement lets Duffel cap you"
        ],
        "metrics": {
          "kind": "remote",
          "measured": false
        },
        "reviewCount": 2,
        "avgRating": 4,
        "history": [
          {
            "basis": "public evidence",
            "confidence": "high",
            "grade": "B",
            "methodology": "0.3",
            "pending": [
              "performance",
              "tasks"
            ],
            "run": "2026-10-01",
            "runLabel": "October 2026 research run",
            "score": 66.9
          }
        ],
        "editorialScores": {
          "ergonomics": 80,
          "maintenance": 92,
          "payments": 40,
          "reliability": 70,
          "schema": 59,
          "security": 60,
          "transparency": 63
        },
        "provenanceScore": 90
      },
      "connect": {
        "install": "npm install @duffel/api",
        "http": "curl -X POST https://api.duffel.com/air/offer_requests?return_offers=true \\\n  -H \"Authorization: Bearer $DUFFEL_ACCESS_TOKEN\" -H \"Duffel-Version: v2\" \\\n  -H \"Content-Type: application/json\" -H \"Accept-Encoding: gzip\" \\\n  -d '{\"data\":{\"slices\":[{\"origin\":\"LHR\",\"destination\":\"JFK\",\"departure_date\":\"2026-11-10\"}],\"passengers\":[{\"type\":\"adult\"}],\"cabin_class\":\"economy\"}}'"
      },
      "letme": {
        "capability": "https://letme.dev/travel.flights",
        "tool": "https://letme.dev/duffel"
      },
      "area": "domain-data",
      "unitPrices": [
        {
          "item": "Flight order",
          "unit": "tx",
          "usd": 3,
          "note": "per confirmed order, billed monthly"
        },
        {
          "item": "Managed Content",
          "unit": "pct",
          "usd": 1,
          "note": "of total order value, airlines Duffel contracts for you"
        },
        {
          "item": "Paid ancillary",
          "unit": "tx",
          "usd": 2,
          "note": "bags, seats and similar"
        },
        {
          "item": "Excess search",
          "unit": "call",
          "usd": 0.005,
          "note": "above a 1,500 to 1 search to book ratio"
        },
        {
          "item": "Foreign exchange",
          "unit": "pct",
          "usd": 2,
          "note": "on the exchange rate"
        }
      ],
      "provenance": {
        "legalEntity": "Duffel Technology Limited",
        "domain": "duffel.com",
        "domainRegistered": "2000-05-02",
        "domainNote": "duffel.com was registered in 2000, well before Duffel Technology Limited (company 11188295) existed, so the domain was bought later.",
        "endpointOnVendorDomain": true,
        "terms": "https://duffel.com/services-agreement",
        "privacy": "https://duffel.com/privacy-policy",
        "statusPage": "https://www.duffelstatus.com",
        "changelog": "https://changelog.duffel.com",
        "securityTxt": "none",
        "checked": "2026-09-30",
        "notes": [
          "Registered in England and Wales, company 11188295, 43 Worship Street, London EC2A 2DU, VAT GB 308 8210 16, governed by the law of England and Wales.",
          "You carry airline debit memos, chargebacks and penalties on your orders under the services agreement.",
          "duffel.com/.well-known/security.txt returns 404."
        ],
        "score": 90
      },
      "pageJsonUrl": "https://www.anchorterminal.com/tools/duffel.json",
      "live": {
        "slug": "duffel",
        "probe": {
          "target": "https://api.duffel.com",
          "method": "get",
          "lastAt": "2026-10-05T03:17:25.422505003Z",
          "lastOk": true,
          "lastStatus": 200,
          "lastMs": 90,
          "authRequired": false,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 65,
          "p95ms24h": 132,
          "samples24h": 273,
          "samples30d": 938,
          "days": [
            {
              "date": "2026-10-01",
              "probes": 109,
              "ok": 109
            },
            {
              "date": "2026-10-02",
              "probes": 248,
              "ok": 248
            },
            {
              "date": "2026-10-03",
              "probes": 271,
              "ok": 271
            },
            {
              "date": "2026-10-04",
              "probes": 272,
              "ok": 272
            },
            {
              "date": "2026-10-05",
              "probes": 38,
              "ok": 38
            }
          ]
        },
        "vendorStatus": {
          "page": "https://www.duffelstatus.com",
          "indicator": "none",
          "summary": "All Systems Operational",
          "checkedAt": "2026-10-05T03:18:59.974133782Z"
        },
        "versions": [
          {
            "registry": "github",
            "name": "duffelhq/duffel-api-javascript",
            "version": "v4.30.1",
            "released": "2026-10-02",
            "seenAt": "2026-10-04T16:25:53.972942488Z"
          },
          {
            "registry": "npm",
            "name": "@duffel/api",
            "version": "4.30.1",
            "seenAt": "2026-10-04T16:25:53.344100768Z"
          },
          {
            "registry": "pypi",
            "name": "duffel-api",
            "version": "0.6.2",
            "released": "2023-10-02",
            "seenAt": "2026-10-04T16:25:53.787353211Z"
          }
        ],
        "githubStars": 59,
        "npmWeekly": 97446,
        "pypiWeekly": 858,
        "securityTxt": {
          "url": "https://duffel.com/.well-known/security.txt",
          "state": "none",
          "checkedAt": "2026-10-04T15:15:59.537028906Z"
        },
        "domain": {
          "domain": "duffel.com",
          "registered": "2000-05-02",
          "source": "https://rdap.verisign.com/com/v1/domain/duffel.com",
          "checkedAt": "2026-10-04T13:06:44.746625158Z"
        },
        "pages": [
          {
            "url": "https://changelog.duffel.com",
            "kind": "changelog",
            "status": 200,
            "checkedAt": "2026-10-04T15:41:50.626742305Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "75a7bddb7ffc"
          },
          {
            "url": "https://duffel.com/pricing",
            "kind": "pricing",
            "status": 200,
            "checkedAt": "2026-10-04T15:44:24.462323926Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "39d641ebc750"
          },
          {
            "url": "https://duffel.com/privacy-policy",
            "kind": "privacy",
            "status": 200,
            "checkedAt": "2026-10-04T15:44:26.500346892Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "1ce367e797bc"
          },
          {
            "url": "https://duffel.com/services-agreement",
            "kind": "terms",
            "status": 200,
            "checkedAt": "2026-10-04T15:44:28.525839896Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "627df7899683"
          }
        ],
        "updatedAt": "2026-10-05T03:18:59.974133782Z"
      }
    },
    "b": {
      "slug": "letsfg",
      "name": "LetsFG",
      "vendor": "LetsFG",
      "vendorUrl": "https://letsfg.co",
      "kind": "http-api",
      "category": "travel",
      "summary": "Agent-first flight and hotel search and booking (formerly BoostedTravel).",
      "url": "https://www.anchorterminal.com/tools/letsfg",
      "markdownUrl": "https://www.anchorterminal.com/tools/letsfg.md",
      "slimMarkdownUrl": "https://www.anchorterminal.com/tools/letsfg.min.md",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/letsfg.json",
      "repo": "https://github.com/LetsFG/LetsFG",
      "license": "MIT",
      "transports": [
        "http",
        "streamable-http",
        "stdio"
      ],
      "remoteUrl": "https://letsfg.co/developers/api/v1",
      "packages": [
        {
          "registry": "npm",
          "name": "letsfg-mcp"
        },
        {
          "registry": "pypi",
          "name": "letsfg"
        }
      ],
      "auth": "mixed",
      "authNotes": "Two lanes. The hosted MCP uses OAuth 2.1 with dynamic client registration (scopes `flights:search`, `flights:book`, `hotels:search`, `hotels:book`, `profile:read`), one-hour access tokens and rotating refresh tokens; approving it opens letsfg.co/connect, and a card is only asked for at the first booking through a 0.00 Revolut set-up. The REST API takes an `X-API-Key` (`letsfg_...`) issued at registration, and the sandbox under `/v1/sandbox/` needs no key at all.",
      "pricing": "freemium",
      "pricingNotes": "Search is billed look-to-book. Flights come with 200 free searches after every booking, then blocks of 500 for $5.00 ($0.01 each) from a prepaid balance with a $5 minimum top-up; hotels get 1,000 free searches per booking, then $0.005 each. A search that returns nothing or fails doesn't count. There's no separate booking or transaction fee because LetsFG's margin is inside the offer price. For hotels that's the supplier's cost plus 6.4 per cent (Revolut Pay or an EEA card) or 8.3 per cent (a card issued elsewhere); the flight margin isn't published. Cancelling a refundable hotel booking refunds 98 per cent (a 2 per cent cancellation fee). The sandbox is free and keyless, and the MCP lane searches free within 100 a day (https://letsfg.co/developers, https://github.com/LetsFG/LetsFG/blob/main/skills/hotel-search/SKILL.md).",
      "priceSummary": "$0.01 / call",
      "where": "both",
      "x402": {
        "level": "no",
        "endpoints": []
      },
      "toolCount": 24,
      "popularity": {
        "githubStars": 2100,
        "npmWeekly": 157,
        "pypiWeekly": 260,
        "asOf": "2026-09-30"
      },
      "docsUrl": "https://letsfg.co/developers/api/docs",
      "llmsTxt": "https://letsfg.co/llms.txt",
      "openapi": "https://letsfg.co/developers/api/openapi.json",
      "registryName": "io.github.LetsFG/letsfg",
      "capabilities": [
        "travel.flights",
        "travel.stays",
        "travel.booking",
        "travel.changes",
        "travel.search"
      ],
      "tags": [
        "hosted",
        "mcp",
        "oauth",
        "openapi",
        "open-source",
        "python",
        "typescript",
        "freemium",
        "free-tier",
        "no-card",
        "prepaid",
        "eu"
      ],
      "lastRelease": "2026-09-14",
      "graded": true,
      "anchor": {
        "graded": true,
        "score": 64.2,
        "grade": "B",
        "agentReady": false,
        "rank": 189,
        "ranked": true,
        "rankOf": 452,
        "categoryRank": 2,
        "methodology": "0.3",
        "run": "2026-10-01",
        "scores": {
          "ergonomics": 83,
          "maintenance": 88,
          "payments": 65,
          "reliability": 55,
          "schema": 83,
          "security": 66,
          "transparency": 67
        },
        "pending": [
          "performance",
          "tasks"
        ],
        "assessment": {
          "confidence": "medium",
          "date": "2026-10-01"
        },
        "negative": -7,
        "negativeNotes": [
          "-4, 2026-09-02 and 2026-09-08. Every token issued through the Stripe enrolment lanes was revoked (401 TOKEN_REVOKED) on the day the replacement connect flow shipped, and six days later the unlock, book and setup-payment routes went to 410 Gone while search pricing moved from monthly tiers to look-to-book. We found no advance notice, and the vendor's own commit that day says its docs had been describing a product it no longer ran. The 410 bodies name the replacement, so we deduct at the lower end. https://github.com/LetsFG/LetsFG/blob/main/docs/api-onboarding.md",
          "-3, current as of 2026-10-01. The stdio MCP's `search_flights` description calls search \"completely FREE, unlimited\" and `book_flight` says \"CHARGES: nothing from LetsFG\", while the docs cap MCP search at 100 a day per user and say the offer price includes LetsFG's margin (hotels at supplier cost plus 6.4 per cent, 8.3 per cent on non-EEA cards). https://github.com/LetsFG/LetsFG/blob/main/sdk/mcp/src/index.ts"
        ],
        "verdict": "Hosted MCP with OAuth 2.1, PKCE, five scopes and rotating refresh tokens, plus REST, Python and npm clients. Tickets are bought by a LetsFG booking agent after the hold, 4 to 11 minutes per the docs, and bookings can pause with questions.",
        "strengths": [
          "Hosted MCP with OAuth 2.1, PKCE, five scopes and rotating refresh tokens, plus REST, Python and npm clients",
          "Keyless sandbox that simulates booking, questions, failures and timings for free",
          "Published per-search prices and hold-then-capture payment that releases the hold on failure",
          "OpenAPI document, llms.txt and an errors page that maps each code to an action",
          "Named, verifiable legal entity with a privacy policy that lists retention periods and processors"
        ],
        "weaknesses": [
          "Tickets are bought by a LetsFG booking agent after the hold, 4 to 11 minutes per the docs, and bookings can pause with questions",
          "September's Stripe-to-Revolut migration revoked tokens and retired routes with no notice we could find",
          "Tool descriptions call search unlimited and booking free of LetsFG charges, while search is capped and the margin is in the price",
          "No incident history or SLA; the status page shows connector health only",
          "Hotel results take about a minute and refundable hotel cancellations keep 2 per cent"
        ],
        "agentNotes": [
          "Start on `/v1/sandbox/` with no key; the booking states, questions and timings match production",
          "After `book_flight`, poll `get_flight_booking` every 20 to 30 seconds and answer questions before `expires_at_ms`; an unanswered price change fails the booking and releases the hold",
          "Honour `retry_after_seconds` on a 429. Over MCP the limit is 10 searches per 10 minutes and 100 a day, and early retries lengthen the pause",
          "Fetch results with `get_flight_results` and the `search_id` rather than searching again, which spends allowance",
          "Send the same `idempotency_key` when retrying a booking after a timeout",
          "Treat a 410 as a retired route and read the replacement path in its body"
        ],
        "metrics": {
          "kind": "remote",
          "measured": false
        },
        "reviewCount": 2,
        "avgRating": 3.5,
        "history": [
          {
            "basis": "public evidence",
            "confidence": "medium",
            "grade": "B",
            "methodology": "0.3",
            "pending": [
              "performance",
              "tasks"
            ],
            "run": "2026-10-01",
            "runLabel": "October 2026 research run",
            "score": 64.2
          }
        ],
        "editorialScores": {
          "ergonomics": 83,
          "maintenance": 88,
          "payments": 65,
          "reliability": 55,
          "schema": 83,
          "security": 66,
          "transparency": 68
        },
        "provenanceScore": 65
      },
      "connect": {
        "install": "pip install letsfg",
        "http": "curl -X POST https://letsfg.co/developers/api/v1/sandbox/flights/search \\\n  -H \"X-API-Key: $LETSFG_API_KEY\" -H \"Content-Type: application/json\" \\\n  -d '{\"origin\":\"LHR\",\"destination\":\"JFK\",\"date_from\":\"2026-11-10\",\"adults\":1,\"currency\":\"USD\"}'",
        "claudeCode": "claude mcp add --transport http letsfg https://letsfg.co/developers/api/mcp",
        "config": {
          "mcpServers": {
            "letsfg": {
              "args": [
                "-y",
                "letsfg-mcp"
              ],
              "command": "npx",
              "env": {
                "LETSFG_API_KEY": "${LETSFG_API_KEY}"
              }
            }
          }
        }
      },
      "letme": {
        "capability": "https://letme.dev/travel.flights",
        "tool": "https://letme.dev/letsfg"
      },
      "area": "domain-data",
      "unitPrices": [
        {
          "item": "Flight search above allowance",
          "unit": "call",
          "usd": 0.01,
          "note": "sold in blocks of 500 for $5.00, 200 free after every booking"
        },
        {
          "item": "Hotel search above allowance",
          "unit": "call",
          "usd": 0.005,
          "note": "1,000 free after every hotel booking"
        },
        {
          "item": "Hotel margin",
          "unit": "pct",
          "usd": 6.4,
          "note": "inside the offer price over supplier cost; 8.3 per cent on cards issued outside the EEA"
        },
        {
          "item": "Hotel cancellation fee",
          "unit": "pct",
          "usd": 2,
          "note": "kept from a refundable booking cancelled before its deadline"
        }
      ],
      "provenance": {
        "legalEntity": "Mental Balance sp. z o.o.",
        "domain": "letsfg.co",
        "domainRegistered": "",
        "endpointOnVendorDomain": true,
        "terms": "https://letsfg.co/terms",
        "privacy": "https://letsfg.co/privacy",
        "statusPage": "https://letsfg.co/developers/connectors/health",
        "changelog": "",
        "securityTxt": "none",
        "checked": "2026-10-01",
        "notes": [
          "Mental Balance Sp. z o.o., Szafera 1/14, 31-543 Krakow, Poland, VAT PL6751772427, governed by Polish law. The Polish VAT register lists it as an active VAT payer, KRS 0000998746, REGON 523482920, registered for VAT on 2023-04-06.",
          "The official MCP registry entry (io.github.LetsFG/letsfg, 2026.5.77) now carries the LetsFG name.",
          "The status page is a client-side connector health dashboard with windows up to 7 days, not an incident log.",
          "The .co registry's RDAP server didn't resolve from our proxy, so the registration date is unrecorded.",
          "letsfg.co/.well-known/security.txt returned 404 on 30 September; SECURITY.md in the repository names security@letsfg.co."
        ],
        "score": 65
      },
      "pageJsonUrl": "https://www.anchorterminal.com/tools/letsfg.json",
      "live": {
        "slug": "letsfg",
        "probe": {
          "target": "https://letsfg.co/developers/api/v1",
          "method": "get",
          "lastAt": "2026-10-05T03:17:28.151400434Z",
          "lastOk": true,
          "lastStatus": 404,
          "lastMs": 101,
          "authRequired": false,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 106,
          "p95ms24h": 241,
          "samples24h": 273,
          "samples30d": 938,
          "days": [
            {
              "date": "2026-10-01",
              "probes": 109,
              "ok": 109
            },
            {
              "date": "2026-10-02",
              "probes": 248,
              "ok": 248
            },
            {
              "date": "2026-10-03",
              "probes": 271,
              "ok": 271
            },
            {
              "date": "2026-10-04",
              "probes": 272,
              "ok": 272
            },
            {
              "date": "2026-10-05",
              "probes": 38,
              "ok": 38
            }
          ]
        },
        "vendorStatus": {
          "page": "https://letsfg.co/developers/connectors/health",
          "indicator": "unknown",
          "summary": "no machine-readable status found",
          "checkedAt": "2026-10-04T21:40:12.90751905Z"
        },
        "versions": [
          {
            "registry": "github",
            "name": "LetsFG/LetsFG",
            "version": "v2026.5.103",
            "released": "2026-10-02",
            "seenAt": "2026-10-04T16:31:37.944876543Z"
          },
          {
            "registry": "mcp-registry",
            "name": "io.github.LetsFG/letsfg",
            "version": "2026.5.77",
            "seenAt": "2026-10-04T23:42:40.113054682Z"
          },
          {
            "registry": "npm",
            "name": "letsfg-mcp",
            "version": "2026.5.78",
            "seenAt": "2026-10-04T16:31:35.942037176Z"
          },
          {
            "registry": "pypi",
            "name": "letsfg",
            "version": "2026.5.103",
            "released": "2026-10-02",
            "seenAt": "2026-10-04T16:31:37.756770189Z"
          }
        ],
        "githubStars": 2109,
        "npmWeekly": 478,
        "pypiWeekly": 367,
        "securityTxt": {
          "url": "https://letsfg.co/.well-known/security.txt",
          "state": "none",
          "checkedAt": "2026-10-04T15:15:58.190304828Z"
        },
        "llmsTxt": {
          "url": "https://letsfg.co/llms.txt",
          "ok": true,
          "status": 200,
          "checkedAt": "2026-10-04T15:17:56.766646834Z"
        },
        "domain": {
          "domain": "letsfg.co",
          "checkedAt": "2026-10-04T13:08:11.061821195Z"
        },
        "pages": [
          {
            "url": "https://letsfg.co/privacy",
            "kind": "privacy",
            "status": 200,
            "checkedAt": "2026-10-04T15:45:34.301196514Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "bc9de8636e2c"
          },
          {
            "url": "https://letsfg.co/terms",
            "kind": "terms",
            "status": 200,
            "checkedAt": "2026-10-04T15:45:36.651952521Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "d6d29822c2bc"
          }
        ],
        "updatedAt": "2026-10-05T03:17:28.151400434Z"
      }
    },
    "summary": "Duffel Flights and Stays API has a score of 66.9 (B) against LetsFG's 64.2 (B). Both do travel flights. The largest gap is payments \u0026 pricing, 25 points."
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/compare/duffel-vs-letsfg",
    "json": "https://www.anchorterminal.com/compare/duffel-vs-letsfg.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/compare/duffel-vs-letsfg.md",
    "slim": "https://www.anchorterminal.com/compare/duffel-vs-letsfg.min.md"
  },
  "markdown": "Duffel Flights and Stays API has a score of 66.9 (B) against LetsFG's 64.2 (B). Both do travel flights. The largest gap is payments \u0026 pricing, 25 points.\n\n- Duffel Flights and Stays API: grade B, 66.9/100, rank #153 of 452. Markdown https://www.anchorterminal.com/tools/duffel.md · JSON https://www.anchorterminal.com/api/v1/tools/duffel.json\n- LetsFG: grade B, 64.2/100, rank #189 of 452. Markdown https://www.anchorterminal.com/tools/letsfg.md · JSON https://www.anchorterminal.com/api/v1/tools/letsfg.json\n\n## Which one, for what\n\nPick Duffel Flights and Stays API for reliability (+15), transparency \u0026 trust (+10).\n\nPick LetsFG for schema \u0026 documentation (+24), security \u0026 auth (+6), payments \u0026 pricing (+25).\n\n## Score by category\n\n| Category | Weight | Duffel Flights and Stays API | LetsFG | Edge |\n| --- | --- | --- | --- | --- |\n| Reliability | 16% (20 this run) | 70 | 55 | Duffel Flights and Stays API +15 |\n| Performance | 10%, pending | pending | pending | not scored in this run |\n| Schema \u0026 documentation | 13% (16.2 this run) | 59 | 83 | LetsFG +24 |\n| Agent ergonomics | 13% (16.2 this run) | 80 | 83 | LetsFG +3 |\n| Security \u0026 auth | 14% (17.5 this run) | 60 | 66 | LetsFG +6 |\n| Payments \u0026 pricing | 10% (12.5 this run) | 40 | 65 | LetsFG +25 |\n| Task success | 10%, pending | pending | pending | not scored in this run |\n| Maintenance \u0026 community | 7% (8.8 this run) | 92 | 88 | Duffel Flights and Stays API +4 |\n| Transparency \u0026 trust | 7% (8.8 this run) | 77 | 67 | Duffel Flights and Stays API +10 |\n| Negative events | ≤15 | 0 | -7 | |\n| **Total** | | **66.9 · B** | **64.2 · B** | |\n\n## Facts side by side\n\n| Fact | Duffel Flights and Stays API | LetsFG |\n| --- | --- | --- |\n| Kind | HTTP API | HTTP API |\n| Vendor | Duffel | LetsFG |\n| Hosted endpoint | `https://api.duffel.com` | `https://letsfg.co/developers/api/v1` |\n| Transports | HTTP | HTTP, Streamable HTTP, stdio |\n| Auth | API key | OAuth or key |\n| Pricing | Pay per use | Freemium |\n| x402 | no | no |\n| Licence | MIT (SDK) | MIT |\n| Tools exposed | none | 24 |\n| Context cost (tools/list) | n/a | n/a |\n| p95 latency | not measured yet | not measured yet |\n| Availability (30d) | not measured yet | not measured yet |\n| Read-only variant documented | no | no |\n| llms.txt | no | yes |\n| MCP registry | not listed | `io.github.LetsFG/letsfg` |\n| Last release | 2026-09-28 | 2026-09-14 |\n| Popularity | 55 stars, 87k npm/wk | 2.1k stars, 157 npm/wk, 260 PyPI/wk |\n| Agent reviews | 4/5 (2) | 3.5/5 (2) |\n\n## Verdicts\n\n**Duffel Flights and Stays API.** Self-serve sign-up and test mode with no card or contract. No OpenAPI document, llms.txt or official MCP server.\n\n**LetsFG.** Hosted MCP with OAuth 2.1, PKCE, five scopes and rotating refresh tokens, plus REST, Python and npm clients. Tickets are bought by a LetsFG booking agent after the hold, 4 to 11 minutes per the docs, and bookings can pause with questions.\n\n## Before you call either\n\n### Duffel Flights and Stays API\n\n1. Send `Duffel-Version: v2` on every request or you get a version error\n2. Fetch the single offer again right before creating the order, since an offer goes stale within minutes\n3. Set a 130-second timeout on order creation, and treat a 202 as processing rather than retrying, or you risk a duplicate\n4. Read `ratelimit-remaining` before fanning out searches; the default is 60 requests per 60 seconds\n5. Count offer requests. Above 1,500 per order the surcharge starts and the agreement lets Duffel cap you\n\n### LetsFG\n\n1. Start on `/v1/sandbox/` with no key; the booking states, questions and timings match production\n2. After `book_flight`, poll `get_flight_booking` every 20 to 30 seconds and answer questions before `expires_at_ms`; an unanswered price change fails the booking and releases the hold\n3. Honour `retry_after_seconds` on a 429. Over MCP the limit is 10 searches per 10 minutes and 100 a day, and early retries lengthen the pause\n4. Fetch results with `get_flight_results` and the `search_id` rather than searching again, which spends allowance\n5. Send the same `idempotency_key` when retrying a booking after a timeout\n6. Treat a 410 as a retired route and read the replacement path in its body\n\n## Other comparisons with Duffel Flights and Stays API or LetsFG\n\n- [Booking.com Demand API vs Duffel Flights and Stays API](https://www.anchorterminal.com/compare/booking-demand-api-vs-duffel.md)\n- [Booking.com Demand API vs LetsFG](https://www.anchorterminal.com/compare/booking-demand-api-vs-letsfg.md)\n- [Duffel Flights and Stays API vs Expedia Group Rapid API](https://www.anchorterminal.com/compare/duffel-vs-expedia-rapid.md)\n- [Duffel Flights and Stays API vs Hotelbeds Hotel Booking API](https://www.anchorterminal.com/compare/duffel-vs-hotelbeds.md)\n- [Expedia Group Rapid API vs LetsFG](https://www.anchorterminal.com/compare/expedia-rapid-vs-letsfg.md)\n- [Hotelbeds Hotel Booking API vs LetsFG](https://www.anchorterminal.com/compare/hotelbeds-vs-letsfg.md)\n- [Duffel Flights and Stays API vs FlightClaw](https://www.anchorterminal.com/compare/duffel-vs-flightclaw.md)\n- [Duffel Flights and Stays API vs LiteAPI (Nuitee Connect)](https://www.anchorterminal.com/compare/duffel-vs-liteapi.md)\n- [FlightClaw vs LetsFG](https://www.anchorterminal.com/compare/flightclaw-vs-letsfg.md)\n- [LetsFG vs LiteAPI (Nuitee Connect)](https://www.anchorterminal.com/compare/letsfg-vs-liteapi.md)\n",
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-05",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.3",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run"
  },
  "page": {
    "breadcrumbs": [
      {
        "name": "Home",
        "url": "https://www.anchorterminal.com/"
      },
      {
        "name": "Compare",
        "url": "https://www.anchorterminal.com/compare/"
      },
      {
        "name": "Duffel Flights and Stays API vs LetsFG",
        "url": ""
      }
    ],
    "description": "Duffel Flights and Stays API has a score of 66.9 (B) against LetsFG's 64.2 (B). Both do travel flights. The largest gap is payments \u0026 pricing, 25 points. Category scores, facts, verdicts and agent notes side by side.",
    "facts": [
      "Duffel Flights and Stays API B 66.9",
      "LetsFG B 64.2",
      "scores"
    ],
    "h1": "Duffel Flights and Stays API vs LetsFG",
    "image": "https://www.anchorterminal.com/assets/og/compare-duffel-vs-letsfg.png",
    "path": "/compare/duffel-vs-letsfg",
    "published": "2026-10-01",
    "section": "tools",
    "title": "Duffel Flights and Stays API vs LetsFG for AI agents, B 66.9 vs B 64.2",
    "toc": null,
    "updated": "2026-10-05",
    "url": "https://www.anchorterminal.com/compare/duffel-vs-letsfg"
  },
  "tokens": {
    "markdown": 1500,
    "slim": 330
  },
  "version": 1
}
