VRBO Scraper — Properties + Calendar + Full Reviews [$2.5💰]
Pricing
from $1.50 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
100
Total users
32
Monthly active users
4.3 hours
Issues response
3 days ago
Last modified
Categories
Share
VRBO Vacation Rentals Scraper — Property + Calendar + Reviews + Rates
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

✨ 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'sproductReviewDetailsGraphQL 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 1on 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"andkind: "review", both pushed to the same dataset for downstream filtering. - 📈 STR investor KPIs built in (v1.14). Turn on
scrapeAvailabilityand every property row shipsadr,occupancyRate,revpar,estimatedAnnualRevenue, and anisStalecomp-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.115scrapes 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
| Team | What they build |
|---|---|
| Vacation-rental data platforms | Power your aggregator with structured VRBO inventory + calendars + reviews |
| Property managers | Track competitor pricing per-night by season; benchmark service fees, cleaning fees vs market |
| Market analysts | City-level ADR (Average Daily Rate) trends from the calendar; review sentiment over time |
| Sentiment / reputation analysts | Pull every review with manager responses → analyze recovery patterns |
| Real-estate / STR investors | Underwrite deals from comps' adr × occupancyRate × revpar × estimatedAnnualRevenue — rank a whole market by RevPAR before making an offer |
| Travel-tech integrators | Build 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 form | Example | Behaviour |
|---|---|---|
| Full URL | https://www.vrbo.com/2165911 | One property row |
| Bare ID | 2165911 or 4193579ha | Auto-prepends https://www.vrbo.com/ — one property row |
| Dotted-ID | 321.2880733.3452770 | Legacy VRBO/Expedia format — one property row |
| Reviews suffix | 2165911/reviews or 4193579ha/reviews | All paginated reviews for that property (up to 1,250) |
| Location text | Bali, New York, Tulum Mexico | Builds search URL → walks pagination → fans out to detail (up to 500 properties) |
| Region ID | region:2554 | Builds region-search URL |
| Coordinates | -7.7956, 110.3695 | Builds coords-search URL |
| Map area (bbox) — v1.14 | bbox:25.76,-80.145,25.815,-80.115 | Searches only inside the lat/lng box (swLat,swLng,neLat,neLng — corners auto-normalized). Ski zones, beach strips, hyperlocal neighborhoods |
| Full search URL | https://www.vrbo.com/search/keywords:bali/ | Walks pagination + fan-out |
🔄 How it works (step by step)
For detail/property inputs:
- Classify the input form → resolve to canonical URL
- Inject date range (default: tomorrow + 30 days) so the Apollo cache loads with calendar + per-night pricing
- Fetch via impit + Apify Residential (Chrome 144 TLS fingerprint, per-session rotation × 3 attempts before fallback)
- Extract
window.__APOLLO_STATE__via theJSON.parse("...")escape pattern - 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
| Parameter | Type | Default | Description |
|---|---|---|---|
startUrls | array of strings | — (required) | Any of the 6 input forms above. Mix freely. |
checkIn | string (YYYY-MM-DD) | tomorrow | ISO date reserved for per-night rate calculation. |
checkOut | string (YYYY-MM-DD) | check-in + 30 days | ISO date reserved for per-night rate calculation. |
adultsCount | integer | 2 | Used by VRBO to compute the rates breakdown. |
scrapeAvailability | boolean | false | v1.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. |
includeReviews | boolean | false | v1.7 — when on, every property visited (direct URL and search fan-out) also emits paginated review rows. Pair with maxReviewsPerProperty to cap blowout. |
maxReviewsPerProperty | integer | 50 | Per-property hard cap on review rows when includeReviews=true or input is in {id}/reviews form. Max 1,000. |
maxItems | integer | 100 | Soft cap per source. Detail = 1 row; reviews = up to N rows; search = up to N fan-out. |
maxConcurrency | integer | 4 | Parallel HTTP requests. Sweet spot 3–6 via Apify Residential. |
maxRequestRetries | integer | 6 | Per-URL retry budget on Akamai 429/403. |
proxy | object | Apify Residential | Required — direct connections are blocked. |
fallbackProxyUrl | string | (none) | Optional Evomi URL when Apify Residential exhausts retries. |
How to get reviews — two ways
| You want | How |
|---|---|
| Reviews for one specific property, no detail row | Paste 2165911/reviews (or full URL vrbo.com/2165911/reviews) in startUrls |
| Property + its reviews | Paste the property URL and check includeReviews |
| Every property in a city + their reviews | Paste 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/reviewsinputs, 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
| Group | Fields |
|---|---|
| Identity | kind, vrboId, expediaPropertyId, listingUrl, rawInput, title, headline |
| Pricing summary | pricePerNight, 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 |
| Location | address.{full,city,region,country,countryCode,postalCode}, coordinates.{lat,lng} |
| Content + media | description, 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 summary | rating, 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
minimumNightsis derived: the lowestminStayacross the property's bookable calendar dates (i.e.min(calendar[].minStay)whereavailable === 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 lowestminStayacross all dates; if the data carries no constraint it'snull. For date-specific logic, readcalendar[].minStaydirectly.
💰 Pricing
$2.50 per 1,000 result rows. Pay only for rows in the dataset.
| Event | Charged when | Rate |
|---|---|---|
apify-actor-start | Each run starts (Akamai-clearance overhead, proxy warm-up) | $0.008 / run |
apify-default-dataset-item | Each 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
| Capability | Other VRBO scrapers | This actor |
|---|---|---|
| Auth requirement | Some require login | No auth — pure HTTP |
| Data source | DOM scraping (fragile) | Apollo state + GraphQL endpoint (canonical) |
| Calendar / availability | Often missing | ✅ Date-by-date with per-night pricing |
| Rates breakdown | Just nightly rate | ✅ Service fee + cleaning fee + taxes + total |
| Reviews depth | First 5–10 only (inline only) | ✅ Full paginated history up to 1,250 per property via direct GraphQL |
| Review fields | Basic 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 them | ✅ adr + occupancyRate + revpar + estimatedAnnualRevenue + isStale, next to the full calendar they're computed from |
| Host signal | Often missing | ✅ Host / property-manager name (host.name) + Premier Host badge (host.superhost) on every property row |
| Input flexibility | URL only, or paywalled "bulk" fields | ✅ 7 forms: URL, bare ID, dotted-ID, location, region, coords, bbox map area, /reviews — mix freely, no paywall |
| Akamai handling | Brittle (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+checkOutfor 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.
/reviewsmode emits review rows only (no property summary). To get both, paste the property URL AND its/reviewsvariant.- 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
- For issues or feature requests, please use the Issues tab on the actor's Apify Console page.
- Author's website: https://muhamed-didovic.github.io/
- Email: muhamed.didovic@gmail.com
🛠 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 --forceapify call --build <new-version> -f scripts/smoke-matrix.json# Copy the "Export results: https://console.apify.com/storage/datasets/<id>" linenode 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.titlenon-empty (catches stub responses)property.ratingin[0, 10](catches encoding bugs)property.photosCount > 0ANDproperty.amenitiesCount > 0(every real VRBO property has both)property.rating > 0whenreviewCount > 0(catches the specific stub pattern where both go to 0)- Property-specific:
2165911must contain "Piccolo Ponte" in title, rating ≥ 9.5, reviewCount ≥ 30, countryCodeTCA - Coverage: every search input (
Bali,New York,region:6054439, coords,keywords:Tulum/) must produce at least one fan-out property row
The matrix:
| # | Input | Resolved kind | Expected output |
|---|---|---|---|
| 1 | https://www.vrbo.com/2165911 | detail | 1 property row |
| 2 | 2165911 | detail | deduped with #1 (same kind+canonical) |
| 3 | 4193579ha | detail | 1 property row (.ha-suffix support) |
| 4 | 2165911/reviews | reviews | up to maxItems review rows |
| 5 | 4193579ha/reviews | reviews | up to maxItems review rows |
| 6 | Bali | search → fan-out | maxItems property rows |
| 7 | New York | search → fan-out | maxItems property rows |
| 8 | region:6054439 | search → fan-out | maxItems property rows |
| 9 | -7.7956, 110.3695 | search (coords) → fan-out | maxItems property rows |
| 10 | https://www.vrbo.com/search/keywords:Tulum/ | search → fan-out | maxItems property rows |
Pass criteria (two layers — both must be green):
- Matrix layer:
details: 17 scraped, 0 failedANDreviews: ≥6 row(s)ANDsearches: 5 processed, 0 failed(atmaxItems: 3). - Assertion layer:
node scripts/smoke-assertions.mjs <datasetId>exits 0. ~350 assertions; any failure prints✗ [row] reasonand 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:
startUrlsaccepts seven forms (full URL, bare/dotted ID,{id}/reviews, location text,region:{id},lat, loncoords,bbox:swLat,swLng,neLat,neLngmap area); each is auto-classified. Detail inputs emit 1 property row;/reviewsinputs emit paginated review rows only; location/region/coords/bbox/search inputs fan out.maxItemsis a soft cap per source (default 100); non-paying users are capped at 25 total rows — always set it.scrapeAvailability(off by default) addsminimumNights+ per-datecalendarvia 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 withmaxReviewsPerProperty(default 50, max 1000) to cap blowout.- Residential proxy is built in; VRBO blocks Apify Residential GB (use US/default), and
fallbackProxyUrladds an Evomi-style secondary pool. - Billing: per result row plus a per-run start event, with an extra per-property availability event when
scrapeAvailabilityis 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