Expedia Scraper - Hotels, Flights, Cars & Packages
Pricing
from $2.20 / 1,000 results
Expedia Scraper - Hotels, Flights, Cars & Packages
Extract Expedia hotel, flight, car rental, vacation package and activity offers from regional sites. Get prices, ratings and listing URLs. Pay per delivered row plus a start fee; cruises are unavailable.
Pricing
from $2.20 / 1,000 results
Rating
0.0
(0)
Developer
kane liu
Maintained by CommunityActor stats
0
Bookmarked
14
Total users
8
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
Expedia Scraper
Extract Expedia hotel, flight, car rental, vacation package and activity offers from regional sites as rows you can export.
- Listing names, URLs, prices and currencies.
- Hotel ratings, review counts and available property details.
- Flight times, airports and fare information.
- Regional searches with destination, dates and traveler settings.
- Pay for delivered rows: $3.00 per 1,000 rows on the Free plan, plus a small start fee.
What does Expedia Scraper do?
Expedia Scraper collects travel search offers for price comparisons, availability research and scheduled monitoring. Each row represents one offer or entity, identified by rowType and id. Choose one service and one destination or route per run.
- Hotels: destination searches with stay dates and room counts.
- Flights: one-way or round-trip searches with an origin and destination.
- Cars: rental searches with pickup destination and dates.
- Packages: flight-and-hotel offers with an origin and stay destination.
- Activities: things to do at a destination.
Cruises are unavailable. Supported regional hosts are www.expedia.com, www.expedia.co.uk, www.expedia.ca, www.expedia.com.au, www.expedia.de, www.expedia.fr, www.expedia.it, www.expedia.es, www.expedia.nl, www.expedia.ie, www.expedia.co.jp, www.expedia.com.sg, www.expedia.com.hk, www.expedia.com.tw, www.expedia.com.my, www.expedia.co.th, www.expedia.co.id, www.expedia.co.in, www.expedia.com.mx, www.expedia.com.br and www.expedia.com.ar. Coverage varies by service and market; an accepted domain does not guarantee offers for every search.
What data can you extract from Expedia?
The shared fields apply across row types. Service-specific tables describe additional fields when Expedia provides them. Examples illustrate the format, not live quotes.
Shared fields
| Field | Description | Example |
|---|---|---|
rowType | Entity type | hotel |
id | Entity identifier, used with rowType | 12345678 |
listingId | Listing identifier; flight identifiers are generated | 12345678 |
name | Listing or offer name | Example Downtown Hotel |
url | Offer page; flights use the search page | https://www.expedia.com/Hotel-Search |
price | Main displayed price; meaning depends on service | 189 |
priceDisplay | Price text as displayed | $189 nightly |
currency | Price currency | USD |
rating | Guest rating, generally out of ten | 8.8 |
reviewCount | Number of reviews shown | 1240 |
sponsored | Whether the offer is an advertisement | false |
domain | Regional Expedia host searched | www.expedia.com |
destination | Search destination | Austin |
country | Country explicitly supplied with details, not the search market | US |
scrapedAt | Collection timestamp | 2026-10-24T08:00:00+00:00 |
Hotel rows: hotel
| Field | Description | Example |
|---|---|---|
priceNightly | Explicit nightly price, as a number or text | 189 |
totalPrice | Numeric stay total when available | 420 |
starRating | Property star rating | 4 |
address | Available city, postal code and country; not necessarily a street address | Austin, US |
amenities | Up to 40 amenity descriptions | ["Free WiFi"] |
needToKnow | Available hotel policy text | ["Check-in starts at 3 PM"] |
Flight rows: flight
| Field | Description | Example |
|---|---|---|
airline | Carrier name | Example Airline |
departTime | Displayed local departure time | 8:00am |
arriveTime | Displayed local arrival time | 11:15am |
originAirport | Departure airport | JFK |
destAirport | Arrival airport | LAX |
stops | Displayed stop count | Nonstop |
priceBasis | Explicit one-way or round-trip fare basis | oneway_per_traveler |
Car rows: car
| Field | Description | Example |
|---|---|---|
supplierName | Rental supplier | Example Rentals |
priceTotal | Rental total when shown | $180 total |
For cars, price is the displayed daily rate, not the rental total.
Package rows: package
| Field | Description | Example |
|---|---|---|
price | Flight-and-hotel package price per traveler | 650 |
totalPrice | Package total for all travelers | 1300 |
Activity rows: activity
| Field | Description | Example |
|---|---|---|
supplierName | Activity operator | Example Tours |
duration | Displayed activity duration | 2 hours |
freeCancellation | Cancellation flag or text, when supplied | true |
address | Meeting or redemption location, when available | Visitor center |
Activity price is the displayed starting price. Optional values can be absent or empty.
How to scrape Expedia
- Open Expedia Scraper in Apify Console.
- Choose
service, then enterdestination; addoriginfor flights or packages. - Set
maxResultsto3for a small first run and review your dates. - Click Start and wait for completion.
- Download the dataset or retrieve its rows through the API.
An empty input starts the prefilled hotel example for Tulsa, OK, limited to three rows. Normal start and row charges apply. Entering only destination or regionId uses hotels; the Actor does not infer flights or packages from an origin. Select those services explicitly.
Hotels
Use destination, optionally with a numeric Expedia regionId. Empty stay dates mean check-in 21 days ahead and checkout two days later.
Flights
Set service to flights with both origin and destination. Empty departure dates mean 28 days ahead. For tripType set to roundtrip, an empty return date means seven days after departure.
Cars
Set service to cars, enter the pickup destination and use checkin and checkout for rental dates. Empty dates use the same two-day window as hotels.
Packages
Set service to packages, supply origin and destination, and choose stay dates. Prices describe a flight-and-hotel package, not a hotel-only stay.
Activities
Set service to activities and enter a destination. This search does not use a stay-date window.
What to fill in
| Field | What to enter | Default |
|---|---|---|
destination | City, region or arrival airport | Empty; example uses Tulsa, OK |
regionId | Numeric Expedia region identifier | Empty |
service | hotels, flights, cars, packages or activities | hotels |
origin | Departure city or airport for flights and packages | Empty |
domain | Supported regional Expedia host | www.expedia.com |
checkin | Stay or pickup date, YYYY-MM-DD | 21 days ahead |
checkout | Later stay or dropoff date | Two days after check-in |
departureDate | Flight departure date, YYYY-MM-DD | 28 days ahead |
returnDate | Later return date for round trips | Seven days after departure |
tripType | oneway or roundtrip | oneway |
adults | Adult count, 1–10 | 2 |
children | Child count, 0–10 | 0 |
rooms | Hotel room count, 1–10 | 1 |
maxResults | Row limit, 1–500 | 70; form prefill 3 |
currency | Optional currency override, such as GBP | From domain |
locale | Optional locale override, such as en_GB | From domain |
sort | Hotel sort value | RECOMMENDED |
includeSponsored | Include advertisement rows on the HTML page lanes; the primary JSON channel serves no sponsored cards | false |
proxyCountry | Legacy compatibility field; choose the market with domain | Empty |
Hotels:
{"service": "hotels","destination": "Austin","maxResults": 3}
Flights:
{"service": "flights","origin": "JFK","destination": "LAX","tripType": "oneway","maxResults": 3}
Cars:
{"service": "cars","destination": "Los Angeles","maxResults": 3}
Packages:
{"service": "packages","origin": "Chicago (ORD)","destination": "Las Vegas","maxResults": 3}
Activities:
{"service": "activities","destination": "London","domain": "www.expedia.co.uk","maxResults": 3}
maxItems and limit are aliases for maxResults. Destination aliases include location, city, query and searchTerm. Close field-name misspellings can be corrected; other unknown fields are ignored with a note. The INPUT_REPORT record in the default key-value store records how input was interpreted, including filled, corrected and ignored fields.
Invalid destinations, services or dates can stop the run with an INVALID_INPUT: message naming the problem and fix. Validation happens before row collection, so no rows are charged for these input failures; the start fee can still apply. Invalid optional filters can instead be ignored, so check INPUT_REPORT.
Use today or a later date, with checkout or return after the first date. Start dates cannot be more than 500 days ahead. Empty-date defaults move forward with each run; there is no automatic widening of a search window.
Output example
Illustrative hotel row:
{"rowType": "hotel","id": "12345678","source": "expedia","service": "hotels","listingId": "12345678","name": "Example Downtown Hotel","url": "https://www.expedia.com/Austin-Hotels-Example.h12345678.Hotel-Information","destination": "Austin","domain": "www.expedia.com","price": 189,"priceNightly": 189,"priceDisplay": "$189 nightly","currency": "USD","rating": 8.8,"reviewCount": 1240,"sponsored": false,"scrapedAt": "2026-10-24T08:00:00+00:00"}
Export the dataset as JSON, CSV, Excel, XML, RSS or an HTML table. Use JSON to preserve array fields such as amenities.
Why use this Expedia scraper?
- Row-based billing: pay for rows written to the dataset, plus the start fee, rather than pages attempted.
- Useful partial output: rows already delivered remain in the dataset if a run stops. Available partial results can also be delivered when collection ends early.
- Clear limits: missing optional data stays empty rather than being invented; rows without a usable name, identifier or numeric price are skipped.
- Repeatable comparisons: keep destination, dates, party size and currency consistent across scheduled runs.
- No proxy setup: you do not need to set up proxies.
How much does it cost to scrape Expedia?
The Actor uses pay-per-event pricing. An Actor start event costs $0.005, with one event per GB of memory and a minimum of one event. At the default 256 MB, the start fee is $0.005. Platform usage is included in these prices.
| Apify plan | Start fee at 256 MB | Price per row | Price per 1,000 rows |
|---|---|---|---|
| Free | $0.005 | $0.003 | $3.00 |
| Starter | $0.005 | $0.003 | $3.00 |
| Scale | $0.005 | $0.0026 | $2.60 |
| Business | $0.005 | $0.0022 | $2.20 |
| Platinum | $0.005 | $0.002 | $2.00 |
| Diamond | $0.005 | $0.0016 | $1.60 |
maxResults applies to each input: this Actor accepts one destination search or route per run. The default is 70 rows, with larger requests collected in parts of 70, up to the input maximum of 500. All row types count toward the same limit. Fewer rows may be available.
Free Apify plan runs are capped at 200 rows, and the free allowance permits 10 runs of this Actor. Set Maximum cost per run to control total spending (maxTotalChargeUsd in the API); the run stops delivering when its budget is exhausted.
Example: 100 delivered hotel rows on the Free plan at 256 MB cost 100 × $0.003 + $0.005 = $0.305. Requesting 100 but receiving 20 costs $0.065, including the same start fee.
What happens when the run timeout is too short
When a search needs more time than remains, the Actor can pause for automatic resumption rather than fail solely because of the short timeout. Its status message is "Queued on the collection backend; this run will resume automatically when results are ready (about Ns)." Here, N is the estimated number of seconds. The run temporarily shows ABORTED.
When results are ready, the same run resumes, reports "Resumed: delivering N rows.", writes to the same dataset and finishes as SUCCEEDED if delivery succeeds. Previously delivered rows are skipped rather than delivered or charged twice. No manual restart is needed for this pause.
- Automatic pauses are limited to three per run. Keep the default 3,600-second timeout to reduce pauses.
- The synchronous API endpoints
run-syncandrun-sync-get-dataset-itemswait at most 300 seconds and can return an empty dataset while the run is paused. - For longer searches, start asynchronously and read the dataset after
SUCCEEDED, or use a run-succeeded webhook. An unrelated collection failure is not a successful pause.
Use with AI agents and the API
Apify MCP server
Claude, ChatGPT, Cursor and VS Code can use this Actor through an MCP client supporting remote servers:
https://mcp.apify.com?tools=lentic_clockss/expedia-scraper
Sign in with Apify through OAuth when prompted, or send Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool returns run and dataset IDs; the agent reads rows with get-dataset-items. Clients without remote support can use npx @apify/actors-mcp-server --tools lentic_clockss/expedia-scraper with APIFY_TOKEN configured.
Example prompt: "Find three Expedia hotels in Austin using the default stay dates, and return their names, prices, currencies and URLs."
Apify API
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("lentic_clockss/expedia-scraper").call(run_input={"service": "hotels", "destination": "Austin", "maxResults": 3})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/expedia-scraper').call({service: 'hotels', destination: 'Austin', maxResults: 3});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Over HTTP, send the input JSON to POST https://api.apify.com/v2/acts/lentic_clockss~expedia-scraper/runs with an Authorization: Bearer <YOUR_APIFY_TOKEN> header. Retrieve rows through GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json after completion.
Integrations
Use the Integrations tab for workflows with Google Sheets, Make, Zapier, n8n, Slack, Airtable or webhooks. Apify Schedules can run recurring searches; leave dates empty for moving default dates rather than reusing expired dates.
FAQ
Is it legal to scrape Expedia?
This unofficial Actor collects public travel data and is not affiliated with Expedia Group. You are responsible for Expedia's terms, applicable law and data-protection requirements. Any personal data requires a lawful basis for its use.
Why did my run end as ABORTED?
Check the status message. The automatic-resumption message above describes a temporary pause, not a completed failure. A manually aborted run or a different error should not be assumed to resume.
How many results can I get?
Request 1–500 rows for one search. The default is 70, while the form prefill is three. Free-plan and spending limits can lower delivery, and Expedia may have fewer matching offers.
Why are some fields empty?
Expedia does not show every optional field for every offer. Hotel details such as stars, amenities and addresses are best-effort additions, not guaranteed values. An empty country is not filled from the search market.
Does this Actor cover flights and cars too?
Yes. Select flights or cars explicitly. Flights require an origin and destination; car searches use a pickup destination. Cruises remain unavailable, and car quote coverage can be limited.
Why do two price fields disagree?
They may describe different units: nightly versus whole-stay cost, daily rental versus rental total, or per-traveler versus full-package cost. For flights, check priceBasis; an unknown basis is not guessed.
Can I search several destinations at once?
No. This input accepts one destination or route, not an array. Use separate runs or scheduled tasks for different destinations.
Does a zero-row run mean an error?
Not always. A confirmed no-match search or unrecognized destination can finish successfully with zero rows and a reason. Collection failures are reported separately. The start fee still applies even when there are no row charges.
Limitations
- Cruises and unlisted regional domains are unsupported.
- Service availability differs across markets; no search guarantees the requested row count.
- Hotel detail additions cover up to 20 rows per collection part and may stop earlier. Hotel addresses need not include street details.
- Amenity lists are capped at 40 entries;
amenitiesTotalrecords the original count when truncated. - Flight identifiers are generated from offer details and may change with the price.
- Prices are search-time offers, not booking guarantees. Compare equivalent dates, travelers, currencies and price units.
Related scrapers
More travel, hotel and flight scrapers from the same publisher:
- Trip.com Scraper — Hotels Flights Trains Cars
- Traveloka Scraper
- Skyscanner 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
Report a problem or request a field through the Issues tab of this Actor's page. Include the run ID and the input you used.