Skyscanner Flight Scraper API avatar

Skyscanner Flight Scraper API

Pricing

from $2.50 / 1,000 results

Go to Apify Store
Skyscanner Flight Scraper API

Skyscanner Flight Scraper API

Rising star

Compare flight prices from 7 sources: Google Flights, Kiwi, Travelpayouts, Ryanair, EasyJet, Wizz Air, Norwegian. One API call.

Pricing

from $2.50 / 1,000 results

Rating

0.0

(0)

Developer

deusex machine

deusex machine

Maintained by Community

Actor stats

4

Bookmarked

328

Total users

120

Monthly active users

2 days ago

Last modified

Share

Flight Price Scraper — Compare Cheap Flights from Multiple Sources in One API Call

Useful? Leave a review — it takes 10 seconds and is the single biggest thing that helps other travel developers and price-comparison teams find this flight scraper.

A production-grade flight price scraper that compares fares across seven flight databases in one API call and returns a single, deduplicated, merged feed of the cheapest flights for any route and date. Pulls Google Flights, Kiwi.com, a cached price database (Travelpayouts), Ryanair, EasyJet, Wizz Air and Norwegian in parallel, matches the same physical flight across every source, and exposes bestPrice, cheapestSource, baggage policy, segment-level details and direct booking links per result. No airline OAuth, no GDS contract, no browser rendering — pure HTTP, JSON or CSV export, ready for Python, Node.js, Zapier, Make.com or any data warehouse. Built for travel aggregators, fare-alert products, OTA startups, corporate-travel teams and data analysts that need accurate multi-source flight price comparison at scale.

✨ Why use this scraper

Given an origin IATA code, a destination IATA code and a date, this flight scraper queries seven independent flight search systems concurrently and returns structured flight data with a price breakdown per source. Every run hits the sources live — airfare prices are the most volatile retail price on the internet, moving every few minutes during the day, so the scraper never caches. You can search one-way or round-trip, filter by cabin class, pick any ISO currency (USD, EUR, MXN, GBP, BRL, JPY…) and cap the result count with maxFlights. The merger logic inside the actor flattens and deduplicates results by flight number + departure time, then sorts ascending by the cheapest price discovered across any source.

Because the whole pipeline runs over raw HTTP (no Puppeteer, no Playwright, no Chromium, no Selenium), the actor is an order of magnitude cheaper and faster than browser-based flight scrapers. A typical one-way search across all seven sources finishes in about 2 to 4 seconds. Output is available as JSON, CSV, Excel or XML directly from the Apify console or via the Apify API.

📤 Output fields

The output is a flat JSON document per unique flight. Fields are grouped below for clarity.

Price comparison fields

FieldDescription
pricesObject mapping each source that found this flight to its price in the selected currency
bestPriceLowest numeric price across every source that returned this flight
cheapestSourceIdentifier of the source that had the lowest price (e.g. kiwi, google, ryanair)
sourcesFoundArray of source identifiers that found and returned this flight
currencyISO currency code used for every price on the row

Schedule and route fields

FieldDescription
airlinePrimary carrier or multi-airline label (e.g. American Airlines, Ryanair + Wizz Air)
departTimeDeparture date and time in ISO 8601
arriveTimeArrival date and time in ISO 8601
durationTotal trip duration (e.g. 9h 50m)
stopsNumber of stops — 0 means nonstop
fromObject: airport (IATA), name, city, country
toObject: airport (IATA), name, city, country
departDateDeparture date in YYYY-MM-DD

Segment, layover and baggage fields

FieldDescription
segmentsArray of per-leg details: flightCode, airline, from, to, departure, arrival, duration, cabinClass
layoversPer-layover details: airport, city, duration, baggage recheck required, terminal change
baggageObject: includedHandBags, includedCheckedBags, includedPersonalItem
isSelfTransferBoolean — true when separate tickets are combined and the passenger must recheck bags
travelHackHidden-city, virtual-interlining or throwaway-ticket indicator when the source surfaces it
highlightsWhether the flight is tagged as cheapest, fastest or best by any source

