Hotel Data Scraping: Hotel Rates and Rate Parity Monitoring
For hotel data scraping, ProxyField's Web Scraping API is designed to fetch public hotel search and hotel pages from booking sites and hotel websites for $0.50 per 1,000 successful results over plain HTTP ($0.20 from 10,000 results in one purchase), or $2.00 per 1,000 ($1.00) with the JS rendering many hotel sites need; API access is through Contact sales, and you pay only for successful results. To start today, run the rate parity script on this page through ProxyField 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.
Rate parity in one line: fix one stay (hotel, room, check-in, nights, guests, rooms, currency), read the direct rate from your booking engine or the hotel's own booking page, fetch the same stay once a day from each booking site's public page, from the market you sell to, and compute gap = (booking-site total − direct total) ÷ direct total; flag a gap above 1–2% that shows in two checks in a row. One hotel on 3 channels for 14 check-in dates is 1,260 pages a month: $0.63 over plain HTTP or $2.52 with JS rendering.
Hotel data on public pages
Hotel data scraping collects what a traveler sees when searching for a room: which hotels show up for a city and dates, at what price, with which conditions. The Web Scraping API fetches the search or hotel URL and returns the page; your code takes the fields out. ProxyField sells no separate hotel API with pre-parsed fields.
| Hotel page | Where | What the public page shows |
|---|---|---|
| Search results for a city and dates | Booking sites such as Booking.com, Hotels.com and Agoda | Hotels in ranking order, price for the stay, taxes note, stars, review score, distance, sponsored flags |
| Hotel page for dates | Booking sites | Room types, rate plans, price per plan, meal and cancellation terms, availability |
| Hotel's own booking page | Hotel and chain websites | The direct rate for the same room and dates |
| Hotel details | All of the above | Address, amenities, check-in times, review summary, photos |
Member and loyalty rates shown only after sign-in are out of scope: ProxyField's acceptable use policy forbids accessing data behind logins you are not entitled to. 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 hotel fields, so your parser reads them.
Rate parity: booking sites vs the hotel's own website
Rate parity means a traveler sees the same price for the same room on every channel. A parity check compares like with like, so most of the work is fixing the comparison key and the source of each rate before you fetch anything.
Read moreShow less
-
Choose the source for each channel
Your own rates: export them from your booking engine or channel manager, not from scraped pages. A booking site's own feed: its partner API, or its written permission. Everything else: public pages only, at a modest pace. Booking.com's terms (A15.2) say you may not "access, monitor, copy, scrape/crawl, download, reproduce" anything on its platform "using any robot, spider, scraper, other automated means", and (A15.3) that it blocks systems it suspects of "using any device or software to gather prices"; Expedia's terms bar robots, spiders and scrapers too. ProxyField's rule for every site: public pages only, and follow the site's terms; a proxy changes none of them.
-
Fix the stay key
Hotel, room type, check-in date, nights, guests, rooms, currency and the market (the country you search from). Use the same key on every channel.
-
Fetch each channel for that key
For example the hotel's own booking page and the booking sites you have cleared in step 0, each with
country(or the proxy's country) set to the market, such asdefor German travelers. -
Compare total prices for matching offers
Match the rate plan (refundable or not, breakfast or not, pay now or later) and count taxes and fees the same way on both sides. Then
gap = (booking-site total − direct total) ÷ direct total. Flag a gap only when it is above a tolerance you set, such as 1–2%, and shows up in two checks in a row: a member-only, mobile-only or non-refundable rate is often the cause, not a parity breach. -
Keep the evidence
Store the raw page of each check with the stay key, channel, market and time, so a revenue manager can open the page behind every flagged gap.
A worked example (made-up numbers, to show the arithmetic): Double room, 2026-12-10, 2 nights, 2 adults, flexible rate with breakfast, taxes included, market de. Direct total €220.00; booking-site total €205.00. Gap = (205.00 − 220.00) ÷ 220.00 = −6.8%: the booking site undercuts the direct rate by more than 2%, so the check is flagged if the next day's check shows the same gap.
| Field to store | Example |
|---|---|
| Stay key | Hotel ID, Double room, 2026-12-10, 2 nights, 2 adults, 1 room, EUR, market de |
| Channel | hotel website, booking site |
| Offer | rate plan, cancellation deadline, breakfast, price, taxes and fees included or not |
| Result | total stay price, gap to the direct rate in %, flagged yes or no |
| Evidence | saved page, final_url, checked_at |
A rate parity check you can run today
The script opens the same stay on each channel in a real browser through one ProxyField residential IP in the market (-country-de, held for 10 minutes with -session-parity01-ttl-600), reads the total price with the selector you set per channel, and prints the gap. Fill in the URLs and selectors from the live pages: hotel sites and booking sites each have their own markup.
# parity_check.py: one stay, several channels, through ProxyField residential proxies
import re
from playwright.sync_api import sync_playwright
STAY = "Double, 2026-12-10, 2 nights, 2 adults, 1 room, EUR, market de"
CHANNELS = { # channel: (public URL for the stay, CSS selector of the total price for the same rate plan)
"direct": ("https://www.example-hotel.com/book?arrive=2026-12-10&nights=2&adults=2&rooms=1¤cy=EUR",
"<selector of the total price>"),
"booking_site": ("<the booking site's public hotel page for the same stay>",
"<selector of the total price>"),
}
TOLERANCE = 0.02 # flag gaps above 2%
def amount(text): # "€1,205.00" -> 1205.0 (en-US formatting)
return float(re.sub(r"[^\d.]", "", text))
prices = {}
with sync_playwright() as p:
browser = p.chromium.launch(proxy={
"server": "http://gate.proxyfield.io:7000",
"username": "<login>-country-de-session-parity01-ttl-600", "password": "<password>"})
page = browser.new_page(locale="en-US")
for channel, (url, selector) in CHANNELS.items():
page.goto(url, timeout=90_000)
prices[channel] = amount(page.locator(selector).first.inner_text(timeout=30_000))
page.screenshot(path=f"{channel}.png", full_page=True) # evidence for step 4
browser.close()
direct = prices.pop("direct")
for channel, price in prices.items():
gap = (price - direct) / direct
print(f"{STAY} | {channel} {price:.2f} vs direct {direct:.2f} | gap {gap:+.1%} | {'FLAG' if abs(gap) > TOLERANCE else 'ok'}")With the numbers of the worked example, it prints:
Double, 2026-12-10, 2 nights, 2 adults, 1 room, EUR, market de | booking_site 205.00 vs direct 220.00 | gap -6.8% | FLAGRun it once a day for each check-in date (cron: 0 7 * * * python3 parity_check.py >> parity.log), and raise an alert only when a channel is flagged two days in a row. When the Web Scraping API opens to you, the same loop sends each URL to it instead of the browser.
Cost: one hotel on 3 channels for 14 check-in dates, checked daily, is 1,260 pages a month, $0.63 over plain HTTP or $2.52 with JS rendering on the Web Scraping API; ten hotels are 12,600 pages (the workload table under Pricing). On your own browser and residential proxies you pay per GB instead: $2.95/GB for 1 GB, from $1.95/GB at volume.
What sets a hotel price
A room has no single price. The same hotel shows a different rate for each check-in date and length of stay, number of guests and rooms, room type and rate plan (refundable or not, breakfast or not), currency and country of the visitor, and sometimes device. A useful hotel dataset therefore records the search, not only the price:
- Stay check-in date, nights, guests, rooms.
- Offer room type, rate plan, cancellation terms, price, currency, taxes included or not.
- Context the site, the country you searched from and the time of the check.
Searching from the country you are pricing matters: booking sites can show other rates or currencies to visitors from other countries. ProxyField residential proxies offer targeting by country, region (state) and city, with 412M+ residential IPs in 195+ countries, such as the United States or Spain. On a Web Scraping API request, country sets the country the request comes from (the exit IP), as a two-letter code such as es; the countries it accepts: the proxy pool's 195+ countries.
Partner APIs or scraping?
Booking sites run APIs for their partners: connectivity APIs for hotels and channel managers, who load their own rates and availability, and affiliate APIs for approved partners who sell the inventory. They give partners their own data or the site's feed on the site's terms. Rate shopping, comparing a hotel's price across sites, its direct website and its competitors, means reading the public pages each traveler sees.
| Item | Booking-site partner APIs | Web Scraping API |
|---|---|---|
| Access | Approval as a hotel, channel manager or affiliate | ProxyField account |
| Data | Your own rates, or the site's feed | Any public search or hotel page |
| Competitors' rates as travelers see them | No | Yes, as shown on the page |
| Billing | Set by the program | Per 1,000 successful results |
What you send
You send a search or hotel URL with the stay in it, such as https://www.booking.com/searchresults.html?ss=Paris&checkin=2026-12-10&checkout=2026-12-12&group_adults=2&no_rooms=1, and choose plain HTTP or JS rendering. 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). For sites that build their results with scripts, wait_for takes a CSS selector the rendered page must show before it is returned, such as the price elements. Parameter reference: API documentation.
# The request the Web Scraping API takes (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.booking.com/searchresults.html?ss=Paris&checkin=2026-12-10&checkout=2026-12-12&group_adults=2&no_rooms=1", "render": true, "country": "us", "output": "json"}'Example response (shortened; content is the rendered page's HTML):
{
"metadata": {"id": "req_6b1f4a8e2d9c0735", "api": "web_scrape", "status": "success", "billed": true},
"status_code": 200,
"final_url": "https://www.booking.com/searchresults.html?ss=Paris&checkin=2026-12-10&checkout=2026-12-12&group_adults=2&no_rooms=1",
"content_type": "text/html; charset=utf-8",
"content": "<!DOCTYPE html><html lang=\"en-us\">…</html>"
}Pricing: from $0.20 per 1,000 hotel pages
Some booking sites send their results in the HTML, and plain HTTP costs $0.50 per 1,000 successful results, from $0.20 at volume. Sites that build results with scripts need JS rendering: $2.00 per 1,000, from $1.00. You pay only for successful results. Billed: a page the booking site answered with a 2xx status. Not billed: blocked requests, timeouts and errors on our side; a blocked request is retried on new IPs, and the retries are not billed. 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. The volume price starts at 10,000 successful results in one purchase. For availability and access, contact sales through the sales team on our 24/7 live chat.
Payment and balance for the API: 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) | Pages a month | HTTP at $0.50 | HTTP at $0.20 (volume) | JS at $2.00 | JS at $1.00 (volume) |
|---|---|---|---|---|---|
| Rate parity: 1 hotel × 3 channels × 14 check-in dates, daily | 1,260 | $0.63 | – | $2.52 | – |
| Rate parity: 10 hotels × 3 channels × 14 check-in dates, daily | 12,600 | $6.30 | $2.52 | $25.20 | $12.60 |
| 200 hotels × 14 check-in dates, daily (one channel) | 84,000 | $42 | $16.80 | $168 | $84 |
| 50 city searches × 7 date pairs, daily | 10,500 | $5.25 | $2.10 | $21 | $10.50 |
| Both | 94,500 | $47.25 | $18.90 | $189 | $94.50 |
When booking sites refuse a request
Booking sites watch for automated searches and answer with a 403, a 429 or a challenge page when one IP runs too many. Spread searches over rotating residential IPs, keep one sticky session (30 s to 36 h) for a search that loads in several steps, set the currency and language in the URL rather than through cookies, and pace requests per hotel. With the Web Scraping API you pay only for successful results. Error codes explained: errors.
Scrape hotel prices with your own browser and proxies
The parity script above is the pattern for any hotel price scraper: a real browser (Playwright) through a residential IP from the country you price from, one selector per site, one stored row per check.
-
Fix the stay: city or hotel, check-in, nights, guests, rooms, currency.
-
Open the search or hotel page through
gate.proxyfield.io:7000with an IP from the country you price from. -
Wait for the price elements, then read hotel, room, rate plan, price and taxes from each result.
-
Store every price with the stay, site, country and time of the check, and repeat for each date.
Access opens once the payment is confirmed; the gateway, credentials or allowlist are in your account. Every username part after the login is optional: <login>-country-<cc>-region-<region>-city-<city>-session-<id>-ttl-<seconds>, with the country as a lowercase two-letter code (-country-de, -country-es), names in lowercase with underscores (-city-new_york), and a sticky session of 30 to 129,600 seconds (20 minutes by default), as in <login>-country-us-region-new_york-city-new_york-session-he9f2qga-ttl-600. 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 Playwright.
What teams use hotel data for
- Rate shopping a hotel's price against its competitive set, by date.
- Rate parity checks whether booking sites show the same rate as the hotel's own website.
- Revenue management demand signals from prices and sold-out dates around events.
- Market research supply, prices and review scores by city and season.
- Travel products price alerts and comparisons built on public rates.
Booking or holding rooms through a scraper is not data collection; fraud and fake accounts are forbidden under ProxyField's acceptable use policy.
Booking sites' terms and the law
Booking sites restrict automated collection in their terms of use: Booking.com's terms (A15.2 and A15.3, quoted in step 0) bar scraping and price-gathering software without its written permission, and Expedia's terms bar robots, spiders and scrapers. Breaching a site's terms is a contract question, separate from whether it breaks a law, and the site can block you; that is why step 0 sends your own rates to your booking engine and a booking site's feed to its partner API or written permission.
Prices, dates and availability are facts; photos, descriptions and review texts can be protected by copyright, so store facts rather than republishing content, and keep personal data out. For the wider question, read Is Web Scraping Legal? US, EU and UK Rules (2026).
ProxyField's rule for every site: public pages only, and follow the site's terms. This is not legal advice.
More scrapers
- Flight scraper: flight and hotel searches on travel metasearch sites.
- Expedia scraper, Airbnb scraper and travel review scraper on the same Web Scraping API.
- Scrape airline data: fares from airline websites.
- All scrapers: scrapers.
Hotel Data Scraping FAQ
24/7 support by live chat, including help with setup and integration.
What is hotel data scraping?
ProxyField's Web Scraping API is designed for hotel data scraping: public hotel search and hotel pages for $0.50 per 1,000 successful results over plain HTTP, or $2.00 with JS rendering, with access through Contact sales. In general, hotel data scraping means collecting hotel prices, availability, room types, conditions and review scores from booking sites and hotel websites.
How do I scrape hotel prices?
Fix the stay (destination, check-in, nights, guests), open the search or hotel page for it through a residential IP from the country you price from, and read hotel, room, rate plan and price from the results. Repeat for each date and store every price with its stay and time of the check.
How do I scrape hotel listings?
Run a city search for one set of dates, page through the results and collect each hotel's name, link, stars, review score and address. Then open the hotel pages for room types and details; the listing changes little, so refresh it less often than prices.
What is a hotel data scraper?
A script or service that collects hotel data from public pages: rates by date, availability, room types, conditions, review scores and hotel details. It can be your own browser script on proxies, or a scraping API that returns each page.
How do I start scraping Hotels.com?
Build a search URL with destination, dates and guests, open it in a browser through a residential proxy and read the hotel cards once the results load. Hotels.com builds results with scripts, so a scraping API needs JS rendering, $2.00 per 1,000 pages on ProxyField's.
How do I handle JavaScript when scraping Hotels.com?
Use a real browser, such as Playwright or Selenium, or a scraping API with JS rendering, and wait until the price elements appear before reading them. A plain HTTP request returns the page before its scripts add the results.
Will I get blocked when scraping Hotels.com?
Likely, if one IP runs many searches fast: booking sites answer with a 403, a 429 or a challenge page. Rotating residential IPs, a modest rate per IP and one sticky session per search keep blocks down.
What's the rate limit for scraping Hotels.com?
Hotels.com publishes no rate limit for visitors; it blocks traffic that looks automated. Keep searches a few seconds apart per IP and spread a large date grid over many IPs.
Can I scrape Hotels.com from a specific country?
Yes, and you should when you compare markets: currency and rates can follow the visitor's country. ProxyField residential proxies target country, region and city, with 412M+ residential IPs in 195+ countries.
Why compare hotel prices across geolocations?
Because booking sites can show other prices, currencies or offers to visitors from other countries. Checking from each market shows what travelers there actually see, which a single location hides.
Show 9 more questionsShow fewer questions
Why are prices different on hotel websites vs. aggregators?
Hotels set different rates per channel: the direct website may add a member rate or a perk, while booking sites add their own discounts or show taxes differently. Scraping both for the same stay is how rate parity is checked.
What's a practical way to scrape hotel rates from booking sites and the hotel's own website to monitor rate parity?
Take the direct rate from your booking engine or the hotel's own booking page, a booking site's feed from its partner API or written permission, and otherwise only public pages; then fetch one fixed stay (hotel, room, check-in, nights, guests, currency, market) once a day per channel and compute gap = (booking-site total − direct total) ÷ direct total for the same rate plan, flagging gaps above 1–2% that repeat the next day. The Playwright script on this page does this today through ProxyField residential proxies (Easy Trial: 1 GB for $2.95); on the Web Scraping API (Contact sales), one hotel on 3 channels for 14 dates is 1,260 pages a month, $0.63 over plain HTTP or $2.52 with JS rendering.
What is rate parity monitoring?
Checking, for the same room, dates and guests, whether booking sites show the same price as the hotel's own website. A parity scraper fetches each channel for each date and flags the gaps.
Does a hotel scraping API provide real-time availability and pricing?
It gets the price and availability shown at the moment of the request, which is as current as the site itself. Prices change often, so repeat the checks on a schedule and store each with its timestamp.
How do I search for hotels in a specific city?
Put the city or area in the search URL with the dates and guests, as the site's own search box does, and page through the results. Add filters such as stars or price range in the URL to keep the list short.
How many dates should a hotel rate scraper check?
Enough to cover how far ahead guests book: revenue teams often check every check-in date for the next few weeks and selected dates further out. Each date is one page per hotel and site, so the date grid drives the cost.
Can I scrape hotel data without writing code?
For a few searches, a browser extension that exports a table works. For daily rates across many hotels and dates you need a script, or an automation tool with an HTTP step that calls a scraping API.
Do I need an account to scrape hotel prices?
No. Search results and hotel pages are public, and a scraper should not sign in. Member and loyalty rates shown only after sign-in are out of scope.
How much does hotel price scraping cost?
On ProxyField's Web Scraping API, 200 hotels checked on one channel for 14 check-in dates daily is 84,000 pages a month: $42 over plain HTTP, $16.80 at the volume price, or $168 with JS rendering. You pay only for successful results.
Related pages
Start collecting public 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.