Skyscanner Scraper | Flights, Hotels & Destination Deals avatar

Skyscanner Scraper | Flights, Hotels & Destination Deals

Pricing

from $2.20 / 1,000 results

Go to Apify Store
Skyscanner Scraper | Flights, Hotels & Destination Deals

Skyscanner Scraper | Flights, Hotels & Destination Deals

Collect public flights, destination deals and hotel listings from Skyscanner.net in GBP, with prices, source links and available hotel details. Pay per delivered row plus a small start fee; export JSON, CSV or Excel.

Pricing

from $2.20 / 1,000 results

Rating

0.0

(0)

Developer

kane liu

kane liu

Maintained by Community

Actor stats

1

Bookmarked

4

Total users

1

Monthly active users

15 hours ago

Last modified

Share

Skyscanner Scraper

Collect public flight offers, destination deals and hotel listings from Skyscanner.net as rows you can export or read through the API.

  • Flight prices, route codes and itinerary links.
  • Destination deal cards for fare research.
  • Hotel prices, addresses, coordinates and ratings when available.
  • Details from existing hotel or flight links, without making a booking.
  • Pay only for the rows you receive: $3.00 per 1,000 rows on the Free plan plus a small start fee.

What does Skyscanner Scraper do?

Skyscanner Scraper collects guest listings from skyscanner.net, using its English-language, GBP market. Each run handles one search or detail link. It is an unofficial tool, not affiliated with Skyscanner, and does not log in or click Go to site or Book.

  • Flights (flights): search a route using origin and destination.
  • Destination deals (flights_seo): collect flights-to deal cards using place.
  • Hotels (hotels): search a city using entityId, geoId, or a supported city name.
  • Hotel details (hotel_detail): read one existing hotelUrl.
  • Flight details (flight_detail): read one existing flightUrl.

Car hire and packages are not available. Other Skyscanner domains are not supported.

What data can you extract from Skyscanner?

Fields vary by service. A row represents a flight offer, a destination deal card, a hotel or a detail page; it is not a confirmed booking.

Common fields

FieldDescriptionExample
listingIdSource identifierdealCard_example
nameAirline, destination or hotel nameSingapore
serviceSelected serviceflights_seo
typeKind of rowflights_seo
urlSource link, when availablenull
priceNumeric displayed price199
priceDisplayPrice text£199
currencyCurrency codeGBP
scrapedAtCollection time in UTC2026-10-24T08:00:00Z
phonesPublished phone numbers, otherwise empty[]
emailsPublished email addresses, otherwise empty[]
leadAbsencesReasons for missing contact fields{"phones":"本站无"}

The source value 本站无 means the information is not provided on that page. Destination deal cards may have no offer URL; detail pages may have no price.

Flight offers and destination deals

FieldDescriptionExample
originFlight origin codebkk
destinationFlight destination or deal-page codesin
itineraryConfigIdIdentifier from a flight detail linkexample-config-id
carrierNamesAirline names, when supplied["Scoot"]
legsJourney legs, including stop information when available[]
org.nameAirline or booking partner shown by the sourceScoot

Hotels and hotel details

FieldDescriptionExample
hotelIdHotel identifier, distinct from the city's identifier105605419
address.fullPublished hotel addressnull
geo.latLatitude1.2834
geo.lngLongitude103.8607
starsHotel star rating5
reviewScoreSource review score4.5
reviewCountNumber of reviews reported120
pricePerNightRawNightly amount when supplied150
priceTotalRawStay total when supplied300
partnerNamesBooking partners shown for the hotel["Example partner"]

Ratings, totals, taxes and addresses are optional, not guaranteed on every row. Check the nightly and total fields separately before comparing hotel prices.

How to scrape Skyscanner

  1. Open Skyscanner Scraper in Apify Console.
  2. Fill one target, such as place, and leave service on auto.
  3. Set maxResults to 5 for a small first run.
  4. Click Start and wait for the run to finish.
  5. Open the dataset and download the rows or read them through the API.

Empty input {} starts a Bangkok-to-Singapore flight example limited to 3 rows, using the form's sample values. It is a billed example, not a free preview. With a target filled, the usual maxResults default is 50; the Console form prefills 3.

Flights

Fill origin and destination with Skyscanner place codes such as bkk and sin. If you provide only one end, the other stays bkk or sin. tripType selects roundtrip or oneway.

Destination deals

Fill place with a supported code or city name, such as dxb or london. This selects flights_seo. These are destination-page deals, not a dated route search. For an unfamiliar code, supply placeSlug from a real flights-to URL.

Hotels

Fill entityId or geoId with a city identifier. Alternatively, choose service: "hotels" and set place to a supported city such as singapore. A city identifier is not a hotel identifier from an /ht- link.

Hotel details

