Skip to content

Comparison · observed 2026-08-24, re-checked 2026-09-07

Amadeus Self-Service vs FlightPowers, and when to migrate

If your Amadeus Self-Service integration stopped working, this page is a migration path. It shows you how to verify the situation yourself, maps the calls you were making to their equivalents, and is explicit about the things we do not replace.

The observable state

Check it yourself, don’t take our word

Amadeus for Developers Self-Service was decommissioned on July 17, 2026, per the notice Amadeus posted on its own portal (source below). Here is what was independently observable on 2026-08-24 and still true when we re-ran every command on 2026-09-07.

Amadeus itself says so, on its own portal. developers.amadeus.comshows an announcement banner: “Amadeus for Developers self-service portal has been decommissioned on July 17th, this website is for Amadeus Enterprise API Portal only.” An archived copy of the same page from three days before the cutover states the year: “Amadeus for Developers self-service portal will be decommissioned on July 17th, 2026.” Source: developers.amadeus.com (read in a browser 2026-09-06); pre-announcement archived at web.archive.org, 2026-07-15. One caveat on that quote, so you do not think we made it up when your own check comes back empty: that portal is an Angular app and the banner is rendered client-side, so a plain curl of developers.amadeus.com returns the shell and none of the text (confirmed 2026-09-07). The commands below avoid that problem entirely: every one of them answers from DNS, an HTTP status line or the GitHub API.

Amadeus also published a corporate statement about the portal, and that one is plain HTML you can read yourself: “Amadeus wants to clarify that its Enterprise Portal and Enterprise APIs remain fully available and will continue to serve and support our large and important community of developers and partners worldwide.” It is linked from the deprecation notice in their own developer-guides README. Source: amadeus.com, statement regarding Amadeus for Developers portal (retrieved 2026-09-07). Read it together with the observations below: Enterprise stays, Self-Service is gone.

The Self-Service portal and pricing pages redirect to the homepage.

curl
curl -sS -o /dev/null -w "%{http_code} -> %{redirect_url}\n" \
  https://developers.amadeus.com/self-service
# 301 -> https://developers.amadeus.com/

curl -sS -o /dev/null -w "%{http_code} -> %{redirect_url}\n" \
  https://developers.amadeus.com/pricing
# 301 -> https://developers.amadeus.com/

The Enterprise portal is still live.

curl
curl -sS -o /dev/null -w "%{http_code}\n" \
  https://developers.amadeus.com/enterprise
# 200

Neither API hostname has a DNS record. Re-checked 2026-09-07.

dns
getent hosts test.api.amadeus.com
# (no output, no record)
getent hosts api.amadeus.com
# (no output, no record)

curl -sS -m 15 \
  https://test.api.amadeus.com/v1/security/oauth2/token
# curl: (6) Could not resolve host: test.api.amadeus.com

This is the part we trust most, because it is our own observation rather than a report. A missing A record is not a paused account or an expired key. There is nothing at the address to authenticate against.

Every Amadeus developer SDK repository is archived.

gh
gh api "orgs/amadeus4dev/repos?per_page=100" \
  --jq '"archived \([.[]|select(.archived)]|length) of \(length)"'
# archived 20 of 20

That includes amadeus-node, amadeus-python and amadeus-java. The developer-guides repository README now opens with:

“# [DEPRECATED] Developer Guides”. “The Amadeus for Developers Self-Service offer has been deprecated.”
github.com/amadeus4dev · retrieved 2026-08-24, re-read 2026-09-07

Honesty first

First: you may not want us

Amadeus Enterprise still exists and is fully available. If you are an accredited travel business (you hold IATA or ARC accreditation, or you work through a consolidator), Enterprise is the appropriate path and it is a serious platform. Nothing on this page argues otherwise, and no data API is a substitute for a GDS if a GDS is what you need.

This guide is for the people Enterprise is not designed to serve: the indie developers, early-stage startups, internal tooling teams, researchers and AI-agent builders who chose Self-Service precisely because it was self-serve. If your blocker is that the remaining route requires accreditation and an account manager, read on.

Scope, honestly

What we do not replace

