Attractions and things to do in a city or region as Tripadvisor ranks them, 30 per page: name, id, page type, URL, rating, review count, short description, badges and labels, number of bookable experiences, coordinates and photo, with raw. total, the sort options and the available filters (types of attractions with their ids for category) come with the list. Every response includes credits_used: the credits this call cost.
Parameters
name
type
description
locationrequired
string
City or region: a Tripadvisor geo id (187147), g187147, a Tripadvisor URL containing g<id>, or a place name (the first matching city or region is used; location.resolved_from echoes it). Example: 187147
category
integer
Attraction type id from available_filters (e.g. 47 = sights and landmarks).
sort
string
Sort id from sorts (default TRAVELER_FAVORITE_V2).
filters
string
Site filter tokens from Tripadvisor list URLs, comma-separated (max 6), e.g. zft11292 (free things to do).
page
integer
Page number (30 per page). Pass next_page back as page; null on the last page. Example: 1
domain
com | co.uk | de | fr | it | es | in
Tripadvisor market: com (default), co.uk, de, fr, it, es or in. Names, prices, currency and review translations follow the market. Default: com
import os, requests
res = requests.get(
"https://api.api.sh/tripadvisor/v1/attractions",
params={"location": "187147"},
headers={"x-api-key": os.environ["APISH_KEY"]},
timeout=120,
)
res.raise_for_status()
data = res.json()
const url = new URL("https://api.api.sh/tripadvisor/v1/attractions");
url.searchParams.set("location", "187147");
const res = await fetch(url, { headers: { "x-api-key": process.env.APISH_KEY } });
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const data = await res.json();
Response
A JSON object with the fields described above, plus raw (the source's own data), cached, fetched_at and credits_used. Errors return {"success": false, "error": "…"} with the HTTP status (see errors). A lookup that ran but found nothing (404) costs the price above; refused calls and errors on our side are free (what's charged).
The fastest way to see the full response is the playground: it runs this endpoint with your account and shows the exact JSON.