Skip to content

Search for attractions v3.3

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.

Minimum request

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"
  }
}

Search input

Required fields

Field
FormatDescription
currencyThree-letter ISO 4217 currency code, such as EURCurrency used for prices in the response. Use a supported currency from /common/payments/currencies.
dates.start_dateISO 8601 date, YYYY-MM-DDStart of the availability period.
dates.end_dateISO 8601 date, YYYY-MM-DDEnd of the availability period.

Date constraints

The date range must meet these requirements:

  • start_date must be today or later and no more than 180 days in the future.
  • end_date must be on or after start_date and no more than 180 days in the future.
  • end_date can be the same as start_date for a single-day search.
  • end_date must be no more than 90 days after start_date.
  • Dates must use the ISO 8601 date format YYYY-MM-DD.

Search criteria

Include exactly one of the following fields in each request. Do not combine search criteria.

Criterion
RestrictionDescription
attractions1–100 attraction IDsRetrieve specific attractions by their IDs.
cities1–5 city IDsSearch for attractions located in one or more cities. Get city IDs from /common/location/cities.
countries1–3 lowercase ISO 3166-1 alpha-2 country codesSearch for attractions in one or more countries. Get country codes from /common/locations/countries.
coordinatesRequired latitude and longitude; optional positive radius, which defaults to 10 kmSearch for attractions near a geographic location.
points_of_interest1–10 integer IDsSearch 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.

Search by attraction ID

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"
  }
}

Search by city

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"
  }
}

Search by country

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"
  }
}

Search near coordinates

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 radius in 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"
  }
}

Search by point-of-interest IDs

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_interest array 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.

Find the points_of_interest IDs

To find the points_of_interest IDs, call /attractions/points-of-interest.

  • You can filter the directory by cities or countries, 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.

Filter results

Use filters to narrow results. You can combine category, rating and supported-language filters in the same request.

Filter by category

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"]
  }
}

Filter by review score and count

Use filters.rating to set minimum review thresholds.

FieldFormatDescription
filters.rating.minimum_review_scoreNumber from 0 to 5Minimum average guest review score.
filters.rating.minimum_review_countInteger greater than or equal to 0Minimum number of guest reviews.

Filter by supported languages

Use filters.supported_languages to return attractions that support one or more specified languages.

  • Values must be lowercase IETF language tags, such as nl, en or en-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"]
  }
}

Combine filters

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"]
  }
}

Sort and paginate results

Use sort.by to control the order of the results. The available options are:

Sort option
Description
most_popularOrders attractions by the highest number of reservations in the last 30 days.
highest_review_scoreShows attractions with the highest average review score first.
highest_weighted_review_scoreOrders attractions by a weighted review score. Higher ratings and a greater number of reviews influence an attraction's priority.
lowest_price_firstDisplays attractions with the lowest available price first.
nearest_locationWhen using the coordinates criterion, displays attractions closest to the search coordinates first.
trendingOrders 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.

Understand the response

The response contains a data array of matching attractions, pagination metadata and a unique request identifier. Each attraction can include:

Field
Description
idUnique identifier of the attraction.
free_cancellationIndicates whether free cancellation is available.
pricePrice in the requested currency for the cheapest available adult offer. The total includes all extra charges.
urlsWeb 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.

When no results are returned

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.

Products coverage

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.

Typical integration flow

A typical search flow is:

  1. Retrieve location identifiers from the relevant /common endpoints, or retrieve attraction IDs from a previous search.
  2. If searching by point of interest, call /attractions/points-of-interest to retrieve IDs, or retrieve the IDs from the points_of_interest field in /attractions/details.
  3. Send a search request with one criterion, a currency and travel dates.
  4. Optionally refine the request with filters, sorting and pagination.
  5. Display search results to travellers.
  6. Retrieve static information for selected attractions from /attractions/details.
  7. 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.

Best practices

✅ Optimise performance:

  • Limit rows to 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.by according to the traveller’s goal, such as most_popular for discovery or lowest_price_first for 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.

Curious to know more?