Being clear about this up front saves you an afternoon.

What you may have been usingDo we replace it?Go here instead
Flight Create Orders: issuing a ticket, PNR creationNoAmadeus Enterprise, or Duffel
Hotel Booking API: confirmed reservationsNoAmadeus Enterprise, or Duffel Stays
Flight Offers Price: confirming an offer is bookableNoA booking platform
Seat maps, baggage, airline ancillariesNoA booking platform
GDS content, published/negotiated fares, corporate contractsNoAmadeus Enterprise
Post-booking lifecycle: changes, cancellations, refundsNoA booking platform
Multi-city / open-jaw itinerariesNoWe support one-way and round-trip only
Reference data: airports, airlines, cities, POI, transfers, activitiesNoNot part of our product
Flight Offers Search: shopping for pricesYes/v1/flights/oneway, /v1/flights/roundtrip
Hotel List + Hotel Search: shopping for room ratesYes/v1/hotels/search, /v1/hotels/by-name

Short version: if the purchase happened inside your product, we are the wrong answer. We return prices and a deep link; the booking happens elsewhere. If you were using Self-Service to shop, monitor, compare or analyse prices (which is what most Self-Service projects did), keep reading.

One more honest note on data: Amadeus served GDS-sourced content. We return live Google Flights consumer pricing. These are genuinely different datasets with different carrier coverage, and neither is a superset of the other. Test your own routes before you commit.

The migration

Auth: delete the token dance

Amadeus used OAuth2 client credentials: fetch a token, watch it expire, refresh it. Here it is one static header.

before · from Amadeus's archived amadeus-code-examples
ACCESS_TOKEN=$(curl -H "Content-Type: application/x-www-form-urlencoded" \
  https://test.api.amadeus.com/v1/security/oauth2/token \
  -d "grant_type=client_credentials&client_id=$AMADEUS_CLIENT_ID\
&client_secret=$AMADEUS_CLIENT_SECRET" \
  | grep access_token | sed 's/"access_token": "\(.*\)"\,/\1/' \
  | tr -d '[:space:]')
after · the whole thing
-H "x-api-key: $FLIGHTPOWERS_API_KEY"

Get the key by subscribing on RapidAPI. There is a free tier (10 requests/month, hard cap). You can delete your token-refresh code and its cache. Confirm a key authenticates with GET /v1/verify before running real searches.

The migration

Flight Offers Search → /v1/flights

before · GET /v2/shopping/flight-offers (their archived example)
curl -X GET "https://test.api.amadeus.com/v2/shopping/flight-offers?\
originLocationCode=SYD&destinationLocationCode=BKK&\
departureDate=2022-08-01&returnDate=2022-08-05&\
adults=2&includedAirlineCodes=TG&max=3" \
  -H "Authorization: Bearer $ACCESS_TOKEN"
after · round-trip, one call
curl -X POST https://api.flightpowers.com/v1/flights/roundtrip \
  -H "x-api-key: $FLIGHTPOWERS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "from_airport": "SYD",
    "to_airport": "BKK",
    "departure_date": "2026-10-19",
    "return_date": "2026-10-23",
    "passengers": [1, 1],
    "departure_airline_codes": ["TG"],
    "limit": 3
  }'

And this is what comes back

captured run · 2026-09-07

A real one-way run, JFK to LHR on 2026-11-12, executed at 02:22 UTC on 2026-09-07 and pasted unedited. It took 7.9 seconds and returned three itineraries because the call asked for three. Prices were live at capture time and will have moved since, which is the point of the API. The run went through our hosted flights MCP server, which is a thin wrapper over the same backend, so the per-result object below is the shape POST /v1/flights/oneway returns; MCP reports completion as a search_status field where REST reports it as the X-Search-Status header.

request
curl -X POST https://api.flightpowers.com/v1/flights/oneway \
  -H "x-api-key: $FLIGHTPOWERS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "from_airport": "JFK",
    "to_airport": "LHR",
    "departure_date": "2026-11-12"
  }'
response · first of three results, plus the run's own status
"search_status": "ok"
"search_coverage": { "requested_combinations": 1,
                     "searched_combinations": 1,
                     "truncated": false }

