---
title: "Kiwi.com API: Search Fares and Cheapest Dates as JSON"
description: "Search Kiwi.com fares by origin, destination and date, then scan a window with calendar-cheapest-dates. A recorded London–Barcelona response and costs."
url: https://perceptlayer.com/blog/kiwi-flights-api-cheapest-dates
---

[Blog](https://perceptlayer.com/blog) / [API guides](https://perceptlayer.com/blog/category/api-guides)

# Kiwi.com API: Search Fares and Cheapest Dates as JSON

7 Sept 2026 Perceptlayer 6 min read

Kiwi.com's own API is now for invited business partners, so most developers can't get a key for it. To read Kiwi.com fares as JSON, call `GET /v1/kiwi/flights-search` with `origin`, `destination` and `departure_date`; each successful call costs 1 credit and returns itineraries with price, carriers, stops, duration, baggage and a booking link. For a date window, `GET /v1/kiwi/calendar-cheapest-dates` takes a `start_date` and `end_date` in one call.

## Key takeaways

-   `flights-search` needs `origin`, `destination` and `departure_date`; `cabin`, `max_stops`, `sort` ( `quality`, `price` or `duration`), `currency` and passenger counts are optional.
-   A recorded search from `LON` to `BCN` returned flights from both Luton and Stansted, so a city code covers all of a city's airports.
-   `duration` is in seconds: the recorded Ryanair flight shows `7800`, 2 hours 10 minutes, for a 15:35 departure and 18:45 local arrival one time zone east.
-   Scanning 30 departure dates one by one is 30 `flights-search` calls, 30 credits. `calendar-cheapest-dates` asks for the whole window in a single 1-credit call.
-   All 7 Kiwi.com endpoints cost 1 credit per successful call, and failed calls cost nothing.

## Can you still get a Kiwi.com API key?

Not unless Kiwi.com invites you. Kiwi.com used to give public access to its Tequila platform, which included the API, a white-label product and an affiliate programme. It has since narrowed that to key business partnerships, and new Tequila partnerships are by invitation only; existing partners keep their tools and documentation ( [Kiwi.com](https://media.kiwi.com/articles-and-interviews/better-for-business-kiwi-com-takes-a-new-approach-to-partnerships/), 2024).

If you're a travel agency that wants to sell Kiwi.com itineraries and take bookings, the partner route is the right one: the [Tequila site](https://tequila.kiwi.com/) asks prospective affiliates to get in touch with Kiwi.com by email (2026). If you want to read fares for research, alerts or an agent, the [Kiwi.com API](https://perceptlayer.com/apis/kiwi) returns what the site shows, as JSON, with the same key as every other API in the catalogue. It doesn't book anything: each itinerary carries a `booking_url` that opens the booking page on Kiwi.com.

## What can the Kiwi.com API return?

Seven GET endpoints cover search, a single itinerary, date flexibility and destination discovery. Each costs 1 credit per successful call. The two that matter most are `flights-search` for one route on one date and `calendar-cheapest-dates` for one route across a window. `locations` turns a place name into the codes the other endpoints take.

| Endpoint | Use it for | Required |
| --- | --- | --- |
| [`/v1/kiwi/flights-search`](https://perceptlayer.com/apis/kiwi/flights-search) | Itineraries for one route and date | `origin`, `destination`, `departure_date` |
| `/v1/kiwi/flights-detail` | One itinerary from a search | `origin`, `destination`, `departure_date`, `itinerary_id` |
| [`/v1/kiwi/calendar-cheapest-dates`](https://perceptlayer.com/apis/kiwi/calendar-cheapest-dates) | Cheapest dates in a window | `origin`, `destination`, `start_date`, `end_date` |
| `/v1/kiwi/calendar-price-graph` | Prices across a window for a stay length | adds `nights_min`, `nights_max` |
| [`/v1/kiwi/explore-price-map`](https://perceptlayer.com/apis/kiwi/explore-price-map) | Destinations from one origin | `origin`, `start_date`, `end_date` |
| `/v1/kiwi/flights-one-per-city` | One flight per destination city | `origin`, `departure_date` |
| `/v1/kiwi/locations` | Place name to codes | `query` |

`explore-price-map` also takes a bounding box ( `south_west_lat`, `south_west_lng`, `north_east_lat`, `north_east_lng`) and a `limit`, which is how you ask "where can I fly from London in December" for one region of the map.

## How do you search Kiwi.com fares?

Send `origin`, `destination` and `departure_date` to `GET /v1/kiwi/flights-search`. Codes can be airports or cities: the recorded request below uses `LON` for London and `BCN` for Barcelona. Add `return_date` for a return trip. If you don't know a code, call `/v1/kiwi/locations?query=London` first. This is the request behind the recorded response in the next section:

```bash
curl "https://api.perceptlayer.com/v1/kiwi/flights-search?origin=LON&destination=BCN&departure_date=2026-12-04" \
  -H "X-API-Key: $API_KEY"
```

You need a key in the `X-API-Key` header; [get a free API key](https://perceptlayer.com/signup), and the [authentication docs](https://docs.perceptlayer.com/authentication) cover the rest.

### Which parameters does flights-search take?

Three are required and fourteen optional. The table lists them with the types and allowed values from the endpoint definition. Nothing else is documented about defaults, although the recorded response echoes the values it used, such as `cabin` `economy`, `currency` `EUR` and `sort` `quality`.

| Parameter | Type | Notes |
| --- | --- | --- |
| `origin` | string, required | Airport or city code, such as `LON` |
| `destination` | string, required | Airport or city code, such as `BCN` |
| `departure_date` | string, required | `YYYY-MM-DD` |
| `return_date` | string | For a return trip |
| `adults`, `children`, `infants` | integer | Passenger counts |
| `cabin` | string | `economy`, `premium_economy`, `business` or `first` |
| `max_stops` | integer | `0` for direct flights only |
| `min_price`, `max_price` | integer | Price bounds |
| `sort` | string | `quality`, `price` or `duration` |
| `limit` | integer | Itineraries to return |
| `currency`, `locale` | string | Display currency and language |
| `carriers[]`, `exclude_carriers[]` | list of strings | Airline codes to include or exclude |

To see only direct flights on one airline, combine `max_stops=0` with `carriers[]=FR`.

### What does a flights-search response look like?

The response echoes the search, gives `total_available`, and lists `itineraries`. The recorded London to Barcelona search on 2026-12-04 found 23. Here is the first itinerary, trimmed with `…`:

```json
{
  "success": true,
  "data": {
    "trip_type": "one_way",
    "origin": "LON",
    "destination": "BCN",
    "departure_date": "2026-12-04",
    "cabin": "economy",
    "currency": "EUR",
    "sort": "quality",
    "total_available": 23,
    "itineraries": [
      {
        "id": "ItineraryOneWay:eyJwcm92aWRlcnMiOiJLSVdJLUJBU0lDOktJV0kiLCJyb3V0ZV9kYXRhIjoiRlI6NzgwNzpMVE46MTc5NjM5ODUwMDpCQ046MTc5NjQwNjMwMDplY29ub215OkZhbHNlOjo6IiwicHJpY2Ui…",
        "price": { "amount": 29, "currency": "EUR", "formatted": "29 €" },
        "duration": 7800,
        "stops": 0,
        "carriers": [{ "code": "FR", "name": "Ryanair", "icao": "RYR" }],
        "departure": {
          "airport_code": "LTN",
          "city": "London",
          "local_time": "2026-12-04T15:35:00"
        },
        "arrival": {
          "airport_code": "BCN",
          "city": "Barcelona",
          "local_time": "2026-12-04T18:45:00"
        },
        "segments": [{ "flight_number": "FR7807", "cabin_class": "ECONOMY", "duration": 7800, … }],
        "booking_url": "https://www.kiwi.com/en/booking/?direct=true&locale=en&currency=eur&passengers=1-0-0&token=…",
        …
      },
      …
    ]
  },
  …
}
```

The second itinerary is FR8216 from Stansted ( `STN`) at 32 EUR, which is how you know `LON` searched every London airport. Times are local to each airport, so compute flight time from `duration` rather than from the two timestamps. Each itinerary's `id` is what `flights-detail` takes as `itinerary_id`, up to 2,000 characters. For what the `baggage` block says about the real price of a cheap fare, see [what fare tracking can and cannot show](https://perceptlayer.com/blog/flight-price-data-fare-tracking).

## How do you find the cheapest date to fly?

Use `GET /v1/kiwi/calendar-cheapest-dates` with a route and a window. It takes `origin`, `destination`, `start_date` and `end_date`, plus optional `nights_min` and `nights_max` for a return stay, and returns the cheapest dates in that window in one call. We don't have a recorded response for it, so run it in the playground on the [Kiwi.com API page](https://perceptlayer.com/apis/kiwi) to see its fields and how wide a window it accepts.

```bash
curl "https://api.perceptlayer.com/v1/kiwi/calendar-cheapest-dates?origin=LON&destination=BCN&start_date=2026-12-01&end_date=2026-12-30&currency=EUR" \
  -H "X-API-Key: $API_KEY"
```

When you need full itineraries for every date, not only the cheapest, loop over `flights-search` instead. This script scans 30 departure dates and keeps the lowest `price.amount` for each, using only fields from the recorded response:

```python
import datetime as dt
import os
import requests

URL = "https://api.perceptlayer.com/v1/kiwi/flights-search"
HEADERS = {"X-API-Key": os.environ["API_KEY"]}
start = dt.date(2026, 12, 1)

for i in range(30):
    day = (start + dt.timedelta(days=i)).isoformat()
    r = requests.get(URL, params={"origin": "LON", "destination": "BCN",
                                  "departure_date": day, "currency": "EUR"},
                     headers=HEADERS, timeout=60)
    if r.status_code != 200:
        print(day, "error", r.json()["error"]["code"])
        continue
    its = r.json()["data"]["itineraries"]
    if not its:
        print(day, "no itineraries")
        continue
    best = min(its, key=lambda x: x["price"]["amount"])
    print(day, best["price"]["amount"], best["carriers"][0]["code"],
          best["departure"]["airport_code"], best["duration"] // 60, "min")
```

The script reads only fields from the recording, but we haven't run it live for this article. Each line prints the date, the lowest fare, the airline, the departure airport and the flight time in minutes. A day that fails prints its error code and costs nothing.

## What does a 30-day date scan cost?

Every Kiwi.com endpoint costs 1 credit per successful call, so the cost depends on how many calls the scan takes. With `flights-search`, one call per departure date makes a 30-day scan 30 × 1 = 30 credits per route. With `calendar-cheapest-dates`, the same window is one call, 1 credit, if the endpoint accepts a 30-day range.

| Scan | Calls per route | Credits per route | Daily for 30 days |
| --- | --- | --- | --- |
| `flights-search`, 30 dates | 30 | 30 | 30 × 30 = 900 |
| `calendar-cheapest-dates`, one window | 1 | 1 | 1 × 30 = 30 |
| Calendar, then `flights-search` on the 3 cheapest dates | 4 | 4 | 4 × 30 = 120 |

The last row is the usual compromise: let the calendar find the dates, then pull full itineraries only for the ones worth showing. Watching 10 routes that way daily is 120 × 10 = 1,200 credits a month, which is 1,200 − 1,000 = 200 credits a month beyond the free tier. Failed calls return `X-Credits-Used: 0`. See the [credits docs](https://docs.perceptlayer.com/credits) for the balance and [pricing](https://perceptlayer.com/pricing) for what packs cost.

To try it, run the London to Barcelona search above in the playground on the [Kiwi.com API page](https://perceptlayer.com/apis/kiwi), then change the date.

## APIs in this post

-   [Kiwi.com **1 credit per call** · 7 endpoints](https://perceptlayer.com/apis/kiwi)

## Frequently asked questions

### How much does the Kiwi.com API cost?

Each of the 7 Kiwi.com endpoints costs 1 credit per successful call, and failed calls cost nothing. A one-date fare search is 1 credit, and a 30-date scan with `flights-search` is 30 credits per route. Every verified account gets 1,000 free credits a month. The [pricing page](https://perceptlayer.com/pricing) has what credit packs cost.

### Can I book flights through this API?

No. The API reads fares and itineraries as the site shows them at the time of the call. Each itinerary includes a `booking_url` that opens Kiwi.com's booking page, where the traveller completes the booking. Selling and ticketing Kiwi.com itineraries yourself is what its invitation-only partner programme is for.

### Are the prices final?

They're the prices the site displayed at the time of the call, and fares change often. The recorded response also shows a fare that includes a personal item but no checked bag, with `checked_bag_tier_prices` for adding one. Re-check a fare with `flights-detail` before you show it as current.

### Which codes does origin accept?

Airport codes such as `LTN` and city codes such as `LON` both appear in the recorded response, which searched with `LON` and returned flights from Luton and Stansted. If you only have a place name, call `/v1/kiwi/locations` with it as `query` to find the code.

### What happens when I hit the rate limit?

You get `rate_limited` (429) with a `Retry-After` header giving the seconds to wait, and nothing is debited. Free accounts get 1 request a second; packs include at least 5 a second. A 30-date scan at 1 request a second takes about 30 seconds. The [rate limits docs](https://docs.perceptlayer.com/rate-limits) explain how limits work.

kiwi.com flights flight prices travel cheapest dates

## More from the blog

1.  [API guides](https://perceptlayer.com/blog/category/api-guides) 28 Aug 2026 Perceptlayer 7 min read
    
    ## [Google Flights API: Fares, Date Ranges and Airports](https://perceptlayer.com/blog/google-flights-api)
    
    Get Google Flights fares as JSON: one-way, round-trip and date-range calls, a recorded JFK to LAX response, and the credit cost of a daily fare check.
    
2.  [API guides](https://perceptlayer.com/blog/category/api-guides) 22 Oct 2026 Perceptlayer 7 min read
    
    ## [Booking.com Reviews API: Hotel Review Scores as JSON](https://perceptlayer.com/blog/booking-com-reviews-api-json)
    
    Pull Booking.com review scores and guest reviews as JSON with two GET calls at 1 credit each. Parameters, sorting, paging and the cost of covering a city.
    
3.  [API guides](https://perceptlayer.com/blog/category/api-guides) 21 Oct 2026 Perceptlayer 6 min read
    
    ## [Vrbo API: Vacation Rental Listings and Availability](https://perceptlayer.com/blog/vrbo-api-vacation-rental-listings)
    
    Search Vrbo with required check\_in and check\_out, then pull a listing's availability and reviews by property\_id. Parameters, cURL and the cost of 50 listings.
