# VRBO Reviews Scraper (`shahidirfan/vrbo-reviews-scraper`) Actor

Extract VRBO reviews, ratings & guest sentiment at scale. Analyze competitor performance, track trends, identify improvement opportunities. Perfect for property owners and market researchers.

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

## VRBO Reviews Scraper

Collect detailed guest review data from VRBO property listings in a clean, analysis-ready dataset. Capture review text, author context, sentiment labels, manager responses, and supporting metadata in one run. Ideal for hospitality intelligence, property benchmarking, and reputation tracking.

### Features

- **Flexible property targeting** — Use either a listing URL or direct property identifier.
- **Messy URL recovery** — Accepts noisy VRBO/Expedia single-property URLs and extracts property IDs reliably.
- **Rich review coverage** — Extract review body, titles, labels, trip summaries, and response notes.
- **Duplicate-safe output** — Automatically filters repeated records across paginated pages and fallback sources.
- **Null-free datasets** — Removes empty values so exports are clean for BI tools and spreadsheets.
- **Resilient collection flow** — Falls back to structured page data when primary review stream is limited.

### Use Cases

#### Reputation Monitoring
Track recurring complaints, praise themes, and response quality across individual properties. Identify service gaps before they impact occupancy.

#### Competitive Benchmarking
Compare guest sentiment and feedback depth between properties in the same market. Use output fields to build side-by-side quality scorecards.

#### Hospitality Analytics
Build structured review datasets for dashboards, trend analysis, and quarterly reporting. Connect scraped output to your internal performance KPIs.

#### Portfolio Operations
Audit large property portfolios to detect review-quality outliers quickly. Prioritize operational fixes based on review volume and sentiment context.

### Input Parameters

| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| `url` | String | No | — | VRBO or Expedia property URL. |
| `propertyId` | String | No | — | Direct property identifier. Takes priority when provided. |
| `results_wanted` | Integer | No | `20` | Maximum review rows to return. |
| `max_pages` | Integer | No | `10` | Maximum pages to request during pagination. |
| `proxyConfiguration` | Object | No | `{ "useApifyProxy": true }` | Proxy settings for reliability on protected pages. |

### Output Data

Each dataset item can contain:

| Field | Type | Description |
|---|---|---|
| `property_id` | String | Resolved property identifier. |
| `review_id` | String | Unique review identifier when available. |
| `rating_label` | String | Rating or score label from source data. |
| `author` | String | Guest/author display name. |
| `title` | String | Review title or heading. |
| `review_text` | String | Main review text content. |
| `summary_accessibility` | String | Supplemental summary/accessibility text. |
| `trip_summary` | String | Trip context summary text when present. |
| `sentiments` | Array | Sentiment labels attached to review content. |
| `management_response` | String | Host/manager response content. |
| `disclaimer` | String | Source disclaimer or attribution text. |
| `page_index` | Integer | Page index where the review was collected. |
| `position` | Integer | Position of item within that page/source batch. |
| `source_type` | String | Source stream used for the record. |
| `source_url` | String | Source endpoint or page reference. |
| `input_url` | String | Original property URL context. |
| `scraped_at` | String | ISO timestamp of extraction. |

### Usage Examples

#### Basic Property Run

```json
{
	"url": "https://www.vrbo.com/32650537",
	"results_wanted": 20
}
````

#### Direct Property ID Run

```json
{
	"propertyId": "32650537",
	"results_wanted": 50,
	"max_pages": 10
}
```

#### Stable Production Run

```json
{
	"url": "https://www.vrbo.com/32650537",
	"results_wanted": 100,
	"max_pages": 20,
	"proxyConfiguration": {
		"useApifyProxy": true,
		"apifyProxyGroups": ["RESIDENTIAL"]
	}
}
```

### Sample Output

```json
{
	"property_id": "32650537",
	"review_id": "bc2fa4f7-7e66-4dc5-8d59-9e7a893c1ef4",
	"rating_label": "10 out of 10",
	"author": "Verified traveler",
	"title": "Great location and clean home",
	"review_text": "The house was spotless and close to everything we needed. Host communication was excellent.",
	"summary_accessibility": "Rated 10 out of 10",
	"trip_summary": "Family trip",
	"sentiments": [
		"Cleanliness",
		"Location",
		"Communication"
	],
	"management_response": "Thank you for staying with us! We would love to host you again.",
	"page_index": 0,
	"position": 3,
	"source_type": "productReviewDetails",
	"source_url": "https://www.expedia.com/graphql",
	"input_url": "https://www.vrbo.com/32650537",
	"scraped_at": "2026-04-23T12:34:56.000Z"
}
```

### Tips for Best Results

#### Prefer Canonical Property Links

- Use direct listing links when possible.
- Keep query strings minimal unless they include property identifiers.

#### Tune Result Limits Gradually

- Start with 20-50 rows for validation.
- Increase limits only after confirming stable output for target properties.

#### Use Residential Proxies for Protected Targets

- Residential pools improve completion rates.
- Keep concurrency moderate to reduce temporary rate-limit responses.

### Integrations

- **Google Sheets** — Build quick review trackers and share with operations teams.
- **Airtable** — Create searchable guest-feedback databases by property.
- **Slack** — Notify teams when new review batches are collected.
- **Make** — Trigger follow-up automations from fresh datasets.
- **Zapier** — Sync records into CRM, PM, or reporting tools.

#### Export Formats

- **JSON** — Best for APIs and engineering workflows.
- **CSV** — Spreadsheet-ready for analysts and ops teams.
- **Excel** — Executive reporting and ad hoc review.
- **XML** — Legacy system integrations.

# Actor input Schema

## `url` (type: `string`):

VRBO or Expedia property URL. If present, actor tries to extract expediaPropertyId or related property id from it.

## `propertyId` (type: `string`):

Expedia property id (recommended). This value takes priority over url parsing.

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

Maximum number of reviews to save.

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

Safety cap for paginated review requests.

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

Use Apify Proxy. Residential proxies are recommended for stable results.

## Actor input object example

```json
{
  "results_wanted": 20,
  "max_pages": 10,
  "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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/vrbo-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/vrbo-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 '{}' |
apify call shahidirfan/vrbo-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "VRBO Reviews Scraper",
        "description": "Extract VRBO reviews, ratings & guest sentiment at scale. Analyze competitor performance, track trends, identify improvement opportunities. Perfect for property owners and market researchers.",
        "version": "0.0",
        "x-build-id": "GbebLS72iFNkFxnT1"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/shahidirfan~vrbo-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-shahidirfan-vrbo-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~vrbo-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-shahidirfan-vrbo-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~vrbo-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-shahidirfan-vrbo-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": {
                    "url": {
                        "title": "Property URL",
                        "type": "string",
                        "description": "VRBO or Expedia property URL. If present, actor tries to extract expediaPropertyId or related property id from it."
                    },
                    "propertyId": {
                        "title": "Property ID",
                        "type": "string",
                        "description": "Expedia property id (recommended). This value takes priority over url parsing."
                    },
                    "results_wanted": {
                        "title": "Maximum number of reviews",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of reviews to save.",
                        "default": 20
                    },
                    "max_pages": {
                        "title": "Maximum pages",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Safety cap for paginated review requests.",
                        "default": 10
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Use Apify Proxy. Residential proxies are recommended for stable results.",
                        "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
