Skip to content
Booking.com

Booking.com rooms

Booking.com room types and rate plans for one stay window.

POST/v1/ota/booking/rooms
8 credits

Fills the gap left by /v1/rooms: Google's entity page frequently carries no room detail for the Booking.com row, so this goes to Booking directly.

Prices come from the property page's room grid, enriched with room size and occupancy when Booking.com provides them.

Request

POSThttps://api.scrapercompany.com/v1/ota/booking/rooms

Authenticate with your API key in the x-api-key header (see Authentication).

Body

JSON object. Unknown fields are rejected with 422.

  • pagenamestringrequiredmin length 2

    URL slug returned by POST /v1/ota/booking/search, e.g. moxy-boston-downtown from booking.com/hotel/us/moxy-boston-downtown.html.

  • countrystringdefault us

    Two-letter segment before the slug in that URL.

    251 allowed values

    ad, ae, af, ag, ai, al, am, ao, aq, ar, as, at, au, aw, ax, az, ba, bb, bd, be, bf, bg, bh, bi, bj, bl, bm, bn, bo, bq, br, bs, bt, bv, bw, by, bz, ca, cc, cd, cf, cg, ch, ci, ck, cl, cm, cn, co, cr, cu, cv, cw, cx, cy, cz, de, dj, dk, dm, do, dz, ec, ee, eg, eh, er, es, et, fi, fj, fk, fm, fo, fr, ga, gb, gd, ge, gf, gg, gh, gi, gl, gm, gn, gp, gq, gr, gs, gt, gu, gw, gy, hk, hm, hn, hr, ht, hu, id, ie, il, im, in, io, iq, ir, is, it, je, jm, jo, jp, ke, kg, kh, ki, km, kn, kp, kr, kw, ky, kz, la, lb, lc, li, lk, lr, ls, lt, lu, lv, ly, ma, mc, md, me, mf, mg, mh, mk, ml, mm, mn, mo, mp, mq, mr, ms, mt, mu, mv, mw, mx, my, mz, na, nc, ne, nf, ng, ni, nl, no, np, nr, nu, nz, om, pa, pe, pf, pg, ph, pk, pl, pm, pn, pr, ps, pt, pw, py, qa, re, ro, rs, ru, rw, sa, sb, sc, sd, se, sg, sh, si, sj, sk, sl, sm, sn, so, sr, ss, st, sv, sx, sy, sz, tc, td, tf, tg, th, tj, tk, tl, tm, tn, to, tr, tt, tv, tw, tz, ua, ug, uk, um, us, uy, uz, va, vc, ve, vg, vi, vn, vu, wf, ws, xk, ye, yt, za, zm, zw

  • check_instring (date)required

    First night of the stay, YYYY-MM-DD.

  • nightsintegerdefault 1min 1, max 30

    Length of stay. Ignored when check_out is supplied.

  • adultsintegerdefault 2min 1, max 8

    Adults in the room. Two is the hotel default; pass one for a hostel, which is priced per bed. Any value from 1 to 8 is accepted.

  • roomsintegerdefault 1min 1, max 8

    Rooms requested.

  • currencystringdefault USD

    ISO 4217 code for the returned prices. Major currencies include AED, AUD, BRL, CAD, CHF, CNY, EUR, GBP, HKD, INR, JPY, KRW, MXN, NZD, SGD, USD; all 39 supported codes are listed in the enum.

    39 allowed values

    AED, ARS, AUD, BRL, CAD, CHF, CLP, CNY, COP, CZK, DKK, EGP, EUR, GBP, HKD, HUF, IDR, ILS, INR, JPY, KRW, MXN, MYR, NOK, NZD, PEN, PHP, PLN, QAR, RON, SAR, SEK, SGD, THB, TRY, TWD, USD, VND, ZAR

Example request

curl -X POST "https://api.scrapercompany.com/v1/ota/booking/rooms" \
  -H "x-api-key: $SCRAPERCOMPANY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "pagename": "moxy-boston-downtown",
    "country": "us",
    "check_in": "2026-11-30",
    "nights": 1,
    "currency": "USD"
  }'

Response

200 — Room types with both rate plans — the cheap non-refundable one and the dearer free-cancellation one. Metered responses carry x-credits-charged and x-credits-remaining headers (see credit headers).