Paste a current hotel link into hotelUrl. It must use HTTPS on skyscanner.net or www.skyscanner.net and contain /ht- followed by the hotel identifier.

Flight details

Paste a current flight link into flightUrl, using the same HTTPS hosts and a /config/ path. Copy the link from an actual result; do not invent identifiers. Detail searches require a link, not just route codes or a city identifier.

With auto, links take priority over identifiers, then place names, then route codes. Select a service explicitly when a city name should mean hotels rather than destination deals.

What to fill in

FieldWhat to enterDefault
serviceauto or one of the five services aboveauto
originFlight origin code; also accepts bkk|sinbkk when omitted
destinationFlight destination codesin when omitted
placeSupported destination code or city nameEmpty
placeSlugSlug from a real flights-to URL for an unfamiliar codeEmpty
entityIdHotel-search city identifier or supported city nameEmpty
geoIdAlternative city identifier for hotelsEmpty
hotelUrlCurrent HTTPS hotel detail linkEmpty
flightUrlCurrent HTTPS flight detail linkEmpty
maxResultsRow limit for this search, from 1 to 5050; form prefill 3
departureDateFlight departure, YYYY-MM-DDToday + 21 days
returnDateReturn date for a round tripDeparture + 7 days
tripTyperoundtrip or onewayroundtrip
checkinHotel arrival, YYYY-MM-DDToday + 21 days
checkoutHotel departure, after arrivalCheck-in + 2 days
adultsAdults, from 1 to 101
childrenChildren, from 0 to 10; assumed age 8 when ages are absent0
childrenv2Flight child ages separated by a pipe, such as 8|5Empty
roomsHotel rooms, from 1 to 81
cabinclasseconomy, premiumeconomy, business or firsteconomy
preferDirectsPrefer direct flights; rows without stop information may remainfalse
includeDetailRequest an optional flight-detail follow-up when availablefalse
sortCompatibility setting; leave empty and sort exported rowsEmpty
marketOnly skyscanner.netskyscanner.net

Dates are calculated when omitted; supplied past dates are rejected, not moved forward. Hotel searches use children with age 8 for each child, not the flight-specific childrenv2 ages. Hotel addresses can be returned without includeDetail.

Flights:

{"origin":"bkk","destination":"sin","maxResults":5}

Destination deals:

{"place":"dxb","maxResults":5}

Hotels:

{"service":"hotels","place":"singapore","maxResults":5}

Hotel details and flight details use placeholders below. Replace the entire placeholder with a current result URL before starting.

{"hotelUrl":"<PASTE_LIVE_HOTEL_URL>","maxResults":1}
{"flightUrl":"<PASTE_LIVE_FLIGHT_URL>","maxResults":1}
  • maxItems and limit are aliases for maxResults.
  • Close field-name misspellings can be corrected; other unknown fields are ignored with a note. Invalid optional filters may be ignored with a warning.
  • The INPUT_REPORT record in the run's key-value store lists filled, corrected and ignored fields and the selected service.
  • Invalid targets or unsupported services stop before any rows are charged. Resolution errors use INVALID_INPUT: <field> — <fix>; later validation errors can be plain messages such as departureDate is in the past; use today or a later date. The start fee still applies.

Output example

Illustrative destination-deal row, not a current fare quote:

{
"listingId": "dealCard_example",
"name": "Singapore",
"service": "flights_seo",
"type": "flights_seo",
"destination": "sin",
"url": null,
"price": 199,
"priceDisplay": "£199",
"currency": "GBP",
"phones": [],
"emails": [],
"leadAbsences": {"phones": "本站无", "emails": "本站无"}
}

Export the dataset as JSON, CSV, Excel, XML, RSS or an HTML table. JSON retains nested values such as addresses and journey legs.

Why use this Skyscanner scraper?

  • Pay per delivered row. Unsuccessful attempts are not billed as rows; the start fee is separate.
  • Keep delivered data. Rows already written remain in the dataset if a run stops. Do not assume unfinished collection has been saved.
  • Inspect input decisions. INPUT_REPORT explains how fields were interpreted; ERROR_SUMMARY records validation or collection failures.
  • See missing data. Contact and address fields can remain empty rather than being inferred from unrelated pages.
  • No proxy setup. You do not need to set up proxies or supply a Skyscanner account.

How much does it cost to scrape Skyscanner?

The Actor uses pay-per-event pricing. The start event costs $0.005 per GB of allocated memory, with a minimum of one event. At the default 512 MB, one start event costs $0.005. Platform usage is included in these prices.

