# Tiket Hotel Reviews Scraper (`shahidirfan/tiket-hotel-reviews-scraper`) Actor

Scrape hotel reviews from Tiket, Indonesia's biggest travel platform. Get guest ratings, feedback, scores & property details instantly. Perfect for sentiment analysis, competitor benchmarking, reputation tracking & hospitality market research. Production-ready.

- **URL**: https://apify.com/shahidirfan/tiket-hotel-reviews-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Categories:** Travel, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 93.8% runs succeeded, 0 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

## Tiket Hotel Reviews Scraper

Extract comprehensive hotel review data from Tiket hotel pages with a single run. Collect verified guest reviews, rating breakdowns, trip context, hotel metadata, and review summaries for analysis, monitoring, and reporting.

### Features

- **Review extraction** — Collect individual guest reviews with timestamps, reviewer names, ratings, trip type, and helpfulness counts
- **Rating breakdowns** — Capture overall scores plus per-category ratings such as cleanliness, service, location, facilities, and value
- **Hotel metadata** — Enrich every review with hotel name, address, chain, star rating, facilities, nearby destinations, and location details
- **Summary insights** — Include aggregate review totals, average rating, impression labels, and topic highlights
- **Pagination control** — Stop at your requested result count while capping the maximum number of pages to scan

### Use Cases

#### Reputation Monitoring
Track how guests describe a property over time. Spot recurring issues, strong service themes, and changes in review sentiment before they affect bookings.

#### Competitor Benchmarking
Compare rating distributions, review volume, and traveler segments across similar hotels. Build benchmarking datasets for internal reporting or market analysis.

#### Hospitality Research
Study guest feedback at scale for pricing, service quality, and property positioning. Use structured review outputs for dashboards, scoring models, or BI pipelines.

#### Lead Qualification
Evaluate hotel quality and traveler fit before outreach or partnership work. Summary metrics and detailed reviews help prioritize the right properties faster.

---

### Input Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `hotel_url` | String | No | — | Full Tiket hotel URL to scrape |
| `hotel_id` | String | No | — | Tiket hotel inventory ID, used when you do not want to pass the full URL |
| `results_wanted` | Integer | No | `20` | Maximum number of unique reviews to collect |
| `max_pages` | Integer | No | `5` | Maximum number of paginated review pages to fetch |
| `proxyConfiguration` | Object | No | — | Optional Apify proxy configuration for higher reliability |

At least one of `hotel_url` or `hotel_id` should be provided.

---

### Output Data

Each item in the dataset contains review-level data enriched with hotel and summary details.

| Field | Type | Description |
|-------|------|-------------|
| `hotel_id` | String | Tiket hotel inventory ID |
| `hotel_name` | String | Hotel name |
| `hotel_chain_name` | String | Hotel chain or brand name |
| `hotel_address` | String | Full hotel address |
| `hotel_city_name` | String | City name |
| `hotel_region_name` | String | Region or province name |
| `hotel_country_name` | String | Country name |
| `hotel_star_rating` | Number | Star rating shown for the hotel |
| `hotel_main_facilities` | Array | Primary facilities available at the property |
| `hotel_nearby_destinations` | Array | Nearby destination titles from the hotel page |
| `review_total_count` | Number | Total review count for the hotel |
| `review_average_rating` | Number | Aggregate average review rating |
| `review_topics` | Array | Topic highlights associated with the property |
| `review_id` | String | Unique review identifier |
| `reviewer_name` | String | Guest name shown on the review |
| `trip_type` | String | Traveler segment such as family, business, couple, or solo |
| `overall_rating` | Number | Overall review score |
| `review_text` | String | Review body text |
| `review_date` | String | Review submission timestamp in ISO format |
| `stay_start_date` | String | Journey start timestamp in ISO format |
| `stay_end_date` | String | Journey end timestamp in ISO format |
| `helpfulness_count` | Number | Number of helpful votes |
| `cleanliness_rating` | Number | Cleanliness score when provided |
| `service_rating` | Number | Service score when provided |
| `location_rating` | Number | Location score when provided |
| `facilities_rating` | Number | Facilities score when provided |
| `value_for_money_rating` | Number | Value score when provided |
| `review_image_urls` | Array | Review image URLs when available |
| `raw_comments` | Array | Original comment objects from the source |
| `raw_review_answers` | Array | Original structured review answer objects |

---

### Usage Examples

#### Basic Hotel URL Extraction

Collect reviews from a hotel page URL:

