Hotel Search API
Search for available hotels in any destination with flexible date and guest configurations.
Copy for your AI agent
Paste into Claude, ChatGPT, Cursor or Copilot — endpoint, parameters, response fields and a curl example in Markdown.
Point of sale and display settings
Pass market=ES for Spain (Spanish and EUR defaults) or market=US for the United States (English and USD). The optional language and currency parameters override these defaults. Market is an ISO 3166-1 two-letter country code; unknown codes and conflicting market/country_market values return 400.
Legacy country_market remains supported and keeps English/USD defaults. Omitting both retains US targeting and English/USD. For search by URL, explicit language/currency query parameters override values embedded in the URL; explicit URL values override market defaults.
Defaults: ES es/EUR, US en-us/USD, GB en-gb/GBP, DE de/EUR, FR fr/EUR, IT it/EUR, PT pt-pt/EUR, NL nl/EUR, IE en-gb/EUR, CA en-us/CAD, AU en-gb/AUD, JP ja/JPY. Other valid countries use en-us/USD unless overridden.
data.effective_market reports requested_country, nullable targeted_country, language, and currency. Targeting is best-effort: country_verified is false and verified_country is null because the response does not independently verify geography. A null target means country targeting was not applied. MCP returns the same object as effective_market.
{"requested_country":"ES","targeted_country":"ES","country_verified":false,"verified_country":null,"language":"es","currency":"EUR"}
For prices, total_price_value follows the displayed gross basis and is not guaranteed to include every charge. taxes_and_charges_value is the included portion (gross minus net); inspect tax_breakdown[].included for excluded taxes.
Compare the same stay, occupancy, room, rate conditions and currency. Market can change tax inclusion and displayed totals without changing the all-in price; it does not guarantee a discount or availability. In the verified Spain/US comparison, the same rate displayed US$455 including taxes in Spain and $341 excluding taxes in the US, with the same $455.46 all-in amount.
Overview
Availability Search
Search for hotels with real-time availability and pricing information based on dates and guest requirements.
Need a Destination ID?
Don't know the dest_id for your location? Use the Destinations Lookup endpoint to convert any location name (e.g., "Barcelona", "Paris") into a Booking.com destination ID.
The Hotel Search endpoint allows you to search for available hotels in any destination with specific check-in/check-out dates, number of guests, and rooms. Returns real-time availability and pricing data.
Endpoint URL
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| dest_id | string | Required | Destination ID from Booking.com (e.g., "-2167973" for Lisbon). Get it from Destinations Lookup |
| dest_type | string | Optional | Destination type (default: "CITY") |
| checkin | string | Optional | Check-in date in YYYY-MM-DD format |
| checkout | string | Optional | Check-out date in YYYY-MM-DD format |
| adults | integer | Optional | Number of adults (default: 2) |
| rooms | integer | Optional | Number of rooms (default: 1) |
| children | integer | Optional | Number of children, 0–10 (default: 0). Supply one age per child. |
| children_ages | string | Optional | Comma-separated integer ages 0–17. The count must equal children; omit or leave empty with zero children. Missing, malformed or mismatched ages return HTTP 400 Problem Details with error_code INVALID_OCCUPANCY. |
| rows_per_page | integer | Optional | Results per page (default: 25, max: 100) |
| offset | integer | Optional |
Starting offset for pagination (default: 0). Booking.com serves results up to offset 1000 — data.pagination.total_results is the real match count, and has_next_page turns false at that limit.
|
| language | string | Optional | Language override (market default, otherwise "en-us") |
| currency | string | Optional | Currency override (market default, otherwise "USD") |
| country_market | string (ISO-3166) | Optional |
Legacy two-letter country target (default: US), preserving English/USD defaults. It must match market if both are supplied. The echo is a request value, not verified geography.
|
Rate labels
each data.hotels[].price object includes labels (an array of readable strings), genius_discount_pct (a number or null), and is_mobile_rate (a boolean). Labels describe the quoted rate, for example Mobile rate or Bonus savings. Unlabelled rates return []. A hotel without a quoted price retains price: null.
These are anonymous public quotes. A property Genius badge alone does not prove a Genius discount on this rate. A null percentage means no rate-specific percentage was observed; is_mobile_rate: false means no explicit mobile-rate marker was observed. Labels can vary by market and occupancy and do not guarantee eligibility for logged-in member prices. Existing discount fields remain available.