Learn how to use the /attractions/search endpoint to find and retrieve attractions that match travellers’ preferences, locations, and travel dates.
Use the /attractions/search endpoint to retrieve attractions, activities and experiences that match a search criterion, travel dates and optional filters.
Search results include pricing and links for the attraction detail and search-results pages.
Each search request must include exactly one search criterion, a currency and a date range. You can search by attraction ID, city, country, coordinates or point-of-interest ID.
Use /attractions/details to retrieve static information about attractions. It does not return pricing information.
A valid search request includes:
- One search criterion.
- A currency.
- Start and end dates.
For example, this request searches for attractions in Amsterdam:
{
"currency": "EUR",
"cities": [-2140479],
"dates": {
"start_date": "2026-11-18",
"end_date": "2026-11-20"
}
}Field | Format | Description |
|---|---|---|
currency | Three-letter ISO 4217 currency code, such as EUR | Currency used for prices in the response. Use a supported currency from /common/payments/currencies. |
dates.start_date | ISO 8601 date, YYYY-MM-DD | Start of the availability period. |
dates.end_date | ISO 8601 date, YYYY-MM-DD | End of the availability period. |
The date range must meet these requirements:
start_datemust be today or later and no more than 180 days in the future.end_datemust be on or afterstart_dateand no more than 180 days in the future.end_datecan be the same asstart_datefor a single-day search.end_datemust be no more than 90 days afterstart_date.- Dates must use the ISO 8601 date format
YYYY-MM-DD.
Include exactly one of the following fields in each request. Do not combine search criteria.
Criterion | Restriction | Description |
|---|---|---|
attractions | 1–100 attraction IDs | Retrieve specific attractions by their IDs. |
cities | 1–5 city IDs | Search for attractions located in one or more cities. Get city IDs from /common/location/cities. |
countries | 1–3 lowercase ISO 3166-1 alpha-2 country codes | Search for attractions in one or more countries. Get country codes from /common/locations/countries. |
coordinates | Required latitude and longitude; optional positive radius, which defaults to 10 km | Search for attractions near a geographic location. |
points_of_interest | 1–10 integer IDs | Search for attractions associated with one or more points of interest. Get these IDs from /attractions/details. |
Point-of-interest IDs are not the landmark IDs returned by /common/locations/landmarks.
Use attraction IDs to retrieve current availability and prices for specific attractions.
{
"currency": "EUR",
"attractions": ["PRahAzWtTraa", "PRAmdacCwQLH"],
"dates": {
"start_date": "2026-12-18",
"end_date": "2026-12-20"
}
}Use city IDs from /common/location/cities to search for attractions in one or more cities.
{
"currency": "EUR",
"cities": [-2140479],
"dates": {
"start_date": "2026-12-18",
"end_date": "2026-12-20"
}
}Use lowercase ISO 3166-1 alpha-2 country codes.
{
"currency": "EUR",
"countries": ["nl", "be"],
"dates": {
"start_date": "2026-12-18",
"end_date": "2026-12-20"
}
}The coordinates object requires latitude and longitude.
- Their values must be between -90 and 90 for latitude and -180 and 180 for longitude.
- You can optionally set a positive
radiusin kilometres. The default radius is 10 km.
{
"currency": "EUR",
"coordinates": {
"latitude": 52.3676,
"longitude": 4.9041,
"radius": 5
},
"dates": {
"start_date": "2026-12-18",
"end_date": "2026-12-20"
}
}Use the points_of_interest IDs to find attractions associated with the same venue or landmark.
- An attraction can be associated with a point of interest when it takes place there, visits it or passes it.
- An attraction can have several associated IDs; the
points_of_interestarray in its details response is empty when it has no associated point of interest.
Example:
{
"currency": "EUR",
"points_of_interest": [107029],
"dates": {
"start_date": "2026-12-18",
"end_date": "2026-12-20"
},
"rows": 50,
"sort": {
"by": "most_popular"
}
}Note: The /attractions/search response does not include the points_of_interest IDs. Retrieve them from the point-of-interest directory or from the attraction details response, then use them as the search criterion to find associated attractions.
To find the points_of_interest IDs, call /attractions/points-of-interest.
- You can filter the directory by
citiesorcountries, or send an empty object ({}) to list points of interest across all locations (The filters cannot be combined) - You can provide up to five city IDs or three country codes.
The response includes IDs, localised names, coordinates, city and country IDs, and Booking.com web search-results links. For example, retrieve points of interest in Paris and request names in English and French:
{
"cities": [-1456928],
"languages": ["en-gb", "fr"],
"rows": 100
}The response includes point-of-interest IDs that you can use in the search request:
{
"data": [
{
"id": 107038,
"name": {
"en-gb": "Rodin Museum",
"fr": "Musée Rodin"
},
"coordinates": {
"latitude": 48.8559,
"longitude": 2.31601
},
"city": -1456928,
"country": "fr",
"urls": {
"web": {
"search_results": {
"en-gb": "https://www.booking.com/attractions/searchresults/fr/dr9brl1gypih-rodin-museum.en-gb.html?aid=111111",
"fr": "https://www.booking.com/attractions/searchresults/fr/dr9brl1gypih-rodin-museum.fr.html?aid=111111"
}
}
}
},
{
"id": 102332,
"name": {
"en-gb": "Saint-Jacques Tower",
"fr": "Tour Saint-Jacques"
},
"coordinates": {
"latitude": 48.858068,
"longitude": 2.348907
},
"city": -1456928,
"country": "fr",
"urls": {
"web": {
"search_results": {
"en-gb": "https://www.booking.com/attractions/searchresults/fr/dr04er7zf5tx-tour-st-jacques.en-gb.html?aid=111111",
"fr": "https://www.booking.com/attractions/searchresults/fr/dr04er7zf5tx-tour-st-jacques.fr.html?aid=111111"
}
}
}
}
],
"request_id": "01fr9ez700exycb98w90w5r9sh",
"metadata": {
"next_page": null,
"total_results": 2
}
}Pass the returned ID in the points_of_interest array, with the required currency and dates.
- The IDs returned by /attractions/points-of-interest match the IDs in the points_of_interest field returned by /attractions/details.
- They are not the landmark IDs returned by /common/locations/landmarks.
Use filters to narrow results. You can combine category, rating and supported-language filters in the same request.
Use one or more category IDs in filters.categories.
- Call /attractions/constants to retrieve available category IDs and their localised names.
- Both root categories and subcategories can be used.
Results include attractions that match at least one of the specified categories.
If you provide an invalid or unsupported category ID, the response contains no results.
{
"currency": "EUR",
"cities": [-2140479],
"dates": {
"start_date": "2026-12-18",
"end_date": "2026-12-20"
},
"filters": {
"categories": ["PTCMCuXtHgrC", "PTCMCY1Fkppn"]
}
}Use filters.rating to set minimum review thresholds.
| Field | Format | Description |
|---|---|---|
filters.rating.minimum_review_score | Number from 0 to 5 | Minimum average guest review score. |
filters.rating.minimum_review_count | Integer greater than or equal to 0 | Minimum number of guest reviews. |
Use filters.supported_languages to return attractions that support one or more specified languages.
- Values must be lowercase IETF language tags, such as
nl,enoren-us. - Call /common/languages in the same Demand API version to retrieve the supported language codes.
{
"currency": "EUR",
"cities": [-2140479],
"dates": {
"start_date": "2026-12-18",
"end_date": "2026-12-20"
},
"filters": {
"supported_languages": ["en", "de"]
}
}You can combine multiple filters in the same request. For example:
{
"currency": "EUR",
"countries": ["nl"],
"dates": {
"start_date": "2026-12-18",
"end_date": "2026-12-20"
},
"filters": {
"categories": ["PTCMCuXtHgrC"],
"rating": {
"minimum_review_score": 4,
"minimum_review_count": 50
},
"supported_languages": ["en", "de"]
}
}Use sort.by to control the order of the results. The available options are:
Sort option | Description |
|---|---|
most_popular | Orders attractions by the highest number of reservations in the last 30 days. |
highest_review_score | Shows attractions with the highest average review score first. |
highest_weighted_review_score | Orders attractions by a weighted review score. Higher ratings and a greater number of reviews influence an attraction's priority. |
lowest_price_first | Displays attractions with the lowest available price first. |
nearest_location | When using the coordinates criterion, displays attractions closest to the search coordinates first. |
trending | Orders attractions by predicted scores from a machine-learning model. |
Use rows to set the number of results returned per page.
- It defaults to 20.
To retrieve the next page, pass the token from metadata.next_page as the page value in your next request. Omit page from the first request.
Example:
{
"currency": "EUR",
"cities": [-2140479],
"dates": {
"start_date": "2026-12-18",
"end_date": "2026-12-20"
},
"rows": 50,
"sort": {
"by": "lowest_price_first"
},
"page": "eyJhbGciOiJIUzI1NiJ9..."
}See the pagination guide for more details.
The response contains a data array of matching attractions, pagination metadata and a unique request identifier. Each attraction can include:
Field | Description |
|---|---|
id | Unique identifier of the attraction. |
free_cancellation | Indicates whether free cancellation is available. |
price | Price in the requested currency for the cheapest available adult offer. The total includes all extra charges. |
urls | Web and app links for the attraction detail page and search results page. |
The response's metadata can include next_page for pagination and total_results.
The request_id uniquely identifies the request.
Example of attractions/search response:
{
"data": [
{
"id": "PRahAzWtTraa",
"free_cancellation": true,
"price": {
"currency": "EUR",
"total": 20
},
"urls": {
"app": {
"detail": "booking://attractions/product?slug=prahazwttraa-heineken-experience-amsterdam&aid=956509",
"search_results": "booking://attractions/searchresults?ufi=-2140479&pinned_product_id=PRahAzWtTraa&aid=956509"
},
"web": {
"detail": "https://www.booking.com/attractions/nl/prahazwttraa-heineken-experience-amsterdam.en-gb.html?selected_currency=EUR&aid=956509",
"search_results": "https://www.booking.com/attractions/searchresults/nl/amsterdam.en-gb.html?pinned_product=PRahAzWtTraa&aid=956509"
}
}
}
],
"metadata": {
"next_page": "eyJhbGciOiJIUzI1NiJ9...",
"total_results": 128
},
"request_id": "01fr9ez700exycb98w90w5r9sh"
}The search response does not include the points_of_interest IDs.
Retrieve those IDs from /attractions/details, then use them as the search criterion when you want to find attractions associated with the same venue.
If the response contains no attractions:
- Check that the requested dates are within the allowed booking window.
- Check whether filters are too restrictive.
- Confirm that attraction, city, country or point-of-interest IDs are valid.
- If you searched by coordinates, check that the latitude, longitude and radius are valid.
If necessary, broaden the search criteria or temporarily remove filters.
Not all attractions or experiences visible on the Booking.com website are available through the Demand API. The API provides a curated subset of experiences for partner integrations.
A typical search flow is:
- Retrieve location identifiers from the relevant /common endpoints, or retrieve attraction IDs from a previous search.
- If searching by point of interest, call /attractions/points-of-interest to retrieve IDs, or retrieve the IDs from the
points_of_interestfield in /attractions/details. - Send a search request with one criterion, a currency and travel dates.
- Optionally refine the request with filters, sorting and pagination.
- Display search results to travellers.
- Retrieve static information for selected attractions from /attractions/details.
- Redirect travellers using the returned URL so they can continue on Booking.com.
For a point-of-interest search, first retrieve the IDs from /attractions/details, then send them in the points_of_interest array.
✅ Optimise performance:
- Limit
rowsto 20–50 results for faster responses. - Use pagination tokens instead of fetching all data at once.
✅ Improve result relevance:
- Combine location-based search (coordinates) and qualitative filters.
- Select
sort.byaccording to the traveller’s goal, such asmost_popularfor discovery orlowest_price_firstfor value.
✅ Maintain integration efficiency
- Always include currency and travel dates.
- Store location IDs from /common/locations endpoints and previously retrieved attraction lists to minimise repeated lookups and API calls.
- See the Search use cases for more examples.
- Read the Retrieve attraction details guide to learn how to obtain attraction details and point-of-interest IDs.
- See the Pagination guide for instructions on paginating results.
- See the Attractions API reference.