Kiwi.com flight search (one-way and return)
Flight itineraries on Kiwi.com between two places for a date or date range, one-way or return (give return_date, or nights_min/nights_max for a stay length), with passengers, cabin, stops, airlines, price and duration limits, bags and sort. Each itinerary: price (in currency and EUR), duration, seats left, included bags and bag prices, self-transfer, hidden-city and throwaway flags, outbound (and inbound) with departure, arrival, stops and every leg (airports, local and UTC times, carrier, operating carrier, flight number, cabin, duration, layover and baggage recheck) and booking options with links. carriers lists the airlines found. Places take an airport or city code, a name or a place id from /kiwi/v1/places. Pass next_page back as page (up to 200 itineraries); null on the last page.
Every response includes credits_used: the credits this call cost.
Parameters
| name | type | description |
|---|---|---|
fromrequired | string | Origin: airport or city code, place name or place id; comma-separated for several, e.g. LON or City:london_gb. Example: LON |
torequired | string | Destination, same forms as from, e.g. NYC. Example: NYC |
daterequired | string | Departure date (YYYY-MM-DD). Example: 2027-10-15 |
date_end | string | Last departure date for a flexible range (YYYY-MM-DD). |
return_date | string | Return date (YYYY-MM-DD); makes the search a return trip. |
return_date_end | string | Last return date for a flexible range (YYYY-MM-DD). |
nights_min | integer | Return trip: minimum nights at the destination. |
nights_max | integer | Return trip: maximum nights at the destination. |
adults | integer | Adults, 1-9 (default 1). |
children | integer | Children (default 0). |
infants | integer | Infants (default 0; at most one per adult). |
cabin | economy | premium_economy | business | first | Cabin class (default economy). |
mixed_cabins | true | false | true allows itineraries mixing cabin classes. |
max_stops | integer | Maximum stops per direction, 0-3. |
carriers | string | Only these airlines (2-letter codes, comma-separated), e.g. LH,BA. |
exclude_carriers | string | Leave out these airlines (2-letter codes, comma-separated). |
price_min | integer | Minimum price in currency. |
price_max | integer | Maximum price in currency. |
max_duration | integer | Maximum travel time per direction in hours. |
hold_bags | integer | Checked bags per passenger, 0-2 (prices include them). |
hand_bags | integer | Cabin bags per passenger, 0-1. |
sort | best | price | duration | date | popularity | best (default), price, duration, date or popularity. |
currency | string | Price currency (3-letter code, default usd). |
market | string | Market country (2-letter code, default us). |
page | integer | Page, from 1. |
size | integer | Itineraries per page, 1-50 (default 20). |
Every endpoint also takes fresh, raw, fields (see lean responses and caching).
Example
curl "https://api.api.sh/kiwi/v1/flights?from=LON&to=NYC&date=2027-10-15" \
-H "x-api-key: $APISH_KEY" import os, requests
res = requests.get(
"https://api.api.sh/kiwi/v1/flights",
params={"from": "LON", "to": "NYC", "date": "2027-10-15"},
headers={"x-api-key": os.environ["APISH_KEY"]},
timeout=120,
)
res.raise_for_status()
data = res.json() const url = new URL("https://api.api.sh/kiwi/v1/flights");
url.searchParams.set("from", "LON");
url.searchParams.set("to", "NYC");
url.searchParams.set("date", "2027-10-15");
const res = await fetch(url, { headers: { "x-api-key": process.env.APISH_KEY } });
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const data = await res.json(); Response
A JSON object with the fields described above, plus raw (the source's own data), cached, fetched_at and credits_used. Errors return {"success": false, "error": "…"} with the HTTP status (see errors). A lookup that ran but found nothing (404) costs the price above; refused calls and errors on our side are free (what's charged).