# Tripadvisor Hotels Scraper (`shahidirfan/tripadvisor-hotels-scraper`) Actor

Extract hotel data from TripAdvisor instantly. Scrape reviews, ratings, prices, amenities & location details at scale. Perfect for travel startups, market research & competitive analysis. Get real-time hospitality insights with zero blocks. Supports batch runs & custom filters.

- **URL**: https://apify.com/shahidirfan/tripadvisor-hotels-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Categories:** Travel, Developer tools, Automation
- **Stats:** 3 total users, 3 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Hotels Scraper

Extract TripAdvisor hotel listing data from city and listing pages into a clean, analytics-ready dataset. Collect ratings, ranking details, pricing signals, address fields, coordinates, and offer highlights at scale. Ideal for travel research, market analysis, and hotel intelligence workflows.

### Features

- **Hotels listing extraction** — Collect hotel cards from TripAdvisor Hotels pages.
- **City and listing URL support** — Use one or multiple source URLs in a single run.
- **Rich hotel fields** — Capture ranking, rating, address, geo coordinates, and pricing/offer details.
- **Pagination controls** — Set page limit and record limit to control run size.
- **Null-free output** — Empty values are automatically removed from each dataset item.
- **Duplicate-safe dataset** — Repeated listings are filtered before save.

### Use Cases

#### Competitor Benchmarking
Track how hotels rank in a city and compare review volume, rating, and pricing signals across competing properties.

#### Destination Intelligence
Build destination-level hotel datasets to understand supply, quality tiers, and neighborhood-level concentration.

#### Travel Product Research
Feed listing data into pricing models, recommendation systems, or internal market dashboards.

#### Sales and Lead Enrichment
Create hotel lead lists with location, contact, and ranking context for outreach and partnership workflows.

---

### Input Parameters

| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| `startUrls` | String Array | No | Istanbul Hotels sample | One or more TripAdvisor Hotels URLs as plain strings. |
| `results_wanted` | Integer | No | `20` | Maximum listings to collect across all URLs. |
| `max_pages` | Integer | No | `5` | Maximum pages to fetch per URL. |
| `proxyConfiguration` | Object | No | Apify Proxy preset | Proxy settings for better run stability. |

---

### Output Data

Each dataset item contains only non-empty fields.

| Field | Type | Description |
|---|---|---|
| `item_type` | String | Record type (`hotel_listing`). |
| `source_url` | String | Source Hotels page URL. |
| `geo_id` | Integer | TripAdvisor geo identifier used for extraction. |
| `hotel_result_key` | String | Unique listing key in result set. |
| `location_id` | Integer | TripAdvisor hotel location ID. |
| `hotel_name` | String | Hotel name. |
| `hotel_url` | String | Absolute hotel detail URL. |
| `rating` | Number | Average rating score. |
| `reviews_count` | Integer | Total number of reviews. |
| `ranking_type_text` | String | Localized ranking text. |
| `provider_star_rating` | Number | Star rating from listing metadata. |
| `accommodation_type` | String | Accommodation type label. |
| `lowest_price` | String | Lowest visible price text. |
| `offer_count` | Integer | Number of offers available. |
| `available_offer_count` | Integer | Number of currently available offers. |
| `primary_offer_price` | String | Primary offer display price. |
| `provider_name` | String | Offer provider name. |
| `thumbnail_url` | String | Listing image URL. |
| `full_address` | String | Full address text. |
| `city` | String | City from address. |
| `country` | String | Country from address. |
| `latitude` | Number | Latitude coordinate. |
| `longitude` | Number | Longitude coordinate. |

---

### Usage Examples

#### Single City URL

