Hotel Price API: How to Get Live Room Rates, Availability, and Partner Offers as JSON

Denis Gramm, StayAPI
By Denis Gramm, StayAPI · · 13 min read

I hope you enjoy reading this blog post. If you want our team to help you with hotel data integration, click here.

Quick summary

This guide maps every hotel price API route, the four shapes price data comes in, and the fields that trip people up, with live Booking.com, Google Travel, Hilton, and Radisson responses.

Hotel Price API: How to Get Live Room Rates, Availability, and Partner Offers as JSON — StayAPI

A hotel price API returns what a hotel costs for specific dates: the rate plans behind each room type, how many rooms are left, and, on metasearch surfaces, what every booking site is charging for the same stay.
It picks up where a hotel search API stops, because search gives you a headline price per hotel and pricing gives you the room-level truth behind it.
The catch is the same one search has.
The official rate APIs belong to travel sellers and hoteliers, the GDS options return contracted inventory rather than the prices travelers see, and Google's "Hotel Prices" developer page is a feed for pushing your own rates to Google.
This guide sorts price data into its four shapes, maps who can use each official route, and shows four live examples: Booking.com room rates, Google Travel partner offers, Hilton starting rates, and a Radisson price calendar.

Key Takeaways

  • Price data comes in four shapes. A headline price per hotel, room-level rate plans, partner offers across booking sites, and a price calendar across arrival dates. Each answers a different question.
  • Official rate APIs are for sellers and hoteliers. Booking.com's Demand API and Expedia's Rapid API need a distribution business; Google's hotel APIs push prices in, not out.
  • GDS rates aren't consumer rates. Amadeus and Sabre return contracted distribution inventory, which is the wrong baseline for comparing what Booking.com or a hotel's own site charges.
  • Taxes and stay basis are where numbers lie. A $169 nightly rate can carry a $19 city tax and 6% VAT outside the number, and a $1,218 total can look like a nightly rate to a careless parser.
  • Data APIs return the consumer view. One key covers Booking.com, Expedia, Google Travel, and chain sites like Hilton, IHG, and Radisson, priced for your dates and guest count.

The Four Shapes of Hotel Price Data

The Four Shapes of Hotel Price Data — StayAPI

"Hotel price" means four different payloads depending on the endpoint, and mixing them up is the most common bug in rate pipelines.

Shape What It Answers Example From This Week Where It Comes From
Headline price Roughly what does this hotel cost for the stay? US$359 for two October nights at a Lisbon 3-star Search results, one number per hotel
Room-level rate plans What does each room cost, with what conditions? Deluxe Twin, $169 a night, free cancellation until 2 days before, breakfast included Prices endpoints keyed by hotel ID and dates
Partner offers What is every booking site charging for this room? Direct £536, a cash-back OTA £541, Booking.com £604, Expedia £603 for the same London night Metasearch surfaces (Google Travel)
Price calendar Which arrival date is cheapest? $195.62 on October 4 versus $557.09 on October 1 at a Berlin 5-star Chain sites that publish a calendar

Availability rides along with the second shape.
A rooms-left count and a sold-out flag are part of the same response as the rate plans, which is why a "hotel availability API" search usually ends at a prices endpoint.
If you only need one number per hotel to sort a list, stop at search.
Everything below is for the moment you need the number behind that number.

The Official Price APIs and Who Gets Them

The Official Price APIs and Who Gets Them — StayAPI

Route Who Gets Access What You Get The Catch
Google Hotel Prices API Hotels and connectivity partners A way to send your rates to Google It's a push feed, with no read endpoint for developers
Booking.com Demand API Approved travel sellers Live availability and rates for display and booking Application judged on your distribution business
Expedia Group Rapid API Companies that sell travel Rates, availability, and booking under agreement Revenue projections rather than data projects
Amadeus hotel offers Anyone, self-service signup GDS-contracted rates per room Test data in the sandbox, GDS inventory in production
Sabre hotel price check Sabre developers Rate detail for a specific room and rate option GDS lens, developer agreement
Bed banks Contracted resellers Wholesale net rates Contract and volume commitments

The Google row surprises people every week.
Google's Hotel APIs documentation covers hotel prices, content, and booking links, and all of it flows from hoteliers and their connectivity partners into Google, which is why "is the Google hotel API free" has no useful answer for a data project.
The GDS rows work and are worth knowing.
Amadeus's self-service hotel APIs return offers per hotel with a free test quota, and our Amadeus API guide explains why those numbers rarely match an OTA or a hotel's own site.
For a booking flow that's fine; for market comparison it's the wrong baseline.
Our Booking.com API guide and Expedia Rapid API guide cover who clears those two partner bars.

Hotel Price API Example: Room-Level Rates on Booking.com

Hotel Price API Example: Room-Level Rates on Booking.com — StayAPI

Third-party hotel data APIs read the public booking pages and return the rate plans as documented JSON, keyed by the platform's hotel ID and your dates.
Here's StayAPI's Booking.com prices endpoint for a Lisbon boutique hotel, two nights in October, two adults:

