# VRBO Scraper — House Rules, Safety & Property Details (`signalbench/vrbo-scraper`) Actor

Look up VRBO properties by URL: bedrooms, bathrooms, sleeps, every amenity, house rules with minimum renter age, safety-device disclosures, Premier Host badge, rating on both 10- and 5-point scales, nearby landmarks with walk/drive minutes, breadcrumbs and coordinates. No browser. JSON, CSV, Excel.

- **URL**: https://apify.com/signalbench/vrbo-scraper.md
- **Developed by:** [SignalBench](https://apify.com/signalbench) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 property scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## VRBO Scraper — House Rules, Safety & Property Details

Give it VRBO property URLs and get back one clean record per property: capacity, every amenity, house rules including the **minimum renter age**, **safety-device disclosures**, the **Premier Host** badge, the rating on **both a 10- and a 5-point scale**, nearby landmarks with walk/drive minutes, the geographic breadcrumb chain, and coordinates. No browser.

### What this Actor does — and doesn't

**It looks up properties you already know.** You supply property URLs or ids; it returns their details.

It does **not**:

- **Discover properties.** There is no destination or market search. You can't hand it "Destin, FL" and get every rental there — bring your own list of URLs.
- **Return prices or availability.** No nightly rates, no calendar, no quotes.
- **Return individual reviews.** You get the rating and the review count, not the review text.
- **Return a room-by-room bed layout, similar properties, or VRBO's FAQ.** VRBO loads those in the browser from a bot-protected endpoint that this Actor doesn't touch. For beds you get `bedSummaryFromDescription` instead: the lines of the host's own description that mention beds. It's host prose, not structured data.

If you need any of those, this isn't the right tool.

### What you get

| Field | Notes |
|---|---|
| **`houseRules`** | `checkIn`, `checkOut`, **`minimumAge`** (e.g. 25), `children`, `events`, `pets`, `smoking`, plus every rule line verbatim in `all`. |
| **`safetyDisclosures`** | Each safety device and what the host disclosed: `{item: "Smoke detector", status: "not_reported", present: null}`. `not_reported` means the host hasn't said either way. `present: false` means the host has said there is none. Both are real screening signals, and VRBO words them so they're easy to miss. |
| **`host.isPremierHost`** | VRBO's equivalent of Airbnb's Superhost, plus the host name (often a management company) and profile image. |
| **`rating10`** and **`rating5Normalised`** | VRBO rates out of **10**. Both are provided so you never compare a VRBO 9.6 with an Airbnb 4.8 as if they were the same scale. |
| **`location.nearby`** | Named landmarks, transport and restaurants with minutes and mode: `{name: "Miramar Beach", type: "landmark", minutes: 1, mode: "walk"}`. |
| **`location`** | Latitude/longitude, city, county, state, country, and the full breadcrumb chain, e.g. United States of America → Florida → Okaloosa County → Destin. |
| **`importantInfo`** | VRBO's "You need to know" notes: deposits, ID at check-in, party bans. |
| **`bedSummaryFromDescription`** | Bed-related lines from the host's description, e.g. `"Bed Sizes: Master - King, Second - Queen, Third - Twin Bunks, Living Area - Queen Sleeper Sofa"`. Only as good as what the host wrote. |
| **`amenities`**, `topAmenities` | Every amenity with its VRBO group, plus VRBO's "Popular amenities" shortlist. |
| `bedrooms`, `baths`, `personCapacity`, `propertyType` | From VRBO's overview. The raw labels are in `overviewItems`: VRBO caps some bathroom counts at "3+", which reads as `3`. |
| `description`, `highlights`, `photos` | Full description as plain text, VRBO's highlights, and every gallery photo with the host's caption. |
| `id`, `internalId` | The URL id (`1043021`) and VRBO's internal id (`21699457`), which differ. |

Field names match our Airbnb Scraper wherever the concept is the same (`personCapacity`, `bedrooms`, `baths`, `amenities`, `photos`, `location.latitude`), and every record carries `platform: "vrbo"`. That makes the two datasets easy to combine. **Use `rating5Normalised`, not `rating10`, when you do.**

### Input

- **Property URLs**: `https://www.vrbo.com/1043021`, `www.vrbo.com/3959326ha`, or a bare `1043021`. Duplicates are removed. Anything after `?` in a URL is ignored.
- **Max listings**: a hard cap on properties scraped and billed.
- **Exclude personal data**: drops the host's name and photo and keeps only the Premier Host flag.

### Output

One row per property. Example (abridged):

```json
{
  "platform": "vrbo",
  "id": "1043021",
  "internalId": "21699457",
  "title": "Beachfront Gulf View Condo-Pool-Season Beach Serv.",
  "propertyType": "Condo",
  "personCapacity": 8, "bedrooms": 3, "baths": 2,
  "rating10": 9.6, "rating5Normalised": 4.8, "reviewCount": 107, "ratingLabel": "Exceptional",
  "host": { "name": "Glass Casa Vacation Rentals", "isPremierHost": true },
  "houseRules": { "checkIn": "4:00 PM", "checkOut": "10:00 AM", "minimumAge": 25,
                  "pets": "No pets allowed", "events": "No events allowed", "smoking": "Smoking is not permitted" },
  "safetyDisclosures": [ { "item": "Carbon monoxide detector", "status": "not_reported", "present": null },
                         { "item": "Smoke detector", "status": "not_reported", "present": null } ],
  "bedSummaryFromDescription": [ "Bed Sizes: Master - King, Second - Queen, Third - Twin Bunks, Living Area - Queen Sleeper Sofa" ],
  "location": { "latitude": 30.38233, "longitude": -86.42785, "city": "Destin", "county": "Okaloosa County",
                "state": "Florida", "country": "United States of America",
                "nearby": [ { "name": "Miramar Beach", "type": "landmark", "minutes": 1, "mode": "walk" },
                            { "name": "Northwest Florida Regional Airport (VPS)", "type": "transport", "minutes": 29, "mode": "drive" } ] },
  "amenityCount": 51, "photoCount": 39
}
```

### Pricing and billing

**$2.00 per 1,000 properties.** One stored property is one charge.

A property that doesn't exist (VRBO quietly redirects dead ids to a search page or the homepage) or that returns no content is **never stored, so it's never billed**. A list of dead ids costs $0.00 in result charges.

### Notes

- **Ratings are out of 10.** `rating10` is VRBO's own number. `rating5Normalised` is that number divided by 2. Both are null when a property has no reviews.
- **Personal data.** Host names and photos can be personal data under GDPR/CCPA when the host is an individual. Turn on **Exclude personal data** to drop them.
- **Proxy.** VRBO rate-limits by IP. By default each property is fetched through Apify's datacenter proxy on a fresh session, and only a request that gets blocked is retried through residential. You can pick any proxy yourself or turn the fallback off.

### How it works, and responsible use

Each property page is fetched once over plain HTTP, and the record is read from data VRBO embeds in that page. There's no browser and no login.

VRBO (Expedia Group) prohibits scraping in its Terms of Service, as most sites do; read them and decide for yourself. This Actor:

- requests only public property pages (`/{id}`), which VRBO's `robots.txt` does not disallow
- never requests search results (`/search?`), dated-availability URLs (`chkin=`/`chkout=`), or any other path `robots.txt` disallows
- never tries to get around VRBO's bot protection. Parts of the site guarded by it are simply out of scope, which is why the list above is what it is.
- identifies as an ordinary browser. It never impersonates a search engine or AI crawler.

Requests are paced and retried politely.

# Actor input Schema

## `propertyUrls` (type: `array`):

VRBO property URLs (https://www.vrbo.com/1043021) or bare property ids (1043021, 3959326ha). This Actor looks up properties you already know — it does not search or browse a destination.

## `maxListings` (type: `integer`):

Hard cap on how many properties this run scrapes and bills for. Duplicates are removed before the cap is applied.

## `excludePersonalData` (type: `boolean`):

Drop the host's name and profile image, keeping only the Premier Host flag. Many VRBO hosts are companies, but individual owners are personal data.

## `maxConcurrency` (type: `integer`):

How many properties to fetch at once, each through its own proxy session.

## `politenessDelayMs` (type: `integer`):

Randomised pause between each worker's requests. Raise it if you see repeated blocks on large runs.

## `maxRetries` (type: `integer`):

How many times to retry a blocked or failed request, on a fresh proxy session each time.

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

VRBO rate-limits by IP, so a proxy is strongly recommended. Apify's datacenter proxy handles most property pages; blocked requests fall back to residential automatically (see below).

## `residentialFallback` (type: `boolean`):

When a property is blocked on the proxy above, retry it through Apify's US residential proxy. Keeps runs reliable while only paying for residential bandwidth where it's needed.

## Actor input object example

```json
{
  "propertyUrls": [
    "https://www.vrbo.com/1043021"
  ],
  "maxListings": 100,
  "excludePersonalData": false,
  "maxConcurrency": 4,
  "politenessDelayMs": 1500,
  "maxRetries": 4,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "residentialFallback": true
}
```

# Actor output Schema

## `results` (type: `string`):

Every scraped property in JSON, with all nested fields.

## `resultsCsv` (type: `string`):

The same properties flattened for spreadsheets.

## `summary` (type: `string`):

Counts of properties stored, not found, empty and failed for this run.

## `viewInConsole` (type: `string`):

Open this run and its dataset in the Apify Console.

# 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 = {
    "propertyUrls": [
        "https://www.vrbo.com/1043021"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("signalbench/vrbo-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 = {
    "propertyUrls": ["https://www.vrbo.com/1043021"],
    "proxyConfiguration": { "useApifyProxy": True },
}

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

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "propertyUrls": [
    "https://www.vrbo.com/1043021"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call signalbench/vrbo-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,signalbench/vrbo-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/oY3zVWLfBSn1mEXtW/builds/XtVHfilbfBj0vbMmK/openapi.json
