Enable travellers to find, compare, and view attractions with key details such as name, description, and pricing..
This quick guide shows the minimum steps needed to integrate the Demand API attractions endpoints.
- Purpose: Fast setup to search for attractions and retrieve their details.
- When to use: You’re new to the Attractions API and want to try a simple example.
- You´ll learn how to:
- Search for available attractions.
- Retrieve attraction details.
- Redirect to the Booking.com attraction page to book.
- Code samples: Minimal, using only the required fields.
Make sure you have:
✓ A valid API key token.
✓ Your X-Affiliate-Id
✓ Open the try out console.
Send the required authentication and affiliate headers with every request.
→ Use the attractions/search endpoint to attractions available in your selected area and dates.
The search criteria are mutually exclusive. For example, send cities or countries, not both.
- City IDs are available from /common/location/cities
- Country codes are lowercase ISO 3166-1 alpha-2 codes, available from /common/locations/countries.
See the Data conventions guide for supported formats.
Search dates must be today or later and within the 180-day booking window.
- The end date must be on or after the start date and no more than 90 days after it.
- A single-day search can use the same date for both fields.
This example searches for attractions in Amsterdam between 18 and 20 December 2026:
Example request by city ID:
{
"currency": "EUR",
"cities": [-2140479],
"dates": {
"start_date": "2026-12-18",
"end_date": "2026-12-20"
},
"filters": {
"rating": {
"minimum_review_score": 4.2,
"minimum_review_count": 100
}
},
"rows": 20,
"sort": {
"by": "most_popular"
}
}
Use a point-of-interest search when you want attractions associated with a large venue or landmark, such as a museum or monument.
Call /attractions/points-of-interest to look up IDs.
- Filter by one or more cities or countries, or send an empty object (
{}) to list points of interest across all locations. - The response includes IDs, localised names, coordinates, city and country, and Booking.com web search-results links.
For example, request points of interest in Amsterdam with English and French names:
{
"cities": [-2140479],
"languages": ["en-gb", "fr"],
"rows": 100
}Use the returned point of interest ID from the response in the points_of_interest array when searching:
{
"currency": "EUR",
"points_of_interest": [107038],
"dates": {
"start_date": "2026-12-18",
"end_date": "2026-12-20"
},
"rows": 20,
"sort": {
"by": "most_popular"
}
}The response includes matching attractions, prices in the requested currency, Booking.com links and pagination metadata.
{
"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": null,
"total_results": 2
},
"request_id": "01fr9ez700exycb98w90w5r9sh"
}
The response includes:
- A list of atractions.
- Whether free cancellation is available.
- Pricing information (in the requested currency)
- A URL to the Booking.com attractions page.
Keep the attraction id (for example, PRahAzWtTraa) for the next step.
→ Try it yourself!
→ Use the /attractions/details to retrieve static information for one or more attractions, including name, description, location, categories, photos, and ratings.
You can request details for 1–100 attraction IDs.
Example request:
{
"attractions": ["PRahAzWtTraa"],
"languages": ["en-gb"]
}
If you request multiple languages, the API will return data in your preferred language when available; otherwise, English is returned by default.
Example response:
The response can include a localised name and description, category IDs, locations, photos, duration, ratings, badges, supported languages, URLs and points_of_interest IDs.
Use the returned points_of_interest IDs with /attractions/points-of-interest to retrieve the associated venue names, coordinates and search-results links.
{
"request_id": "01fr9ez700exycb98w90w5r9sh",
"data": [
{
"id": "PRahAzWtTraa",
"name": "Heineken Experience Amsterdam",
"categories": ["food_drinks"],
"duration": "PT2H",
"badges": ["best_seller"],
"photos": [
{
"url": "https://cf.bstatic.com/xdata/images/xphoto/500x375/170335205.jpg"
}
],
"locations": [
{
"address": "Stadhouderskade 78",
"city": -2140479,
"country": "nl",
"coordinates": {
"latitude": 52.360043,
"longitude": 4.885177
},
"type": "attraction"
}
],
"long_description": "Discover the history of Heineken and enjoy a behind-the-scenes interactive experience in Amsterdam’s original brewery.",
"ratings": {
"number_of_reviews": 3250,
"score": 4.8
},
"supported_languages": ["en-gb", "nl"],
"url": {
"web": "https://www.booking.com/attractions/nl/prahazwttraa-heineken-experience-amsterdam.en-gb.html"
}
}
]
}
The response provides static content such as:
- Attraction name and description.
- Duration and categories.
- Location details (address, coordinates, city).
- Photos and supported languages.
- Rating data.
For recommendations on presenting and storing static details, see the Retrieve attraction details guide and the Display attraction details guide.
Each attraction response includes a direct url (web and app) that you can use to redirect travellers to Booking.com to complete their booking.
Example:
"url": {
"app": "booking://attractions/product?slug=prahazwttraa-heineken-experience-amsterdam&aid=956509",
"web": "https://www.booking.com/attractions/nl/prahazwttraa-heineken-experience-amsterdam.en-gb.html?selected_currency=EUR&aid=956509"
}Use the aid parameter (your affiliate ID) to ensure proper attribution.
If your initial /attractions/search response includes a metadata.next_page token, use it to fetch the next set of results.
{
"next_page": "eyJwYWdlIjoyfQ=="
}Each subsequent call returns:
- The next rows of results.
- An updated
next_pagetoken (if more results are available) - Repeat until the
next_pagefield is no longer returned.
For optimal performance, store the last next_page token and use it to resume pagination if a session is interrupted. See the Pagination guide for more details.
| Step | Endpoint | Purpose |
|---|---|---|
| 1 | /attractions/search | Find available attractions and prices. |
| 2 | /attractions/points-of-interest (optional) | Look up venue IDs to search for associated attractions. |
| 3 | /attractions/details | Retrieve static information for selected attractions. |
| 4 | Booking.com URL from the response | Direct travellers to continue on Booking.com. |
| 5 | /attractions/search (as needed) | Retrieve another page using metadata.next_page as page. |
- Send your API key token and
X-Affiliate-Idwith every request. - Include exactly one search criterion, plus the required currency and dates.
- Use returned IDs and URLs rather than constructing them yourself.
- Store static attraction details where useful, and refresh them periodically. Search again before displaying prices or availability.
- Use pagination tokens to retrieve further results instead of increasing
rowsunnecessarily.
Here are some common issues you might encounter when testing the Attractions endpoints.
Check that the request is valid JSON and includes the required fields. A search request needs exactly one criterion, currency and dates. Confirm that array limits, date constraints and enum values are valid.
Pass the token returned in metadata.next_page as page, and keep the other search parameters unchanged. If the token is no longer valid, restart the search without page and begin a new pagination sequence.
Check the date range, location IDs and filters. If you searched by point of interest, note that its Booking.com search-results page can be empty when no attractions are currently associated with it. Try broader criteria or remove filters.
If the issue persists, check your affiliate ID and authentication header, review the error codes and examples, and test the request in the Try out console.
Congratulations, by now you know the basics of how to use the key attractions endpoints for the Search, look and redirect flow!
- Explore the Search for attractions guide and use cases for more examples.
- Learn how to Display and Store Attraction details.
- See tha Attractions API reference here for all endpoints and schemas.