```json
{
  "hotel_url": "https://www.tiket.com/en-us/hotel/indonesia/neo-denpasar-hotel-by-aston-807001751612811865",
  "results_wanted": 20
}
````

#### Inventory ID Input

Run the scraper using only the hotel inventory ID:

```json
{
  "hotel_id": "neo-denpasar-hotel-by-aston-807001751612811865",
  "results_wanted": 50,
  "max_pages": 3
}
```

#### Proxy-Assisted Collection

Use Apify Proxy for more consistent runs at scale:

```json
{
  "hotel_url": "https://www.tiket.com/en-us/hotel/indonesia/neo-denpasar-hotel-by-aston-807001751612811865",
  "results_wanted": 100,
  "max_pages": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

***

### Sample Output

```json
{
  "hotel_id": "neo-denpasar-hotel-by-aston-807001751612811865",
  "hotel_name": "Neo Denpasar Hotel by ASTON",
  "hotel_chain_name": "Archipelago Hotels & Resorts",
  "hotel_address": "Jl. Gatot Subroto Barat, Padangsambian Kaja, Kec. Denpasar Bar., Kota Denpasar, Bali",
  "hotel_city_name": "Denpasar",
  "hotel_region_name": "Bali",
  "hotel_country_name": "Indonesia",
  "hotel_star_rating": 3,
  "hotel_main_facilities": [
    "Swimming Pool",
    "WiFi",
    "Parking"
  ],
  "review_total_count": 1836,
  "review_average_rating": 4.394,
  "review_topics": [
    "food",
    "staff",
    "price"
  ],
  "review_id": "64a6726c4b136500012651a8",
  "reviewer_name": "Rengga Erlinawati",
  "overall_rating": 5,
  "review_text": "Nyaman banget nih hotel dgn harga yg trjangkau Sayang jauh dr kuta",
  "review_date": "2023-07-06T10:31:08.539Z",
  "stay_start_date": "2023-07-03T05:30:00.000Z",
  "stay_end_date": "2023-07-04T05:30:00.000Z",
  "helpfulness_count": 2,
  "cleanliness_rating": 5,
  "service_rating": 5,
  "location_rating": 5,
  "facilities_rating": 5,
  "value_for_money_rating": 5,
  "review_source_label": "Verified review from tiket.com"
}
```

***

### Tips for Best Results

#### Choose a Valid Hotel Page

- Use a live Tiket hotel page or inventory ID
- Prefer the English hotel URL format when sharing links across systems

#### Start Small

- Use `results_wanted: 20` for quick validation
- Increase the count once you confirm the property returns review data

#### Control Collection Scope

- Use `max_pages` to keep larger runs predictable
- For deep historical review collection, increase both `results_wanted` and `max_pages`

#### Use Proxies for Volume

- Residential proxies are recommended for repeated or larger runs
- Keep request sizes reasonable to reduce retries

***

### Integrations

Connect your dataset with:

- **Google Sheets** — Build quick review dashboards and scorecards
- **Airtable** — Organize hotels, segments, and traveler feedback in a searchable base
- **Make** — Trigger downstream automations from fresh review runs
- **Zapier** — Send alerts or records into business workflows
- **Webhooks** — Push review datasets into your own systems

#### Export Formats

- **JSON** — For custom applications and data pipelines
- **CSV** — For spreadsheet analysis
- **Excel** — For business reporting
- **XML** — For downstream integrations

***

### Frequently Asked Questions

#### Can I scrape reviews without the full hotel URL?

Yes. You can provide the Tiket hotel inventory ID with `hotel_id`.

#### Does the actor stop at my requested count?

Yes. It collects unique reviews until `results_wanted` is reached or `max_pages` is exhausted.

#### Why do some reviews have fewer fields?

Some guests do not provide every optional detail, image, or traveler label. The dataset keeps only fields that are present in the source.

#### Can I collect more than the newest page of reviews?

Yes. The actor paginates review pages automatically up to your `max_pages` limit.

#### What if the hotel has no reviews?

The actor will finish without records if the selected property does not expose review content.

#### Is proxy usage required?

No, but it can improve reliability for repeated or higher-volume runs.

***

### Support

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

#### Resources

- [Apify Documentation](https://docs.apify.com/)
- [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 purposes. Users are responsible for ensuring compliance with website terms of service and applicable laws. Use data responsibly and respect rate limits.

# Actor input Schema

## `hotel_url` (type: `string`):

Full tiket.com hotel URL, e.g. https://www.tiket.com/en-us/hotel/indonesia/neo-denpasar-hotel-by-aston-807001751612811865.

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

Maximum number of reviews to collect.

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

Maximum number of review pages to paginate through.

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

Use Apify Proxy (residential recommended for tiket.com).

## Actor input object example

```json
{
  "hotel_url": "https://www.tiket.com/en-us/hotel/indonesia/neo-denpasar-hotel-by-aston-807001751612811865",
  "results_wanted": 20,
  "max_pages": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "hotel_url": "https://www.tiket.com/en-us/hotel/indonesia/neo-denpasar-hotel-by-aston-807001751612811865",
    "results_wanted": 20,
    "max_pages": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/tiket-hotel-reviews-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 = {
    "hotel_url": "https://www.tiket.com/en-us/hotel/indonesia/neo-denpasar-hotel-by-aston-807001751612811865",
    "results_wanted": 20,
    "max_pages": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/tiket-hotel-reviews-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 '{
  "hotel_url": "https://www.tiket.com/en-us/hotel/indonesia/neo-denpasar-hotel-by-aston-807001751612811865",
  "results_wanted": 20,
  "max_pages": 5
}' |
apify call shahidirfan/tiket-hotel-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Tiket Hotel Reviews Scraper",
        "description": "Scrape hotel reviews from Tiket, Indonesia's biggest travel platform. Get guest ratings, feedback, scores & property details instantly. Perfect for sentiment analysis, competitor benchmarking, reputation tracking & hospitality market research. Production-ready.",
        "version": "0.0",
        "x-build-id": "WKbGC2gyY1if5gZbz"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/shahidirfan~tiket-hotel-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-shahidirfan-tiket-hotel-reviews-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~tiket-hotel-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-shahidirfan-tiket-hotel-reviews-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~tiket-hotel-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-shahidirfan-tiket-hotel-reviews-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": {
                    "hotel_url": {
                        "title": "Hotel URL",
                        "type": "string",
                        "description": "Full tiket.com hotel URL, e.g. https://www.tiket.com/en-us/hotel/indonesia/neo-denpasar-hotel-by-aston-807001751612811865."
                    },
                    "results_wanted": {
                        "title": "Maximum Reviews",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of reviews to collect.",
                        "default": 20
                    },
                    "max_pages": {
                        "title": "Maximum Pages",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of review pages to paginate through.",
                        "default": 5
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Use Apify Proxy (residential recommended for tiket.com).",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
