Kiwi Flight Search Scraper avatar

Kiwi Flight Search Scraper

Pricing

from $2.50 / 1,000 flight founds

Go to Apify Store
Kiwi Flight Search Scraper

Kiwi Flight Search Scraper

Search Kiwi.com by route, date and cabin and get every itinerary as a row: fare, airlines, flight numbers, times, stops, layovers, included bags and a direct booking link. Flags the cheap trips built from separate tickets and scores each connection. 37 currencies, one-way or return.

Pricing

from $2.50 / 1,000 flight founds

Rating

0.0

(0)

Developer

Hamza

Hamza

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Search Kiwi.com the way a traveller would — one route, one date, one cabin — and get back every itinerary as a clean row: the fare, the airlines, the flight numbers, the exact departure and arrival times, the stops, every layover, and a link that opens that precise trip on Kiwi.com. It also tells you something almost no other flight dataset does: which of those cheap itineraries are stitched together from separate tickets, and how exposed the traveller is if one leg runs late. Run it for a single route or for a whole matrix of routes and dates, and get a table you can price against, model with, or ship straight into a product.

What you can do with it

  • Track fares on the routes you care about. Run it on a schedule and build your own price history for any route, in any of 37 currencies.
  • Compare an origin, a destination or a whole date range at once. Several departure airports, several destinations and many dates in one run, each search kept separate and labelled. Every search carries its own complete set of results, so a flight that two of your searches both find is written once under each of them — group by searchId to compare searches, or deduplicate on itineraryId to count distinct flights.
  • Find the cheap fares other datasets miss. Kiwi.com sells self-connected trips that no airline lists, so the cheapest row is often one a standard flight feed never shows you.
  • Judge a connection before you buy it. Every result carries its separate-ticket flags, the shortest layover, airport changes, bag re-checks and protected connections, plus an overall risk level you can sort on.
  • Feed a comparison site or a travel product. Every row ships with a working booking link for that exact itinerary.
  • Screen a route for airline mix and schedule. Airlines actually flying it, the operating carrier behind each codeshare, real flight numbers and door-to-door duration.

What you get

One row per itinerary. Real example, abridged (long identifiers and the booking link are shortened here):

{
"source": "kiwi",
"market": "US",
"currency": "USD",
"requestedCurrency": "USD",
"collectedAt": "2026-08-16T12:00:00.000Z",
"searchId": "JFK-LAX-2026-09-15",
"searchOrigin": "JFK",
"searchDestination": "LAX",
"requestedDepartureDate": "2026-09-15",
"tripType": "oneway",
"cabinClass": "ECONOMY",
"price": 171,
"priceFormatted": "$171",
"priceEur": 147.8088,
"durationMin": 359,
"originCode": "JFK",
"originName": "John F. Kennedy International",
"destinationCode": "LAX",
"destinationName": "Los Angeles International",
"departureLocal": "2026-09-15T06:00:00",
"arrivalLocal": "2026-09-15T08:59:00",
"stopCount": 0,
"carrierCodes": ["B6"],
"carrierNames": ["JetBlue Airways"],
"flightNumbers": ["B6123"],
"pnrCount": 1,
"isSelfTransfer": false,
"isTrueHiddenCity": false,
"includedHandBags": 1,
"includedCheckedBags": 0,
"connectionRiskLevel": "NONE",
"riskFlags": [],
"segments": [
{
"leg": "outbound",
"flightNumber": "B6123",
"carrierName": "JetBlue Airways",
"fromCode": "JFK",
"toCode": "LAX",
"departureLocal": "2026-09-15T06:00:00",
"arrivalLocal": "2026-09-15T08:59:00",
"durationMin": 359,
"cabinClass": "ECONOMY"
}
],
"layovers": [],
"sellerName": "Kiwi.com",
"bookingUrl": "https://www.kiwi.com/en/booking/?…",
"resultsAvailable": 22
}

Input reference

