Flight search returns offers. Each offer has a token. Flight details take that token and return the itinerary: direction, airports, times, duration, baggage, and a short summary. You cannot call details with an airport code. The token is the offer.
The token has to be at least 50 characters. It comes from GET /v1/booking/flights/search.
👉 To access this endpoint, you must obtain an API key: https://steadyapi.com/register
Authentication
Every call uses a Bearer token from your SteadyAPI dashboard.
Documentation:
https://docs.steadyapi.com/#authenticating-requests
headers = {
'Authorization': 'Bearer YOUR_API_KEY'
}
Where this fits
Resolve airport names with GET /v1/booking/flights/autocomplete, then search with GET /v1/booking/flights/search. Copy token from the offer you want. This details call is the end of that chain. Hotel routes do not accept a flight token, and this route does not accept a hotel_id.
One flight offer
Endpoint: GET /v1/booking/flights/details
Documentation:
https://docs.steadyapi.com/#bookingcom-GETapi-v1-booking-flights-details
Parameters
token— required string fromGET /v1/booking/flights/search. It must be at least 50 characters.include_branded_fares— optional boolean, default trueskip_branded_fares— optional0or1, default1language— optional, defaulten-us
token selects the offer. include_branded_fares defaults to true. skip_branded_fares defaults to 1, which skips branded fare offers, and 0 includes them. Those two flags are independent. language changes labels. A token shorter than 50 characters is rejected before the offer is loaded.
Python
import requests
url = "https://api.steadyapi.com/v1/booking/flights/details"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
response = requests.get(url, headers=headers, params={
"token": offer["token"],
"language": "en-us",
})
response.raise_for_status()
body = response.json().get("body", {})
for segment in body.get("segments", []):
depart = segment["departure"]["airport"]
arrive = segment["arrival"]["airport"]
print(
segment.get("direction"),
depart.get("code"),
"to",
arrive.get("code"),
segment["departure"].get("time"),
)
Annotated sample
{
"trip_type": "ROUNDTRIP",
"segments": [
{
"segment_number": 1,
"direction": "outbound",
"departure": {
"airport": { "code": "CVG", "city_name": "Cincinnati" },
"time": "2026-02-02T07:00:00"
},
"arrival": {
"airport": { "code": "OKC", "city_name": "Oklahoma City" },
"time": "2026-02-02T10:35:00"
},
"total_duration_minutes": 275
}
]
}
Store trip_type and each segment’s direction, airport code, city_name, and time. The first segment is outbound. A later segment is return. total_duration_minutes is that segment, not the whole trip. body.summary has total_segments, total_legs, total_duration_minutes, airlines, and airports for the offer. Baggage is on baggage.cabin and baggage.checked. Legs are the individual flights inside a segment. You do not need offer_reference or flight_key for a normal display.
Practical use
Keep the search token intact. It is one long string. Trimming it, or sending a city code in its place, fails the 50-character check.
A round trip has more than one segment. Read direction so the return is not shown as a second outbound. summary.total_duration_minutes adds the segments. A single segment’s total_duration_minutes does not include the return.
The default skip_branded_fares is 1. Set it to 0 when you need branded fare rows. include_branded_fares can stay at its default of true while you do that.
👉 Get your API key and open an offer: https://steadyapi.com/register