# Tripadvisor Places & Leads Scraper (`axlymxp/tripadvisor-places-leads-scraper`) Actor

Tripadvisor restaurants, hotels and attractions by city with contact details: phone, email, website, address, coordinates, rating, rank, cuisines, hours and awards. Filter by rating and reviews, keep only places with contacts. Build lead lists and local market data.

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

## Pricing

from $4.00 / 1,000 dataset items

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Tripadvisor Places & Leads Scraper

Turn any city into a Tripadvisor lead list. Pick a location and place types and get **restaurants, hotels and attractions** as clean rows: phone number, website, email where Tripadvisor shows one, address, coordinates, rating, review count, rank, cuisines, opening hours today, awards and more. Filter by rating and number of reviews, or keep only places that have contact details.

The actor reads Tripadvisor's mobile-app data feed, so it needs no login and no browser. Places are returned best ranked first.

### Output fields

| Field | Description |
| --- | --- |
| `place_id`, `place_type`, `name`, `url` | Tripadvisor ID, `restaurant` / `hotel` / `attraction`, name and Tripadvisor page |
| `phone` | Phone number as listed |
| `email` | E-mail address when the listing shows one (many attractions and hotels do, restaurants rarely) |
| `website` | The place's own website (restaurants and attractions) |
| `menu_url` | Menu link for restaurants that list one |
| `address`, `latitude`, `longitude`, `neighborhood` | Location |
| `rating`, `review_count`, `rating_distribution`, `sub_ratings` | Overall rating, review count, counts per rating band and sub-ratings (food, service, rooms, ...) |
| `rank`, `rank_total`, `rank_scope` | Rank in the city, e.g. 668 of 20,548 "Restaurants in Paris" |
| `price_level`, `cuisines`, `categories` | Price band, cuisines (restaurants), categories (attractions) |
| `awards`, `features`, `amenities`, `languages_spoken` | Travellers' Choice, MICHELIN, amenities, languages and style tags where listed |
| `open_status`, `hours_today` | Open/closed now and today's opening hours |
| `photo_count`, `list_position`, `scraped_at` | Number of photos, position in the ranked list, UTC timestamp |

### Use cases

- **Sales and lead generation**: restaurant and hotel contact lists for POS, booking, delivery, marketing and supplier sales teams.
- **Local market research**: how many restaurants, price bands and cuisines a city has and who ranks where.
- **Competitor monitoring**: schedule runs to track ranks, ratings and review counts of your competitors.
- **Travel apps and directories**: coordinates, categories and contact data for places.

### Input

| Field | Description |
| --- | --- |
| `locations` | City names (`Paris`, `Barcelona, Spain`), Tripadvisor URLs containing `-g<number>-`, or `geo:187147` |
| `placeTypes` | `restaurant`, `hotel`, `attraction` (any combination) |
| `maxPlacesPerLocation` | Places per location and type, best ranked first. `0` = every place Tripadvisor lists |
| `onlyWithContactDetails` | Return only places that have a phone, e-mail or website |
| `minRating`, `minReviews` | Skip weaker places |
| `placeUrls` | Individual place URLs or IDs (`restaurant:719141`, `hotel:188730`, `attraction:188151`) |
| `includeDetails` | `false` returns only name, rating, review count and list position (no contacts), faster |
| `concurrency`, `proxyConfiguration` | Parallel requests; datacenter proxy by default, switching to Apify RESIDENTIAL automatically after repeated blocks |

```json
{
    "locations": ["Paris", "Lisbon"],
    "placeTypes": ["restaurant", "attraction"],
    "maxPlacesPerLocation": 200,
    "onlyWithContactDetails": true,
    "minRating": 4
}
```

### Scheduling and webhooks

Run it on a schedule and use an Apify webhook or integration to send the rows to your CRM or sheet. Rows are pushed as they are collected, and an interrupted run resumes where it stopped.

### Using it from AI agents and pipelines

The dataset is flat JSON/CSV, so it works with the Apify API, the Python and JavaScript clients, and any MCP-compatible agent that can call Apify Actors.

### FAQ

**Do I need a Tripadvisor account?** No.

**Which contact details do I get?** In test runs on Paris, Lisbon, Berlin and New York: phone and website on nearly every restaurant (400 of 400 had a phone in Paris), website on about 80% of attractions with e-mail on about half, and for hotels a phone on about 55-70% and an e-mail on about a third. Hotels do not expose their own website in the data, so use the phone or e-mail. Coverage varies by city.

**How many places can I get per city?** As many as Tripadvisor lists (Paris has more than 20,000 restaurants). Set `maxPlacesPerLocation` to `0` for all of them; they are read in ranked order.

**Are the e-mail addresses verified?** No. They are the addresses shown on the listing, not checked for deliverability.

**What happens when Tripadvisor blocks an IP?** The request is retried on a fresh IP, and after repeated blocks the run switches to RESIDENTIAL proxies.

# Actor input Schema

## `locations` (type: `array`):

Cities or regions to scrape, e.g. "Paris", "Barcelona, Spain", or a Tripadvisor page URL such as https://www.tripadvisor.com/Restaurants-g187147-Paris_Ile_de_France.html (any URL containing -g<number>-), or geo:187147.

## `placeTypes` (type: `array`):

What to collect in each location.

## `maxPlacesPerLocation` (type: `integer`):

Places returned for each location and place type, best ranked first. 0 = every place Tripadvisor lists. You are charged per place.

## `onlyWithContactDetails` (type: `boolean`):

Return only places that have a phone number, an e-mail address or a website. Handy for lead lists.

## `minRating` (type: `number`):

Skip places rated below this (0 to 5).

## `minReviews` (type: `integer`):

Skip places with fewer reviews than this.

## `placeUrls` (type: `array`):

Individual Tripadvisor restaurant, hotel or attraction URLs, or IDs such as restaurant:719141 / hotel:188730 / attraction:188151. Scraped in addition to the locations.

## `includeDetails` (type: `boolean`):

On (default): one detail request per place for phone, e-mail, website, address, coordinates, hours, awards and more. Off: name, rating, review count and rank position only, faster.

## `concurrency` (type: `integer`):

How many requests run at the same time.

## `proxyConfiguration` (type: `object`):

Datacenter proxy by default. If Tripadvisor blocks several exits in a row the run switches to Apify RESIDENTIAL automatically (charged as proxy traffic on your plan).

## Actor input object example

```json
{
  "locations": [
    "Paris"
  ],
  "placeTypes": [
    "restaurant"
  ],
  "maxPlacesPerLocation": 10,
  "onlyWithContactDetails": false,
  "minRating": 0,
  "minReviews": 0,
  "includeDetails": true,
  "concurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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 = {
    "locations": [
        "Paris"
    ],
    "placeTypes": [
        "restaurant"
    ],
    "maxPlacesPerLocation": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("axlymxp/tripadvisor-places-leads-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 = {
    "locations": ["Paris"],
    "placeTypes": ["restaurant"],
    "maxPlacesPerLocation": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("axlymxp/tripadvisor-places-leads-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 '{
  "locations": [
    "Paris"
  ],
  "placeTypes": [
    "restaurant"
  ],
  "maxPlacesPerLocation": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call axlymxp/tripadvisor-places-leads-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,axlymxp/tripadvisor-places-leads-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/6Dgs0Et2hWVJqpOEo/builds/ol8Hul5oOwTSfKq6T/openapi.json
