# TripAdvisor Search Scraper (`romy/tripadvisor-search-scraper`) Actor

Look up TripAdvisor destination and POI autocomplete results — the same numeric geo\_id suggestions the app returns as you type — for one or more free-text queries, plus an optional home feed. Talks directly to TripAdvisor internal mobile API; no account or API key needed.

- **URL**: https://apify.com/romy/tripadvisor-search-scraper.md
- **Developed by:** [Romy](https://apify.com/romy) (community)
- **Categories:** Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.56 / 1,000 search result pusheds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### What does TripAdvisor Search Scraper do?

**TripAdvisor Search Scraper** takes one or more free-text destination queries (e.g. `"Bangkok"`) and pushes real destination/POI autocomplete results — the same suggestions, with the same numeric `geo_id` values, that the TripAdvisor app itself returns as you type. Optionally also fetches the TripAdvisor home tab feed once per run.

It talks directly to the same internal API the official [TripAdvisor](https://www.tripadvisor.com/) 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 needed. This is the search/home slice of [TripAdvisor All-in-One API](https://apify.com/romy/tripadvisor-all-in-one-api), split out as its own focused batch Actor.

### Why use TripAdvisor Search Scraper?

- **Real destination ids, not guesses** — every result carries a numeric `geo_id` that plugs straight into TripAdvisor's hotel/restaurant/attraction search
- **Batch multiple queries in one run** — pass an array of destination names, get one dataset row per query
- **Optional home feed** — grab TripAdvisor's home tab content once per run alongside your searches
- **No account needed** — every call works fully anonymously
- **Use cases:** destination lookup for a downstream hotel/restaurant/attraction pipeline, travel content aggregation, autocomplete testing, geo-id discovery

### How it connects to the parent

This Actor wraps exactly two of the parent [TripAdvisor All-in-One API](https://apify.com/romy/tripadvisor-all-in-one-api)'s Standby REST endpoints — `GET /search` and `GET /home` — as a standalone batch-run Actor: give it an input JSON with a list of queries, get dataset rows out. No always-on Standby container, no per-call billing loop — just run it, get your rows, done. If you need hotel/restaurant/attraction search, detail pages, reviews, or photo galleries, use the parent Actor directly (or another spin-off) with the `geo_id` values this Actor returns.

### Input

| Field         | Type     | Description                                                                                         |
| ------------- | -------- | --------------------------------------------------------------------------------------------------- |
| `queries`     | string\[] | **Required.** Free-text destination names to search, e.g. `"Bangkok"`.                              |
| `currency`    | string   | ISO currency code, affects prices in results. Default `"GBP"`.                                      |
| `includeHome` | boolean  | Also fetch the TripAdvisor home tab feed once and push it as an extra dataset row. Default `false`. |

Example:

```json
{
    "queries": ["Bangkok", "Paris"],
    "currency": "USD",
    "includeHome": true
}
```

### Output

One dataset row per query:

```json
{
    "query": "Bangkok",
    "results": { "...": "AppPresentation_TypeaheadV2 response, including numeric geo_id values" }
}
```

Plus, if `includeHome` is `true`, one extra row after the query rows:

```json
{
    "home": { "...": "HomeData response" }
}
```

### Data notes

- **No request signing exists at all** — confirmed by capturing the real app's traffic and finding just static identity headers (no per-request signature or hash) that aren't validated against any server-side registry (confirmed: a freshly generated device identity works immediately). Verified fully standalone-reproducible — no device or live app session needed at runtime.
- **One internal API endpoint, persisted queries.** Every request goes to a single internal endpoint, distinguished by an operation name plus a fixed persisted-query hash instead of a full query string — confirmed live that these hashes are reusable across devices/sessions.
- **`currency` changes real prices**, not just a symbol. Not part of any request signature (there isn't one here), so any ISO code is always safe to pass.

### Known limitations

- **Search only, no downstream lookups.** This Actor returns destination/POI suggestions and the home feed; it does not fetch hotels, restaurants, attractions, detail pages, reviews, or photos — use the parent [TripAdvisor All-in-One API](https://apify.com/romy/tripadvisor-all-in-one-api) or another spin-off Actor for those, feeding in the `geo_id` values this Actor returns.
- **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.002** per `search-result` — charged once for each destination-search row and once for the optional home-feed row pushed to the dataset (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.

# Actor input Schema

## `queries` (type: `array`):

Free-text destination names to search, e.g. "Bangkok".

## `currency` (type: `string`):

ISO currency code, affects prices in results.

## `includeHome` (type: `boolean`):

Also fetch the TripAdvisor home tab feed once and push it as an extra dataset row.

## Actor input object example

```json
{
  "queries": [
    "Bangkok"
  ],
  "currency": "GBP",
  "includeHome": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "queries": [
        "Bangkok"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("romy/tripadvisor-search-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "queries": ["Bangkok"] }

# Run the Actor and wait for it to finish
run = client.actor("romy/tripadvisor-search-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queries": [
    "Bangkok"
  ]
}' |
apify call romy/tripadvisor-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,romy/tripadvisor-search-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/eUVSb4UTZwknrJ8Es/builds/Rgh5wRBdVudnvpNrD/openapi.json
