Skip to content

Tripadvisor Scraper API ​

Turn tripadvisor.com hotel and restaurant lists and place pages into structured data. Send a city name (or its geo id, or a list URL), optionally with your stay dates and currency, get back one page of 30 places - location id, name, rating and review count, ranking, Travelers' Choice award, address and coordinates, hotel class, partner price and offers, or cuisines, opening hours and reservations - or send one hotel or restaurant page and get its ratings by category, contacts, amenities or menus, partner prices, photos and the reviews it shows. No proxy pool, bot-check handling or parser maintenance on your side.

It ships as two synchronous Scraper APIs and a no-code scraper:

ProductTypeProduct codeWhat it does
Tripadvisor Search APIScraper API (synchronous)tripadvisor_searchRead one page of 30 hotels or restaurants of a city.
Tripadvisor Place APIScraper API (synchronous)tripadvisor_placeGive one hotel or restaurant page URL, get the place detail.
Tripadvisor ScraperNo-code scrapertripadvisorSweep up to 20 list pages and export JSON, CSV or XML.

Every field is snake_case, the same convention as the Web Scraping API. Requests go to the English www.tripadvisor.com from residential exits in several countries, where it shows names and reviews in English and prices in US dollars; a page one country refuses is retried from another at no extra charge. With currency, a list is read from the English Tripadvisor site that prices in it (tripadvisor.ie for EUR, tripadvisor.co.uk for GBP and so on). The places themselves can be anywhere.

Tripadvisor Search API ​

GET https://api.scrapeit.io/api/v1/scrape/tripadvisor/search
x-api-key: YOUR_SCRAPEIT_API_KEY

Send exactly one of location, geo_id (both with category) or a list url.

ParameterTypeExampleDescription
locationstringLisbon, PortugalA city or region by name: the first place Tripadvisor's own search box suggests for it. Add the country or state when the name is common (Springfield, Illinois).
categorystringrestaurantsWith location or geo_id: hotels (default) or restaurants.
checkinstring2026-12-01Hotels lists only: check-in date, YYYY-MM-DD, from today on, sent together with checkout. Partner prices are for this stay.
checkoutstring2026-12-03Check-out date, YYYY-MM-DD, after checkin.
adultsnumber2Adults of the stay, 1–8, with checkin and checkout. Defaults to 2.
currencystringEURCurrency of partner prices: USD (default), EUR, GBP, CAD, AUD, INR, NZD or SGD.
hotel_classesarray4,5Hotels lists only: hotels of any of these star classes, 2–5; comma-separated in a query string. Replaces a class filter the url carries.
geo_idstring187147Tripadvisor geo id of a city, instead of location: the digits after -g in a list URL.
urlstringhttps://www.tripadvisor.com/Hotels-g187147-Paris_Ile_de_France-Hotels.htmlA tripadvisor.com hotels (Hotels-g<id>-…) or restaurants (Restaurants-g<id>-…) list URL.
pagenumber2List page of 30 places, 1–30. Defaults to 1.
include_htmlbooleanfalseAlso return the fetched page HTML in html. Paid add-on: +4 credits per request.

location is looked up in Tripadvisor's own search box first; that lookup costs nothing extra and is not a separate entry in your request log, and the answer's geo_id and title show which place it found. A location the search box suggests no city or region for answers 404 NOT_FOUND and is billed like a search - Tripadvisor answered it. Without checkin and checkout, Tripadvisor prices a night it picks itself - check_in and check_out in the answer say which. Tripadvisor prices a stay it was not asked about recently a few seconds after the first ask, so a request with dates can take about ten seconds longer: ScrapeIt reads the list again once the prices are in, at no extra charge.