200 response
{
  "pagename": "moxy-boston-downtown",
  "hotel_id": "5375786",
  "property_name": "Moxy Boston Downtown",
  "check_in": "2029-02-05",
  "check_out": "2029-02-06",
  "nights": 1,
  "currency": "USD",
  "sold_out": false,
  "rendered": true,
  "catalogue_from_graphql": false,
  "cheapest_rate": 250,
  "wire_bytes": 2136057,
  "rooms": [
    {
      "name": "Center Stage, Guest room, 1 Queen, City view",
      "room_id": "537578602",
      "beds": "1 queen bed",
      "room_size": 22,
      "max_persons": 2,
      "cheapest_rate": 250,
      "rate_plans": [
        {
          "block_id": "537578602_191393531_0_42_0",
          "price": 250,
          "currency": "USD",
          "guests": 2,
          "free_cancellation": false,
          "no_prepayment": false,
          "breakfast_included": false
        },
        {
          "block_id": "537578602_246436396_0_42_0",
          "price": 269,
          "currency": "USD",
          "guests": 2,
          "free_cancellation": true,
          "no_prepayment": true,
          "breakfast_included": false
        }
      ]
    }
  ]
}

Response fields

Fields marked required are always present; others appear when they apply.

  • pagenamestringrequired
  • hotel_idstringrequired

    Empty string when the room catalogue was unavailable.

  • property_namestringrequired
  • check_instring (date)required
  • check_outstring (date)required
  • nightsintegerrequired
  • currencystringrequired
  • sold_outboolean | nullrequired
  • renderedbooleanrequired
  • catalogue_from_graphqlbooleanrequired

    Whether room size / occupancy enrichment was available.

  • cheapest_ratenumber | nullrequired
  • wire_bytesintegerrequired
  • collection_idstringrequired
  • observed_atstringrequired
  • roomsarray of objectrequired
    Show 7 child fields
    • rooms[].namestringrequired
    • rooms[].room_idstringrequired
    • rooms[].bedsstringrequired
    • rooms[].room_sizenumber | nullrequired
    • rooms[].max_personsinteger | nullrequired
    • rooms[].cheapest_ratenumber | nullrequired
    • rooms[].rate_plansarray of objectrequired
      Show 8 child fields
      • rooms[].rate_plans[].block_idstringrequired
      • rooms[].rate_plans[].pricenumber | nullrequired
      • rooms[].rate_plans[].currencystringrequired
      • rooms[].rate_plans[].guestsinteger | nullrequired
      • rooms[].rate_plans[].free_cancellationbooleanrequired
      • rooms[].rate_plans[].no_prepaymentbooleanrequired
      • rooms[].rate_plans[].breakfast_includedbooleanrequired
      • rooms[].rate_plans[].provenanceobjectrequired

        Where, when and how one normalized price was observed.

Errors

Errors return a JSON body with a detail field. Failed requests are not charged. See Errors for the full list and retry advice.

StatusMeaningRetry?
401Unauthorized

Missing or invalid API key.

{"detail":"missing or invalid API key"}
No, fix the request
402Payment Required

Not enough credits for this request. Only returned once credit enforcement is switched on; during the beta metering runs in shadow mode and never blocks.

{"detail":"insufficient credits: this request costs 5, 0 available. Credits renew 2026-11-01."}
No, fix the request
422Unprocessable Content

Request validation failed.

{"detail":[{"loc":["body","token"],"msg":"Field required","type":"missing"}]}
No, fix the request
429Too Many Requests

Too many requests: the key's requests-per-minute limit was exceeded, or (once credit enforcement is on) the plan's concurrent-request limit. No rate-limit or Retry-After headers are sent; back off and retry.

{"detail":"rate limit 60/min exceeded"}
Yes, with backoff
502Bad Gateway

The upstream source failed, blocked the request or returned an unusable answer. Safe to retry later; failed requests are not charged.

{"detail":"RuntimeError"}
Yes, with backoff

Try it

  1. Export your key: export SCRAPERCOMPANY_API_KEY=sk_... (no key yet? request access).
  2. Copy the cURL example above and run it in a terminal.
  3. Or open the interactive playground on api.scrapercompany.com, paste your key and pick this endpoint.

Credits

8 credits per successful call. Failed, blocked and empty results are free. Credit metering is in beta and does not block requests yet.