Tripadvisor API: List top restaurants in a city
Lists Tripadvisor's ranked restaurants in a city from the first results page, optionally filtered by cuisine and price category. Sponsored listings are left out; up to 30 restaurants with rating, review count, cuisines, price range and address.
Unofficial. Not affiliated with or endorsed by Tripadvisor.
Inputs
Values from the run on Oct 31, 2026, shown under Output.
- City, required
city City to look up, for example Lisbon.
Lisbon
- Price optional
price Price category, for example cheap_eats; any includes all prices.
cheap_eats
One of
any,cheap_eats,mid_range,fine_dining. Defaultany.- Cuisine optional
cuisine Cuisine to filter by, for example Italian; leave as any for all cuisines.
Italian
Default
any.- Max Results optional
max_results Maximum restaurants to return from the first page, for example 20.
5
Whole number from 1 to 30. Default
20.
Input as JSON
{ "city": "Lisbon", "price": "cheap_eats", "cuisine": "Italian", "max_results": 5}Output
{ "restaurants": [ { "name": "Pizzeria Romana", "rank": 1, "rating": 4.8, "address": "Rua de Sao João da Praça 75, Lisbon 1100-519 Portugal", "cuisines": [ "Italian", "Pizza" ], "price_range": "$", "review_count": 1394, "tripadvisor_link": "https://www.tripadvisor.com/Restaurant_Review-g189158-d15081113-Reviews-Pizzeria_Romana-Lisbon_Lisbon_District_Central_Portugal.html" , "tripadvisor_location_id": "15081113" }, { "name": "Focaccia in Giro", "rank": 2, "rating": 4.7, "address": "Campo de Santa Clara 141, Lisbon 1100-474 Portugal", "cuisines": [ "Italian", "Brew Pub" ], "price_range": "$", "review_count": 291, "tripadvisor_link": "https://www.tripadvisor.com/Restaurant_Review-g189158-d7002452-Reviews-Focaccia_in_Giro-Lisbon_Lisbon_District_Central_Portugal.html" , "tripadvisor_location_id": "7002452" }, { "name": "Sapore", "rank": 3, "rating": 4.3, "address": "Avenida Sidonio Pais 2-B, Lisbon 1050-214 Portugal", "cuisines": [ "Italian", "Pizza" ], "price_range": "$", "review_count": 653, "tripadvisor_link": "https://www.tripadvisor.com/Restaurant_Review-g189158-d3706486-Reviews-Sapore-Lisbon_Lisbon_District_Central_Portugal.html" , "tripadvisor_location_id": "3706486" } ]}Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"tripadvisor.com/list_top_restaurants","input":{"city":"Lisbon","price":"cheap_eats","cuisine":"Italian","max_results":5}}' # Save as fous.py, then run: python3 fous.pyimport json, os, timefrom urllib.error import HTTPErrorfrom urllib.request import Request, urlopenAPI = "https://api.fous.com/v1/runs" KEY = os.environ["FOUS_API_KEY"]HEADERS = { "Authorization": f"Bearer {KEY}", "Content-Type": "application/json" ,}def call(url, body=None): data = json.dumps(body).encode() if body else None request = Request(url, data, HEADERS) try: with urlopen(request, timeout=120) as r: return r.status, json.load(r) except HTTPError as error: message = json.load(error)["error"]["message"] raise RuntimeError(message) from errorstatus, run = call(API, { "method": "tripadvisor.com/list_top_restaurants" , "input": { "city": "Lisbon", "price": "cheap_eats", "cuisine": "Italian", "max_results": 5 }})# 202: still going after 30 s. Ask again until it ends.while status == 202: time.sleep(2) status, run = call(f"{API}/{run['id']}")print(json.dumps(run["data"], indent=2))// Save as fous.mjs, then run: node fous.mjsconst api = "https://api.fous.com/v1/runs" ;const headers = { Authorization: `Bearer ${process.env.FOUS_API_KEY}`, "Content-Type": "application/json" ,};let response = await fetch(api, { method: "POST", headers, body: JSON.stringify({ "method": "tripadvisor.com/list_top_restaurants" , "input": { "city": "Lisbon", "price": "cheap_eats", "cuisine": "Italian", "max_results": 5 } }), signal: AbortSignal.timeout(120_000),});let run = await response.json();// 202: still going after 30 s. Ask again until it ends.while (response.status === 202) { await new Promise((done) => setTimeout(done, 2_000)); response = await fetch(`${api}/${run.id}`, { headers }); run = await response.json();}if (!response.ok) throw new Error(run.error.message);console.log(run.data);# Connect your agent to Fous once, over MCP (Streamable HTTP):# https://api.fous.com/mcp# Set FOUS_API_KEY first: create a key at https://app.fous.com/keys.# Claude Codeclaude mcp add \ --scope user \ --transport http fous https://api.fous.com/mcp \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Codexcodex mcp add fous \ --url https://api.fous.com/mcp \ --bearer-token-env-var FOUS_API_KEY# Cursor, VS Code, Windsurf, Cline and morenpx -y add-mcp https://api.fous.com/mcp -g -n fous \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Then ask your agent:# "Use Fous to run tripadvisor.com/list_top_restaurants# with {"city":"Lisbon","price":"cheap_eats","cuisine":"Italian","max_results":5}"Over HTTP, the answer’s data holds the output. A run still going after 30 seconds answers 202 with its id: ask GET /v1/runs/{id} until it ends.
Schema
Input schema
{ "type": "object", "required": [ "city" ], "properties": { "city": { "type": "string", "minLength": 1, "description": "City to look up, for example Lisbon." }, "price": { "enum": [ "any", "cheap_eats", "mid_range", "fine_dining" ], "type": "string", "default": "any", "description": "Price category, for example cheap_eats; any includes all prices." }, "cuisine": { "type": "string", "default": "any", "description": "Cuisine to filter by, for example Italian; leave as any for all cuisines." }, "max_results": { "type": "integer", "default": 20, "maximum": 30, "minimum": 1, "description": "Maximum restaurants to return from the first page, for example 20." } }}Output schema
{ "type": "object", "required": [ "restaurants" ], "properties": { "restaurants": { "type": "array", "items": { "type": "object", "required": [ "rank", "name", "rating", "review_count", "cuisines", "price_range", "address", "tripadvisor_link", "tripadvisor_location_id" ], "properties": { "name": { "type": "string" }, "rank": { "type": "integer" }, "rating": { "type": [ "number", "null" ] }, "address": { "type": [ "string", "null" ] }, "cuisines": { "type": "array", "items": { "type": "string" } }, "price_range": { "type": [ "string", "null" ] }, "review_count": { "type": [ "integer", "null" ] }, "tripadvisor_link": { "type": "string" }, "tripadvisor_location_id": { "type": [ "string", "null" ] } } } } }}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
tripadvisor.com/list_top_restaurants- Returns
- rank, name, rating, review count, cuisines, price range, address, Tripadvisor link and location ID
Use it from your agent
Give your agent this line. It reads SKILL.md, gets a Fous API key and connects the Fous MCP server. Its run then takes the method tripadvisor.com/list_top_restaurants with the inputs above.
Ask your agent
- What are the best-rated cheap eats in Lisbon right now? Give me around 15 with their ratings and addresses.
- Pull the top 10 Japanese restaurants in Chicago from Tripadvisor, including review counts and price range.
- I'm planning an anniversary dinner in Paris — list the highest-ranked fine dining spots there with ratings and links.
- Show me Tripadvisor's top 25 restaurants in Mexico City, any cuisine or price, with rank and location IDs.
- Need a shortlist of mid-range Italian places in Melbourne that rank well — names, cuisines, review counts and addresses, max 8.
See more
All Tripadvisor methodsLists Tripadvisor's ranked things to do in a city from the first results page, for all attractions or one category (tours, museums, sights and landmarks, nature and parks), with rating, review count, category, and the description or neighbourhood when shown.
tripadvisor.com/list_top_attractionsGets the latest traveler reviews for a hotel, restaurant or attraction in a city (by name or Tripadvisor listing link), with the place's overall rating and review count. Dates of visit show the month and year when provided.
tripadvisor.com/get_reviewsLists Michelin Guide restaurants in a city or region, in Guide order, optionally filtered by distinction and cuisine, with each restaurant's address, description and photo. Results may include the surrounding area as labeled by the Guide.
guide.michelin.com/search_restaurantsFinds hotels in a city on Trip.com for given dates, with prices, guest ratings, reviews and booking links. Only the initial public listing is read, so large limits may return fewer hotels.
trip.com/search_hotelsFinds tours and experiences in a city on Viator, with optional keywords, date, currency and sorting. Prices are starting prices.
viator.com/search_toursGets a restaurant's public OpenTable profile by name or OpenTable link and city, including ratings, details, menu and photo links. Ratings and other fields can be missing when the restaurant does not publish them.
opentable.com/get_restaurantFind restaurants delivering to an address in Uber Eats guest browsing order. Fees can be conditional for new users; displayed rating counts may be rounded.
ubereats.com/search_restaurantsFinds OpenTable restaurants with bookable slots within two hours of the selected time in a city or neighborhood, in OpenTable search order, optionally for one cuisine. Examines up to 300 listings; availability may change.
opentable.com/search_available_tables