Getting Started
Turn a place name into an id, then read everything Tripadvisor holds about it.
1. Get your API key
Create an account and generate a FetchLayer API key from your dashboard. There is no Tripadvisor partner application, content licence, or per-property key involved.
Create free account →2. Find the place
Every other endpoint takes a location: a Tripadvisor location id, or a hotel, restaurant or attraction URL. Search by name to get the id.
curl -X POST https://api.fetchlayer.dev/tripadvisor/search-locations \
-H "Authorization: Bearer ss-your-key" \
-H "Content-Type: application/json" \
-d '{"query":"Park Hyatt Tokyo","locationTypes":["hotel"],"limit":5}'Tip
/resolve-url instead — it returns the location id, the geo id of the city, and the kind of place, and it does not consume a credit. 3. Read the profile
One call returns the rating and its per-bubble distribution, the ranking within the city, price range, address and coordinates, phone, website, amenities, opening hours, awards and description. It is eight upstream operations resolved in a single request, and nothing renders a browser to do it.
curl -X POST https://api.fetchlayer.dev/tripadvisor/location-profile \
-H "Authorization: Bearer ss-your-key" \
-H "Content-Type: application/json" \
-d '{"location":"307368"}'4. Page the reviews
Reviews arrive 20 to a page. Use pages to walk deeper in one request, and cursor to resume where the last response stopped.
curl -X POST https://api.fetchlayer.dev/tripadvisor/location-reviews \
-H "Authorization: Bearer ss-your-key" \
-H "Content-Type: application/json" \
-d '{"location":"307368","pages":5,"sortBy":"recent","minRating":4}'20 per page is the hard ceiling
limit asks for — a request for 200 returns a byte-identical 20. Ask for depth with pages, and remember each page walked bills as one request. language does not filter
language is the language reviews are requested in, not a filter on what the reviewer wrote. It moves the reported reviewCount while the rows that come back stay a mix of languages. Set translate: true to get the text in your language, and read originalLanguage and isTranslated on each review to know what you are looking at. 5. Read the notes
Every JSON response carries a notes[] array of plain-English caveats — a walk cut short, an upstream limit hit, a field Tripadvisor does not publish for this place. A response can be complete-looking and still partial, and notes is where that is said. Log it alongside the payload.
Error responses
Every error, on every route, is JSON in one shape: error (what went wrong, in words), status, code, retryable and requestId, which also comes as the X-Request-Id header. Branch on code and retryable rather than on the text; on a 5xx the text is generic. Quote requestId when reporting a problem.
{
"error": "Missing required parameter: url",
"status": 400,
"missing": ["url"],
"code": "invalid_input",
"retryable": false,
"requestId": "922874e3-c0d0-40d8-8866-d198af132420"
}| code | Status | Retryable | Meaning |
|---|---|---|---|
| invalid_input | 400 | no | The request needs fixing; error names the field. A missing required parameter also lists it in missing. |
| unauthorized | 401 | no | The API key is missing or not valid. |
| insufficient_credits | 402 | no | Nothing left to spend: no credits, a used-up free trial, or a monthly allowance and credit balance both spent. error says which. Waiting does not help; topping up does. |
| forbidden | 403 | no | This key or account is not allowed this request. |
| not_found | 404 | no | What the request names does not exist or is not public. |
| expired | 410 | no | What the request refers to is no longer available; ask for it afresh. |
| quota_exceeded | 429 | no | A request-rate limit was reached; error says which. Slow down before sending more. |
| cancelled | 499 | no | The caller closed or cancelled the request before it finished. The work was stopped and nothing was charged. |
| time_limit | 503 | yes | Your timeoutMs ran out before there was anything to return; ask again, or allow more time. |
| temporarily_unavailable | 503 | yes | Not available right now; ask again shortly. |
| store_unreachable | 503 | yes | Store routes (Shopify, WooCommerce): the store itself can’t be reached right now — it may be offline. Ask again later. Where a store route doesn’t say so yet, an offline store is temporarily_unavailable. |
| upstream_error | 502 | yes | The source answered in a way that could not be used; ask again later. |
| internal_error | 500 | yes | Something failed on our side; ask again later, and quote requestId if it persists. |
| tool_error | — | no | MCP only: a tool call failed in a way no other code describes; error says what. |
More codes may be added; treat one you do not recognise by its retryable flag. Over MCP, a tool error carries the same fields in structuredContent, and as a JSON text block beside the message.