15% off your first purchase with code WELCOME15, up to 25 GB.

See pricing

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

Illustration. The URLs and values are fictional; the connection string is the real grammar.
€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

  1. 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.

  2. 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 market
    import 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
  3. 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.

  4. 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.

  5. 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.

PlanRoleSessionTargetingPrice
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 shopCountry, 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.
RotatingCountry
€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 shopCountry + 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.

sticky · Germany · 10 min
http://USERNAME_pool-arcfast_country-de_session-k3f9a1x2_sesstime-10:PASSWORD@proxy.arcproxies.io:8000

Swap _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:

DimensionTypical valuesWhy it changes the price
Stay dateToday to 365 days outDemand, events, day of week
Length of stay1, 2, 3, 7 nightsLOS discounts and minimum-stay restrictions
Occupancy1 or 2 adults, familyPer-person pricing, child policies
Rate planFlexible, non-refundable, breakfastConditions trade price for risk
ChannelBrand site, OTAs, metasearchCommission, channel-specific discounts
Point of saleVisitor's countryMarket-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.

MarketRuleWhat it means for the data you collect
United StatesFTC Rule on Unfair or Deceptive Fees, in effect since 12 May 2025; covers hotels, motels and vacation rentalsThe advertised total must include mandatory fees the business knows about; taxes may still be disclosed separately before payment
United KingdomDMCC 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:

HorizonTypical cadenceReason
0–7 daysSeveral times a dayLast-minute pricing moves fastest
8–30 daysDaily or twice dailyMost pickup happens here for transient hotels
31–90 daysDailyGroup and event dates set the shape early
91–365 daysWeeklyRates 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. [1]US Federal Trade Commission: Rule on Unfair or Deceptive Fees: Frequently Asked Questions
  2. [2]UK Competition and Markets Authority: Unfair commercial practices: price transparency (CMA209), 18 November 2025
  3. [3]Autorité de la concurrence: 6 April 2017: Online hotel booking platforms (ECN monitoring report)

Travel fares

More on travel fares

OverviewProxies for travel fare aggregationAirline, hotel and rail fares change with the point of sale. Query each market from an IP inside it so the fare you store is the fare a traveller is quoted.Deep diveAirline faresCollect airline fares per point of sale: the same flight priced from each market, taxes itemised, one sticky session per search, billed per GB.Deep diveLow-cost carrier faresMonitor low-cost carrier fares where they are sold: on the airline's own site, priced per leg and per seat bucket, with mandatory fees split out. Per GB.Deep diveAirline ancillary pricesTrack airline ancillary prices (checked bags, seats, priority and fare bundles) per route, date and market, so a trip's true cost can be compared.Deep diveRail and bus faresCollect European rail and intercity coach fares per operator, departure and fare family, including yield-managed long-distance tickets. Billed per GB.Deep diveFerry faresMonitor ferry fares by route, sailing, season and vehicle (foot passengers, cars, cabins) from each operator's own public booking site. Per GB.Deep diveFare alertsBuild fare alerts and deal newsletters on verified prices: cheap watch-list polling, live confirmation from the right market before sending, per-GB costs.Deep diveCorporate travel benchmarkingBenchmark booked and negotiated corporate fares against public fares on the same flights, lead times and markets, for TMCs, travel managers and audits.Deep diveTravel metasearchHow to build a travel metasearch engine: partner feeds, cached prices, live re-pricing and look-to-book. Where proxies fit, and what it costs per GB.Deep diveHotel rate parityCheck your hotel's own rates across OTAs, metasearch and markets from local IPs. Catch wholesale leakage and loading errors with evidence, billed per GB.GuideWhy flight prices differ by countryThe same flight costs different amounts in different countries because fares are filed and sold per point of sale, and taxes follow the departure airport.GuideDo airlines raise prices when you search?What regulators and researchers found about cookie and IP tracking in airline pricing, and what actually makes a fare change between two searches.GuideHow often flight prices changeFlight prices can change many times a day: filed fares update constantly and seat availability moves with every booking. What that means for collection.

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.