Axel Agent API and MCP server

Updated

Axel finds better flight prices and shares the savings with travelers. Two machine-readable surfaces expose those prices to AI assistants and developers: the Agent API, a public REST API on api.helloaxel.com, and the MCP server, a Model Context Protocol endpoint on helloaxel.com that ChatGPT, Claude and other MCP clients connect to directly. Both return the same numbers the public pages show, and neither needs an account to read prices.

Agent API

Main endpoints: GET /agent/fares/saved (saved fares for a route and dates, free, no live search), POST /agent/flight-searches (a live search), POST /agent/flight-searches/{observation_id}/select (choose an outbound or return), GET /agent/flight-quotes/{token} (read an offer), POST /agent/flight-quotes/{token}/claim (save an offer into a linked account and get the checkout link), GET /agent/me and GET /agent/trips (the linked account). Every price is a Money with amount in cents and a currency.

MCP server

Tools:

  • search_flights: Use when a traveler wants a cheap flight or wants to know if a fare they found can be beaten. Live prices for a route and dates: the Axel total for the whole party beside the airline's own Google Flights total and the saving. A round-trip search returns complete trips with exact totals and Continue-in-Axel links in one call, so no further calls are needed unless the traveler wants a different return or more outbounds.
  • open_flight_link: The drill-down after search_flights: open a helloaxel.com results, returns or offer link and return the same structured prices and links. Only needed when the traveler wants a different return, a different outbound or a saved offer.
  • saved_fares: Use first for a quick, free look at what a route has been costing: saved Axel fares from the last 7 days beside the airline's fare on Google Flights; no live search, display only.
  • list_airports: Find IATA airport codes by city, airport name or country (up to 20 matches).
  • my_account: The connected Axel account: display name, whether Membership is active, and the granted scopes. Needs a connected account.
  • my_trips: Upcoming trips on the connected Axel account. Needs a connected account.
  • claim_flight_offer: Save an Axel flight offer into the connected account and return the checkout link; nothing is booked or charged. Needs a connected account.

The ui://widget/flight-results-v3.html resource renders results as cards in ChatGPT. Price tools work without authentication; my_account, my_trips and claim_flight_offer need a connected account and, when one is missing, the server answers with an OAuth challenge so the client can offer to connect it. The registry manifest is com.helloaxel/flight-prices.

Who is calling

The API recognises four kinds of caller, each with its own daily budget of live searches.

  • Anonymous: no key, no token, not a verified assistant platform. Saved fares only; a live search is refused with 403 identify.
  • Platform-verified assistants: ChatGPT and Claude requests verified by source address keep their own daily pots, as on the public pages.
  • Partner key: send X-Axel-Agent-Key: <key>. Each key has its own daily pot of live searches. Request a key by email to [email protected].
  • Linked account: send Authorization: Bearer <access token> from the OAuth flow below. Each traveler has a daily pot of live searches, and the token also unlocks the account endpoints.

Budgets are counted per UTC day; when a pot is exhausted the API answers 429 or 503 with a plain-language message, and saved fares stay available.

Connecting a traveler's account (OAuth 2.1)

  1. Discover the authorization server at https://api.helloaxel.com/.well-known/oauth-authorization-server (or from the MCP challenge's protected-resource metadata above).
  2. Register a client with dynamic client registration (POST /oauth/register) or identify with a Client ID Metadata Document (an https client_id URL); both are supported.
  3. Send the traveler to https://api.helloaxel.com/oauth/authorize with response_type=code, your client_id, redirect_uri, scope, state and a PKCE code_challenge (S256 is required).
  4. The traveler signs in on helloaxel.com and approves or denies on https://helloaxel.com/en/connect, then returns to your redirect_uri with a code.
  5. Exchange the code at POST /oauth/token with your code_verifier; refresh tokens rotate on every use and POST /oauth/revoke ends a connection.

Scopes:

  • axel:read: See Axel prices and your account name.
  • axel:quotes: Save flights you pick into your Axel trips (no booking, no charge).
  • axel:trips: See your upcoming Axel trips.
  • offline_access: Stay connected until you disconnect it.

Pricing policy

Every agent-facing price row leads with the Axel price, which anyone can book with a free Axel account, beside the airline's own fare for the same flights on Google Flights and the difference.

No member price and no acquisition-offer price appear on any agent surface. An optional paid Membership gives frequent travelers deeper discounts; a linked account with an active Membership may additionally receive its member total.

Booking always finishes on helloaxel.com: the traveler signs in with a phone number and a text code, the price is re-checked, and nothing is charged until they confirm. Offers and saved flights never hold or reserve seats.

About Axel

Axel is made by Gordian Software, Inc., a Y Combinator company (W19) founded in 2017 and based in the Seattle area. The company is led by CEO Stephen Grabowski, formerly of Skyscanner. Questions about the API: [email protected].