Skyscanner Scraper | Flights, Hotels & Destination Deals
Pricing
from $2.20 / 1,000 results
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
Maintained by CommunityActor stats
1
Bookmarked
4
Total users
1
Monthly active users
15 hours ago
Last modified
Categories
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 usingoriginanddestination. - Destination deals (
flights_seo): collect flights-to deal cards usingplace. - Hotels (
hotels): search a city usingentityId,geoId, or a supported city name. - Hotel details (
hotel_detail): read one existinghotelUrl. - Flight details (
flight_detail): read one existingflightUrl.
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
| Field | Description | Example |
|---|---|---|
listingId | Source identifier | dealCard_example |
name | Airline, destination or hotel name | Singapore |
service | Selected service | flights_seo |
type | Kind of row | flights_seo |
url | Source link, when available | null |
price | Numeric displayed price | 199 |
priceDisplay | Price text | £199 |
currency | Currency code | GBP |
scrapedAt | Collection time in UTC | 2026-10-24T08:00:00Z |
phones | Published phone numbers, otherwise empty | [] |
emails | Published email addresses, otherwise empty | [] |
leadAbsences | Reasons 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
| Field | Description | Example |
|---|---|---|
origin | Flight origin code | bkk |
destination | Flight destination or deal-page code | sin |
itineraryConfigId | Identifier from a flight detail link | example-config-id |
carrierNames | Airline names, when supplied | ["Scoot"] |
legs | Journey legs, including stop information when available | [] |
org.name | Airline or booking partner shown by the source | Scoot |
Hotels and hotel details
| Field | Description | Example |
|---|---|---|
hotelId | Hotel identifier, distinct from the city's identifier | 105605419 |
address.full | Published hotel address | null |
geo.lat | Latitude | 1.2834 |
geo.lng | Longitude | 103.8607 |
stars | Hotel star rating | 5 |
reviewScore | Source review score | 4.5 |
reviewCount | Number of reviews reported | 120 |
pricePerNightRaw | Nightly amount when supplied | 150 |
priceTotalRaw | Stay total when supplied | 300 |
partnerNames | Booking 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
- Open Skyscanner Scraper in Apify Console.
- Fill one target, such as
place, and leaveserviceonauto. - Set
maxResultsto5for a small first run. - Click Start and wait for the run to finish.
- 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
| Field | What to enter | Default |
|---|---|---|
service | auto or one of the five services above | auto |
origin | Flight origin code; also accepts bkk|sin | bkk when omitted |
destination | Flight destination code | sin when omitted |
place | Supported destination code or city name | Empty |
placeSlug | Slug from a real flights-to URL for an unfamiliar code | Empty |
entityId | Hotel-search city identifier or supported city name | Empty |
geoId | Alternative city identifier for hotels | Empty |
hotelUrl | Current HTTPS hotel detail link | Empty |
flightUrl | Current HTTPS flight detail link | Empty |
maxResults | Row limit for this search, from 1 to 50 | 50; form prefill 3 |
departureDate | Flight departure, YYYY-MM-DD | Today + 21 days |
returnDate | Return date for a round trip | Departure + 7 days |
tripType | roundtrip or oneway | roundtrip |
checkin | Hotel arrival, YYYY-MM-DD | Today + 21 days |
checkout | Hotel departure, after arrival | Check-in + 2 days |
adults | Adults, from 1 to 10 | 1 |
children | Children, from 0 to 10; assumed age 8 when ages are absent | 0 |
childrenv2 | Flight child ages separated by a pipe, such as 8|5 | Empty |
rooms | Hotel rooms, from 1 to 8 | 1 |
cabinclass | economy, premiumeconomy, business or first | economy |
preferDirects | Prefer direct flights; rows without stop information may remain | false |
includeDetail | Request an optional flight-detail follow-up when available | false |
sort | Compatibility setting; leave empty and sort exported rows | Empty |
market | Only skyscanner.net | skyscanner.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}
maxItemsandlimitare aliases formaxResults.- 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_REPORTrecord 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 asdepartureDate 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_REPORTexplains how fields were interpreted;ERROR_SUMMARYrecords 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 plan | Price per row | Price 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 |
maxResultsapplies 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 (
maxTotalChargeUsdin 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 ApifyClientclient = 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
Is it legal to scrape Skyscanner?
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.netEnglish/GBP market is supported, notskyscanner.comor 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.
Related scrapers
More travel, hotel and flight scrapers from the same publisher:
- Trip.com Scraper — Hotels Flights Trains Cars
- Traveloka Scraper
- Expedia Scraper
- Agoda Scraper — Hotels, Flights, Packages & More
- Despegar Scraper
- TripAdvisor Scraper — Hotels, Restaurants & More
- Airbnb Listings Scraper
- Booking.com Hotels Scraper
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.