---
title: "List a hotel's rooms & rates"
method: GET
path: "/v1/hotels/{hotelId}/rates"
tags: ["Hotels"]
---

# List a hotel's rooms & rates

`GET /v1/hotels/{hotelId}/rates`

Returns the Book-on-Wego rooms & rates for a hotel (cheapest-first): room name, board, refundability, price, and each rate's composed booking reference id.

## Path parameters

- `hotelId` integer, required

## Query parameters

- `searchId` string, required
- `currency` string
- `locale` string

## Response `200`

Cheapest-first Book-on-Wego rates.

- object
  - `hotelId` number, required — The hotel these rates are for.
  - `searchId` string, required — The search these rates were priced within.
  - `currencyCode` string, required — The currency every rate price on this read was computed in – the same value as metadata.currencyCode, which carries currencyCodeSource beside it. Read it before you show a number: a price computed in the wrong currency renders as a perfectly normal price.
  - `searchComplete` boolean, required — Advisory: true means upstream reports it finished aggregating rates for this search. It is not a guarantee that the list on this page is final, so do not block on it.
  - `stay` object — What upstream priced: the dates and occupancy every price on this read covers. Present when upstream states them.
    - `checkIn` string, required — Check-in date priced upstream, YYYY-MM-DD.
    - `checkOut` string, required — Check-out date priced upstream, YYYY-MM-DD.
    - `nights` integer, required — Nights between checkIn and checkOut. price.total covers this many nights of price.amountPerNight.
    - `occupancy` object, required — The occupancy priced upstream for this search (ages resolved, incl. fallback).
      - `adults` integer, required — Adults priced upstream for this search.
      - `childrenAges` integer[], required — Resolved per-child ages actually sent upstream (age-8 fallback when omitted).
      - `rooms` integer, required — Rooms priced upstream for this search.
  - `rates` object[], required — Bookable rates for the hotel in this search.
    - `id` string, required — Composed booking reference (opaque passthrough); pass it to GET /v1/hotels/{hotelId}/rates/{rateId}/booking-link.
    - `roomName` string, required — Room type name, e.g. Deluxe King.
    - `board` string — Board basis, normalized to lower_snake_case (e.g. room_only, breakfast_included). Absent when the provider states none.
    - `refundable` boolean, required — True when this rate carries a refundable or free-cancellation code. Authoritative on this endpoint, unlike the results card's refundable witness.
    - `cancellationPolicy` string — Coarse policy derived from the refundability codes: free_cancellation or non_refundable.
    - `price` object, required — A rate's pricing. Every amount covers the whole booking, all rooms in the search, so quote these figures as they stand. Upstream rounds per booking, so total is the exact stay figure and amountPerNight is one night of it. All amounts exclude totalLocalTax, which wego.com adds to the displayed price.
      - `scope` 'booking', required — What every amount here covers: the whole booking, all rooms in the search.
      - `amountPerNight` number, required — One night of the whole booking, in the request currency, covering every room. Rounded to a whole currency unit upstream; total is the exact stay figure.
      - `taxAmountPerNight` number — Per-night tax, when reported.
      - `taxInclusive` boolean — Whether amountPerNight already includes taxAmountPerNight. Says nothing about localTaxPerNight, which is excluded either way.
      - `localTaxPerNight` number — Per-night local tax (city / tourism / municipality), charged on top of amountPerNight whatever taxInclusive says. wego.com quotes amountPerNight + localTaxPerNight, so quote both. Present when upstream reports the tax, where 0 means none charged. Absent when upstream reports it as unknown.
      - `totalLocalTax` number — Stay total of localTaxPerNight as reported upstream, which rounds the nightly figure. Present when upstream reports the tax. Absent when upstream reports it as unknown.
      - `total` number — Stay total in the request currency. Excludes totalLocalTax, mirroring amountPerNight.
      - `totalUsd` number, required — Stay total in USD – the cross-currency sort key.
      - `currency` string, required — ISO 4217 currency of the amounts on this price.
      - `deal` object — The discount advertised on this room's rate, absent when it carries none. Rooms commonly share one offer, so treat a deal here as a property of the rate rather than as a rare find, and compare percentOff across the rooms before recommending one.
        - `label` string — The offer's own tag, e.g. 'Best Deal'. Its presence also says where wasPerNight came from: see that field.
        - `percentOff` integer, required — This room's discount as a whole percent. A tagged offer's percent wins over a usual-price one, matching the site's precedence, and the two often differ. wego.com renders a percentage only for an UNTAGGED offer; a tagged one it shows as its label plus a crossed-out price, so do not attribute this figure to what the page displays. Always describes the same offer as wasPerNight, so the pair never disagree.
        - `wasPerNight` number — Pre-discount per-night price, on amountPerNight's basis so the two subtract cleanly. When label is present this is COMPUTED back from the offer's unrounded discount, since a tagged offer carries no pre-discount price of its own and wego.com renders the same computed figure; quote it as approximate, and expect it to differ slightly from a figure you derive using the rounded percentOff. When label is absent it is the quoted pre-discount price itself.
        - `wasTotal` number — Pre-discount stay total, on total's basis. Computed or quoted on the same rule as wasPerNight.
        - `promoCode` string — Promo code the traveller enters at checkout, when the offer carries one. Most live offers are provider discounts with no code. Scoped to this room's rate; wego.com instead shows one such code above the whole room list.
    - `roomsLeft` number — Rooms remaining at this rate, when the provider reports scarcity; absent otherwise.
    - `images` string[] — Room image URLs, when the provider supplies them.
  - `metadata` object, required — What this read resolved currency and locale to, and how each was decided.
    - `currencyCode` string, required — The currency this read ASKED upstream for, and the one every price on it is meant to be in. Read it beside currencyCodeSource before you show a number: a price computed in the wrong currency renders as a perfectly normal price, with no error and no odd shape to notice, so the response states which one rather than leaving it to be inferred. Where the operation also publishes a top-level currencyCode, that field reports the currency the prices actually came back in; the two agree unless upstream declined to reprice.
    - `currencyCodeSource` 'explicit' | 'default', required — How the API resolved currencyCode: explicit (the caller sent currency – including a value equal to the default) or default (USD, no currency sent). A default here is the one signal that the request never carried the currency you meant.
    - `locale` string, required — The language tag this read asked upstream for – what any localized text on it was resolved in (room and board names, airline and airport names, review prose).
    - `localeSource` 'explicit' | 'default', required — How the API resolved locale: explicit (the caller sent locale – including a value equal to the default) or default (en, no locale sent). A default here explains text that came back in a language the caller did not ask for.

## Other responses

- `400` — Invalid request parameters.
- `401` — Missing or invalid bearer token.
- `404` — Unknown hotel, or unknown/expired search.
- `429` — Rate limit exceeded; retry after the `Retry-After` seconds.
- `502` — The upstream hotels service returned an invalid response.
- `503` — The hotels service is unavailable (`upstream_unavailable`) or rate-limited upstream (`upstream_rate_limited`); retry after the `Retry-After` seconds.

---

[API](https://skmtc.net/wego/apis/wego-api.md) · [All operations](https://skmtc.net/wego/apis/wego-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/wego/wego-api/revisions/e5d7af502419/schema)