curl -X GET "https://api.stayapi.com/v1/booking/hotel/prices?hotel_id=4045490&check_in=2026-10-06&check_out=2026-10-08&adults=2&rooms=1&currency=USD" \
  -H "x-api-key: YOUR_API_KEY"

The response (truncated to one room):

{
  "success": true,
  "hotel_id": "4045490",
  "data": {
    "hotel": { "id": 4045490, "name": "Maxime Boutique Hotel Avenida da Liberdade" },
    "search_params": { "check_in": "2026-10-06", "check_out": "2026-10-08", "adults": 2, "rooms": 1, "currency": "USD", "nights": 2 },
    "pricing_summary": {
      "price_per_night_value": 169.21,
      "total_price_value": 338.42,
      "taxes_and_charges_value": 0.0,
      "currency": "USD"
    },
    "tax_breakdown": [
      { "name": "City tax", "type": "charge", "amount_value": 18.64, "included": false },
      { "name": "VAT", "type": "charge", "percentage": 6.0, "amount_value": 20.31, "included": false }
    ],
    "available_rooms_count": 3,
    "is_soldout": false,
    "rooms": [
      {
        "room_name": "Deluxe Twin Room",
        "room_count": 4,
        "is_refundable": true,
        "cancellation_policy": "You can cancel for free until 2 days before arrival. ...",
        "breakfast_included": true,
        "price_per_night_value": 169.21,
        "total_price_value": 338.42,
        ...
      }
    ]
  }
}
Field Description
pricing_summary.price_per_night_value The cheapest bookable room, as a number
tax_breakdown[].included Whether each tax is inside the price or added at checkout
rooms[].room_count Rooms of this type still available for the dates
rooms[].is_refundable Free-cancellation flag, with the policy text alongside
rooms[].breakfast_included Meal plan resolved to a boolean
is_soldout The availability signal for the whole stay

