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 a list of available attractions, activities, and experiences based on a search criterion, travel dates, and optional filters.
This endpoint returns real-time availability and up-to-date prices for our travel experiences inventory.
If you store our attractions inventory retrieved from orders/details endpoint, use the /attractions/search endpoint to retrieve live availability and the latest prices before displaying them to travellers.
The smallest valid request must include:
- A location search criterion
- Currency
- Dates
Example:
{
"currency": "EUR",
"cities": [-2140479, -2154955],
"dates": {
"start_date": "2026-09-18",
"end_date": "2026-09-20"
}
}Optional parameters such as filters, rows, and sort
A search request defines the parameters used to find attractions. The response returns a list of matching attractions and metadata describing the result set.
Example scenario:
Retrieve attractions in the Netherlands and Belgium available between 18–20 September 2026, filtered by minimum review score and supported languages.
{
"currency": "EUR",
"countries": ["nl", "be"],
"dates": {
"start_date": "2026-09-18",
"end_date": "2026-09-20"
},
"filters": {
"rating": {
"minimum_review_score": 4.2,
"minimum_review_count": 100
},
"supported_languages": ["en", "es", "fr", "de"]
},
"rows": 50,
"sort": {
"by": "most_popular"
}
}
The request body defines where and how to search for attractions.
Field | Format | Description |
|---|---|---|
currency | ISO 4217 code (e.g. EUR) | Currency used for pricing in the response. |
dates.start_date | YYYY-MM-DD | Start of the availability period. |
dates.end_date | YYYY-MM-DD | End of the availability period. |
The following date constraints apply:
start_datemust be before or equal toend_date.start_dateandend_datemust be between the date of the request and 180 days after the request date.end_datecan be the same asstart_datefor a single-day search.end_datemust be no more than 90 days afterstart_date.- Dates use ISO 8601 date format (
YYYY-MM-DD).
You must include one of the following fields to define where to search for attractions.
Field | Restriction | Description |
|---|---|---|
attractions | Between 1 and 100 attraction IDs. | Retrieve specific attractions using attraction IDs. |
cities | Between 1 and 5 city IDs. | Search for attractions located in one or more cities. |
countries | Between 1 and 3 lowercase ISO 3166-1 alpha-2 country codes. | Search for attractions within specific countries. |
coordinates | Required latitude and longitude; optional positive radius; default radius is 10 km. | Search for attractions near a geographic location. |
Example (city search):
{
"currency": "EUR",
"cities": [-2140479],
"dates": {
"start_date": "2026-09-18",
"end_date": "2026-09-20"
}
}Filters allow you to restrict the search to specific criteria. You can use one or more filters in the same request.
filters.categories– Filter by attraction typefilters.rating– Filter by review score and countfilters.supported_languages– Filter by supported languages
Use filters.categories to filter results by one or more attraction category IDs.
- Call the /attractions/constants endpoint to retrieve the available category IDs and their localised names.
- You can use both root categories and subcategories as filter values.
Only attractions matching at least one of the selected categories are returned.
Example of filter by categories request:
"filters": {
"categories": ["PTCMCuXtHgrC", "PTCMCY1Fkppn"]
}If an invalid or unsupported category ID is provided, the search response contains no results.
You can filter by review score and total count.
| Field | Format | Description |
|---|---|---|
filters.rating.minimum_review_score | Number (0–5) | Minimum average guest review score. |
filters.rating.minimum_review_count | Integer ≥0 | Minimum number of guest reviews. |
Use filters.supported_languages to filter results by the languages supported by the attraction.
- Values must use lowercase IETF language tags, such as
nl,en, oren-us. - To retrieve the complete list of supported languages, call the /common/languages endpoint in the same Demand API version.
Example:
"filters": {
"supported_languages": ["en", "de"]
}Filters allow you to refine results based on quality indicators and traveller preferences.
"filters": {
"categories": ["PTTV32SGqJEv"],
"rating": {
"minimum_review_score": 4.0,
"minimum_review_count": 50
},
"supported_languages": ["en", "de"]
}- Use
rowsto set the number of results returned per page. - Use
pageas pagination token returned inmetadata.next_page. - Use
sort.byto control how attractions results are ordered.
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 search criterion, it displays attractions closest to the provided search coordinates first. |
trending | Orders attractions based on predicted scores from a machine learning model. |
Pagination and sorting example
"rows": 50,
"sort": {
"by": "lowest_price_first"
},
"page": "eyJhbGciOiJIUzI1NiJ9..."
See the pagination guide for details.
The response returns:
- Matching attractions.
- Pagination metadata.
- A unique request identifier.
{
"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"
}
}
},
{
"id": "PRAmdacCwQLH",
"free_cancellation": false,
"price": {
"currency": "EUR",
"total": 15.5
},
"urls": {
"app": {
"detail": "booking://attractions/product?slug=pramdaccwqlh-madame-tussauds-ticket&aid=956509",
"search_results": "booking://attractions/searchresults?ufi=-2140479&pinned_product_id=PRAmdacCwQLH&aid=956509"
},
"web": {
"detail": "https://www.booking.com/attractions/nl/pramdaccwqlh-madame-tussauds-ticket.en-gb.html?selected_currency=EUR&aid=956509",
"search_results": "https://www.booking.com/attractions/searchresults/nl/amsterdam.en-gb.html?pinned_product=PRAmdacCwQLH&aid=956509"
}
}
}
],
"metadata": {
"next_page": "eyJhbGciOiJIUzI1NiJ9...",
"total_results": 128
},
"request_id": "01fr9ez700exycb98w90w5r9sh"
}
If no attractions are returned:
- Verify that the date range has available inventory.
- Check whether filters are too restrictive.
- Confirm that city or country IDs are valid.
If necessary, broaden the search criteria or remove filters temporarily.
Not all attractions or experiences visible on the Booking.com website are available via the Demand API. The API intentionally provides a curated subset of experiences designed for partner integrations and connected travel solutions.
Most integrations use /attractions/search as part of the following workflow:
- Retrieve location identifiers from /common/locations endpoints.
- Search for attractions using /attractions/search.
- Display results to travellers.
- Retrieve full product information with /attractions/details.
- Continue with availability and booking flows.
✅ 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.
- Refer to the Search use cases section for more examples.
- Read the Attraction details guide to learn how to obtain attraction static data.
- See the Pagination guide for instructions on paginating search results.