{
  "price_range_in_relation_to_other_periods": "high",
  "price_insights_low": 170,
  "price_insights_high": 285,
  "from_airport": "New York (JFK)",
  "to_airport": "London (LHR)",
  "departure_date": "2026-11-12",
  "price": "$291",
  "price_as_number": 291,
  "duration": "10 hr 25 min",
  "duration_seconds": 37500,
  "airline": "Icelandair",
  "stops": 1,
  "stops_info": [
    { "stop_airport": "KEF", "stop_duration_seconds": 5100 }
  ],
  "departure_description": "7:25 PM on Thu, Nov 12",
  "arrival_description": "10:50 AM on Fri, Nov 13",
  "buy_link": "https://www.google.com/travel/flights?tfs=..."
}

Read the first three fields together and you have something Amadeus never returned: $291 against a historical band of $170 to $285, so Google calls it high. A fare-watch rule can be written on that on day one, with no price history of your own. The band is null when Google shows none, so handle that case. Run the same query in the browser before you write any code.

Parameter mapping

Amadeus Flight Offers SearchFlightPowers
originLocationCodefrom_airport
destinationLocationCodeto_airport
departureDatedeparture_date
returnDatereturn_date, and use /v1/flights/roundtrip
adultspassengers, one entry per traveller: 1 adult, 2 child, 3 infant on lap, 4 infant in seat. Two adults is [1, 1]
includedAirlineCodesairline_codes (round-trip: departure_airline_codes / return_airline_codes)
excludedAirlineCodesexclude_airline_codes
maxlimit (default 10)
currencyCodecurrency (default usd)
maxPricemax_price
nonStop=truemax_stops: 0
travelClassseat_type: only 1 Economy and 3 Business. Premium economy and first are not supported

Both APIs handle round-trip in a single request, so there is no gain to claim there. The difference is that ours is a dedicated endpoint that returns paired legs with a combined total (total_price_as_number, total_duration_seconds, total_stops) plus separate departure_flight_* and return_flight_* blocks, and it accepts per-leg filters. “Leave after 6pm Friday, return before noon Sunday” is one call.

Self-Service had no cheapest-date search on Flight Offers Search: you looped. The REST API here works the same way, but the per-minute rate limits are published so you can parallelise deliberately: a 31-date scan is one burst, not a serial crawl (how that works). If you are building an AI agent, the hosted MCP server at https://flights.flightpowers.com/mcp does the fan-out for you: its flight search accepts a date range and a list of destinations and expands the combinations server-side. That is an MCP-layer feature, not a REST parameter; on REST you loop. See MCP setup.

The migration

Hotel Search → /v1/hotels

before · two calls plus the token
# 1. get hotelIds for a city
curl -X GET "https://test.api.amadeus.com/v1/reference-data/\
locations/hotels/by-city?cityCode=PAR" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

# 2. price those specific hotels
curl -X GET "https://test.api.amadeus.com/v3/shopping/hotel-offers?\
hotelIds=MCLONGHM&adults=2&checkInDate=2026-10-19\
&checkOutDate=2026-10-23" \
  -H "Authorization: Bearer $ACCESS_TOKEN"
after · free-text destination, one call, no ID resolution
curl -X POST https://api.flightpowers.com/v1/hotels/search \
  -H "x-api-key: $FLIGHTPOWERS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "destination": "Paris",
    "checkin_date": "2026-10-19",
    "checkout_date": "2026-10-23",
    "adults": 2,
    "currency": "EUR"
  }'
Amadeus Hotel Search v3FlightPowers
hotelIds (via Hotel List by-city/by-geocode)not needed: destination takes free text like “Paris” or “Tokyo Shibuya”
checkInDatecheckin_date
checkOutDatecheckout_date
adultsadults (default 2)
roomQuantitynot supported
currencycurrency (default usd)
priceRangebudget_per_night: max per night, in your currency
boardType, paymentPolicy, bestRateOnlypartially covered by filters; not a 1:1 mapping
countryOfResidenceproxy_country: related in intent, different mechanism. Amadeus’s field is a declared attribute passed to the supplier; ours routes the request through a residential proxy in that country, so you see the rates a real visitor from that market sees. Geo-pricing →