Booking and metadata fields

FieldDescription
linksDirect booking URLs keyed by source (e.g. googleFlights, kiwi, ryanair)
scrapedAtISO timestamp of when the record was produced by this actor

🎯 Use cases

  • Build a fare-alert product — Run the scraper on a schedule against the routes your subscribers care about and push a notification whenever bestPrice drops below their threshold. Everything you need (price per source, cheapest source, booking link) is already in the payload.
  • Power a price-comparison site or Chrome extension — Skip the cost of ten independent scrapers and 10 sets of blocks. Hit this actor once, surface prices as a side-by-side table and link users straight to each source's booking page.
  • Corporate-travel pre-booking audits — Give finance a daily CSV of the cheapest economy and business fares on the ten routes your road warriors fly most, so they can audit whether the agency is really booking the cheapest option.
  • Market research for airlines and OTAs — Track how a carrier's price moves versus low-cost competitors on specific city pairs over weeks. The scraper gives you aligned timestamps across every source in one run.
  • Feed a dynamic-pricing model — Use the scraper as a daily data ingestion step for an ML pipeline that predicts fare movement on routes your product sells.
  • Travel deal newsletter / social media bot — Find flights where bestPrice is more than 30% below the median for the route, include the booking link, and auto-post to your audience.

🚀 How to use

The actor supports three common input shapes. All the examples below are copy-pasteable into the Apify input form.

{
"origin": "LAX",
"destination": "JFK",
"departDate": "2026-04-25",
"currency": "USD",
"maxFlights": 20
}

Round-trip flight search with cabin class

{
"origin": "MEX",
"destination": "EZE",
"departDate": "2026-04-25",
"returnDate": "2026-05-05",
"adults": 1,
"cabinClass": "ECONOMY",
"currency": "MXN",
"maxFlights": 50
}
{
"origin": "LHR",
"destination": "SIN",
"departDate": "2026-07-10",
"returnDate": "2026-07-20",
"adults": 2,
"cabinClass": "BUSINESS",
"currency": "GBP",
"maxFlights": 30
}

Supported cabin classes: ECONOMY, PREMIUM_ECONOMY, BUSINESS, FIRST.

📥 Input

ParameterTypeDefaultDescription
originstring"LAX"Origin airport IATA code (e.g. LAX, JFK, LHR, MTY)
destinationstring"JFK"Destination airport IATA code (e.g. JFK, EZE, CDG)
departDatestring"2026-04-25"Departure date in YYYY-MM-DD format
returnDatestringReturn date YYYY-MM-DD. Omit for one-way.
adultsinteger1Number of adult passengers (1–9)
cabinClassstring"ECONOMY"ECONOMY, PREMIUM_ECONOMY, BUSINESS, or FIRST
currencystring"USD"ISO currency code used to price every source (USD, EUR, MXN, GBP, BRL, JPY…)
maxFlightsinteger50Maximum number of merged flights returned after deduplication

📋 Output example

{
"prices": {
"google": 409,
"kiwi": 380,
"travelpayouts": 130
},
"bestPrice": 130,
"cheapestSource": "travelpayouts",
"sourcesFound": ["google", "kiwi", "travelpayouts"],
"currency": "USD",
"airline": "American Airlines",
"departTime": "2026-04-25T06:00:00",
"arriveTime": "2026-04-25T14:32:00",
"duration": "5h 32m",
"stops": 0,
"from": {
"airport": "LAX",
"city": "Los Angeles",
"country": "United States"
},
"to": {
"airport": "JFK",
"city": "New York",
"country": "United States"
},
"segments": [
{
"flightCode": "AA 123",
"airline": "American Airlines",
"from": "LAX",
"to": "JFK",
"departure": "2026-04-25T06:00:00",
"arrival": "2026-04-25T14:32:00",
"duration": "5h 32m",
"cabinClass": "ECONOMY"
}
],
"baggage": {
"includedHandBags": 1,
"includedCheckedBags": 0,
"includedPersonalItem": 1
},
"links": {
"googleFlights": "https://www.google.com/travel/flights?q=LAX+JFK+2026-04-25",
"kiwi": "https://www.kiwi.com/en/search/results/..."
},
"scrapedAt": "2026-04-25T16:45:42.209Z"
}

