# Tripadvisor Restaurant Listings Extractor (`kawsar/tripadvisor-restaurant-listings-extractor`) Actor

Tripadvisor Restaurant Listings Extractor that scrapes city restaurant pages for ratings, reviews, cuisines, phones, addresses, and coordinates so SEO and lead-gen teams get structured local data fast.

- **URL**: https://apify.com/kawsar/tripadvisor-restaurant-listings-extractor.md
- **Developed by:** [Kawsar](https://apify.com/kawsar) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.99 / 1,000 results

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 Listings Extractor: city restaurant data for SEO and local research

<p align="center">
  <img src="https://imgur.com/Lxvrl9g.png" alt="USA Automotive Leads Hub" style="max-width:100%; border-radius:14px; width:680px;" />
</p>

Tripadvisor Restaurant Listings Extractor turns a Tripadvisor city Restaurants page into clean, structured rows. Paste a list URL, run the actor, and export names, ratings, review counts, cuisines, phones, addresses, coordinates, and listing images.

It is built for restaurant list pages only (`Restaurants-g...` URLs). That keeps runs focused, predictable, and easy to plug into SEO audits, lead lists, and competitor maps.

### Why this actor

Tripadvisor is still one of the strongest public signals for local dining: rating, review volume, price band, and cuisine tags in one place. Collecting that by hand does not scale. This actor reads the listing page you already use in a browser and returns the same restaurants as dataset rows you can sort, filter, or join with your own data.

Compared with broad Tripadvisor scrapers that mix hotels, attractions, and tours, this one stays on restaurant listings. If you only need dining data for a city, that is usually enough.

### What you get

| Field | Type | Description |
| --- | --- | --- |
| `position` | integer | Rank on the Tripadvisor list page |
| `locationId` | string | Tripadvisor location ID |
| `name` | string | Restaurant name |
| `restaurantUrl` | string | Link to the restaurant page |
| `rating` | number | Aggregate rating |
| `reviewCount` | integer | Number of reviews |
| `priceRange` | string | Price band (for example `$$ - $$$`) |
| `cuisines` | array | Cuisine tags |
| `phone` | string | Phone number when listed |
| `street` | string | Street address line |
| `city` | string | City when resolved from schema, page title, or URL (omitted if unknown) |
| `region` | string | Region/state when resolved (omitted if unknown) |
| `postalCode` | string | Postal or ZIP code |
| `country` | string | Country |
| `fullAddress` | string | Combined address string |
| `latitude` / `longitude` | number | Map coordinates |
| `imageUrl` | string | Listing image URL |
| `openingHours` | array | Hours when present on the list page |
| `sourceUrl` | string | Listing page the row came from |
| `scrapedAt` | string | UTC scrape timestamp |
| `error` | string | Error text if that page failed; otherwise `null` |

#### City and region notes

Tripadvisor often leaves `addressLocality` / `addressRegion` blank on restaurant list cards and packs the full line into `streetAddress`. The actor tries, in order:

1. Schema locality/region when Tripadvisor provides them
2. City from the page title (for example "Restaurants in London")
3. City/region from the listing or restaurant URL slug (`London_England`, `Boston_Massachusetts`)
4. A match of that slug inside the street line

If city or region still cannot be resolved, those keys are left out of the row instead of returning `null`.

### How to use it

1. Open Tripadvisor, choose a city, open **Restaurants**, and copy the browser URL.
2. Paste one or more URLs into `startUrls`.
3. Leave `maxItems` at 20 for a quick sample, or raise it (up to 10000) for fuller coverage.
4. Run the actor and download JSON, CSV, or Excel from the dataset.

#### Supported URL examples

- `https://www.tripadvisor.com/Restaurants-g186338-London_England.html`
- `https://www.tripadvisor.com/Restaurants-g60745-Boston_Massachusetts.html`
- `https://www.tripadvisor.com/Restaurants-g60763-New_York_City_New_York.html`

Filtered FindRestaurants URLs also work when they still show a restaurant list.

#### Example input

```json
{
  "startUrls": [
    "https://www.tripadvisor.com/Restaurants-g186338-London_England.html"
  ],
  "includeImages": true,
  "maxItems": 20,
  "requestTimeoutSecs": 60
}
```

#### Example output

```json
{
  "position": 1,
  "locationId": "7345750",
  "name": "Sky Pod Bar",
  "restaurantUrl": "https://www.tripadvisor.com/Restaurant_Review-g186338-d7345750-Reviews-Sky_Pod_Bar-London_England.html",
  "rating": 4.6,
  "reviewCount": 2864,
  "priceRange": "$$ - $$$",
  "cuisines": ["Bar", "British"],
  "phone": "+44 333 772 0020",
  "street": "1 Sky Garden Walk Sky Garden, London EC3M 8AF England",
  "city": "London",
  "region": "England",
  "postalCode": "EC3M 8AF",
  "country": "United Kingdom",
  "fullAddress": "1 Sky Garden Walk Sky Garden, London EC3M 8AF England, London, England, EC3M 8AF, United Kingdom",
  "latitude": 51.511192,
  "longitude": -0.083558,
  "imageUrl": "https://dynamic-media-cdn.tripadvisor.com/media/photo-o/25/23/50/a5/caption.jpg",
  "openingHours": [
    {
      "dayOfWeek": "Monday",
      "opens": "08:00:00",
      "closes": "00:00:00"
    }
  ],
  "sourceUrl": "https://www.tripadvisor.com/Restaurants-g186338-London_England.html",
  "scrapedAt": "2026-09-13T08:00:00+00:00",
  "error": null
}
```

### Input parameters

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `startUrls` | array | London restaurants URL | Tripadvisor restaurant listing page URLs |
| `includeImages` | boolean | `true` | Include listing image URLs |
| `maxItems` | integer | `20` | Cap on restaurants returned (maximum 10000) |
| `requestTimeoutSecs` | integer | `60` | Per-request timeout in seconds |

### Features

- Restaurant-list focus: city Restaurants pages, not hotels or attractions
- Structured fields ready for CSV/Excel/CRM import
- Automatic pagination until `maxItems` is reached (Tripadvisor usually shows 30 places per page)
- Listing images optional via `includeImages`
- Coordinates on most rows for map plots without a separate geocoding step
- City/region enrichment from title and URL when schema fields are empty
- Per-page error rows so one bad URL does not wipe the whole run

### Use cases

- **Local SEO audits**: see which restaurants Tripadvisor ranks for a city and how review volume lines up with rating
- **Lead generation**: export phone and address fields for outreach lists
- **Competitor mapping**: plot lat/long and sort by `reviewCount` to spot places that actually get traffic
- **Market research**: group by `cuisines` and `priceRange` before opening or expanding
- **Content and catalogs**: keep `imageUrl` with each row for decks, directories, or enrichment pipelines
- **Agency reporting**: schedule runs for client cities and track rating/review changes over time

### Limits

- Default `maxItems` is **20**; maximum is **10000** if you want more (or nearly all) results
- Restaurant listing pages only (not hotel/attraction lists, not full review text)
- `description` on list cards is often empty on Tripadvisor; detail-page blurbs are out of scope
- Address splitting depends on what Tripadvisor publishes; `fullAddress` and `street` remain the safest raw fields
- Very large cities may still hit Tripadvisor's own list depth; raise `maxItems` and let pagination run

### FAQ

**Can I scrape hotels or attractions?**
No. Use a restaurant list URL. Other surfaces belong in a broader Tripadvisor scraper.

**Does it scrape individual reviews?**
No. It returns listing-level fields: who is on the page, how they are rated, and contact/location data shown there.

**How many restaurants can I get per run?**
Default is 20. Set `maxItems` from 1 to 10000 when you want more results from the city list.

**What URL should I paste?**
City → Restaurants → copy the browser URL into `startUrls`.

**Why might `city` or `region` be missing?**
Only when the actor cannot resolve them from schema, page title, URL slug, or street text. In that case the fields are omitted instead of stored as `null`.

**Can I run several cities at once?**
Yes. Add multiple listing URLs to `startUrls`. The `maxItems` cap applies to the whole run.

# Actor input Schema

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

One or more Tripadvisor restaurant list URLs for a city or area. Paste the Restaurants page URL from your browser (for example London or Boston).

## `includeImages` (type: `boolean`):

When enabled, each restaurant row includes the listing image URL from Tripadvisor.

## `maxItems` (type: `integer`):

Maximum number of restaurant listings to return across all start URLs and pages. Defaults to 20; raise this (up to 10000) when you want fuller city coverage.

## `requestTimeoutSecs` (type: `integer`):

Per-request timeout in seconds. Restaurant list pages can take longer; 60 is a solid default.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.tripadvisor.com/Restaurants-g186338-London_England.html",
    "https://www.tripadvisor.com/Restaurants-g60745-Boston_Massachusetts.html"
  ],
  "includeImages": true,
  "maxItems": 20,
  "requestTimeoutSecs": 60
}
```

# Actor output Schema

## `restaurantListings` (type: `string`):

Scraped Tripadvisor restaurant listings with ratings, reviews, cuisines, contact details, coordinates, and listing images.

# 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-g186338-London_England.html"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("kawsar/tripadvisor-restaurant-listings-extractor").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-g186338-London_England.html"] }

# Run the Actor and wait for it to finish
run = client.actor("kawsar/tripadvisor-restaurant-listings-extractor").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-g186338-London_England.html"
  ]
}' |
apify call kawsar/tripadvisor-restaurant-listings-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kawsar/tripadvisor-restaurant-listings-extractor"
        }
    }
}
```

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/tWg2VCn1oPwWa7dQH/builds/ab8I9LkadXT11J3G9/openapi.json
