Expedia Scraper: Public Expedia Pages via API
Get Expedia's written permission first: its terms require it for automated access, and no setup guarantees you will not be blocked. With it, ProxyField's Web Scraping API fetches public Expedia hotel, flight and review pages for $2.00 per 1,000 successful results with JS rendering, or $1.00 from 10,000 results in one purchase; pages that need no browser cost $0.50 per 1,000, from $0.20. The API is in development: contact sales, or run your own scraper on residential proxies with the Easy Trial, 1 GB for $2.95.
Through the sales team on our 24/7 live chat
| Fetch | Entry | Volume, from |
|---|---|---|
| HTTP | $0.50 | $0.20 |
| JS rendering | $2.00 | $1.00 |
Billed on successful results only.
One hotel across many check-in dates: send one hotel URL per check-in and check-out pair, with the guests, the length of stay and the country fixed; render it, wait for the price element and spread the dates over the day. Store the total with taxes and fees as shown, the currency, both dates and the time of the check. A 90-date sweep costs $0.18; 500 hotels × 2 date pairs a day is 30,000 pages a month, $60.
Expedia's rule first. Expedia's terms of use say you may not, "without our express written, prior permission", access or copy content "using any robot, spider, scraper or other automated means", or impose "an unreasonable or disproportionately large load" on its infrastructure (Expedia Group terms of use, "Last Modified: July 22, 2026"). The same list forbids attempts to "bypass or circumvent other measures employed to prevent or limit access". So get that permission, or use Expedia Group's partner API if you sell travel (below), before you automate. ProxyField's rule for every site is the same: public pages only, and follow the site's terms.
Pull one hotel across many check-in dates
A date sweep is one request per check-in and check-out pair for the same property, with everything else fixed, so the only thing that changes between rows is the date.
| Keep fixed | Change per request | Store with each price |
|---|---|---|
| the hotel (its Expedia hotel id), adults and rooms | check-in date | check-in and check-out dates |
the Expedia country site and the request's country | check-out date (fixed length of stay) | the total with taxes and fees as shown, and the currency |
| the length of stay, such as 2 nights | the time of the check and the response id |
Read moreShow less
-
Copy the hotel URL from your browser after one search: it carries the hotel id and the dates. Change only the two date values in it.
-
Pick the dates for example the next 90 check-in dates with a 2-night stay is 90 URLs.
-
Send them as one batch with JS rendering on and
wait_forset to the element that holds the price, so the page counts as loaded only once rates are on it. -
Spread the sweep over the day instead of firing all dates at once: the API runs up to 20 concurrent requests per account, and Expedia's terms forbid a disproportionate load.
-
Parse and store the price, the dates, the currency and the check time; a missing price means the property had no rate for those dates or the page changed, so log it rather than retry it in a loop.
# Build a date sweep for one hotel as a batch of Web Scraping API jobs.
# The request format is the API's design (see /docs/api/); access through Contact sales.
import datetime as dt, json
HOTEL_URL = ("https://www.expedia.co.uk/Lisbon-Hotels-<Hotel>.h<id>.Hotel-Information"
"?chkin={checkin}&chkout={checkout}&rm1=a2") # copy yours from the browser
NIGHTS, DAYS = 2, 90
start = dt.date(2026, 12, 1)
items = []
for i in range(DAYS):
checkin = start + dt.timedelta(days=i)
checkout = checkin + dt.timedelta(days=NIGHTS)
items.append({"url": HOTEL_URL.format(checkin=checkin, checkout=checkout),
"tag": f"{checkin}/{checkout}"})
body = {"api": "web_scrape",
"params": {"render": True, "country": "gb", "output": "html",
"wait_for": "<CSS selector of the price element>"},
"items": items, # up to 1,000 per batch
"callback_url": "https://your-server.example/expedia-callback"}
print(json.dumps(body)[:300])
# POST it to https://api.proxyfield.io/v1/jobs/batch with "Authorization: Bearer <api_key>"Each finished job is sent to your callback, signed, and kept for 48 hours. A 90-date sweep is 90 results: $0.18 at $2.00 per 1,000. Parameter reference: API documentation.
What keeps a sweep reliable is the request, not tricks: JS rendering, a wait for the price element, one country, and a pace the site can carry. With the API, a blocked request is retried on new IPs within its timeout and the retries are not billed. With your own scraper, keep one sticky session (30 s to 36 h) for the steps of one search, back off when you get a 429 or a 403, and stop when you are refused rather than switching IPs. More in web scraping without getting blocked.
Expedia's partner API or a scraper?
If you sell Expedia inventory, apply for the partner API instead of scraping. Expedia Group's API access, such as its Rapid API for lodging content and rates, is for approved travel businesses that sell Expedia inventory under a partner agreement, within the call limits set for their integration. A scraper reads the public pages a visitor sees, and Expedia's terms ask for its written permission before you automate that.
| Item | Expedia partner API | Web Scraping API |
|---|---|---|
| Who can use it | Approved travel partners | ProxyField customers, within each site's terms |
| Data | Lodging content, rates and booking, as the agreement allows | Public search, hotel, review and flight pages |
| Permission from Expedia | The partner agreement | Expedia's terms require express written, prior permission for automated access |
| Billing | Set by the agreement | Per 1,000 successful results |
Expedia data on public pages
Expedia sells hotels, flights, car rentals, vacation rentals and packages, and shows any visitor the prices for a search with dates. You need no account to read search results, hotel pages or guest reviews; member prices and your trips need a sign-in and are out of scope.
| Page type | Example URL | What the public page shows |
|---|---|---|
| Hotel search results | expedia.com/Hotel-Search?destination=…&startDate=…&endDate=…&adults=2 | Hotel name, star rating, guest score, price for the dates, taxes note, cancellation terms, a link to each hotel |
| Hotel page | expedia.com/<City>-Hotels-<Hotel>.h<id>.Hotel-Information | Room types, rate for each, meal and cancellation terms, amenities, location, policies |
| Guest reviews | on the hotel page | Score out of 10, review text, trip type, stay month |
| Flight search results | expedia.com/Flights-Search?… | Airlines, times, stops, duration, fare per passenger, fare class |
| Car rentals and activities | search result pages | Supplier, vehicle or activity, price for the dates |
The API returns the page itself as HTML, Markdown or plain text, or a JSON envelope with the status code, the final URL, the headers, the cookies and the content; it has no parsed Expedia fields, so your parser reads them.
How the Web Scraping API fetches an Expedia page
Expedia builds its search results and room rates with scripts after the page loads, so send Expedia URLs with JS rendering on; the API returns the rendered page. The API takes a POST to https://api.proxyfield.io/v1/scrape with your API key in an Authorization: Bearer <api_key> header and a JSON body: url, render (false for plain HTTP, true for JS rendering), country and output (html, markdown, text or json); wait_for waits until a CSS selector, such as the first result card, appears in the rendered page.
# The request the Web Scraping API takes (in development; access through Contact sales)
curl https://api.proxyfield.io/v1/scrape \
-H "Authorization: Bearer <api_key>" \
-H "Content-Type: application/json" \
-d '{"url": "https://www.expedia.co.uk/Hotel-Search?destination=Lisbon&startDate=2026-12-04&endDate=2026-12-06&adults=2", "render": true, "country": "gb", "output": "json"}'Example response (shortened; content is the rendered page's HTML):
{
"metadata": {"id": "req_8e3a6d1f0c5b2947", "api": "web_scrape", "status": "success", "billed": true},
"status_code": 200,
"final_url": "https://www.expedia.co.uk/Hotel-Search?destination=Lisbon&startDate=2026-12-04&endDate=2026-12-06&adults=2",
"content_type": "text/html; charset=utf-8",
"content": "<!DOCTYPE html><html lang=\"en-GB\">…</html>"
}| Choice | Price per 1,000 successful results | Use it for |
|---|---|---|
| JS rendering | $2.00, or $1.00 from 10,000 results in one purchase | Hotel and flight searches, room rates, reviews that load on scroll |
| Plain HTTP | $0.50, or $0.20 from 10,000 results in one purchase | Hotel facts that ship in the HTML, such as name, address and amenities |
Pricing: $2.00 per 1,000 Expedia pages, from $1.00
Expedia pages cost the Web Scraping API's JS rendering price: $2.00 per 1,000 successful results, or $1.00 from 10,000 results in one purchase; pages that need no browser cost $0.50 per 1,000, from $0.20. You pay only for successful results.
Billed: a page Expedia answered with a 2xx status. Not billed: blocked requests, timeouts and errors on our side, and our internal retries. Every response says whether it was billed. A target's 404 or 410, and a sign-in page the site serves with a 200 status, count as billed results. Contact sales through the sales team on our 24/7 live chat.
One result is one page: a search that loads more results on a second page counts twice. Payment and balance: the same crypto balance as proxies, which never expires; there is no subscription or monthly fee. All prices: pricing.
Through the sales team on our 24/7 live chat
| Workload (30-day month) | Results | JS rendering at $2.00 | At $1.00 (10,000+ in one purchase) |
|---|---|---|---|
| 1 hotel × 90 check-in dates, daily | 2,700 | $5.40 | $2.70 |
| 500 hotels × 2 date pairs, daily | 30,000 | $60 | $30 |
| 100 routes × 30 departure dates, weekly (4 runs) | 12,000 | $24 | $12 |
| 2,000 hotel review pages, once | 2,000 | $4 | $2 |
Why the same hotel has many Expedia prices
An Expedia price depends on who asks. Expedia runs a separate site per country, such as expedia.com, expedia.co.uk and expedia.de, each with its own currency, taxes display and offers, and prices change with the dates, the number of guests, the length of stay and member status. To collect what travelers in one market see, send the search from that country: ProxyField residential proxies offer targeting by country, region (state) and city, with 412M+ residential IPs in 195+ countries, for example the United Kingdom or Germany. In the Web Scraping API, country sets the country the request comes from, as a two-letter code such as gb; it accepts the proxy pool's 195+ countries.
Why Expedia is hard to scrape
Large travel sites like Expedia commonly limit automated traffic: fast searches from one IP, datacenter ranges and clients without normal browser behaviour are the usual triggers for a challenge or an error instead of results. Results also load in stages as the page scrolls, so a scraper has to wait for them. With your own scraper, use a headless browser, keep a modest pace, spread searches over rotating residential IPs, and keep one sticky session for the steps of one search. Error codes explained: errors.
What teams use Expedia data for
- Rate parity checks whether a hotel's price on Expedia matches its own site and other booking sites.
- Revenue management competing hotels' rates for the same nights.
- Review analysis guest scores and complaints across a city's hotels.
- Fare and package research flight and bundle prices by route, date and market.
Booking, holding rooms or reselling inventory through a scraper is not data collection; fraud and fake accounts are forbidden under ProxyField's acceptable use policy. Proxies for running other travel work yourself: travel proxies.
Scrape Expedia with Python and ProxyField proxies
This script opens one Expedia hotel search in a real browser through a residential IP and prints the hotel names and prices it finds. Playwright runs the page's scripts, which a plain HTTP request would not.
import re
from playwright.sync_api import sync_playwright
URL = ("https://www.expedia.com/Hotel-Search?destination=Chicago"
"&startDate=2026-12-10&endDate=2026-12-12&adults=2")
with sync_playwright() as p:
browser = p.chromium.launch(proxy={
"server": "http://gate.proxyfield.io:7000",
"username": "<login>-country-us-city-new_york-session-exp01-ttl-600",
"password": "<password>"})
page = browser.new_page(locale="en-US")
page.goto(URL, wait_until="networkidle", timeout=90_000)
page.mouse.wheel(0, 4000) # load the next results
page.wait_for_timeout(3000)
names = [h.inner_text() for h in page.locator("h3").all()][:10]
prices = re.findall(r"\$\d[\d,]*", page.inner_text("body"))[:10]
print(names)
print(prices)
browser.close()-session-exp01-ttl-600 keeps one IP for 10 minutes, the length of one search; every part after the login is optional, and a session without ttl lasts 20 minutes. Access opens once the payment is confirmed; the gateway, credentials or allowlist are in your account. Residential proxies cost $2.95/GB for 1 GB and from $1.95/GB at volume, with unlimited concurrent threads; the traffic never expires, and all purchases are final. More on browser automation: Playwright.
Is it legal to scrape Expedia?
Expedia's terms of use forbid automated access to its sites without its express written, prior permission, so scraping without it breaches the terms, separate from whether it breaks a law. Rates and availability are facts; hotel descriptions, photos and guest reviews can be protected by copyright, and reviewer names are personal data under GDPR in the EU and UK. Ask Expedia for permission or partner access, collect public facts only and keep personal data out. The wider answer is in Is Web Scraping Legal? US, EU and UK Rules (2026).
ProxyField's acceptable use policy allows collecting public web data, price monitoring and market research, and forbids accessing data behind logins you are not entitled to. ProxyField's rule for every site: public pages only, and follow the site's terms. This is not legal advice.
More scrapers
- Flight and hotel scraper Booking.com, Skyscanner, Kayak, Orbitz and other travel sites on the same API.
- Hotel price scraper room rates and fares across sites.
- airline fare scraper room rates and fares across sites.
- Airbnb scraper rentals, reviews and rankings.
- Travel review scraper hotel, restaurant and attraction reviews.
- Google Flights scraper fares from Google's flight search.
- All scraper APIs
Expedia Scraper FAQ
24/7 support by live chat, including help with setup and integration.
What is an Expedia scraper API?
ProxyField has no separate Expedia API, but its Web Scraping API fetches public Expedia hotel, flight and review pages with JS rendering for $2.00 per 1,000 successful results, or $1.00 from 10,000 results in one purchase. You send the search or hotel URL, get the rendered page back and parse the rates yourself; you pay only for successful results. The API is in development, through Contact sales.
How do I pull Expedia hotel prices for the same property across many check-in dates without getting blocked?
First get Expedia's written permission, which its terms require for automated access; no setup guarantees you will never be blocked. Then send one hotel URL per check-in and check-out pair, keep the guests, length of stay and country fixed, render each page and wait for the price element, and spread the dates over the day; store the total with taxes and fees as shown, the currency, both dates and the check time. On ProxyField's Web Scraping API, 90 dates for one hotel cost $0.18 at $2.00 per 1,000 successful results, and blocked requests are not billed.
How do I scrape Expedia?
Build the search URL with the destination, dates and guests, load it in a headless browser or with JS rendering, scroll until the results have loaded, then read each hotel's name, score and price. Send the search from the market whose prices you want, repeat it on a schedule, and check Expedia's terms first: they require written permission for automated access.
What data can you extract from Expedia?
Hotel names, star ratings, guest scores, prices for given dates, room types and rates, cancellation and meal terms, amenities and reviews, plus flight fares, car rentals and activities. Member prices and anything in your account need a sign-in and are out of scope.
Does Expedia have a public API?
Not an open one: Expedia Group gives API access, such as its Rapid API for lodging, to approved travel partners under an agreement, with call limits set for each integration. Anyone else reads the public pages, with the written permission Expedia's terms ask for.
How do I scrape Expedia reviews at scale?
Open each hotel page with JS rendering, load the reviews section and read the score, text, trip type and stay month of each review. Keep a modest pace, and keep reviewer names out of your dataset unless you need them, because they are personal data.
How do I collect Expedia flight prices programmatically?
Build flight search URLs for each route, date and passenger count, load them with JS rendering and read the airline, times, stops and fare from each result. Fix the country of the request, because expedia.com, expedia.co.uk and other country sites show their own prices.
How is Expedia scraping priced?
On ProxyField's Web Scraping API you pay per 1,000 successful results: $2.00 with JS rendering, which Expedia searches need, or $1.00 from 10,000 results in one purchase. Checking 500 hotels for 2 date pairs every day is 30,000 pages a month, $60, or $30 at the volume price.
Does Expedia use JavaScript for content?
Yes: search results, room rates and parts of the reviews load with scripts after the page opens, and more results load as you scroll. A plain HTTP request gets the page frame without most prices, so use a headless browser or JS rendering.
What headers should I use when scraping Expedia?
Send the headers a real browser sends: a current User-Agent, Accept, Accept-Language that matches the country of your IP, and the cookies the site sets during the session. A headless browser sends them for you, which is one reason it works better on Expedia than a bare HTTP client.
Show 7 more questionsShow fewer questions
How do I integrate an Expedia scraper with Python, Node.js or cURL?
In Python or Node.js, run Playwright through a proxy, open the search URL and read the results, as in the code on this page; cURL fits only pages that need no scripts. With a scraping API, each language sends the target URL to the API and receives the page.
Can Expedia detect proxies?
Sites like Expedia can recognise datacenter IP ranges and traffic that behaves like a bot, and may answer with challenges or errors. Residential IPs used at a modest pace through a real browser are flagged less often than datacenter ranges, but no proxy makes a scraper invisible.
Which proxy is best for Expedia?
ProxyField's rotating residential proxies, from $1.95/GB, suit Expedia: IPs from real home internet providers, targeting by country, region (state) and city for each market's prices, and sticky sessions from 30 s to 36 h for multi-step searches. Datacenter ranges are easier for sites to recognise.
What is an Expedia proxy?
A proxy used to load Expedia from a chosen location or to spread searches over many IPs. Travel teams use them to see the prices that travelers in another country see.
Why do Expedia prices differ between countries?
Expedia runs a separate site per country with its own currency, taxes display and offers, and prices also move with dates, guests and member status. To compare markets, send the same search from IPs in each country and keep everything else fixed.
How can scraped Expedia data be used?
Hotels check rate parity and competitors' prices, revenue managers set rates for the same nights, analysts study guest reviews by city, and travel startups track fares and packages. Booking or reselling inventory through a scraper is not part of it.
Is scraping Expedia legal?
Expedia's terms forbid automated access without its express written, prior permission, so scraping without it breaches the terms even on public pages; whether it also breaks a law depends on what you collect and where. Rates are facts, while descriptions, photos and reviews can be protected by copyright and reviewer names are personal data. This is not legal advice.
Related pages
Collect Expedia pages with the Web Scraping API
Billed on successful results only. Contact sales for the Web Scraping API and the volume you need, or run your own scraper on residential proxies. 24/7 live chat helps with setup and integration.