Comparison · observed 2026-08-24, re-checked 2026-10-06
Amadeus Self-Service vs FlightPowers, and when to migrate
FlightPowers is an Amadeus Self-Service alternative for flight and hotel shopping: Amadeus closed Self-Service on July 17, 2026 and its sandbox host no longer resolves, while our key works the day you subscribe, $10 for 2,500 live Google Flights searches or $10 for 2,000 Booking.com hotel searches. Best for indie developers and AI agents; Amadeus Enterprise for accredited travel sellers.
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.
Looking for an alternative? FlightPowers is a Flights API over live Google Flights fares and a Hotels API over live Booking.com rates, with MCP servers for Claude and Cursor; PRO is $10 for 2,500 flight searches, and the guides have working code for each.
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 what we saw when we re-ran every command on 2026-10-06. One result changed: the production host api.amadeus.com resolves again.
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-10-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-10-06). 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 -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 -sS -o /dev/null -w "%{http_code}\n" \
https://developers.amadeus.com/enterprise
# 200The Self-Service sandbox host has no DNS record. Re-checked 2026-10-06.
getent hosts test.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
getent hosts api.amadeus.com
# 45.60.149.120 r9thhv7.ng.impervadns.net api.amadeus.com
curl -sS -o /dev/null -w "%{http_code}\n" \
"https://api.amadeus.com/v2/shopping/flight-offers"
# 401The sandbox 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. The production host is a correction. On 2026-09-07 it had no record either; on 2026-10-06 it resolves to an Imperva address and answers 401 to a call without credentials, which is what an API behind a contract looks like. Read that as Enterprise being live, as Amadeus says it is, not as Self-Service coming back.
Every Amadeus developer SDK repository is archived.
gh api "orgs/amadeus4dev/repos?per_page=100" \
--jq '"archived \([.[]|select(.archived)]|length) of \(length)"'
# archived 20 of 20That 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.”
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 using | Do we replace it? | Go here instead |
|---|---|---|
| Flight Create Orders: issuing a ticket, PNR creation | No | Amadeus Enterprise, or Duffel |
| Hotel Booking API: confirmed reservations | No | Amadeus Enterprise, or Duffel Stays |
| Flight Offers Price: confirming an offer is bookable | No | A booking platform |
| Seat maps, baggage, airline ancillaries | No | A booking platform |
| GDS content, published/negotiated fares, corporate contracts | No | Amadeus Enterprise |
| Post-booking lifecycle: changes, cancellations, refunds | No | A booking platform |
| Multi-city / open-jaw itineraries | No | We support one-way and round-trip only |
| Reference data: airports, airlines, cities, POI, transfers, activities | No | Not part of our product |
| Flight Offers Search: shopping for prices | Yes | /v1/flights/oneway, /v1/flights/roundtrip |
| Hotel List + Hotel Search: shopping for room rates | Yes | /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.
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:]')-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
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"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-07A 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.
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"
}'"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 Search | FlightPowers |
|---|---|
originLocationCode | from_airport |
destinationLocationCode | to_airport |
departureDate | departure_date |
returnDate | return_date, and use /v1/flights/roundtrip |
adults | passengers, one entry per traveller: 1 adult, 2 child, 3 infant on lap, 4 infant in seat. Two adults is [1, 1] |
includedAirlineCodes | airline_codes (round-trip: departure_airline_codes / return_airline_codes) |
excludedAirlineCodes | exclude_airline_codes |
max | limit (default 10) |
currencyCode | currency (default usd) |
maxPrice | max_price |
nonStop=true | max_stops: 0 |
travelClass | seat_type: 1 Economy, 2 Premium economy, 3 Business, 4 First (a first-class search returned fares on 2026-10-06) |
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
# 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"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 v3 | FlightPowers |
|---|---|
hotelIds (via Hotel List by-city/by-geocode) | not needed: destination takes free text like “Paris” or “Tokyo Shibuya” |
checkInDate | checkin_date |
checkOutDate | checkout_date |
adults | adults (default 2) |
roomQuantity | not supported |
currency | currency (default usd) |
priceRange | budget_per_night: max per night, in your currency |
boardType, paymentPolicy, bestRateOnly | partially covered by filters; not a 1:1 mapping |
countryOfResidence | proxy_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
- Subscribe on RapidAPI (free tier) and confirm the key authenticates with
GET /v1/verify. - Delete the OAuth token fetch, cache and refresh logic. Replace with one header.
- Rename request fields per the tables above. Watch
adults→passengers(a list) andtravelClass→seat_type(a number, 1 to 4). - Rewrite response parsing: the shape is flat JSON, not Amadeus’s
data[]/dictionariesenvelope. - Drop the hotel ID-resolution step; pass
destinationas free text. - Re-point anything that booked to a booking platform. That work does not migrate.
- 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-10-06: the Self-Service portal and pricing pages 301-redirect to the Amadeus homepage, the test sandbox host still has no DNS record, 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.
Other alternatives
Compared on the same terms
The product side of every page: Flights API, Hotels API and the MCP servers. All comparisons are on /compare.
SerpApi alternative for Google Flights
their pages read 2026-10-06
vs SerpApi, row by row
their pages read 2026-10-06
vs SearchApi
their pages read 2026-10-06
vs HasData
their pages read 2026-10-06
vs FlightAPI.io
their pages read 2026-10-06
vs the Skyscanner API
their pages read 2026-10-06
vs Kiwi.com Tequila
their pages read 2026-10-06
vs Duffel
their pages read 2026-10-06
vs flight-mcp.com
their pages read 2026-09-05
vs DataCrawler on RapidAPI
their pages read 2026-09-01
vs Crawlio on RapidAPI
their pages read 2026-09-01
vs ScrapeBadger
their pages read 2026-09-01
Every other Self-Service alternative with its access gate is in the Amadeus Self-Service alternatives guide, and a live query with no key at all is on the flight price checker.
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.
Docs: the Flights API and the MCP servers.