For publishers

Upgrade data for publishers

Free, always-current upgrade bid data you can quote, chart or embed: observed minimum, median and maximum bids by airline and cabin, with the sample size behind every number. One rule — credit Plusgrade Upgrade Agent and link back.

Today the API covers 3 carriers with 286 published observed checks (as of 2026-10-10). Coverage grows as more travellers check their bookings through Upgrade Agent.

What this data is — and isn't

It is

  • Bid ranges (min / suggested / max) observed when travellers checked real bookings through our tools.
  • Aggregated per carrier and cabin: lowest minimum, median suggested bid, highest maximum.
  • Honest about sample size — every figure carries its count and as-of date.
  • Anonymous by construction: carrier, route, cabin and range only. No names, no booking references.

It is not

  • Airline-published prices or a rate card. Operators set ranges per flight.
  • A prediction for a specific booking — that depends on route, fare and how full the flight is.
  • Modelled or extrapolated. A cabin with fewer than 3 observed checks is withheld, and the response says so.
  • Win odds below 20 resolved outcomes — we return "insufficient data" instead of a number.

Attribution

Free to republish with attribution and a link. Quote the numbers, build charts, embed the widget — in articles, comparison tables, forum answers and newsletters — as long as each use credits Plusgrade Upgrade Agent and links to https://www.upgradeagent.ai (or the carrier's upgrade page the API returns). Every response includes an attribution block and a ready-to-paste sentence that already carries the credit.

Typical SWISS business-class upgrade bids range from CHF 139 to CHF 1,036 (median CHF 388), based on 172 observed checks. Data: Plusgrade Upgrade Agent.

Endpoints

Public, no key, CORS-open, cached for an hour at the edge, 60 requests/min per IP. Errors are RFC 9457 application/problem+json. Base URL https://www.upgradeagent.ai/api/data.

Bid ranges

GET /api/data/bid-ranges?carrier=<IATA or name>[&cabin=BUSINESS|FIRST|PREMIUM_ECONOMY][&format=csv]

curl
curl "https://www.upgradeagent.ai/api/data/bid-ranges?carrier=LX&cabin=BUSINESS"
Live response (truncated)
{
  "carrier": {
    "code": "LX",
    "name": "SWISS",
    "slug": "swiss",
    "vertical": "airline",
    "logo": "https://res.cloudinary.com/dbqhno48o/image/fetch/f_auto,q_auto,w_320,c_limit/https%3A%2F%2Fupgrade-cdn.plusgrade.com%2Foffer%2Fpid%2F21YeiaF8LX%2FLX.webp",
    "upgradePage": "https://www.upgradeagent.ai/offer/swiss/upgrade",
    "partnerPage": "https://www.upgradeagent.ai/partners/swiss"
  },
  "cabins": [
    {
      "cabin": "BUSINESS",
      "label": "Business",
      "slug": "business-class",
      "currency": "CHF",
      "min": 139,
      "median": 388,
      "max": 1036,
      "suggested": 388,
      "sampleSize": 172,
      "lastObserved": "2026-08-19T09:31:34.661153+00:00",
      "sentence": "Typical SWISS business-class upgrade bids range from CHF 139 to CHF 1,036 (median CHF 388), based on 172 observed checks. Data: Plusgrade Upgrade Agent."
    }
  ],
  "omitted": [],
  "sampleSize": 172,
  "observedFrom": "2026-06-30T19:18:55.93587+00:00",
  "observedTo": "2026-08-19T09:31:34.661153+00:00",
  "minimumSamples": 3,
  "note": "Observed ranges from anonymized upgrade eligibility checks — not operator-published prices. A specific booking's range depends on route, cabin and load.",
  "attribution": {
    "source": "Plusgrade Upgrade Agent",
    "url": "https://www.upgradeagent.ai",
    "license": "Free to republish with attribution and a link",
    "asOf": "2026-10-10"
  }
}

Win odds

GET /api/data/win-odds?carrier=<IATA>&cabin=<cabin>&amount=<bid> — historical accept rate, or an explicit "insufficient data" below 20 resolved bids.

