VRBO Scraper — Properties + Calendar + Full Reviews [$2.5💰] avatar

VRBO Scraper — Properties + Calendar + Full Reviews [$2.5💰]

Pricing

from $1.50 / 1,000 results

Go to Apify Store
VRBO Scraper — Properties + Calendar + Full Reviews [$2.5💰]

VRBO Scraper — Properties + Calendar + Full Reviews [$2.5💰]

ADR · occupancy · RevPAR built in — STR investor KPIs per listing from the 730-day price calendar. Plus host/manager name, bedrooms/bathrooms, full fee breakdown, up to 1,250 reviews, Premier Host badge, and map-area search. Any URL, ID, or location. No login. From $1.50/1k rows at volume.

Pricing

from $1.50 / 1,000 results

Rating

5.0

(4)

Developer

Muhamed Didovic

Muhamed Didovic

Maintained by Community

Actor stats

0

Bookmarked

100

Total users

32

Monthly active users

4.3 hours

Issues response

3 days ago

Last modified

Share

VRBO Vacation Rentals Scraper — Property + Calendar + Reviews + Rates

VRBO Scraper logo

Scrape any VRBO property at $2.50 per 1,000 results — with STR investor KPIs built in. One actor, seven input forms (URL, bare ID, location text, region, coords, map-area bbox, /reviews suffix). Returns full property data (title, sleeps, bedrooms, bathrooms, photos, amenities, Premier Host badge), the date-by-date availability calendar with per-night pricing, ADR · occupancy · RevPAR · estimated annual revenue per listing, a full rates breakdown (service fee + cleaning fee + taxes + total), and the complete paginated review history (up to 1,250 reviews per property) — all from VRBO's own GraphQL backend. Pure HTTP via Apify Residential, no auth required, no login needed.

How it works

How VRBO Scraper works

✨ Why use this scraper?

