Vrbo Scraper - Vacation Rentals, Reviews & Enriched Output avatar

Vrbo Scraper - Vacation Rentals, Reviews & Enriched Output

Pricing

from $1.40 / 1,000 results

Go to Apify Store
Vrbo Scraper - Vacation Rentals, Reviews & Enriched Output

Vrbo Scraper - Vacation Rentals, Reviews & Enriched Output

Extract vacation rental data from Vrbo.com by location, region, coordinates, property URL, or property ID. Returns prices, availability signals, amenities, photos, geo data, ratings, full guest reviews, and structured listing details.

Pricing

from $1.40 / 1,000 results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

1

Bookmarked

23

Total users

3

Monthly active users

6 days ago

Last modified

Security

Limited permissions

Share

Vrbo Scraper: Vacation Rental Listings, Prices and Guest Reviews

Vrbo Scraper turns Vrbo into structured vacation rental data. Search a destination, a region ID, or coordinates, or paste property URLs, bare or dotted property IDs, a reviews link, or a Vrbo search URL, and get back property cards with nightly prices, capacity, ratings and photos (plus address, coordinates and description for property URLs), or full paginated guest reviews with manager responses and category ratings. Export to JSON, CSV or Excel, or pull the results straight into your app through the API.

Why This Scraper?

  • Five ways to find a property. Search by destination text, region ID, or coordinates, or paste property URLs, bare IDs, dotted IDs, reviews links, or a full Vrbo search URL, all in the same run.
  • Full guest reviews. Paginated review collection with ratings, review text, liked and disliked tags, manager responses, stay duration and category ratings (cleanliness, communication, location, accuracy).
  • Reviews on demand. Embed a capped number of reviews inside each property card, or switch to review rows only and get one record per review.
  • Real capacity fields. Sleeps, bedrooms, bathrooms and a detected property type, read directly off the listing.
  • Currency-honest pricing. priceCurrency reports the currency Vrbo actually rendered for the connection used, and the run tells you plainly when your requested currency could not be served.
  • Built for schedules. Resume one interrupted crawl by run or dataset ID, or turn on Incremental mode to see only new, updated, and expired properties on a recurring search.
  • Cost control that matches what happened. Only properties enriched with an extra request, a direct URL or ID fetch, or embedded reviews, carry an enrichment fee; plain search cards do not.

Use Cases

  • Vacation rental price and market research: track nightly rates, price drops and availability windows across a destination.
  • Rental pricing and revenue management: compare rates, ratings and reviews across similar properties to price your own listing.
  • Travel apps and metasearch: feed structured property data into your own listings site, comparison tool or chatbot.
  • Reputation and review monitoring: collect a property's full review history to track rating trends and guest feedback themes over time.
  • Market monitoring: schedule the actor with Incremental mode to see new listings, price changes and delisted properties for a destination as they happen.

Data You Get

Sample shape: values are illustrative placeholders, not from a live record.

