# TripAdvisor Restaurants · Profile URLs by City (`corent1robert/tripadvisor-restaurant-discovery-scraper`) Actor

Paste a TripAdvisor city restaurants page. Get unique restaurant profile URLs — name when listed — ready to enrich. Public listings only. No login.

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

## Pricing

from $0.70 / 1,000 restaurant urls

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

## TripAdvisor restaurant URL discovery

**Turn a TripAdvisor city restaurants page into a clean list of restaurant profile URLs — name when listed, ready to enrich.**

Paste the listing URL from your browser (New York, Paris, London…). The Actor walks public pages and saves unique restaurant profiles.

**No login. No API key. No TripAdvisor account.**

Pair with **TripAdvisor restaurant details** to add phone, email, hours and ranking.

***

### Also available

| Actor | Use when |
|-------|----------|
| **This Actor — discovery** | You have a **city / neighborhood listing** URL and need profile links |
| [TripAdvisor restaurant details](https://console.apify.com/actors/6aXohphOwgWP96zLN) | You already have `Restaurant_Review` URLs and need contacts |
| [Booking Pro Host](https://apify.com/corent1robert/booking-pro-host-scraper) | Hotel / apartment host contacts on Booking.com |

***

### Who is this for?

| You are… | Typical goal | Suggested setup |
|----------|--------------|-----------------|
| **Outbound / SDR** | Build a restaurant URL list for a city before enrichment | One city URL · **Max listing pages** `5` |
| **CRM / RevOps** | Feed profile URLs into the details Actor | Discovery first, then details on the same `url` column |
| **Market research** | Sample restaurants in a destination | **Max listing pages** `1`, then raise coverage |
| **Agency / local SEO** | Map competitors on TripAdvisor in one territory | Neighborhood or city listing URL |
| **Data / ops** | Recurring city snapshot | Scheduler · `maxPages: 0` until the list ends |

**What you get by default:** unique `url`, `name` when TripAdvisor lists it, the listing page it came from, pagination offset.

**When to raise coverage:** increase **Max listing pages**. Set **0** to keep going until a page has no new restaurants.

**Typical yield:** one New York listing page returns ~90 unique restaurant profile URLs.

***

### Quick start

1. Open TripAdvisor → Restaurants → copy the city URL
2. Paste it in **Restaurant listing URL(s)**
3. Leave **Max listing pages** at `1` for a first run, then `5`
4. Click **Start**
5. Export CSV/JSON, or pass `url` into **TripAdvisor restaurant details**

***

### Ready-made examples

Sixteen city presets are saved as Console tasks (New York, Paris, London, Barcelona, Rome, Los Angeles, Miami, Chicago, Berlin, Amsterdam, Lisbon, Dubai, Tokyo, Singapore, Sydney, plus New York × 5 pages). They appear on the Store **Examples** tab after each task is published.

Until then, paste any city restaurants URL — New York is the Console prefill.

***

### What does it produce?

| Field | Meaning |
|-------|---------|
| `url` | Restaurant profile (`Restaurant_Review`) |
| `name` | Name when listed on the city page |
| `listingPageUrl` | The listing page this URL was collected from |
| `pageOffset` | Pagination offset (`0`, `30`, …) |

One row per unique restaurant URL. Dataset view: **Restaurant URLs**.

***

### How much does it cost to scrape TripAdvisor restaurant URLs?

HTTP-only. You pay **pay-per-event** per unique restaurant URL — this is a **URL list**, not a full contact row. Official Tripadvisor listing scrapers charge about **$2.90 / 1k** (Bronze) to **$5 / 1k** (FREE) for richer listing rows. This Actor is **$1 / 1k** on FREE.

| Scenario | FREE | Bronze | Silver | Gold |
|----------|------|--------|--------|------|
| 1 listing page (~90 URLs) | ~$0.09 | ~$0.08 | ~$0.07 | ~$0.06 |
| 5 listing pages (~400 URLs) | ~$0.40 | ~$0.36 | ~$0.32 | ~$0.28 |
| 1,000 URLs | $1.00 | $0.90 | $0.80 | $0.70 |

Feed `url` into **TripAdvisor restaurant details** for emails and phones (billed separately). Residential proxy is **not** required by default.

***

### Is it legal to scrape TripAdvisor restaurant listings?

This Actor only reads **public** city restaurant listing pages (the same HTML a visitor can open without an account). It does not log in.

You are responsible for TripAdvisor terms and privacy law when you enrich those URLs (phones and emails) with the details Actor. See [Apify's guide to web scraping legality](https://blog.apify.com/is-web-scraping-legal/).

***

### Input

Console: paste listing URL(s) and set **Max listing pages**.

```json
{
  "startUrls": [
    "https://www.tripadvisor.com/Restaurants-g60763-New_York_City_New_York.html"
  ],
  "maxPages": 3
}
```

| Parameter | Console | Default | Description |
|-----------|---------|---------|-------------|
| `startUrls` | Yes | — | City restaurants listing URLs |
| `maxPages` | Yes | `5` | Pages per URL (`0` = until the list ends) |
| `pageStep` | Hidden | `30` | Restaurants per listing page |
| `delayMsBetweenPages` | Hidden | `800` | Pause between pages (ms) |
| `resume` | Hidden | `false` | Skip URLs already in the dataset |
| `proxyConfiguration` | Hidden | no proxy | Optional backup |
| `verboseLogs` | Hidden | `false` | Extra diagnostics |
| `navigationTimeoutSecs` | Hidden | `60` | Wait per page |

***

### Output example

```json
{
  "url": "https://www.tripadvisor.com/Restaurant_Review-g60763-d425330-Reviews-Keens_Steakhouse-New_York_City_New_York.html",
  "name": "Keens Steakhouse",
  "listingPageUrl": "https://www.tripadvisor.com/Restaurants-g60763-New_York_City_New_York.html",
  "pageOffset": 0
}
```

***

### How it works

1. You paste a public city restaurants URL
2. The Actor reads each listing page and collects unique restaurant profile links
3. Names are saved when TripAdvisor shows them
4. Pass `url` into **TripAdvisor restaurant details** for phone, email and hours

***

### Local development

```bash
npm ci
node --test tests/*.test.js
apify run --input-file=./published-tasks/inputs/01-new-york-restaurant-urls.json
```

Requires [Apify CLI](https://docs.apify.com/cli).

***

### FAQ

**City listing or restaurant profile?** This Actor needs `/Restaurants-g…` (or equivalent city list). Profile pages belong in the **details** Actor.

**Do I need a proxy?** Not for typical city pages. Pass `proxyConfiguration` in JSON only if a run returns no restaurants.

**How many URLs per page?** About 70–90 unique profiles on a New York page in recent runs.

***

### Support

Issues tab, or <corentin@outreacher.fr> for a custom scraper or integration.

# Actor input Schema

## `startUrls` (type: `array`):

TripAdvisor city restaurants pages, e.g. New York or Paris. One URL per row. Page 2+ is handled from **Max listing pages**.

## `maxPages` (type: `integer`):

How many listing pages to collect per URL. **0** = keep going until a page has no new restaurants. Start with **1** for a smoke test.

## `pageStep` (type: `integer`):

TripAdvisor typically shows 30 restaurants per page. Leave the default unless a listing uses another step.

## `delayMsBetweenPages` (type: `integer`):

Optional pause between listing pages.

## `resume` (type: `boolean`):

Continue a previous run on the same dataset without duplicating restaurant URLs.

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

Optional backup. Direct access is the default.

## `verboseLogs` (type: `boolean`):

Print listing URLs and extra diagnostics in the run log.

## `navigationTimeoutSecs` (type: `integer`):

How long to wait for each listing page.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.tripadvisor.com/Restaurants-g60763-New_York_City_New_York.html"
  ],
  "maxPages": 5,
  "pageStep": 30,
  "delayMsBetweenPages": 800,
  "resume": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "verboseLogs": false,
  "navigationTimeoutSecs": 60
}
```

# Actor output Schema

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

All restaurant profile URLs — one row per restaurant

## `overview` (type: `string`):

Name, profile URL and listing page

# 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 = {
    "startUrls": [
        "https://www.tripadvisor.com/Restaurants-g60763-New_York_City_New_York.html"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("corent1robert/tripadvisor-restaurant-discovery-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 = { "startUrls": ["https://www.tripadvisor.com/Restaurants-g60763-New_York_City_New_York.html"] }

# Run the Actor and wait for it to finish
run = client.actor("corent1robert/tripadvisor-restaurant-discovery-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 '{
  "startUrls": [
    "https://www.tripadvisor.com/Restaurants-g60763-New_York_City_New_York.html"
  ]
}' |
apify call corent1robert/tripadvisor-restaurant-discovery-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,corent1robert/tripadvisor-restaurant-discovery-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/r63zaonzpROWPHZCS/builds/UNZaaxgjsLECwfA1U/openapi.json