VRBO is the #2 vacation-rental marketplace globally (acquired by Expedia Group in 2015, 2M+ properties). Most VRBO scrapers on Apify either require account permissions (security risk), scrape thin DOM data (incomplete), or haven't shipped updates in months. This one is different:

  • 🏖 No auth required. Public property pages + VRBO's public GraphQL endpoint only. No login, no captcha solving, no account permissions.
  • 📋 Apollo state extraction + paginated GraphQL. For property data we extract VRBO's own window.__APOLLO_STATE__ cache (canonical source). For reviews we additionally hit VRBO's productReviewDetails GraphQL endpoint to paginate full history — not just the 5–10 reviews the HTML page ships inline.
  • 🌍 Expedia Group backend. VRBO uses siteId 9001001 / tpid 9001 / eapid 1 on the shared Expedia GraphQL stack — same infrastructure proven at 5.0★ on memo23/expedia-scraper (the #1 Expedia scraper on Apify).
  • 🛡 Akamai-cleared with per-session retry chain. 3 rotated sessions on Apify Residential primary → optional Evomi fallback. Same proven stack as the Expedia actor.
  • 📤 Two row types from one actor. kind: "property" and kind: "review", both pushed to the same dataset for downstream filtering.
  • 📈 STR investor KPIs built in (v1.14). Turn on scrapeAvailability and every property row ships adr, occupancyRate, revpar, estimatedAnnualRevenue, and an isStale comp-set filter — computed from the listing's own forward calendar, with the raw calendar right next to them so you can audit every number. Actors that ship KPIs without the underlying calendar are asking you to trust a black box.
  • 🗺 Map-area (bbox) search (v1.14). bbox:25.76,-80.145,25.815,-80.115 scrapes only inside a lat/lng box — ski zones, beach strips, single neighborhoods — no spillover from neighboring areas.
  • 💰 Predictable PPE pricing. $2.50 per 1,000 result rows, no monthly flat fee — flat from the first row, no "volume tier" games.

🎯 Use cases

TeamWhat they build
Vacation-rental data platformsPower your aggregator with structured VRBO inventory + calendars + reviews
Property managersTrack competitor pricing per-night by season; benchmark service fees, cleaning fees vs market
Market analystsCity-level ADR (Average Daily Rate) trends from the calendar; review sentiment over time
Sentiment / reputation analystsPull every review with manager responses → analyze recovery patterns
Real-estate / STR investorsUnderwrite deals from comps' adr × occupancyRate × revpar × estimatedAnnualRevenue — rank a whole market by RevPAR before making an offer
Travel-tech integratorsBuild VRBO support into a multi-platform travel app without Expedia Partner Solutions

📥 Supported inputs (7 forms)

Paste any of these — the actor classifies each input automatically.

Input formExampleBehaviour
Full URLhttps://www.vrbo.com/2165911One property row
Bare ID2165911 or 4193579haAuto-prepends https://www.vrbo.com/ — one property row
Dotted-ID321.2880733.3452770Legacy VRBO/Expedia format — one property row
Reviews suffix2165911/reviews or 4193579ha/reviewsAll paginated reviews for that property (up to 1,250)
Location textBali, New York, Tulum MexicoBuilds search URL → walks pagination → fans out to detail (up to 500 properties)
Region IDregion:2554Builds region-search URL
Coordinates-7.7956, 110.3695Builds coords-search URL
Map area (bbox) — v1.14bbox:25.76,-80.145,25.815,-80.115Searches only inside the lat/lng box (swLat,swLng,neLat,neLng — corners auto-normalized). Ski zones, beach strips, hyperlocal neighborhoods
Full search URLhttps://www.vrbo.com/search/keywords:bali/Walks pagination + fan-out

🔄 How it works (step by step)

For detail/property inputs:

  1. Classify the input form → resolve to canonical URL
  2. Inject date range (default: tomorrow + 30 days) so the Apollo cache loads with calendar + per-night pricing
  3. Fetch via impit + Apify Residential (Chrome 144 TLS fingerprint, per-session rotation × 3 attempts before fallback)
  4. Extract window.__APOLLO_STATE__ via the JSON.parse("...") escape pattern
  5. Map PropertyInfo:{id} to a flat row + extract calendar, rates, policies

For reviews inputs (extra steps): 6. Resolve vrboId → expediaPropertyId from the Apollo cache 7. POST to https://www.vrbo.com/graphql with the productReviewDetails operation, iOS-app-style headers 8. Paginate pageIndex: 0 → 1 → 2 → … at 25 reviews/page until empty or maxItems hit 9. Emit one row per review with the full schema (rating, text, "liked" tags, travel type, verified flag, manager response)

For search inputs: 10. Walk search-result pages (up to 50 pages), extract property IDs (up to 500) 11. Fan out as detail requests — each emits its own row

⚙️ Input parameters

ParameterTypeDefaultDescription
startUrlsarray of strings(required)Any of the 6 input forms above. Mix freely.
checkInstring (YYYY-MM-DD)tomorrowISO date reserved for per-night rate calculation.
checkOutstring (YYYY-MM-DD)check-in + 30 daysISO date reserved for per-night rate calculation.
adultsCountinteger2Used by VRBO to compute the rates breakdown.
scrapeAvailabilitybooleanfalsev1.12 — when on, every property gets one extra GraphQL call that fills minimumNights + the per-date calendar (availability, nightly price, per-date min-stay; up to ~730 days). v1.14: also computes the STR KPIs — adr, occupancyRate, revpar, estimatedAnnualRevenue, isStale — from that calendar. Adds ~1 request (~285 KB) per property.
includeReviewsbooleanfalsev1.7 — when on, every property visited (direct URL and search fan-out) also emits paginated review rows. Pair with maxReviewsPerProperty to cap blowout.
maxReviewsPerPropertyinteger50Per-property hard cap on review rows when includeReviews=true or input is in {id}/reviews form. Max 1,000.
maxItemsinteger100Soft cap per source. Detail = 1 row; reviews = up to N rows; search = up to N fan-out.
maxConcurrencyinteger4Parallel HTTP requests. Sweet spot 3–6 via Apify Residential.
maxRequestRetriesinteger6Per-URL retry budget on Akamai 429/403.
proxyobjectApify ResidentialRequired — direct connections are blocked.
fallbackProxyUrlstring(none)Optional Evomi URL when Apify Residential exhausts retries.

How to get reviews — two ways

You wantHow
Reviews for one specific property, no detail rowPaste 2165911/reviews (or full URL vrbo.com/2165911/reviews) in startUrls
Property + its reviewsPaste the property URL and check includeReviews
Every property in a city + their reviewsPaste Bali (or any search URL) and check includeReviews

Cost math (at $2.50/1k rows): a Bali search hitting 50 properties × maxReviewsPerProperty=50 = 50 property rows + 2,500 review rows = ~$6.38. Lower the per-property cap or maxItems if you want to dial that back.

Example input — mixed forms in one run

{
"startUrls": [
"https://www.vrbo.com/2165911",
"4193579ha",
"Bali",
"2165911/reviews",
"region:2554",
"-7.7956, 110.3695"
],
"checkIn": "2026-07-01",
"checkOut": "2026-07-31",
"adultsCount": 4,
"scrapeAvailability": true,
"includeReviews": false,
"maxReviewsPerProperty": 50,
"maxItems": 100,
"proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}

Example input — property + full review history in one run (v1.7)

{
"startUrls": ["https://www.vrbo.com/3444303"],
"includeReviews": true,
"maxReviewsPerProperty": 200,
"maxItems": 250
}

Emits 1 property row + up to 200 review rows for the listing.

📊 Output overview

Two row shapes — both pushed to the same dataset. Filter by kind field to split downstream.

  • kind: "property" — one row per property (from detail / search-fanout / bare-ID / location inputs)
  • kind: "review" — one row per review (from /reviews inputs, paginated)

📦 Output sample — property row

{
"kind": "property",
"vrboId": "2165911", // VRBO URL ID
"expediaPropertyId": "63066336", // Expedia Group internal ID
"listingUrl": "https://www.vrbo.com/2165911?startDate=2026-07-01&endDate=2026-07-31&adultsCount=4",
"title": "Piccolo Ponte 3 BR Caribbean Villa. Pool & Hot Tub. Canal front, SUP, Bikes.",
"headline": "Caribbean Villa with private pool and canal access",
// Pricing summary (single nightly rate)
"pricePerNight": 1094,
"priceCurrency": "USD",
"priceFormatted": "$1,094 per night",
// Capacity (v1.13 — direct from VRBO's capacity strip; half-baths appear as .5)
"sleeps": 6,
"bedrooms": 3,
"bathrooms": 3.5,
"propertyType": "villa",
// Location
"address": {
"full": "Providenciales, Turks and Caicos Islands",
"city": "Providenciales",
"country": "Turks and Caicos Islands",
"countryCode": "TC"
},
"coordinates": { "lat": 21.81669, "lng": -72.15198 },
// Content + media
"description": "Charming canal-front villa in the heart of Providenciales...",
"photos": [ { "url": "https://images.trvl-media.com/.../1.jpg", "caption": "Pool view" } ],
"photosCount": 28,
// Amenities — v1.15: grouped by VRBO's own category (Kitchen, Pool & spa, Safety, Nearby activities, …)
"amenities": [
{ "id": "pool", "label": "Private pool", "group": "Pool & spa" },
{ "id": "hot_tub", "label": "Hot tub", "group": "Pool & spa" }
],
"amenitiesCount": 42,
"wifiSpeed": "50+ Mbps", // v1.15 — stated internet speed tier, when VRBO shows one
// v1.15: VRBO's "Highlights" strip — title + one-line detail + icon
"highlights": [
{ "title": "Dive into relaxation", "detail": "Unwind in the top-rated pool, your perfect spot for relaxation.", "icon": "pool" },
{ "title": "Discover nearby landmarks", "detail": "Near Providenciales Beaches", "icon": "place" }
],
// Review summary (full reviews via separate /reviews input)
"rating": 9.4,
"ratingScale": 10,
"reviewCount": 87,
// Host (v1.14 — host/manager name + Premier Host badge, VRBO's superhost equivalent)
"host": {
"name": "Janice",
"type": "Premier Host",
"superhost": true,
"responseRate": null
},
// ── v1.2: Detailed rates breakdown ──
"rates": {
"nightlyRate": 1094,
"serviceFee": 287,
"cleaningFee": 250,
"taxes": 178,
"totalPrice": 33914,
"currency": "USD",
"nights": 30,
"checkIn": "2026-07-01",
"checkOut": "2026-07-31"
},
// ── v1.2: Date-by-date availability calendar ──
"calendar": [
{ "date": "2026-07-01", "available": true, "pricePerNight": 1094, "currency": "USD", "minStay": 3 },
{ "date": "2026-07-02", "available": true, "pricePerNight": 1094, "currency": "USD", "minStay": 3 },
{ "date": "2026-07-03", "available": false, "pricePerNight": null, "currency": null, "minStay": null }
// ... up to 730 days ...
],
"calendarLength": 30,
// ── v1.14: STR investor KPIs (computed from the calendar when scrapeAvailability=true) ──
"adr": 1094.00, // mean nightly price across the window
"occupancyRate": 0.633, // unavailable share − 10% host-block baseline
"revpar": 692.50, // adr × occupancyRate
"estimatedAnnualRevenue": 252763, // revpar × 365
"isStale": false, // true = empty calendar AND <3 reviews (drop from comp sets)
// ── v1.2: Policy flags ──
"policies": {
"pets": true,
"smoking": false,
"events": false,
"children": true,
"rawText": "House rules: No smoking. Pets welcome. Quiet hours 10pm-7am."
},
"cancellationPolicy": "Strict — 50% refund if cancelled 60 days before check-in",
"minimumNights": 4,
"scrapedAt": "2026-05-25T15:00:00.000Z"
}

📦 Output sample — review row

{
"kind": "review",
"vrboId": "3444303",
"expediaPropertyId": "...",
"listingUrl": "https://www.vrbo.com/3444303/reviews",
"reviewId": "6a00d16b320ff804c7f9e55a",
// Rating
"rating": 10,
"ratingMax": 10,
"ratingLabel": "Excellent",
// Content
"title": null,
"text": "Comfy, cozy, and whimsical. We will return when we can spend more time.",
"liked": "cleanliness, check-in, communication, location, listing accuracy, value for money",
// Author + verification
"authorName": "Heidi S.",
"authorLocation": null,
"isVerified": true,
// Stay metadata
"submittedAt": "2026-05-12T00:00:00.000Z",
"stayPeriod": "Stayed 2 nights in May 2026",
"travelType": "Traveled with family",
// Engagement
"helpfulVotes": 3,
"managerResponse": {
"text": "Thank you Heidi! We loved hosting you and look forward to your return!",
"respondedAt": "2026-05-15T14:22:00.000Z"
},
"scrapedAt": "2026-05-25T15:00:00.000Z"
}

🗂 Key output fields

GroupFields
Identitykind, vrboId, expediaPropertyId, listingUrl, rawInput, title, headline
Pricing summarypricePerNight, priceCurrency, priceFormatted
Rates breakdown (v1.2)rates.{nightlyRate, serviceFee, cleaningFee, taxes, totalPrice, currency, nights, checkIn, checkOut}
Minimum stay + Calendar (v1.12)minimumNights, calendar[].{date, available, pricePerNight, currency, minStay}, calendarLength — populated only when scrapeAvailability=true
STR investor KPIs (v1.14)adr, occupancyRate, revpar, estimatedAnnualRevenue, isStale — computed from the calendar when scrapeAvailability=true
Capacity (v1.13)sleeps, bedrooms, bathrooms (half-baths as .5), propertyType
Locationaddress.{full,city,region,country,countryCode,postalCode}, coordinates.{lat,lng}
Content + mediadescription, photos[], photosCount
Amenities (v1.15)amenities[].{id,label,group} (grouped by VRBO category), amenitiesCount, wifiSpeed
Highlights (v1.15)highlights[].{title,detail,icon} — VRBO's curated highlight strip
Review summaryrating, ratingScale, reviewCount
Host (v1.14)host.{name,type,superhost,responseRate}name is the host or property-manager display name (e.g. "Janice", "Downtown FL Travel"); superhost=true when VRBO shows the Premier Host badge
Policies (v1.2)policies.{pets,smoking,events,children,rawText}
Per-review row (v1.4)reviewId, rating, ratingMax, ratingLabel, text, liked, authorName, isVerified, stayPeriod, travelType, helpfulVotes, managerResponse.{text,respondedAt}

How minimumNights is derived: the lowest minStay across the property's bookable calendar dates (i.e. min(calendar[].minStay) where available === true). VRBO sets minimum stay per date, so this is the fewest nights you could actually book the property for. If no dates are currently available it falls back to the lowest minStay across all dates; if the data carries no constraint it's null. For date-specific logic, read calendar[].minStay directly.

💰 Pricing

$2.50 per 1,000 result rows. Pay only for rows in the dataset.

EventCharged whenRate
apify-actor-startEach run starts (Akamai-clearance overhead, proxy warm-up)$0.008 / run
apify-default-dataset-itemEach row written (property OR review)$2.50 per 1,000
additional-data (×25)Each property enriched with minimumNights + calendar (only when scrapeAvailability is on and the lookup succeeds)$2.50 per 1,000

Cost examples:

  • 100 property rows in Bali → ~$0.26
  • 100 properties with scrapeAvailability → 100 rows ($0.25) + availability enrichment ($0.25) → ~$0.50
  • 1 property + its 250 reviews → ~$0.64
  • 50 properties × 30 reviews each = 1,500 review rows + 50 property rows → ~$3.88
  • Daily monitoring of 500 properties → ~$1.26/day = ~$38/month

What makes this richer than the competition

CapabilityOther VRBO scrapersThis actor
Auth requirementSome require loginNo auth — pure HTTP
Data sourceDOM scraping (fragile)Apollo state + GraphQL endpoint (canonical)
Calendar / availabilityOften missing✅ Date-by-date with per-night pricing
Rates breakdownJust nightly rate✅ Service fee + cleaning fee + taxes + total
Reviews depthFirst 5–10 only (inline only)Full paginated history up to 1,250 per property via direct GraphQL
Review fieldsBasic rating + text✅ Rating + label + "liked" categories + travel type + verified flag + manager responses
Policies (pets/smoking/events)Buried in amenities array✅ Top-level booleans for filterability
STR KPIs (ADR / occupancy / RevPAR)Either absent, or shipped without the raw calendar to audit themadr + occupancyRate + revpar + estimatedAnnualRevenue + isStale, next to the full calendar they're computed from
Host signalOften missingHost / property-manager name (host.name) + Premier Host badge (host.superhost) on every property row
Input flexibilityURL only, or paywalled "bulk" fields✅ 7 forms: URL, bare ID, dotted-ID, location, region, coords, bbox map area, /reviews — mix freely, no paywall
Akamai handlingBrittle (issues queue full of 429s)✅ Per-session retry chain × 3 + optional Evomi fallback
Pricing$1–$30/month flat, $0.90–$3/1k, or volume tiers that only get cheap after $500 spend$2.50/1k PPE flat from the first row — cheaper than tiered competitors' best rate, no spend threshold

Notes & limitations

  • Calendar requires a date range on the URL. v1.2 auto-injects tomorrow + 30 days by default. Pass checkIn + checkOut for a different window. Without a date range, VRBO ships only a sparse Apollo cache (no calendar, no rates).
  • Review pagination caps at 1,250 per property. That's 50 GraphQL pages × 25 reviews/page. Most properties have far fewer reviews; the cap exists to prevent runaway billing on the rare 5,000-review listing.
  • /reviews mode emits review rows only (no property summary). To get both, paste the property URL AND its /reviews variant.
  • Search-URL fan-out caps at 500 properties per source. Use multiple search URLs (different cities / property types) to scale beyond that.
  • Apify Residential US/default pool works. Apify Residential GB is on Akamai's blocklist for VRBO — use US or default.

❓ FAQ

Q. Does this require a VRBO account or any auth? No. The actor only accesses public property pages + VRBO's public GraphQL endpoint. No login, no account-permission grant, no captcha solving.

Q. How is this different from existing VRBO scrapers on Apify? Existing scrapers ship only the first 5–10 reviews (inline Apollo cache only). This actor uses VRBO's own paginated GraphQL endpoint to return the full review history. Plus we ship calendar + rates breakdown + policies — features competitors haven't shipped despite buyers asking since 2023.

Q. Why same pricing as memo23/expedia-scraper? VRBO is an Expedia Group property, uses the same backend, and the same Akamai protection. Same per-row cost makes bundling clean for buyers managing both vacation-rentals (VRBO) and hotels (Expedia / Hotels.com) data.

Q. Can I get the calendar for the next 12 months? Yes — pass checkIn: "2026-06-01" and checkOut: "2027-06-01". The Apollo cache will load a year-wide availability matrix when the date range is that long.

Q. How are adr, occupancyRate, revpar, and estimatedAnnualRevenue computed? From each listing's own forward calendar (so you can audit every number against the calendar array in the same row): adr = mean nightly price across the window · occupancyRate = share of unavailable nights minus a 10% host-block baseline (hosts block nights for personal use; counting them all as bookings overstates demand) · revpar = adr × occupancyRate · estimatedAnnualRevenue = revpar × 365. isStale flags listings with a fully-open calendar and fewer than 3 reviews — likely inactive or brand-new, exclude them from comp sets. Requires scrapeAvailability: true.

Q. Does it return the host / property-manager name? Yes (v1.14) — host.name carries the display name shown in VRBO's "About the host" section: individual hosts (e.g. "Janice", "Margie Hunter") and management companies alike (e.g. "Downtown FL Travel", "Upstay"). It comes free with the capacity lookup — no extra call, no extra cost. host.superhost additionally flags the Premier Host badge. A small number of listings hide the host name on VRBO's own page; those come back null rather than guessed.

Q. Can I scrape just one neighborhood or a ski resort area? Yes — the bbox input form (v1.14): bbox:swLat,swLng,neLat,neLng (e.g. bbox:25.76,-80.145,25.815,-80.115 for a Miami Beach strip). Only listings inside the box are returned; corners are auto-normalized so any two opposite corners work.

Q. What's the realistic throughput? Default maxConcurrency: 4. ~2–4 properties/sec for detail rows; ~5–10 review pages/sec for reviews mode. So 1,000 properties in ~5 min; 250 reviews per property in ~50s.

Q. Reviews pagination — do I pay per page or per review? Per review. Each review row → one $0.0025 event. Pages are free roundtrips; you only pay for what lands in the dataset.

Q. Can I get historical bookings, occupancy, or transaction data? No. VRBO doesn't expose closed-booking data publicly. The actor sees what's currently listed (price, description, calendar, public reviews).

Q. What if Apify Residential gets rate-limited mid-run? The actor retries the primary proxy up to 3 times with rotated sessions automatically. Beyond that, set fallbackProxyUrl to an Evomi residential URL.

💬 Support

🛠 Additional services

  • Need Expedia / Hotels.com / Things-To-Do reviews? Use the sibling memo23/expedia-scraper — same architecture, $2.50/1k, covers all 3 Expedia Group brands.
  • Custom output shape, additional fields, or a private build: muhamed.didovic@gmail.com
  • Need other vacation-rental platforms (Airbnb, Booking.com, Vacasa, FlipKey, HomeToGo)? Drop an email.
  • For API access (no Apify fee, just a usage fee for the API): muhamed.didovic@gmail.com

🔎 Explore more scrapers

See other scrapers at memo23's Apify profile — Expedia/Hotels.com reviews, ImmoScout24 DACH residential, LoopNet US+UK commercial, Stepstone DE jobs, Naukri India jobs, and more.


🧪 Smoke-test matrix (for developers / contributors)

Before every apify push, run the full input-form matrix AND the field-level assertion suite to catch regressions across input kinds AND data quality:

apify push --force
apify call --build <new-version> -f scripts/smoke-matrix.json
# Copy the "Export results: https://console.apify.com/storage/datasets/<id>" line
node scripts/smoke-assertions.mjs <datasetId>

The matrix (scripts/smoke-matrix.json) exercises all 10 input forms in a single run (~25 s, ~23 rows). The assertion suite (scripts/smoke-assertions.mjs) runs ~350 field-level checks on the resulting dataset and exits non-zero on any failure.

Why two layers? The matrix proves rows LAND; the assertions prove rows aren't STUBS. A real-world bug (May 2026) shipped rows with title: null + rating: 0 because VRBO's API briefly returned a thin shell that the matrix counted as "success." The assertion suite catches that class of regression at ship time.

Sample assertions:

  • property.title non-empty (catches stub responses)
  • property.rating in [0, 10] (catches encoding bugs)
  • property.photosCount > 0 AND property.amenitiesCount > 0 (every real VRBO property has both)
  • property.rating > 0 when reviewCount > 0 (catches the specific stub pattern where both go to 0)
  • Property-specific: 2165911 must contain "Piccolo Ponte" in title, rating ≥ 9.5, reviewCount ≥ 30, countryCode TCA
  • Coverage: every search input (Bali, New York, region:6054439, coords, keywords:Tulum/) must produce at least one fan-out property row

The matrix:

#InputResolved kindExpected output
1https://www.vrbo.com/2165911detail1 property row
22165911detaildeduped with #1 (same kind+canonical)
34193579hadetail1 property row (.ha-suffix support)
42165911/reviewsreviewsup to maxItems review rows
54193579ha/reviewsreviewsup to maxItems review rows
6Balisearch → fan-outmaxItems property rows
7New Yorksearch → fan-outmaxItems property rows
8region:6054439search → fan-outmaxItems property rows
9-7.7956, 110.3695search (coords) → fan-outmaxItems property rows
10https://www.vrbo.com/search/keywords:Tulum/search → fan-outmaxItems property rows

Pass criteria (two layers — both must be green):

  1. Matrix layer: details: 17 scraped, 0 failed AND reviews: ≥6 row(s) AND searches: 5 processed, 0 failed (at maxItems: 3).
  2. Assertion layer: node scripts/smoke-assertions.mjs <datasetId> exits 0. ~350 assertions; any failure prints ✗ [row] reason and blocks the push.

🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the Apify MCP server or the Apify API (actor: memo23/vrbo-scraper).

Purpose: Scrapes VRBO.com vacation-rental properties (details, per-night calendar, rates breakdown) and full paginated review history from VRBO's own GraphQL backend, no login required.

Minimal input:

{
"startUrls": ["https://www.vrbo.com/2165911"],
"maxItems": 25
}

Search-mode variant: set startUrls to a location, region, or coords, e.g. "startUrls": ["Bali"] (walks pagination and fans out to up to maxItems property rows).

Output: rows carry a kind discriminator. Property rows (kind: "property"): vrboId, expediaPropertyId, listingUrl, title, headline, pricePerNight, priceCurrency, sleeps, bedrooms, bathrooms, propertyType, address {full, city, region, country, countryCode}, coordinates {lat, lng}, description, photos[] {url, caption}, photosCount, amenities[] {id, label, group}, amenitiesCount, wifiSpeed, highlights[] {title, detail, icon}, rating, ratingScale, reviewCount, host {name, type, superhost, responseRate}, rates {nightlyRate, serviceFee, cleaningFee, taxes, totalPrice, currency, nights}, calendar[] {date, available, pricePerNight, minStay}, calendarLength, adr, occupancyRate, revpar, estimatedAnnualRevenue, isStale, policies {pets, smoking, events, children}, cancellationPolicy, minimumNights, scrapedAt. Review rows (kind: "review"): reviewId, rating, ratingMax, ratingLabel, text, liked, authorName, isVerified, submittedAt, stayPeriod, travelType, helpfulVotes, managerResponse {text, respondedAt}.

Behaviors an agent should know:

  • startUrls accepts seven forms (full URL, bare/dotted ID, {id}/reviews, location text, region:{id}, lat, lon coords, bbox:swLat,swLng,neLat,neLng map area); each is auto-classified. Detail inputs emit 1 property row; /reviews inputs emit paginated review rows only; location/region/coords/bbox/search inputs fan out.
  • maxItems is a soft cap per source (default 100); non-paying users are capped at 25 total rows — always set it.
  • scrapeAvailability (off by default) adds minimumNights + per-date calendar via one extra GraphQL call per property, and computes the STR KPIs (adr, occupancyRate, revpar, estimatedAnnualRevenue, isStale) from that calendar — for STR investment / underwriting queries, turn it on.
  • includeReviews (off by default) makes every visited property also emit review rows; pair with maxReviewsPerProperty (default 50, max 1000) to cap blowout.
  • Residential proxy is built in; VRBO blocks Apify Residential GB (use US/default), and fallbackProxyUrl adds an Evomi-style secondary pool.
  • Billing: per result row plus a per-run start event, with an extra per-property availability event when scrapeAvailability is on — see the Pricing tab on the actor page for current rates.

⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by VRBO, Expedia Group Inc., HomeAway, or any of their subsidiaries or related entities. All VRBO-, Expedia-, HomeAway-, and Expedia Group-related trademarks, service marks, trade names, and logos are the property of their respective owners and are used here solely for descriptive purposes — to identify the public vacation-rental listings from which this scraper extracts data.

This Actor accesses only publicly available property-listing pages and the public GraphQL endpoint on www.vrbo.com. You are solely responsible for ensuring that your use of the data complies with VRBO's Terms of Service, applicable copyright law, the EU Database Directive, GDPR (where applicable), the US Computer Fraud and Abuse Act, and any other regulations that may apply to your jurisdiction or use case. Do not use this Actor to bulk-republish copyrighted content, to harass hosts or guests, to circumvent any rate-limiting or technical protection measure intentionally imposed by VRBO, or to enable unsolicited outreach in violation of CAN-SPAM / e-Privacy consent rules.

The author provides this Actor "as is", without warranty of any kind, and disclaims any liability for damages arising from its use.


SEO Keywords

vrbo scraper, vrbo api, vrbo.com scraper, vacation rentals scraper, vrbo vacation rental api, vrbo property scraper, vrbo calendar scraper, vrbo availability api, vrbo reviews scraper, vrbo all reviews api, vacation rental reviews api, vrbo pricing data, vrbo service fee api, vrbo cleaning fee data, vacation rental analytics, vrbo amenities scraper, vrbo photos api, vrbo host scraper, manager response scraper, vacation rental aggregator data, short term rental data, vrbo competitor of airbnb, vacation rental market intelligence, vrbo no auth scraper, apify vrbo actor, vrbo without login scraping, vacation rental adr benchmark, expedia partner solutions alternative, str data api, vacation rental scraper apify, vrbo paginated reviews, vrbo adr, vrbo occupancy rate, vrbo revpar, vrbo estimated annual revenue, str investor kpis, vrbo income estimator, vrbo investment calculator, str underwriting data, vrbo market analysis, vrbo revpar benchmark, vrbo bedrooms bathrooms data, vrbo premier host data, vrbo polygon search, vrbo map area search, vrbo bounding box search, vrbo ski resort market, vrbo beach strip scan, vrbo neighborhood comps, str comp set data, vacation rental occupancy data