FieldExample
mode"search" (also "url", "reviews")
vrboId"2165911"
listingUrl"https://www.vrbo.com/2165911"
title"Beachfront Villa with Private Pool"
propertyType"Villa"
sleeps / bedrooms / bathrooms8 / 4 / 3
pricePerNight / priceFormatted412 / "$412 nightly"
priceStrikeout / priceCurrency"$520" / "USD"
rating / ratingLabel9.8 / "Exceptional"
reviewCount137
latitude / longitude-8.6887 / 115.1700 (filled only for property records fetched by URL or ID; always empty on search-mode rows)
address"Leeward Settlement, Caicos Islands, TCA" (URL or ID mode only; always empty on search-mode rows)
badges["Premier Host"] (the card's badge texts, such as host status or a deal label; empty when the card shows none)
image"https://media.example.com/villa-1.jpg"
images / imagesCountarray of photo URLs / 24
description"Situated on the waterfront, this villa is within 1 mi of the beach." (URL or ID mode only; always empty on search-mode rows)
provider"vrbo"
searchLocation"Bali"
checkIn / checkOut"2026-11-01" / "2026-11-06"
adults2
scrapedAt"2026-09-28T10:00:00Z"
extra.starRating4.5 (Vrbo's own star rating, when the card shows one)
changeType / changedFields"UPDATED" / ["pricePerNight", "priceFormatted"] (Incremental mode only)
firstSeenAt / lastSeenAtISO timestamps (Incremental mode only)

When Scrape reviews only is on, or you paste a /reviews link, each row is one guest review instead of a property card: mode is "reviews", vrboId and listingUrl identify the property (a review row's title field is always empty, Vrbo does not attach one at this step), reviewId, rating and ratingLabel score the stay, reviewTitle and reviewText hold the guest's words, authorName, reviewDate and stayDuration describe who wrote it and when, liked and disliked list tagged highlights and complaints, managerResponse carries the host's reply when there is one, photos lists any guest-uploaded images, propertyRating and propertyReviewCount summarize the property overall, categoryRatings (cleanliness, communication, location, accuracy) is attached only when Include Category Ratings is on, and locale and scrapedAt round out the row.

How to Use

  1. Pick a mode: Search mode (by destination, region ID or coordinates) or URL mode (paste property URLs, IDs, reviews links or a Vrbo search URL).
  2. Fill in the fields for that mode, set your stay dates and guest count, and switch on Include reviews or Scrape reviews only if you want guest reviews.
  3. Set Max items to control run size and cost, then click Start.
  4. Download the dataset as JSON, CSV or Excel, or read it through the API.

Search a destination:

{
"mode": "search",
"destination": "Orlando, Florida",
"checkIn": "2026-11-01",
"checkOut": "2026-11-06",
"adults": 4,
"bedrooms": 3,
"maxItems": 50
}

Paste specific property URLs and IDs:

{
"mode": "url",
"startUrls": [
{ "url": "https://www.vrbo.com/2165911" },
{ "url": "321.2880733.3452770" }
],
"checkIn": "1 day",
"checkOut": "6 days"
}

Collect only the reviews for one property:

{
"mode": "url",
"startUrls": [{ "url": "https://www.vrbo.com/2165911/reviews" }],
"reviewsOnly": true,
"maxItems": 100,
"maxReviewsPerProperty": 100,
"includeCategoryRatings": true,
"checkIn": "1 day",
"checkOut": "6 days"
}

Search by coordinates with recurring monitoring:

{
"mode": "search",
"latitude": "-8.6887",
"longitude": "115.1700",
"checkIn": "30 days",
"checkOut": "35 days",
"incrementalMode": true,
"emitExpired": true,
"stateKey": "bali-monitor",
"maxItems": 200
}

URL shapes

ShapeExampleResult
Property page (numeric id)https://www.vrbo.com/2165911One property record
Property page with query paramshttps://www.vrbo.com/2165911?adults=2One property record
Search URL (destination query)https://www.vrbo.com/search?destination=Orlando%2C%20Florida&startDate=2026-12-01&endDate=2026-12-06&adults=2Auto-paginated property records
Reviews linkhttps://www.vrbo.com/2165911/reviewsReviews for that property (accepted, but not in the default sample URLs)

Category landing pages such as /vacation-rentals/florida/orlando are not supported: the run logs a warning naming each skipped URL.

Default behaviour change: a URL mode run with startUrls left untouched now scrapes two distinct sample URLs (a property page and a search URL); the property-with-query-params example in the table resolves to the same property as the plain property page, so it is pre-filled but not in the default list (previously it logged an error and returned nothing).

Dataset views

The Output tab offers four views: Overview (property cards), Detail (full property fields), Reviews (review rows) and Changes (Incremental mode: changeType, changedFields, firstSeenAt, lastSeenAt).

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/vrbo-vacation-rentals-scraper").call(run_input={
"mode": "search",
"destination": "Orlando, Florida",
"checkIn": "1 day",
"checkOut": "6 days",
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["title"], item["pricePerNight"], item["priceCurrency"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/vrbo-vacation-rentals-scraper').call({
mode: 'search',
destination: 'Orlando, Florida',
checkIn: '1 day',
checkOut: '6 days',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

Resume and recurring updates

  • Resume (resumeFromRunId) continues one interrupted crawl: paste its run or dataset ID and the actor skips every property ID already saved there, so the new run only fetches, and pays for, properties it has not already collected. This applies to property-card runs; a Scrape reviews only run does not skip previously collected properties.
  • Incremental mode (incrementalMode) is for scheduled runs of the same search. Each property is classified NEW, UPDATED (with changedFields), UNCHANGED (suppressed and not billed unless emitUnchanged is on), or EXPIRED (Search mode only, only after a run that scans the whole search without a cap, a resume, or another early stop, and only with emitExpired on). A property is classified REAPPEARED only if an earlier complete scan with emitExpired on found it missing, and it then shows up again in any later run, capped or not. stateKey names or shares the stored baseline; leave it empty and the actor derives one automatically from your search and stay settings. Raising maxItems or maxReviewsPerProperty never starts a new baseline. Reordered or newly embedded reviews, and a field flipping between unobserved (empty) and a real value in either direction (including badges going from empty to a badge or back), never count as a change on their own. listingUrl stays in every row but is excluded from change detection too, because a pasted link can be repaired to the page that actually served, depending on whether that page fetch worked. title is excluded from change detection entirely, because Vrbo can render two different headlines for the same property depending on which internal path answered a given fetch, not because the listing itself changed. ignoreFieldsForChanges lets you add your own fields to that exclusion (dots reach nested fields, e.g. extra.starRating): they stay in every row but never make a property UPDATED or appear in changedFields. The stored baseline is compared under your current list, so changing it does not cause a one-time wave of UPDATED rows. With Incremental mode off, output is exactly as before.

Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape, and the Apify dataset is never changed.

What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.

  1. Authorize a connector once under Apify > Settings > Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. If the picker is empty, you have not authorized a connector yet.
  3. For Notion, also set notionParentPageUrl to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

Input Parameters

ParameterTypeDefaultDescription
modestringsearchsearch (by location) or url (by property URL, ID, or search URL).
destinationstringnone (prefill: Orlando, Florida)Search mode only. A location such as Orlando, Bali, or Tulum Mexico.
destinationIdstringnoneSearch mode only. Numeric Vrbo/Expedia region ID that pins an exact region instead of resolving destination by text.
latitudestringnoneSearch by coordinates instead of a location name. Provide with longitude.
longitudestringnoneSearch by coordinates instead of a location name. Provide with latitude.
startUrlsarraytwo sample URLs (property page, search URL)URL mode only. Full property URLs, bare IDs, dotted IDs, /reviews links, or Vrbo search URLs, in any mix.
checkInstring1 dayDate, or a relative value such as 1 day or 30 days. Drives nightly pricing in Search mode and for Vrbo search URLs; property URLs or IDs are fetched without a date range, so the dates are only echoed on the record. Required by the schema, but this default fills it in when left empty.
checkOutstring6 daysDate, or a relative value such as 6 days. Required by the schema, but this default fills it in when left empty.
adultsinteger2Number of adult guests. Affects pricing and availability.
childrenarray[]One entry per child, the age in years.
roomsinteger1Number of units to search for.
bedroomsintegernone (no minimum)Only return properties with at least this many bedrooms.
minPriceintegernone (no minimum)Minimum nightly price filter, in the selected currency.
maxPriceintegernone (no maximum)Maximum nightly price filter, in the selected currency.
sortBystringRECOMMENDEDRECOMMENDED, PRICE_LOW_TO_HIGH, PRICE_HIGH_TO_LOW, DISTANCE, or REVIEW.
reviewsOnlybooleanfalseOutput one row per review instead of property cards. Works in both modes.
includeReviewsbooleanfalseEmbed up to maxReviewsPerProperty reviews inside each property card. Ignored when reviewsOnly is on.
maxReviewsPerPropertyinteger20Cap on reviews collected per property, for both includeReviews and reviewsOnly.
reviewsFromstringnoneYYYY-MM-DD is accepted in the input, but is not currently applied as a filter; reviews are returned regardless of date.
includeCategoryRatingsbooleantrueAttach property-level category ratings (cleanliness, communication, location, accuracy) to each review record.
currencystringUSDCurrency for the prices shown on property cards. Vrbo renders the price for the market its connection actually lands in; priceCurrency reports what was rendered, which can differ from this setting.
localestringen_USLanguage and region for page content and review language.
maxItemsinteger20Hard cap on the total number of records saved to the dataset.
resumeFromRunIdstringnonePrevious run or dataset ID. Properties already saved there are skipped so this run only fetches new ones.
incrementalModebooleanfalseRemember this search between scheduled runs and classify each property as NEW, UPDATED, UNCHANGED, REAPPEARED, or EXPIRED.
stateKeystringnoneNames a monitoring campaign so it keeps its own baseline. Left empty, one is derived automatically from the search and stay settings.
emitUnchangedbooleanfalseAlso return, and bill, properties classified UNCHANGED since the last run.
emitExpiredbooleanfalseSearch mode only. Also return, and bill, a previously tracked property as an EXPIRED tombstone when it is missing from a complete, uncapped scan.
ignoreFieldsForChangesarraynoneIncremental mode only. Field names (dots for nested fields, e.g. extra.starRating) that never count as a change; they stay in the output.
proxyobjectnone (prefill: Apify Proxy, Residential group)Proxy settings. The actor tries several proxy countries automatically to find a working connection.
mcpConnectorsarraynoneSend a summary of each record to apps authorized under Integrations.
notionParentPageUrlstringnoneNotion connector only. Page under which item pages are created.
maxNotifyListingsinteger50Cap on items written to each connector per run. Does not affect the dataset.

Output Example

Sample shape: values are illustrative placeholders, not from a live record.

{
"mode": "search",
"vrboId": "2165911",
"listingUrl": "https://www.vrbo.com/2165911",
"title": "Beachfront Villa with Private Pool",
"propertyType": "Villa",
"sleeps": 8,
"bedrooms": 4,
"bathrooms": 3,
"pricePerNight": 412,
"priceFormatted": "$412 nightly",
"priceStrikeout": "$520",
"priceCurrency": "USD",
"rating": 9.8,
"ratingScale": 10,
"ratingLabel": "Exceptional",
"reviewCount": 137,
"latitude": -8.6887,
"longitude": 115.17,
"image": "https://media.example.com/villa-1.jpg",
"images": ["https://media.example.com/villa-1.jpg", "https://media.example.com/villa-2.jpg"],
"imagesCount": 24,
"badges": ["Premier Host"],
"description": "Completely renovated beachfront villa with private pool and ocean views.",
"address": "Leeward Settlement, Caicos Islands, TCA",
"provider": "vrbo",
"searchLocation": "Bali",
"checkIn": "2026-11-01",
"checkOut": "2026-11-06",
"adults": 2,
"scrapedAt": "2026-09-28T10:00:00Z",
"extra": { "starRating": 4.5 }
}

changeType, changedFields, firstSeenAt, and lastSeenAt are added only when Incremental mode is on.

Plan Requirement

This actor is billed per event: apify-actor-start once per run, result for each property card or review row pushed to the dataset (review rows included), and a smaller enrich fee only for properties enriched with an extra request, either fetched directly by URL or ID, or with reviews attached. Plain search cards without reviews carry no enrichment fee. The Pricing tab on the actor page shows the current rates. On free plans, which have no residential proxy, the run ends with a clear failure message instead of an empty success. The actor rotates connections automatically when one is refused, and you can supply your own proxy under Connection for the most demanding runs. Runs on the default Residential setting also get an operator-maintained residential failover connection after every other connection is refused; runs with their own proxy URLs, and runs without that entitlement, keep exactly the connections they configured.

FAQ

How much does it cost?

You are billed per event: apify-actor-start once per run, result once per record saved (property card or review row), and a smaller enrich fee only for properties enriched with an extra request. Location-search cards without reviews carry no enrichment fee. Address, coordinates and description come only from URL-mode property records: each one needs an extra page fetch of that property's own page (a second or third only when the first link does not serve the property page), made over your own proxy configuration (about 1 MB of traffic each), and search-mode rows leave those fields empty. The Pricing tab shows the current rates. Use Max items to cap the size, and the cost, of any run.

This actor collects only publicly available vacation rental listings and reviews. You are responsible for how you use it: follow Vrbo's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Listing text, photos and guest reviews may be subject to third-party rights.

Can I get only new or changed properties on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new and updated properties for the same search, and unchanged ones are not billed unless you turn on Emit unchanged properties. Turn on Emit expired properties too if you also want a one-time tombstone row when a tracked property disappears from a complete scan.

Why did the same property come back with a different title or a different currency?

Vrbo can answer the same property through more than one internal response path, and those paths occasionally render slightly different headline text for the same listing. Most title differences you will see run to run are this, not a real edit, which is why title is excluded from Incremental mode's change detection. Vrbo also renders prices for the market its connection lands in, not necessarily the currency you requested; priceCurrency always reports what was actually rendered, and the run's status message says so plainly if your requested currency could not be served.

Why did my run fail instead of returning an empty dataset?

The run fails outright when it saves no records and sees no properties at all (every connection attempt was refused, Vrbo answered but nothing matched, or none of the provided URLs is a supported shape), when resumeFromRunId does not point to a run or dataset this Apify account can read, or when you combine resumeFromRunId with Incremental mode on a search that already has saved state. A Search mode run with no destination, region ID, or coordinates, or a URL mode run with no URLs, instead logs an error and finishes with an empty dataset, so check the run log if you get zero results without a failure.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

🔗 Want more travel data?

Pair this actor with these related scrapers from the same team:

🏨 Expedia Hotels Scraper
Scrape Expedia.com hotel listings and reviews for any destination. Extract prices...
🏨 Booking.com Hotels, Prices and Reviews Scraper
Scrape booking.com hotels, apartments, villas and hostels. Search any destination with...
🏨 Airbnb Scraper
Scrape Airbnb stays by destination or link: nightly and total price, rating breakdown...
🏨 Traveloka Hotel Scraper
Scrape Traveloka hotels across Singapore, Malaysia, Indonesia, Thailand, Vietnam and the...
🏨 Yanolja Scraper
Scrape Yanolja (NOL), Korea's largest accommodations marketplace, by region or URL. Every...
🏨 Rover Pet Care Scraper
Scrape Rover.com pet-care providers: sitter search by city, rates per stay type, ratings...

👉 Browse all abotapi scrapers

💬 Support

  • 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • 🛠️ Need another site, extra fields or a private build? Email contact@abotapi.com.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.