Travel fares · Hotel rate shopping
Hotel rate shopping: competitor rates per market, date and length of stay
Hotel rate shopping is collecting the public rates your competitive set is selling, for every stay date and length of stay, on every channel that matters. Run each shop from an IP in the market you are pricing for, so the rate you store is the one a guest in that market was quoted.
Pay per GB · No subscription · Prices in EUR, excl. VAT
- €2.00
- per GB on ARC Fast, excl. VAT
- −44%
- at 1 TB (€1.12 / GB)
- 185+
- countries, city targeting
- Never
- expires — no subscription
Written for
- Hotel revenue managers
- Revenue management system (RMS) vendors
- Hotel group commercial analysts
- Rate-intelligence product teams
The short answer
- A rate shop is a matrix: properties × stay dates × length of stay × occupancy × channel × point of sale. Size it before you buy anything.
- The same room is often quoted differently per country of the visitor, so the exit IP belongs in your shop definition, not in your infrastructure notes.
- Store the total stay price with taxes and mandatory fees broken out. Nightly rates from different markets are not comparable until you do.
- Distinguish sold out, minimum-stay restriction and failed fetch. Treating all three as "no rate" corrupts every downstream price recommendation.
The problem
What goes wrong without the right IPs
Length-of-stay restrictions look like sold-out
A hotel that closes one-night stays on a Saturday still sells two nights. Shop only LOS 1 and you record a sell-out that never happened, and your RMS reads it as compression in the market.
Tax display differs by market
Many US-facing pages show rates before tax, most EU-facing pages show them tax-inclusive, and resort or cleaning fees sit somewhere in between. Without normalising, a competitor looks cheaper in one market purely because of how the number was displayed.
Room names do not map across channels
"Superior Double", "Double Room with City View" and "Classic King" may be the same inventory. Rate shopping that compares the lowest visible rate without a room-type map compares a broom cupboard with a suite.
Search results are cached, property pages are live
List and map views often show a cached "from" price. The rate a guest can actually book appears on the property page with dates selected, which is the request you have to make if accuracy matters.
One address cannot shop a whole comp set
A daily shop for nine properties over 90 days and two lengths of stay is thousands of priced searches. From one IP that is a rate limit by mid-morning; spread across a pool with one session per shop it completes inside the window.
What to collect
What you can collect
- Property and channel
- Your own ID for the hotel plus the channel shopped: brand site, an OTA or a metasearch result.
- Point of sale
- The exit country (and city where it matters) of the request. Two shops of the same date from two markets are two observations, not a duplicate.
- Check-in date and length of stay
- The key of the matrix. Store LOS explicitly; a three-night total divided by three is not the one-night rate.
- Occupancy
- Adults and child ages. Default searches are usually two adults, and single-occupancy rates differ.
- Room type, raw and mapped
- Keep the channel's room name verbatim and your mapped category beside it, so the mapping can be audited later.
- Rate plan conditions
- Refundable or non-refundable, breakfast included, pay now or pay at hotel. The cheapest rate is often the most restricted one.
- Price components
- Base price, taxes, mandatory fees and currency as shown, plus a computed comparable total for the whole stay.
- Availability status
- Available, sold out, closed by restriction, or not retrieved. Four values, never one null.
- Shop timestamp
- Rates move during the day; a shop without a timestamp cannot be compared with yesterday's.
How it runs
How a collection run works
- 01
Define the shop matrix
List the comp set, the stay-date horizon, the lengths of stay you sell (usually 1, 2, 3 and 7), the default occupancy, the channels and the markets. Multiply it out; that number drives cadence and cost.
- 02
One sticky session per shop
Hold one exit for search, property page and room list, so the flow completes on one IP and in one market. Ten minutes is plenty; a new session handle per shop spreads the load across the pool.
One shop, one exit, one market18 linesimport secrets, requestsBASE = "USERNAME_pool-arcfast_country-de".split("_country-")[0] # USERNAME_pool-arcfastdef proxy_for(country: str, city: str | None = None) -> dict: user = f"{BASE}_country-{country}" if city: user += f"_city-{city}" user += f"_session-{secrets.token_hex(4)}_sesstime-10" url = f"http://{user}:PASSWORD@proxy.arcproxies.io:8000" return {"http": url, "https": url}def shop(property_url: str, checkin: str, nights: int, country: str): with requests.Session() as s: s.proxies = proxy_for(country) r = s.get(property_url, params={"checkin": checkin, "nights": nights, "adults": 2}, timeout=30) r.raise_for_status() return r.text # parse rooms, rate plans and price components downstream - 03
Parse into explicit statuses
Every cell of the matrix ends as available (with a price), sold out, restricted, or not retrieved. Retries only apply to the last one, and only with a fresh session.
- 04
Normalise to a comparable total
Convert to one currency at a stated rate, add mandatory fees, decide whether your comparison is tax-inclusive, and divide by nights only after summing. Keep the raw values beside the normalised one.
- 05
Feed the RMS, not a spreadsheet
Push the cleaned rows to your revenue system or warehouse, and alert on moves that matter: a competitor dropping below your rate for a compressed date, or opening a restriction you had not seen.
Setup
Recommended setup
A rate shop is a stateful flow per date, so a sticky session per shop is the default. Spend the residential budget on the priced pages and nothing else.
| Plan | Role | Session | Targeting | Price |
|---|---|---|---|---|
ARC Fast Rotating residential | Default for priced shops Residential exits in the market you are pricing for, held for the search, property page and room list of one stay date. | Sticky, 10 minutes per shop | Country, city where local promotions matter | €2.00 / GB €1.12 at 1 TB (−44%) |
ARC Basic Rotating ISP | Static property content Room descriptions, amenities and photos do not change per shop. Refresh them weekly on the cheapest pool and keep them out of the daily run. | Rotating | Country | €0.75 / GB €0.59 at 1 TB (−21%) |
ARC Ultra Premium residential | The channels your pricing is judged on Premium residential for the one or two channels where a gap in the data is most expensive. Route only those through it. | Sticky per shop | Country + city | €3.50 / GB €2.17 at 1 TB (−38%) |
Prices are list prices in EUR, excl. VAT. Volume discounts apply automatically at checkout — full ladder on the pricing page.
Connect
One connection string per market
The country, city and sticky session are tokens in the username. Change the token, change the market; keep the session handle, keep the IP.
http://USERNAME_pool-arcfast_country-de_session-k3f9a1x2_sesstime-10:PASSWORD@proxy.arcproxies.io:8000Swap _country-de for any market you quote. The full grammar is on the residential proxies page.
Illustration
What a daily comp-set shop costs
An illustration with round numbers — your pages, payloads and retry rate will differ. The arithmetic is the real price ladder.
Assumptions
- Properties (comp set + own)
- 9
- Stay dates ahead
- 90
- Lengths of stay
- 2 (1 and 3 nights)
- Channels
- 3
- Cadence
- daily, 30 days
- Weight per shop
- 350 KB
- Bandwidth per month
- ≈ 52 GB
On ARC Fast
€87.36per month, excl. VAT
52 GB bought in one purchase at €1.68 / GB (−16% volume rung, applied automatically).
The same 52 GB on ARC Basic: €37.96 at €0.73 / GB. Move down as soon as the cheaper pool holds up.
Assumes one market. Each extra point of sale multiplies the figure; most hotels shop their top two or three source markets, not every country. Blocking images and fonts in a browser, or fetching the rate endpoint directly, is the biggest single saving (see reducing proxy bandwidth).
Bandwidth never expires, so a bigger single purchase is only ever cheaper per GB. See the ladder.
In depth
Hotel rate shopping, in depth
What a hotel rate shop actually measures
A rate shop answers one question per cell: what would a guest from this market pay for this room, on these dates, through this channel, right now? Revenue managers then use the grid to position their own dynamic pricing against the market rather than against last year.
The dimensions are fixed by how hotels sell, not by how a scraper is written:
| Dimension | Typical values | Why it changes the price |
|---|---|---|
| Stay date | Today to 365 days out | Demand, events, day of week |
| Length of stay | 1, 2, 3, 7 nights | LOS discounts and minimum-stay restrictions |
| Occupancy | 1 or 2 adults, family | Per-person pricing, child policies |
| Rate plan | Flexible, non-refundable, breakfast | Conditions trade price for risk |
| Channel | Brand site, OTAs, metasearch | Commission, channel-specific discounts |
| Point of sale | Visitor's country | Market-specific rates and tax display |
The cheapest useful shop is the one that leaves out dimensions you will never act on. If you do not price differently for single occupancy, do not shop it.
Why the same room shows different rates in different markets
Hotels and channels can load rates that are only visible to visitors from certain countries, run mobile-only or geo-targeted promotions, and display prices with or without tax depending on local convention. The point of sale is set largely by where the request comes from; changing the currency selector usually just converts the same offer.
Price differences between channels are also real, not noise. When EU competition authorities reviewed the sector after wide parity clauses were removed, they found increased price differentiation between online travel agents in most of the countries studied, including Germany after January 2016. A shop that covers one channel is therefore a shop of that channel, not of the market.
If your shop has to reflect a guest in London and a guest in Munich, it needs exits in both. That is the whole reason a proxy is in this pipeline, and the same point-of-sale logic that drives travel fare aggregation for flights and rail.
Total price, nightly rate and the new fee-display rules
Mandatory fees used to make competitor comparison unreliable: a low headline rate plus a resort fee looked cheaper than an honest all-in rate. Two regimes now require the total to be shown up front, which makes collected prices more comparable, provided you collect the right number.
| Market | Rule | What it means for the data you collect |
|---|---|---|
| United States | FTC Rule on Unfair or Deceptive Fees, in effect since 12 May 2025; covers hotels, motels and vacation rentals | The advertised total must include mandatory fees the business knows about; taxes may still be disclosed separately before payment |
| United Kingdom | DMCC Act 2024 price transparency provisions; CMA guidance CMA209 (18 November 2025) | Resort fees and local taxes payable at the hotel are mandatory charges and belong in the total price shown |
Store the components anyway. A total that includes tax in one market and excludes it in another still has to be normalised before your RMS sees it.
How often to shop which dates
Shop frequency should follow how often a date's price can still change and how much revenue is left to influence. A common pattern is to concentrate cadence on the next few weeks and sample the far horizon:
| Horizon | Typical cadence | Reason |
|---|---|---|
| 0–7 days | Several times a day | Last-minute pricing moves fastest |
| 8–30 days | Daily or twice daily | Most pickup happens here for transient hotels |
| 31–90 days | Daily | Group and event dates set the shape early |
| 91–365 days | Weekly | Rates move rarely; watch for events and openings |
Event dates break the pattern: once a city-wide event is announced, shop those dates as if they were next week.
Shopping rates responsibly
- Collect only public, logged-out rates. Member-only and loyalty rates behind a sign-in are out of scope.
- Read each channel's robots.txt and terms, and keep request rates modest; a shop that completes in two hours does not need to complete in ten minutes.
- Back off on 429 responses instead of rotating harder. See handling 429 rate limits.
- Prefer an official API or a data partnership where a channel offers one for your use.
The longer version, with travel-specific examples, is in collecting travel data responsibly.
Works with anything that takes a proxy URL
Playwright
- Python requests / httpx
- Scrapy
Crawlee
- Docker
FAQ
Questions
Something not covered? Write to contact@arcproxies.io.
What is hotel rate shopping?
Hotel rate shopping is the regular collection of competitors' public room rates for specific stay dates, lengths of stay and channels. Revenue managers use the resulting grid to set and adjust their own prices against the market.
Why do hotel rate shops need proxies?
Because rates and their display differ by the visitor's country, and because a daily shop of a full comp set is thousands of searches. Exits in each market give you the rate a local guest sees, and spreading shops across a pool keeps one address from being rate-limited.
Should I shop the nightly rate or the total stay price?
Store both, but compare on the total stay price including mandatory fees, normalised for tax and currency. A three-night total divided by three is not the one-night rate, and a headline rate without fees is not what the guest pays.
How many lengths of stay should a rate shop cover?
Every length of stay you price differently, usually one, two or three nights plus a week for leisure hotels. Shopping only one-night stays misreads minimum-stay restrictions on busy dates as sell-outs.
How much bandwidth does a hotel rate shop use?
It depends on whether you load full pages or only rate data. A rendered property page with images can be several megabytes; the rate content alone is usually a few hundred kilobytes. Nine properties, 90 dates, two lengths of stay and three channels shopped daily come to roughly 50 GB a month at 350 KB per shop.
Can I shop member or loyalty rates?
Not with this setup. Everything here is public, logged-out collection; rates that require signing in to an account are out of scope.
Sources & review
Last reviewed by the ARC Proxies team. Prices are read from the live catalog at build time.
- [1]US Federal Trade Commission: Rule on Unfair or Deceptive Fees: Frequently Asked Questions
- [2]UK Competition and Markets Authority: Unfair commercial practices: price transparency (CMA209), 18 November 2025
- [3]Autorité de la concurrence: 6 April 2017: Online hotel booking platforms (ECN monitoring report)
Travel fares
More on travel fares
Get started
Buy a gigabyte and try it on your own targets.
No subscription, no sales call. Code WELCOME15 takes 15% off your first purchase, and whatever you do not use is still there next quarter.