To look up one named property instead of searching a city, use POST /v1/hotels/by-name with hotel_name, checkin_date, checkout_date, and optionally area to disambiguate generic names.

What you gain

What the move buys you

Only claims we can point at. Each links to the page that proves it.

A verdict attached to every price

Every flight result carries Google’s historical band (price_insights_low / price_insights_high) plus a price context. Rebuilding a fare-alert feature? That field is the trigger condition, and you don’t accumulate months of history first. It can be null when Google shows no band. Handle that. Proven here →

An honest empty result

X-Search-Status separates “Google genuinely has no itineraries” from “the search did not complete,” and opt-in strict: true turns a degraded search into an HTTP 503 instead of a misleading []. Search status →

A working buy_link on every result

Every itinerary deep-links into Google Flights, so a comparison or alert product can hand off to a bookable page without reconstructing URLs. One-way API →

No OAuth, published rate limits

One static header instead of a token lifecycle, and per-minute rate limits published per plan so parallel date scanning is a documented capability, not a guess. Plans →

Checklist

A migration checklist

  1. Subscribe on RapidAPI (free tier) and confirm the key authenticates with GET /v1/verify.
  2. Delete the OAuth token fetch, cache and refresh logic. Replace with one header.
  3. Rename request fields per the tables above. Watch adultspassengers (a list) and travelClassseat_type (only two cabins).
  4. Rewrite response parsing: the shape is flat JSON, not Amadeus’s data[] / dictionaries envelope.
  5. Drop the hotel ID-resolution step; pass destination as free text.
  6. Re-point anything that booked to a booking platform. That work does not migrate.
  7. Run your three hardest routes on both datasets before you cut over. GDS content and Google Flights content are not identical.

Questions, answered plainly

Did Amadeus Self-Service shut down?
Yes, on July 17, 2026. Amadeus posted the date itself on developers.amadeus.com, which reads “has been decommissioned on July 17th, this website is for Amadeus Enterprise API Portal only” (an archived copy from three days before the cutover gives the year: “will be decommissioned on July 17th, 2026”). What we can additionally verify ourselves, first on 2026-08-24 and again on 2026-09-07 with identical results: the Self-Service portal and pricing pages 301-redirect to the Amadeus homepage, the test sandbox host no longer resolves, all 20 repositories in the amadeus4dev GitHub organisation are archived, and their developer-guides README opens with “The Amadeus for Developers Self-Service offer has been deprecated.” The commands to check each of these yourself are on this page.
Should I move to Amadeus Enterprise instead?
If you are an accredited travel business (you hold IATA or ARC accreditation, or work through a consolidator), yes, Enterprise is the appropriate path and it is a serious platform. This page is for the people Enterprise is not designed to serve: indie developers, early-stage startups, internal tooling teams, researchers and AI-agent builders who chose Self-Service precisely because it was self-serve.
Does FlightPowers replace Flight Create Orders or the Hotel Booking API?
No. Nothing on our side issues tickets, creates PNRs, or confirms reservations. If the purchase happened inside your product, we are the wrong answer. Go to Amadeus Enterprise or a booking platform like Duffel. We replace the shopping endpoints: Flight Offers Search and Hotel List + Hotel Search.
Is the data the same as what Amadeus served?
No, and pretending otherwise would waste your afternoon. Amadeus served GDS-sourced content; we return live Google Flights consumer pricing and live Booking.com hotel rates. These are genuinely different datasets with different carrier coverage, and neither is a superset of the other. Run your three hardest routes on both before you cut over.
How does authentication change?
Amadeus used OAuth2 client credentials: fetch a token, watch it expire, refresh it. Here there is no token step: one static x-api-key header, with the key issued by RapidAPI when you subscribe. You can delete your token-refresh code and its cache.

Self-serve, like Self-Service was

Subscribe, get a key, make a call. No account manager, no accreditation. Free tier: 10 requests/month, hard cap.

Free tier: 10 requests/month. No card to try.