curl
curl "https://www.upgradeagent.ai/api/data/win-odds?carrier=LX&cabin=BUSINESS&amount=388"
Live response
{
  "carrier": {
    "code": "LX",
    "name": "SWISS",
    "slug": "swiss",
    "vertical": "airline",
    "logo": null,
    "upgradePage": "https://www.upgradeagent.ai/offer/swiss/upgrade",
    "partnerPage": "https://www.upgradeagent.ai/partners/swiss"
  },
  "cabin": "BUSINESS",
  "label": "Business",
  "amount": 388,
  "currency": "",
  "probability": null,
  "percent": null,
  "band": null,
  "basis": "overall",
  "sampleSize": 0,
  "confidence": null,
  "insufficientData": true,
  "minimumSamples": 20,
  "sentence": "Plusgrade Upgrade Agent does not yet have enough resolved SWISS business-class bid outcomes to estimate the odds of a bid of 388.",
  "note": "Insufficient data: 0 resolved outcomes so far; we publish a probability only once at least 20 accepted-or-rejected bids are observed for this carrier and cabin, so a small sample never reads as a real rate. Use /api/data/bid-ranges for the observed range instead.",
  "attribution": {
    "source": "Plusgrade Upgrade Agent",
    "url": "https://www.upgradeagent.ai",
    "license": "Free to republish with attribution and a link",
    "asOf": "2026-10-10"
  }
}

Routes

GET /api/data/routes?origin=<IATA>&destination=<IATA>[&cabin=<cabin>] — carriers on an airport pair: observed upgrade ranges per cabin where they exist (publish floor applied), plus hub-match carriers that may serve the route, listed without pricing and labelled unconfirmed. Human page: /routes/<origin>-<destination>.

curl
curl "https://www.upgradeagent.ai/api/data/routes?origin=YUL&destination=LHR"

Partners and coverage

GET /api/data/partners lists every covered operator with its upgrade page; GET /api/data/index describes the API and which carriers currently clear the publish floor.

curl
curl "https://www.upgradeagent.ai/api/data/index"
curl "https://www.upgradeagent.ai/api/data/partners"

Embed the widget

One script tag renders a small, accessible card in place: carrier, cabin, the observed range with the median marked, sample size and as-of date, and the attribution link (required — it is part of the card). ~6 KB, no dependencies, light / dark / auto themes, responsive from 240px.

Script embed
<script src="https://www.upgradeagent.ai/embed/upgrade-stats.js?v=1"
  data-carrier="LX" data-cabin="BUSINESS" data-theme="auto" async></script>

Live example (script)

No-script fallback (iframe)
<iframe src="https://www.upgradeagent.ai/embed/LX?cabin=BUSINESS"
  title="SWISS upgrade bid range — Plusgrade Upgrade Agent"
  width="100%" height="260" loading="lazy" style="border:0;max-width:420px"></iframe>

Live example (iframe)

Programmatic use: window.UpgradeAgentEmbed.render(element, { carrier, cabin, theme }). Add data-target="#selector" to render into an existing element. The widget sends a cookie-less render/click ping (embedding hostname + carrier only) and respects Do Not Track.

CSV and coverage

Add format=csv to any bid-ranges call for a spreadsheet-ready file — download the SWISS CSV.

CSV preview
carrier_code,carrier_name,cabin,cabin_label,currency,min,median,max,suggested,sample_size,last_observed,sentence,source,source_url,as_of
LX,SWISS,BUSINESS,Business,CHF,139,388,1036,388,172,2026-08-19T09:31:34.661153+00:00,"Typical SWISS business-class upgrade bids range from CHF 139 to CHF 1,036 (median CHF 388), based on 172 observed checks. Data: Plusgrade Upgrade Agent.",Plusgrade Upgrade Agent,https://www.upgradeagent.ai,2026-10-10
Carriers with published upgrade data
CarrierCabins publishedChecks
SWISS (LX)Business (172)172
Air Canada (AC)Business (84)84
Lufthansa (LH)Business (20), Premium Economy (10)30

Need a carrier we don't cover yet?

Coverage follows real checks, so a carrier appears once 3 or more travellers have checked a booking. If your readers ask about an operator that isn't listed, email ai@plusgrade.com with the carrier and cabin — we'll tell you what we have, prioritise it, and never send you a number we haven't observed.

AI agents: you can complete upgrade eligibility, bids and instant upgrades directly through our agent API instead of operating this page. MCP server card: /.well-known/mcp.json · REST + OpenAPI: /openapi.json · Guide: /llms.txt · Docs: /developers.