A url is never fetched as given: ScrapeIt reads the list (hotels or restaurants, the geo id and the site's own filter segments) out of it and loads that tripadvisor.com list itself; its page offset (-oa30) is replaced by page. The filter segments stay, so any Tripadvisor filter works: set it on tripadvisor.com and send the filtered list URL - for example hotel classes -zfc3,4 (Hotels-g187147-zfc3,4-Paris_Ile_de_France-Hotels.html) or a cuisine -c<id> on a restaurants list.

Example request ​

bash
curl -G 'https://api.scrapeit.io/api/v1/scrape/tripadvisor/search' \
  -H 'x-api-key: YOUR_SCRAPEIT_API_KEY' \
  --data-urlencode 'location=Paris' \
  --data-urlencode 'checkin=2026-12-01' \
  --data-urlencode 'checkout=2026-12-03'
js
const response = await fetch(
  'https://api.scrapeit.io/api/v1/scrape/tripadvisor/search?' +
    new URLSearchParams({ location: 'Paris', checkin: '2026-12-01', checkout: '2026-12-03' }),
  { headers: { 'x-api-key': 'YOUR_SCRAPEIT_API_KEY' } },
);
const { data } = await response.json();
for (const place of data.results)
  console.log(place.position, place.name, place.rating, place.price);
python
import requests

response = requests.get(
    "https://api.scrapeit.io/api/v1/scrape/tripadvisor/search",
    headers={"x-api-key": "YOUR_SCRAPEIT_API_KEY"},
    params={"location": "Paris", "checkin": "2026-12-01", "checkout": "2026-12-03"},
    timeout=120,
)
for place in response.json()["data"]["results"]:
    print(place["position"], place["name"], place["rating"], place["price"])

Search response ​

json
{
  "data": {
    "category": "hotels",
    "geo_id": "187147",
    "title": "THE 10 BEST Hotels in Paris, France 2026 (from $98) - Tripadvisor",
    "url": "https://www.tripadvisor.com/Hotels-g187147-Paris_Ile_de_France-Hotels.html",
    "total_results": 3075,
    "check_in": "2026-11-08",
    "check_out": "2026-11-09",
    "facts": [
      { "name": "Hotels Prices From", "value": "$98" },
      { "name": "High season avg price", "value": "$346" }
    ],
    "results": [
      {
        "position": 1,
        "location_id": "228757",
        "type": "Hotel",
        "name": "Hôtel Maison Mère",
        "url": "https://www.tripadvisor.com/Hotel_Review-g187147-d228757-Reviews-Hotel_Maison_Mere-Paris_Ile_de_France.html",
        "rating": 4.9,
        "reviews_count": 2042,
        "price_range": "€€",
        "phone": "+33 1 42 80 00 00",
        "street_address": "7 Rue Mayran",
        "city": "Paris",
        "postal_code": "75009",
        "country": "France",
        "latitude": 48.877193,
        "longitude": 2.345141,
        "image": "https://dynamic-media-cdn.tripadvisor.com/media/photo-o/21/b1/19/ec/hotel-maison-mere.jpg?w=1200&h=-1&s=1",
        "description": "Charming boutique hotel with a central location near metro stations, shops, and restaurants. …",
        "sponsored": false,
        "ranking": "#14 of 1,896 hotels in Paris",
        "ranking_position": 14,
        "ranking_total": 1896,
        "awards": [
          { "name": "Travelers' Choice Best of the Best", "year": 2026, "description": null }
        ],
        "hotel_class": 4,
        "amenities": ["Restaurant", "Bar/Lounge", "Fitness center", "Air conditioning"],
        "labels": [],
        "neighborhoods": ["Rochechouart", "9th Arr. - Opéra", "Opéra / Bourse"],
        "review_snippets": ["Our superior room was very comfortable, …"],
        "price": 157,
        "price_text": "$157",
        "price_currency": "USD",
        "price_provider": "Agoda",
        "offers_count": 11,
        "price_min": 212,
        "price_max": 506,
        "has_special_offer": true,
        "cuisines": [],
        "open_now": null,
        "opening_hours": [],
        "menu_url": null,
        "has_reservation": null,
        "has_delivery": null
      }
    ],
    "sponsored_results": [
      {
        "position": 1,
        "location_id": "572984",
        "name": "Hotel Eiffel Seine",
        "sponsored": true,
        "price": 151,
        "price_provider": "Official Site",
        "ranking_position": 271
      }
    ],
    "pagination": { "current_page": 1, "next_page": 2 }
  }
}
FieldDescription
total_resultsPlaces the whole list holds; a restaurants list shows at most 10000.
check_in, check_outThe stay hotel prices are quoted for: your checkin–checkout, or Tripadvisor's default of one night about ten days ahead. null on a restaurants list.
factsThe city's facts box of a hotels list (prices, seasons, counts) as name / value pairs.
results[].position1-based position across pages: page 2 starts at 31.
results[].location_idTripadvisor location id (-d<id>- in its URL); url is the place page - pass it to the Place API.
results[].descriptionOn a hotel card, Tripadvisor's AI-written summary of its reviews.
results[].rankingPopularity rank as shown, with ranking_position and ranking_total as numbers.
results[].awardsThe Travelers' Choice award of the year, when the place won it.
results[].price, price_providerA hotel's partner price per night for check_in–check_out and who offers it; offers_count partners quote a price.
results[].price_min, price_maxA hotel's average nightly rate range.
results[].cuisines, opening_hoursRestaurants: cuisines, and the week as { day, open, close } in local 24-hour time (a day with two services appears twice).
results[].has_reservation, has_deliveryRestaurants: online reservations and delivery.
sponsored_resultsPaid cards the page mixes into the list, in page order; they are not counted in results.
pagination.next_pageThe page to ask for next, or null when this page was not full.

Hotel-only and restaurant-only fields are null or empty on the other list. A missing field is null or an empty list, never an error.

Tripadvisor Place API ​

GET https://api.scrapeit.io/api/v1/scrape/tripadvisor/place
x-api-key: YOUR_SCRAPEIT_API_KEY
ParameterTypeExampleDescription
urlstringhttps://www.tripadvisor.com/Hotel_Review-g187147-d228757-Reviews-Hotel_Maison_Mere-Paris_Ile_de_France.htmlRequired. A tripadvisor.com Hotel_Review-g<geo>-d<id>-….html or Restaurant_Review-g<geo>-d<id>-….html page URL.
include_htmlbooleanfalseAlso return the fetched page HTML in html. Paid add-on: +4 credits per request.

Tripadvisor serves a place page at its full slugged path only, so the API takes the URL - the url of a search result fits. It is never fetched as given: ScrapeIt rebuilds the tripadvisor.com place page from its path.

Example request ​

bash
curl -G 'https://api.scrapeit.io/api/v1/scrape/tripadvisor/place' \
  -H 'x-api-key: YOUR_SCRAPEIT_API_KEY' \
  --data-urlencode 'url=https://www.tripadvisor.com/Hotel_Review-g187147-d228757-Reviews-Hotel_Maison_Mere-Paris_Ile_de_France.html'
js
const response = await fetch(
  'https://api.scrapeit.io/api/v1/scrape/tripadvisor/place?' +
    new URLSearchParams({
      url: 'https://www.tripadvisor.com/Hotel_Review-g187147-d228757-Reviews-Hotel_Maison_Mere-Paris_Ile_de_France.html',
    }),
  { headers: { 'x-api-key': 'YOUR_SCRAPEIT_API_KEY' } },
);
const { data } = await response.json();
console.log(data.name, data.rating, data.sub_ratings, data.reviews.length);
python
import requests

response = requests.get(
    "https://api.scrapeit.io/api/v1/scrape/tripadvisor/place",
    headers={"x-api-key": "YOUR_SCRAPEIT_API_KEY"},
    params={
        "url": "https://www.tripadvisor.com/Hotel_Review-g187147-d228757-Reviews-Hotel_Maison_Mere-Paris_Ile_de_France.html"
    },
    timeout=120,
)
place = response.json()["data"]
print(place["name"], place["rating"], place["sub_ratings"], len(place["reviews"]))

Place response ​

json
{
  "data": {
    "location_id": "228757",
    "geo_id": "187147",
    "type": "Hotel",
    "name": "Hôtel Maison Mère",
    "url": "https://www.tripadvisor.com/Hotel_Review-g187147-d228757-Reviews-Hotel_Maison_Mere-Paris_Ile_de_France.html",
    "description": "Welcome to Maison Mère, a hotel with a distinctive identity, …",
    "rating": 4.9,
    "reviews_count": 2042,
    "rating_counts": { "five": 1907, "four": 90, "three": 29, "two": 5, "one": 11 },
    "sub_ratings": {
      "cleanliness": 4.9,
      "location": 4.8,
      "rooms": 4.8,
      "service": 4.9,
      "sleep_quality": 4.8,
      "value": 4.7,
      "food": null,
      "atmosphere": null
    },
    "ranking": "#14 of 1,896 hotels in Paris",
    "ranking_position": 14,
    "ranking_total": 1896,
    "awards": [{ "name": "Travelers' Choice Best of the Best", "year": 2026, "description": null }],
    "price_level": "$$",
    "price_min": 212,
    "price_max": 506,
    "price_currency": "USD",
    "is_claimed": true,
    "is_closed": false,
    "address": "7 Rue Mayran, 75009 Paris France",
    "street_address": "7 Rue Mayran",
    "city": "Paris",
    "region": "Ile-de-France",
    "postal_code": "75009",
    "country_code": "FR",
    "neighborhoods": ["9th Arr. - Opéra", "Rochechouart", "Opéra / Bourse"],
    "latitude": 48.877193,
    "longitude": 2.345141,
    "phone": "011 33 1 42 80 00 00",
    "website": "https://www.maisonmere.co/",
    "email": "hello@maisonmere.co",
    "photos": [
      "https://media-cdn.tripadvisor.com/media/photo-m/1280/21/b1/19/ec/hotel-maison-mere.jpg"
    ],
    "photos_count": 1057,
    "review_keywords": ["tote bag", "cadet metro", "welcome drink"],
    "ai_review_summary": {
      "summary": "Hôtel Maison Mère earns high praise from many travelers for its quiet atmosphere…",
      "reviews_count": 241,
      "attributes": [
        {
          "name": "Service",
          "opinion": "Warm",
          "summary": "Most travelers highlight the staff’s warmth…"
        }
      ]
    },
    "reviews": [
      {
        "review_id": "1083563511",
        "url": "https://www.tripadvisor.com/ShowUserReviews-g187147-d228757-r1083563511-Hotel_Maison_Mere-Paris_Ile_de_France.html",
        "title": "Viva La Maison Mere!",
        "text": "We thought Maison Mere was a great find! …",
        "rating": 5,
        "language": "en",
        "original_language": "en",
        "machine_translated": false,
        "published_date": "2026-10-28",
        "visit_date": "2026-10",
        "trip_type": "family",
        "helpful_votes": 0,
        "author": "jrhjhh2018",
        "sub_ratings": [],
        "photos": [],
        "owner_response": { "text": "Dear jrhjhh2018, …", "published_date": "2026-10-29" }
      }
    ],
    "hotel_class": 4,
    "rooms_count": 51,
    "former_name": "Hôtel de l’Océan",
    "special_offer": "15% off room rate",
    "styles": ["Mid-range", "Charming", "Family", "Quiet", "City View"],
    "property_amenities": ["Paid public parking nearby", "Free High Speed Internet (WiFi)"],
    "room_features": ["Allergy-free room", "Blackout curtains", "Air conditioning"],
    "room_types": ["City view", "Non-smoking rooms", "Suites", "Family rooms"],
    "languages_spoken": ["English", "French", "Spanish"],
    "offers": {
      "check_in": "2026-11-08",
      "check_out": "2026-11-09",
      "adults": 2,
      "rooms": 1,
      "currency": "USD",
      "lowest_price": "$157",
      "offers": [
        { "provider": "Priceline", "price": 181, "price_text": "$181", "available": true },
        { "provider": "Booking.com", "price": 201, "price_text": "$201", "available": true }
      ]
    },
    "walk_score": 100,
    "nearby": { "hotels": 108, "restaurants": 660, "attractions": 98, "radius_miles": 0.3 },
    "nearby_transit": [{ "name": "Cadet", "type": "Paris Metro", "distance_miles": 0.09 }],
    "nearby_airports": [{ "name": "Orly Field", "type": null, "distance_miles": 10.37 }],
    "cuisines": [],
    "meal_types": [],
    "special_diets": [],
    "features": [],
    "opening_hours": [],
    "menu_url": null,
    "menus": [],
    "popular_dishes": []
  }
}
FieldDescription
typeHotel or Restaurant.
rating_countsHow many reviews gave each bubble rating, five (Excellent) to one (Terrible).
sub_ratingsCategory ratings out of 5: a hotel on cleanliness, location, rooms, service, sleep_quality, value; a restaurant on food, service, value, atmosphere.
awardsTravelers' Choice awards and guide distinctions, e.g. MICHELIN with Bib Gourmand: good quality, good value cooking.
price_level, price_min, price_maxThe price level as shown, and a hotel's average nightly rate range or a restaurant's per-person range in price_currency.
is_claimedWhether the business manages the listing.
photos, photos_countFull-size photo URLs the page carries (a few dozen), and how many the whole gallery holds.
review_keywordsThe "Popular mentions" chips of the reviews.
ai_review_summaryTripadvisor's AI summary of recent reviews, overall and per topic.
reviewsThe most recent reviews the page shows, in English (machine_translated marks a translation). Authors are named, never linked.
offersHotels: partner prices per night for Tripadvisor's default stay, mandatory fees included, taxes not.
walk_score, nearby, nearby_transit, nearby_airportsHotels: walkability 0–100, what lies around (with the radius in miles), and the nearest stations and airports.
cuisines, meal_types, special_diets, featuresRestaurants: the tags of the page, e.g. Japanese, Lunch, Table Service.
opening_hoursRestaurants: { day, open, close } in local 24-hour time.
menus, popular_dishesRestaurants: the menus the restaurant publishes on Tripadvisor (sections, items, prices) and the dishes reviewers mention most.

A restaurant page fills the restaurant fields instead, for example Kodawari Ramen: cuisines: ["Japanese", "Asian", "Healthy", "Soups"], opening_hours: [{ "day": "sunday", "open": "11:45", "close": "23:00" }, …], popular_dishes: [{ "name": "shoyu ramen", "reviews_count": 915 }, …] - and leaves hotel_class, offers and nearby null. A missing field is null or an empty list, never an error.

No-code Tripadvisor Scraper ​

Prefer a dashboard run and a file? Scrapers without code → Tripadvisor Scraper takes a list url or a geo_id with category, sweeps up to 20 list pages and produces JSON, CSV and XML files with one record per place (the search result fields above). With include_detail it also opens every place page and nests it under detail. The same job is available over HTTP with an API key (x-api-key; scope scrapers:run to start, scrapers:read to poll):

POST https://api.scrapeit.io/api/v1/scrapers/tripadvisor/jobs
GET  https://api.scrapeit.io/api/v1/scrapers/tripadvisor/jobs/{jobId}
ParameterTypeExampleDescription
urlstringhttps://www.tripadvisor.com/Hotels-g187147-Paris_Ile_de_France-Hotels.htmlA hotels or restaurants list URL. Send either url or geo_id.
geo_idstring187147Tripadvisor geo id of a city. Send either url or geo_id.
categorystringrestaurantsWith geo_id: hotels (default) or restaurants.
hotel_classesarray["4", "5"]Hotels lists only: star classes 2–5, as in the Search API.
max_pagesnumber10List pages to sweep, 1–20. Defaults to 5; the run stops earlier at the last page.
include_detailbooleantrueAlso fetch each place page and nest it under detail (the Place API fields). Defaults to false.
output_formatarray["json", "csv"]One or more of json, csv, xml. Defaults to ["json"]; an empty list is rejected.

A run without a list is refused with 400 VALIDATION_ERROR before any job exists. A sweep of five pages or fewer without include_detail finishes inline and the POST already answers with the result-file ids; a larger one, or any run with include_detail, answers queued, so poll the GET endpoint until status is finished (or failed). A place Tripadvisor repeats on a later page is written once; the paid cards of sponsored_results are not exported. Each swept page is billed like one Search API request and each place page like one Place API request; a place whose page fails keeps its list fields with detail: null and a detail_error code, and that page costs nothing. A job started with an API key runs under that key, queued or not: its pages count in the key's usage.

Errors ​

CodeHTTPMeaning
VALIDATION_ERROR400Not exactly one of location/geo_id/url; a geo_id that is not digits; a url that is not an https tripadvisor.com hotels or restaurants list, or Hotel_Review-/Restaurant_Review- page; a page outside 1–30; hotel_classes outside 2–5, or on a restaurants list; checkin without checkout (or the other way round), adults without them, a date the calendar does not have (2027-02-30), checkin in the past, checkout not after checkin, or dates on a restaurants list; a currency not in the list.
NOT_FOUND404Search API: Tripadvisor's search box suggests no city or region for location. Place API: tripadvisor.com answered HTTP 404 or 410 - there is no place at this URL.
TARGET_BLOCKED502Every proxy attempt drew Tripadvisor's bot check (DataDome). Retry later; the request costs nothing.

See Error codes for the shared error format.

Credits and billing ​

Both APIs bill one flat price per request under their own product code - the residential proxy is part of it (billing & credits). Every request is scraped live - never served from the shared cache - so rankings, prices and reviews are current.

Price per request: 40 credits, flat; this is an introductory price for a new product and may change - the dashboard Pricing page always shows the current price. A no-code job pays the Search API price per list page it fetched, and the Place API price per place page with include_detail.

Limits and behavior ​

  • One search request returns one page of 30 places; the API reads up to 30 pages (900 places) of a list. Use page to walk further.
  • Hotel prices are the ones Tripadvisor quotes a signed-out visitor for its default stay (one night about ten days ahead, two adults, one room); the API takes no dates.
  • A list or place page is about 1 MB of HTML, usually answered in two to three seconds.
  • The place page carries the most recent reviews in its language (a few per page); this API does not page through all reviews.

ScrapeIt Web Scraping API documentation. Managed web scraping services: www.scrapeit.io.