FieldTypeDefaultWhat it does
originsarrayWhere the trip starts: airport codes (JFK), city-wide codes (NYC), or names (London Heathrow, Milan). Several are allowed. A name that two airports answer equally well is refused with both codes named, rather than one of them being chosen for you — see below.
destinationsarrayWhere the trip ends, same formats. Several are allowed.
tripTypestringonewayoneway or return.
departureDatesarrayOutbound dates, YYYY-MM-DD. Each date is a separate search.
returnDatesarrayReturn dates for a return trip. Each is paired with each departure date.
nightsMin / nightsMaxintegerInstead of fixed return dates, let the search choose the return date inside this trip length.
dateFlexibilityDaysinteger0Widen every date into a window of this many extra days (0–7).
adultsinteger1Adult travellers (1–9).
childreninteger0Children aged 2–11 in their own seat.
infantsinteger0Lap infants; cannot exceed the number of adults.
cabinClassstringECONOMYECONOMY, PREMIUM_ECONOMY, BUSINESS or FIRST_CLASS.
currencystringUSDOne of 37 currencies. Every row also records the currency it was served in.
marketstringUSThe market the search is prepared for; recorded on every row.
localestringenLanguage for airline and airport names.
maxResultsPerSearchinteger50Itineraries to keep per route and date, up to 1,000.
sortBystringpriceprice, duration, quality, departure or arrival.
maxStopsinteger0 for non-stop only, 1 for at most one connection. Empty means any.
maxDurationHoursintegerDrop trips longer than this door to door.
maxPriceintegerOnly keep fares at or below this amount, in your chosen currency.
includeAirlinesarrayTwo-character airline codes to restrict the search to.
excludeAirlinesarrayTwo-character airline codes to leave out.
excludeSelfTransferFaresbooleanfalseKeep only trips sold as a single ticket, where the airline is responsible for missed connections.
includeGroundTransportbooleanfalseAllow train and coach legs inside an itinerary.
includeConnectionRiskbooleantrueAdd the self-transfer profile and risk level to every result.

Output fields

FieldWhat it is
price, priceFormatted, currencyThe fare for the whole party and the currency it was actually served in.
requestedCurrency, currencyMismatch, currencyMissingWhat you asked for, and whether the fare came back in something else. currencyMismatch is true or false when the served currency is known and null when it is not; in that case currencyMissing is true, currency is null, and the amount must not be treated as being in your currency.
priceEurThe same fare in euros, always — a stable column to join or compare on.
priceBeforeDiscountThe pre-discount fare where one is published.
market, source, collectedAtWhich market the search was for, where it came from, and when.
searchId, searchOrigin, searchDestinationWhich of your searches produced the row.
requestedDepartureDate, requestedReturnDateThe dates you asked for, so flexible searches stay traceable.
tripType, cabinClass, adults, children, infantsWhat was priced.
originCode, originName, originCity, originCountryThe actual departure airport — useful when you searched a city-wide code.
destinationCode, destinationName, destinationCity, destinationCountryThe actual arrival airport.
departureLocal, arrivalLocal, departureUtc, arrivalUtcTimes in local airport time and in UTC.
returnDepartureLocal, returnArrivalLocalThe inbound leg of a return trip.
durationMin, outboundDurationMin, inboundDurationMinDoor-to-door minutes, overall and per direction.
stopCount, outboundStopCount, inboundStopCount, segmentCountHow many stops and how many legs.
carrierCodes, carrierNames, flightNumbers, hasCodeshareWho flies it, and under which numbers.
pnrCountHow many separate bookings the trip is made of. More than one means separate tickets.
isSelfTransfer, isVirtualInterlining, isTrueHiddenCity, isThrowawayTicketThe characteristics that make a fare cheap, and riskier.
connectionRiskLevel, riskFlagsAn overall label (NONE, LOW, MEDIUM, HIGH) and the flags behind it.
shortestLayoverMin, stationChanges, baggageRechecks, protectedConnectionsThe connection detail the label is built from.
includedHandBags, includedCheckedBags, includedPersonalItemBaggage included in this fare.
segmentsEvery leg: flight number, marketing and operating airline, airports, times, duration, cabin.
layoversEvery connection: airport, minutes on the ground, airport change, bag re-check, walking distance, whether it is protected.
sellerCode, sellerName, bookingOptionsWho is selling it, and every fare product offered for the same itinerary.
bookingUrlA direct link that opens this exact trip.
resultsAvailableHow many itineraries the source says exist for that search, so you know what your limit cut off.
isEstimatedAlways false: every value on the row was published by the source, nothing is modelled.