Export the full dataset as CSV, Excel, JSON or XML from the Apify console run page, or pull it programmatically via the Apify API.

💻 Code examples

From the Apify API (curl)

curl -X POST 'https://api.apify.com/v2/acts/makework36~flight-price-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"origin": "MEX",
"destination": "MAD",
"departDate": "2026-06-10",
"returnDate": "2026-06-25",
"adults": 1,
"currency": "EUR",
"maxFlights": 30
}'

From Python (apify-client)

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("makework36/flight-price-scraper").call(run_input={
"origin": "JFK",
"destination": "CDG",
"departDate": "2026-07-01",
"returnDate": "2026-07-10",
"adults": 1,
"cabinClass": "ECONOMY",
"currency": "USD",
"maxFlights": 40,
})
for flight in client.dataset(run["defaultDatasetId"]).iterate_items():
print(
flight["airline"],
flight["bestPrice"],
flight["cheapestSource"],
flight["duration"],
flight["stops"],
)

From Node.js (apify-client)

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('makework36/flight-price-scraper').call({
origin: 'MEX',
destination: 'EZE',
departDate: '2026-08-12',
returnDate: '2026-08-22',
adults: 1,
cabinClass: 'ECONOMY',
currency: 'MXN',
maxFlights: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.table(items.map((f) => ({
airline: f.airline,
best: f.bestPrice,
source: f.cheapestSource,
duration: f.duration,
stops: f.stops,
})));

Export to CSV

From the console run page → ExportCSV. Or via the dataset API:

https://api.apify.com/v2/datasets/DATASET_ID/items?format=csv&token=YOUR_TOKEN

⚡ Performance

  • 2 to 4 seconds per search — all seven sources run in parallel, not sequentially.
  • ~$0.0003 per search — pay-per-event pricing; no browser overhead inflating compute.
  • 128 MB memory tier is enough for the default maxFlights=50. Bump to 256 MB only if you raise maxFlights above 100.
  • Apify Proxy rotates IPs automatically — no proxy setup, no block management on your side.
  • Deduplicated and sorted — you receive a clean, merged feed, not seven raw result sets to stitch together yourself.

📊 Comparison

There are several flight scrapers on Apify Store. Here is how this multi-source flight scraper stacks up on the dimensions that actually matter to production workflows: coverage, completeness, per-result cost and developer ergonomics. All competitors are anonymized because pricing models and field sets change week to week.

FeatureThis scraperSingle-source flight scraper (Google Flights only)Airline-specific scraper (one low-cost carrier)Browser-based flight scraper with residential proxy
Sources queried per run7 (Google Flights, Kiwi, cached prices DB, Ryanair, EasyJet, Wizz Air, Norwegian)111–2
Price comparison in outputYes (prices map + cheapestSource)NoNoNo
Scraping engineRaw HTTPRaw HTTPRaw HTTPHeadless browser + residential proxy
Latency per search2–4 s2–3 s2–3 s10–30 s
Price per search~$0.0003SimilarSimilar10–50× higher
Segment detailsYes (per-leg)PartialYesYes
Layover and baggage recheckYesPartialN/APartial
Baggage allowance (hand / checked / personal)YesPartialYesPartial
Direct booking links per sourceYesSingle linkSingle linkSingle link
Self-transfer / virtual interlining flagYesNoNoNo
Multi-currency outputYes (any ISO)LimitedLimitedYes
Cabin class filterYesYesLimitedYes
Round-trip + one-wayYesYesRound-trip sometimes missingYes
Export formatsJSON / CSV / Excel / XMLJSON / CSVJSONJSON / CSV
Code examples in READMEPython / Node.js / curl / PHP / Go / RubyTypically noneTypically noneTypically none
MCP-compatible alternativeHotel MCP server, Airbnb MCP server, Reddit MCP server on same accountRareRareRare

The honest take: if you only ever need Google Flights and you do not care which carrier has the cheapest fare, a single-source flight scraper will do. If you need an accurate multi-source price comparison, a fallback when one source blocks, and a single merged output to ship to downstream consumers, this scraper is the one to pick. The cost difference per search is negligible; the ops cost of running and reconciling seven scrapers yourself is not.

💵 Pricing

Pay-per-event model:

  • ~$0.0003 per flight price search (as of 2026-04-22), measured per merged result set across all seven sources.
  • Apify gives every new user a $5 free trial, enough to run thousands of searches while evaluating.
  • No subscription, no minimum, no egress fees, no rate cap.

Plan guidance

Apify planRecommended forNotes
FREE (trial credit)First-time evaluation, hobby projects~$5 credit → thousands of searches
STARTERPersonal fare-alert bots, small side projects, MVP OTAsMonthly credit + proxy included
SCALEProduction fare-alert products, corporate-travel dashboards, small OTAsHigher concurrency, more proxy bandwidth
BUSINESSB2B fare feeds, multi-tenant SaaS, travel agenciesSLAs and priority support
ENTERPRISE / DIAMONDLarge OTAs, airlines benchmarking competitors, enterprise data teamsDedicated resources, custom terms

❓ FAQ

Do I need an airline API key, a GDS contract or a Kiwi.com Affiliate account? No. This flight scraper reads publicly available search result pages and public fare APIs — no login, no OAuth, no airline contract required. You only need an Apify account and an API token.

How many sources does it actually query? Seven source groups: Google Flights, Kiwi.com, a cached price database (via Travelpayouts), Ryanair, EasyJet, Wizz Air and Norwegian. All seven run in parallel inside the actor.

What airport codes are supported? Any valid 3-letter IATA code: JFK, LAX, LHR, CDG, NRT, MTY, EZE, MEX, TRC, PVG, SIN, DXB, and so on. Small regional airports are supported too, subject to each underlying source's coverage.

Can I search in other currencies? Yes. Set currency to any ISO code: USD, EUR, MXN, GBP, BRL, JPY, INR, AUD, CAD, CHF, ZAR, AED, HKD, and so on. The merger normalizes every source into the currency you request.

Why do different sources show different prices for the same flight? Each source has different airline agreements, distribution fees, markups and, for OTAs, affiliate margin. That is the entire point of a multi-source flight price comparison — you see who is genuinely cheapest on this exact flight right now.

What is self-transfer and when should I care? isSelfTransfer = true means separate tickets are combined into one itinerary. You must collect your bags and check in again at the connection airport. Cheaper fare, but a missed connection is the passenger's problem, not the airline's. Flag this clearly to users in any consumer product.

How often should I run this for fare monitoring? Once or twice per day is plenty for most routes. Serious deal-hunters run hourly on hot routes. Running more often than every 15 minutes is overkill and rarely surfaces new prices.

Do you have a scraper for hotels and vacation rentals? Yes. See Related scrapers below — the same Apify account publishes Airbnb, Booking.com, Vrbo and hotel-price scrapers with consistent output shapes and pricing models.

Can I get seat availability or seat maps? Not in the current version — the actor focuses on price and schedule. Seat maps and per-fare availability are on the roadmap; leave a request on the actor issues tab to prioritize.

Can I filter by number of stops or max duration? Not as input parameters yet. Post-process the dataset with .filter(f => f.stops === 0 && parseDuration(f.duration) < 720) — the fields are already in the output. Native filters are on the roadmap.

📝 Changelog

  • v0.3 (2026-04-22) — SEO-friendly rewrite of the README, explicit source list, code examples in Python, Node.js, curl, PHP, Ruby and Go, expanded troubleshooting and FAQ. No breaking API changes.
  • v0.2 (2026-04-10) — Added Wizz Air, Norwegian and EasyJet sources. Merger now tracks cheapestSource and exposes a per-source prices map.
  • v0.1 (2026-03-25) — Initial release with Google Flights, Kiwi and Travelpayouts.