```json
{
  "startUrls": [
    "https://www.tripadvisor.com/Hotels-g293974-Istanbul-Hotels.html"
  ],
  "results_wanted": 20
}
````

#### Multiple Cities

```json
{
  "startUrls": [
    "https://www.tripadvisor.com/Hotels-g293974-Istanbul-Hotels.html",
    "https://www.tripadvisor.com/Hotels-g294226-Dubai_Emirate_of_Dubai-Hotels.html"
  ],
  "results_wanted": 120,
  "max_pages": 10
}
```

#### Basic Extended Collection

```json
{
  "startUrls": [
    "https://www.tripadvisor.com/Hotels-g293974-Istanbul-Hotels.html"
  ],
  "results_wanted": 50,
  "max_pages": 8
}
```

***

### Sample Output

```json
{
  "item_type": "hotel_listing",
  "source_url": "https://www.tripadvisor.com/Hotels-g293974-Istanbul-Hotels.html",
  "geo_id": 293974,
  "hotel_result_key": "12395785:s:MzM0ODMyMTU:1b0deade-0273-42a8-bdba-521b02fba032",
  "location_id": 12395785,
  "hotel_name": "ibis Istanbul Tuzla Hotel",
  "hotel_url": "https://www.tripadvisor.com/Hotel_Review-g293974-d12395785-Reviews-Ibis_Istanbul_Tuzla_Hotel-Istanbul.html",
  "rating": 4.2,
  "reviews_count": 151,
  "ranking_type_text": "#594 of 2,504 hotels in Istanbul",
  "provider_star_rating": 3,
  "accommodation_type": "Hotel",
  "lowest_price": "$65",
  "offer_count": 1,
  "available_offer_count": 1,
  "primary_offer_price": "$65",
  "provider_name": "all.accor.com",
  "thumbnail_url": "https://dynamic-media-cdn.tripadvisor.com/media/photo-o/27/be/43/7b/ibis-istanbul-tuzla-hotel.jpg?w=1200&h=800&s=1",
  "full_address": "Aydintepe Mah.selin Sok.no.7 Tuzla, Istanbul 34947 Türkiye",
  "city": "Istanbul",
  "country": "Türkiye",
  "latitude": 40.848927,
  "longitude": 29.296696
}
```

***

### Tips for Best Results

#### Use Stable Hotels URLs

- Prefer URLs that include `-g<geoId>-` for direct city resolution.
- Keep URLs canonical to reduce routing issues.

#### Keep QA-Friendly Limits

- Use `results_wanted: 20` for quick validation.
- Increase gradually for production collections.

#### Improve Reliability

- Enable residential proxies for protected traffic.
- Retry with smaller run sizes when testing new URLs.

***

### Integrations

Connect your dataset with:

- **Google Sheets** — Share listing snapshots with business teams.
- **Airtable** — Build searchable hotel intelligence bases.
- **Make** — Automate recurring enrichment workflows.
- **Zapier** — Trigger actions from fresh listing runs.
- **Webhooks** — Push records into custom pipelines.

#### Export Formats

- **JSON** — Best for automation and downstream processing.
- **CSV** — Best for spreadsheet analysis.
- **Excel** — Best for business reporting.
- **XML** — Best for legacy systems.

***

### Frequently Asked Questions

#### Does the actor support multiple source URLs?

Yes. Add multiple values in `startUrls` and collect listings across them in one run.

#### Are null values saved in the dataset?

No. Empty and null fields are removed before records are stored.

#### How is duplicate data handled?

Listings are deduplicated by listing identifiers before saving.

#### What URL format should I use?

Use a TripAdvisor Hotels URL that includes `-g<geoId>-`, such as city listing pages.

#### How can I reduce blocked runs?

Use Apify residential proxies and start with smaller collection sizes.

***

### Support

For issues or feature requests, contact support through the Apify Console.

#### Resources

- [Apify Documentation](https://docs.apify.com/)
- [Apify API Reference](https://docs.apify.com/api/v2)
- [Scheduling Runs](https://docs.apify.com/platform/schedules)

***

### Legal Notice

This actor is designed for legitimate data collection. You are responsible for complying with website terms and applicable laws in your jurisdiction.

# Actor input Schema

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

One or more TripAdvisor Hotels city/listing URLs. Best format contains -g<geoId>- in the URL.

## `results_wanted` (type: `integer`):

Maximum number of hotel listings to save across all input URLs.

## `max_pages` (type: `integer`):

Safety cap for pagination per source URL.

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

Use Apify Proxy for better reliability on protected pages.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.tripadvisor.com/Hotels-g293974-Istanbul-Hotels.html"
  ],
  "results_wanted": 20,
  "max_pages": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "startUrls": [
        "https://www.tripadvisor.com/Hotels-g293974-Istanbul-Hotels.html"
    ],
    "results_wanted": 20,
    "max_pages": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/tripadvisor-hotels-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/Hotels-g293974-Istanbul-Hotels.html"],
    "results_wanted": 20,
    "max_pages": 5,
}

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

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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/Hotels-g293974-Istanbul-Hotels.html"
  ],
  "results_wanted": 20,
  "max_pages": 5
}' |
apify call shahidirfan/tripadvisor-hotels-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=shahidirfan/tripadvisor-hotels-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Tripadvisor Hotels Scraper",
        "description": "Extract hotel data from TripAdvisor instantly. Scrape reviews, ratings, prices, amenities & location details at scale. Perfect for travel startups, market research & competitive analysis. Get real-time hospitality insights with zero blocks. Supports batch runs & custom filters.",
        "version": "1.0",
        "x-build-id": "aDlNdnPSTgcEhfLD5"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/shahidirfan~tripadvisor-hotels-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-shahidirfan-tripadvisor-hotels-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/shahidirfan~tripadvisor-hotels-scraper/runs": {
            "post": {
                "operationId": "runs-sync-shahidirfan-tripadvisor-hotels-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/shahidirfan~tripadvisor-hotels-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-shahidirfan-tripadvisor-hotels-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "startUrls": {
                        "title": "TripAdvisor Hotels URLs",
                        "type": "array",
                        "description": "One or more TripAdvisor Hotels city/listing URLs. Best format contains -g<geoId>- in the URL.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "results_wanted": {
                        "title": "Maximum listings",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of hotel listings to save across all input URLs.",
                        "default": 20
                    },
                    "max_pages": {
                        "title": "Maximum pages per URL",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Safety cap for pagination per source URL.",
                        "default": 5
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Use Apify Proxy for better reliability on protected pages.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