Pricing

You pay per result, with one optional extra:

What you pay forPrice
Flight found — one itinerary written to your dataset$2.50 per 1,000
Connection risk scored — the self-transfer profile added to a result$0.60 per 1,000

Worked example: five routes across three dates is fifteen searches. At 50 results each that is 750 flights, so $1.88. Leaving connection risk scoring on adds $0.45, for $2.33 in total. Turning scoring off costs nothing extra and simply omits those fields.

A search that runs successfully and finds no flights costs you nothing, because nothing is written. A search the source refuses to complete is reported as failed in the run summary and also produces no rows.

Limits & what this actor cannot do

  • Fares are a snapshot. Airline pricing moves continuously; a fare collected now can be gone minutes later.
  • It reports what Kiwi.com publishes to the public. It does not book, hold or reserve anything, and cannot guarantee a fare is still available when you act on it.
  • The fare is the price shown for the search you asked for. Taxes, carrier fees and baggage rules vary by airline and fare type, and extras are only reported where they are published.
  • Any one search returns a limited number of itineraries — up to 1,000, and often far fewer, because that is what the source publishes for that route and date. Each row records how many it says exist.
  • Cheap does not mean protected. Trips made of separate tickets are labelled as such: if the first leg is late, the next airline owes the traveller nothing beyond what the seller's own guarantee covers. The flags and the risk level are there so you can filter, not a promise about any particular connection.
  • The risk level is a label over published facts, not a prediction. It is built only from flags and layover lengths that came with the itinerary.
  • Routes are seasonal. A real route with nothing on the dates you searched is reported as having no flights — that is an answer, not an error, and the run summary counts it separately.
  • A search the source refuses is reported as a failed search, never as "no flights found." If nothing at all could be searched, the run ends as failed rather than handing you an empty table that looks like a result.
  • Some city-wide codes cannot be searched. Where a city code has no searchable entry, the actor refuses it and names the airports to use instead, rather than returning an empty list that looks like "no flights".
  • A city name that two airports answer equally well is never settled for you. Houston is refused, naming both IAH and HOU; so is Frankfurt, naming FRA and Frankfurt-Hahn. Where the whole city can be searched instead, it is — Milan, Milan, Italy, Rome, Italy, Paris, France and Tokyo, Japan all search every airport of that city, and the run says so in its warnings. Naming one airport still searches that one airport: Newark is EWR and London Heathrow is LHR.
  • Overlapping searches repeat a flight on purpose. If you search both NYC and JFK, or two date windows that overlap, the same flight can be found by both — it is written once under each search rather than withheld from the second, so no search ever looks emptier than it was. The run summary counts how many flights that affected.
  • A priced result that arrives with no flight legs at all is dropped and counted, never written as a non-stop flight with no airline, no times and no connection risk.
  • One-way and return trips only. Multi-city and open-jaw itineraries are not offered, because they are not reliably available here.
  • Fares and availability differ by market and currency. Results reflect the market you selected, and every row carries it.
  • Speed depends on the size of the job and on how quickly the source answers; no fixed throughput is promised.
  • Kiwi.com's terms govern automated access. You are responsible for using the data lawfully and in line with those terms.

FAQ

Do I need an account on Kiwi.com? No. No account, no login, nothing to sign up for.

Does it need my password or any personal detail? No. You give it routes and dates and nothing else.

Can I schedule it? Yes. Schedule it daily or twice daily and each run appends a fresh snapshot, which is how you build your own price history. Very short intervals are not worth paying for — fares do not move minute to minute.

Are these fares bookable? They were on sale when they were collected, and every row carries a link to that exact trip. Nothing is held or reserved for you, and airlines can change or withdraw a fare at any time.

Why is one result so much cheaper than the rest? Usually because it is a self-connected trip built from separate tickets, or a hidden-city or throwaway fare. Those rows are flagged, scored and easy to exclude with a single switch if you only want ordinary single-ticket fares.

What happens if a route genuinely has no flights on my dates? You get zero rows for that search and the run summary counts it as an empty search — clearly separated from searches that could not be completed, which are counted as failures.

Can I get fares in my own currency? Yes, choose from 37 currencies. Each row also carries the currency it was actually served in and a euro reference price, so you can always tell what a number means.