Two details in that payload do real work.
The tax breakdown says the $19 city tax and the 6% VAT sit outside the $169, so a parity comparison against a tax-inclusive site has to add them back.
And the sold-out contract is explicit: a confirmed sold-out stay returns is_soldout: true with an empty rooms array, and empty inventory that can't be confirmed returns an error rather than a false zero.
Full parameters are in the Booking.com prices endpoint documentation.
The same shape exists for Expedia rates by property ID (the Aloft on Chicago's Magnificent Mile returned $512 a night and a $1,218 total for the same dates this week), documented on the Expedia rates endpoint.

Same Hotel, Six Prices: Partner Offers from Google Travel

Same Hotel, Six Prices: Partner Offers from Google Travel — StayAPI

The partner-offers shape answers the parity question directly.
Google Travel shows every booking site's price for a stay, including the hotel's own rate, and the prices endpoint returns that list as an array.
Resolve the hotel once to get its token, then ask for prices:

curl -X GET "https://api.stayapi.com/v1/google_travel/prices?entity_token=ChUIzYGfsLP03b1HGgkvbS8wMnE4emYQAQ&currency=GBP" \
  -H "x-api-key: YOUR_API_KEY"
{
  "success": true,
  "check_in": "2026-10-28",
  "check_out": "2026-10-29",
  "currency": "GBP",
  "price": { "formatted": "£536", "value": 535.875 },
  "offers": [
    { "partner": "London Hilton on Park Lane", "price": "£536", "booking_link": "..." },
    { "partner": "Super.com", "price": "£541", "booking_link": "..." },
    { "partner": "trivago DEALS", "price": "£568", "booking_link": "..." },
    { "partner": "Expedia.com", "price": "£603", "booking_link": "..." },
    { "partner": "Booking.com", "price": "£604", "booking_link": "..." },
    { "partner": "TravelPortal", "price": "£662", "booking_link": "..." }
  ]
}

One night at the London Hilton on Park Lane: the direct rate is cheapest at £536, the big OTAs sit £67 to £68 higher, and a reseller is £126 above direct.
That spread is the whole rate parity conversation in one response.
The limit, stated plainly: Google chooses the dates.
The endpoint echoes the check-in and check-out Google picked (late October here), and dates you pass are ignored, so treat this as the parity picture rather than a dated quote and use the platform endpoints for specific stays.
Our Google Hotels API guide explains where those offers come from, and the parameters are in the Google Travel prices documentation.

Chain Direct Rates and Price Calendars

Chain Direct Rates and Price Calendars — StayAPI

Chain websites are the source of the direct rate, and their endpoints add two things OTAs don't publish: member pricing flags and, on some chains, a calendar.
Hilton's rooms endpoint returns one starting cash rate per available room type:

curl -X GET "https://api.stayapi.com/v1/hilton/rooms?hotel_code=LONHITW&check_in=2026-10-06&check_out=2026-10-08&adults=2&currency=GBP" \
  -H "x-api-key: YOUR_API_KEY"
{
  "success": true,
  "hotel_code": "LONHITW",
  "pricing_scope": "starting_rates",
  "total": 18,
  "room_types": [
    {
      "code": "K1",
      "name": "King Guest Room",
      "rates": [
        { "rate_plan_code": "HPPAP4", "per_night": 430.8, "total": 861.6, "currency": "GBP", "includes_taxes_and_service_charges": true, "rate_changes_during_stay": true }
      ]
    },
    ...
  ]
}

Eighteen room types, each with its starting rate and a flag that says taxes and service charges are inside the number, which is the opposite of the Booking.com payload above.
The pricing_scope field is honest about what this is: one starting offer per room, without the full rate-plan list.
Radisson adds the calendar shape, the lowest public price per arrival date across a window of up to 60 days:

curl -X GET "https://api.stayapi.com/v1/radisson/hotel/price-calendar?hotel_id=DEBER1&date_from=2026-10-01&date_to=2026-10-31&nights=1" \
  -H "x-api-key: YOUR_API_KEY"
{
  "success": true,
  "hotel_id": "DEBER1",
  "currency": "USD",
  "calendar": [
    { "date": "2026-10-01", "available": true, "amount": 557.09, "tax_inclusive": true, "lowest": false },
    { "date": "2026-10-02", "available": true, "amount": 233.89, "tax_inclusive": true, "lowest": false },
    { "date": "2026-10-04", "available": true, "amount": 195.62, "tax_inclusive": true, "lowest": true },
    ...
  ],
  "total": 31
}

The Radisson Collection in Berlin swings from $557 on October 1 to $196 three nights later, and the lowest marker finds the floor without 31 separate calls.
IHG's rooms endpoint goes the other direction and returns member flags plus points pricing beside the cash rate, which our IHG API guide walks through.
Parameters are in the Hilton rooms documentation and the Radisson price calendar documentation.

The Price Fields That Trip People Up

Every payload above carries a trap, and each one has a field that defuses it.

Trap What Goes Wrong The Field That Resolves It
Taxes in or out $169 on Booking.com excludes a city tax; £430.80 on Hilton includes everything tax_breakdown[].included, includes_taxes_and_service_charges
Per night vs total A $1,218 two-night total logged as a nightly rate price_per_night_value and total_price_value side by side
Member and app rates A rate only members can book, compared against public OTA prices is_member_rate, memberOnly, deal labels
Currency "$" meaning USD, CAD, or AUD depending on the site The explicit currency field on every response
Sold out vs failed An empty page read as zero availability is_soldout with an empty rooms array, versus an error

Decide your normalization rules before the first pull: tax-inclusive or not, nightly or total, public or member.
Two feeds that disagree on those three choices will never reconcile.

Which Price Endpoint for Which Job

Your Job Endpoint Key Field
Track a competitor's OTA rate daily Booking.com or Expedia prices by hotel ID price_per_night_value
See direct vs OTA for one hotel Google Travel prices offers[].partner and price
Check a chain's own rate and member flags Hilton, IHG, Radisson, Wyndham, or Accor rooms per_night, is_member_rate
Find the cheapest arrival date Radisson or Accor price calendar calendar[].lowest
Sort a market by price Search endpoints (headline price only) price.display

For a one-time check on a handful of hotels, the free Google hotel info tool shows the partner offers without code.
For anything scheduled, the StayAPI endpoints above replace a scraper that would otherwise need constant upkeep.

Getting Started

  1. Sign up at stayapi.com. Free tier, no credit card, no partner application.
  2. Get your hotel IDs: a Booking.com hotel_id from search or a URL, an Expedia property ID from the URL, a chain hotel code from the chain's search or URL-to-ID endpoint.
  3. Run the prices call above for one hotel and your real dates, and write down your normalization rules (taxes, stay basis, member rates) from the fields it returns.
  4. Add the Google Travel prices call for the same hotel to see the partner spread.
  5. Schedule the pulls (daily is typical for rate tracking) and pipe the JSON into your database, Google Sheets, Power BI, or no-code platforms like N8N and Make.com. For portfolio- or market-scale rate monitoring, book a demo call.

FAQ

Is there a free hotel price API?

Free access is either a test environment (Amadeus, with GDS test data), a free tier of a commercial data API (StayAPI's covers the first requests with no card), or a static dataset with no live prices at all.
Our free hotel API guide compares them.

What's the difference between a hotel price API and a hotel search API?

Search returns many hotels with one headline price each; a price API returns one hotel with every room, rate plan, tax, and cancellation condition for your dates.
Search finds the hotel ID, and the price endpoint uses it.

Does Google have a hotel price API?

Google's Hotel Prices API lets hotels and their connectivity partners send rates to Google; it doesn't return prices to developers.
Third-party data APIs read Google Travel's public price display instead and return the partner offers as an array.

Can I get historical hotel prices from an API?

No price API sells rate history for arbitrary hotels; every endpoint above returns today's price for future dates.
History is built by polling on a schedule and storing the results, which our hotel price tracker guide walks through.

Do hotel price APIs include taxes?

It depends on the platform, and the response says which.
Booking.com payloads carry a tax breakdown with an included flag per charge, Hilton flags taxes and service charges as included, and Radisson marks each calendar amount tax_inclusive.

Ship in 3 days

Ready to simplify your hotel data?

Join other developers using StayAPI to build the next generation of travel applications. Get started for free today.