Apify planPrice per rowPrice per 1,000 rows
Free$0.003$3.00
Starter$0.003$3.00
Scale$0.0026$2.60
Business$0.0022$2.20
Platinum$0.002$2.00
Diamond$0.0016$1.60
  • maxResults applies to this run's single search or detail URL. Its default and maximum are 50, not 70. Use separate runs for other targets.
  • The Free plan has a 200-row-per-run allowance and a 10-run limit for this Actor; the stricter 50-row search limit still applies.
  • Set Maximum cost per run (maxTotalChargeUsd in the API) to limit the total charge. A smaller cost allowance may reduce the delivered row count.
  • A zero-row run has no row charge, but still incurs its start fee.

Example: one search delivering 5 rows at 512 MB on the Free plan costs 5 × $0.003 + $0.005 = $0.020, assuming one start event.

What happens when the run timeout is too short

If collection needs longer than your chosen timeout, the run can pause with status ABORTED and the message "Queued on the collection backend; this run will resume automatically when results are ready (about N s)." This message indicates a pause, not a failed search.

When results are ready, the same run resumes, delivers new rows to the same dataset and finishes as SUCCEEDED. Delivery can report "Resumed: delivering N rows." Previously delivered rows are skipped, so resuming does not deliver or charge them twice.

A run can pause this way at most 3 times. Keep the default timeout of 3600 seconds to reduce interruptions. This does not promise recovery from a user cancellation or an unrelated failure.

Synchronous API endpoints (run-sync, run-sync-get-dataset-items) wait at most 300 seconds and can return an empty dataset while a run is paused. For longer jobs, start asynchronously and read the dataset after SUCCEEDED, or use an ACTOR.RUN.SUCCEEDED webhook.

Use with AI agents and the API

Apify MCP server (Claude, ChatGPT, Cursor, VS Code)

Add this Actor to an MCP client that supports remote servers:

https://mcp.apify.com?tools=lentic_clockss/skyscanner-scraper

Sign in with Apify through OAuth, or send Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool starts a run and returns run and dataset IDs; the agent can then read rows with get-dataset-items.

For clients without remote support, run npx @apify/actors-mcp-server --tools lentic_clockss/skyscanner-scraper with the APIFY_TOKEN environment variable.

Example prompt: "Use Skyscanner Scraper to collect five destination-deal rows for Dubai with place dxb. Return the prices in a table."

Apify API

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("lentic_clockss/skyscanner-scraper").call(
run_input={"place": "dxb", "maxResults": 5}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('lentic_clockss/skyscanner-scraper').call({
place: 'dxb', maxResults: 5
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Over HTTP, send input JSON to POST https://api.apify.com/v2/acts/lentic_clockss~skyscanner-scraper/runs with an Authorization: Bearer <YOUR_APIFY_TOKEN> header. Read rows with GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json after success. If a waiting SDK call returns during a pause, wait for the resumed run before reading its final dataset.

Integrations

Connect results to Google Sheets, Make, Zapier, n8n, Slack, Airtable or a webhook through the Actor's Integrations tab. Use Apify Schedules for repeated searches.

FAQ

This Actor collects public guest data. You are responsible for checking site terms and applicable data-protection law; personal data needs a lawful basis. Public access alone does not grant unrestricted reuse rights.

Why did my run end as ABORTED?

Read the status message. If it says results are queued and the run will resume, wait for the same run to finish. An unrelated abort is not proof that automatic resumption will happen.

How many results can I get?

Request 1–50 rows for one search. Availability, missing required fields and your cost allowance may produce fewer. Detail mode reads one supplied page rather than expanding into a new search.

Why are some fields empty?

A page may omit addresses, ratings, contact information or prices. Guest search listings generally lack partner phone numbers and emails; available detail-page contacts are included only when published.

Can I scrape flights, hotels and cars in one run?

No. Each run selects one service and target. Run flights and hotels separately. Cars and packages are not available.

Is this the official Skyscanner API?

No. This is an independent Actor for public listings, not Skyscanner's official API or a booking service.

Why did my search return no rows?

There may be no matching listings, an unrecognised place or an unsupported search. Check RUN_SUMMARY for the reason and ERROR_SUMMARY if collection failed. A zero-row search is not proof that no inventory exists.

Do I need my own proxies or a login?

No. You do not need to set up proxies or supply account credentials for the supported guest searches.

Limitations

  • Only the skyscanner.net English/GBP market is supported, not skyscanner.com or arbitrary subdomains.
  • Detail links must be current HTTPS links on the supported hosts; relative links are rejected.
  • Prices and availability can change. Rows do not reserve tickets or rooms.
  • Results can be partial. The requested row count, optional detail follow-ups and every optional field are not guaranteed.
  • Direct-flight preference can retain rows whose stop information is missing.
  • Unknown place names are not automatically translated into supported destinations.

More travel, hotel and flight scrapers from the same publisher:

Browse all of our scrapers at apify.com/lentic_clockss.

Support

Found a problem or need another field? Open an issue in the Issues tab of this Actor's page and include the run ID and the input you used.