TripAdvisor Restaurants Scraper
Under maintenancePricing
from $2.34 / 1,000 restaurant result pusheds
TripAdvisor Restaurants Scraper
Under maintenanceSearch TripAdvisor restaurants for a destination and fetch full detail plus genuinely paginated reviews for one or more restaurant ids, with real price/rating/sort filters. No account or API key needed. Derived from romy/tripadvisor-all-in-one-api.
What does TripAdvisor Restaurants Scraper do?
TripAdvisor Restaurants Scraper takes a destination geoId and/or a list of restaurant ids, and pushes restaurant search results, full restaurant detail, and paginated reviews to the dataset.
It talks directly to the same internal API the official TripAdvisor Android app uses, reverse-engineered by capturing live traffic from a real device. Unlike many reverse-engineered mobile APIs, TripAdvisor needs no per-request signature at all — just a static API key and self-generated device/session ids, confirmed live and standalone-reproducible. No TripAdvisor account, no API key of your own. This is the restaurants slice of TripAdvisor All-in-One API, split out as its own focused Actor.
Why use TripAdvisor Restaurants Scraper?
- Search or detail, in one Actor — pass
geoIdfor a restaurant list,restaurantIdsfor full detail, or both in the same run - Real filters that genuinely work — price range, minimum rating, sort — confirmed live in the parent Actor
- Real paginated reviews, not a 20-item cap — confirmed live end-to-end: page 2 returns 20 genuinely new reviews with zero overlap with page 1, using TripAdvisor's own real (non-trivial) continuation cursor, wrapped so you don't have to reverse-engineer it yourself
- No account needed — every call works fully anonymously
- Use cases: restaurant discovery for a destination, price/rating monitoring, review analysis, dining research bots
Input
| Field | Type | Description |
|---|---|---|
geoId | string | Destination geoId from TripAdvisor search (e.g. "293916" for Bangkok). Required unless restaurantIds is set. Runs a restaurant list search. |
priceMin / priceMax | integer | Only used with geoId. |
minRating | string | Only used with geoId. Confirmed live values "1"-"5". |
sort | string | Only used with geoId. Confirmed live values BEST_VALUE, PRICE_LOW_TO_HIGH. |
maxPages | integer | Only used with geoId. Default 10. See Known Limitations — list pagination beyond page 1 is not confirmed live and this actor caps at 1 page regardless of this value. |
maxItems | integer | Only used with geoId. Stop once this many restaurants have been pushed. Leave empty to only bound by maxPages. |
restaurantIds | string[] | TripAdvisor restaurant content ids (from a geoId search, or a TripAdvisor URL/app link). Required unless geoId is set. One dataset row per id. |
includeReviews | boolean | Only used with restaurantIds. Paginates and attaches each restaurant's reviews. Default false. |
reviewsMaxItems | integer | Only used when includeReviews is true. Stop once this many reviews have been collected for a restaurant. Leave empty to fetch all reviews. |
currency | string | ISO code, default GBP. Affects prices in returned data. |
At least one of geoId / restaurantIds is required; both may be set in the same run.
Example (search):
{ "geoId": "293916", "maxItems": 20, "minRating": "4" }
Example (detail + reviews):
{ "restaurantIds": ["24191839", "16726460"], "includeReviews": true, "reviewsMaxItems": 50 }
Output
List search (geoId): one dataset row per restaurant — TripAdvisor's own map-pin object for that restaurant (saveId.id is the content id, primaryInfo.text the name, secondaryInfo.text the cuisine/type, overlay.text the rating), confirmed live against Bangkok (geoId 293916).
Detail / reviews (restaurantIds): one dataset row per id:
{"restaurantId": "24191839","restaurant": { "AppPresentation_queryAppDetailV2": [{ "container": { "navTitle": "Bangkok'78" } }] },"reviews": [{ "htmlTitle": { "htmlString": "My lunch" }, "bubbleRating": { "rating": 5 } }]}
reviews is omitted entirely when includeReviews is false.
Known limitations
- Restaurant list-search pagination beyond page 1 does not work, confirmed live. The parent's README already flags
/restaurantslist pagination beyond page 1 as unwrapped; this Actor attempted to genuinely thread a continuation cursor the same way it does for reviews (which does work), but confirmed live against geoId293916(Bangkok): the restaurant list response never carries a continuationupdateTokenat all — only a "View all restaurants" deep link with its own separate filter parameter that the parent'slistContent()has no field for. So this Actor caps the list search at 1 page regardless of themaxPagesinput, and logs a warning explaining why. Reviews pagination (includeReviews) is unaffected and works as documented above. - List search returns the map's restaurant pins, not a dedicated results array. TripAdvisor's restaurant list-search response is structured like a mixed overview screen (a few "top restaurant" teaser cards plus an accompanying map). This Actor extracts the map's restaurant pins as the per-page result set — confirmed live to be a complete, homogeneous list of real restaurants (28 for Bangkok on an unfiltered search) with a usable content id, name, cuisine, and rating on each.
- This Actor only wraps guest-accessible endpoints. No login flow is implemented or planned.
- This is an unofficial, reverse-engineered integration, not affiliated with or endorsed by Tripadvisor LLC. Behavior may change if TripAdvisor changes its API.
Pricing
Pay per event: $0.003 per restaurant — charged once for each restaurant returned by search and once for each restaurant id's detail row (Free plan price; lower on paid Apify plans). See the Actor's Pricing tab for current tiered rates.
Found a bug or have a feature request? Use the Issues tab on this Actor's page.