VRBO Vacation Rentals Scraper
Under maintenancePricing
Pay per event
VRBO Vacation Rentals Scraper
Under maintenanceScrape VRBO (Expedia Group) vacation-rental search results and listing details by destination: title, location, price per night, beds/baths, guests, rating, reviews, amenities, host, and coordinates. Camoufox-powered to clear anti-bot challenges. Pay only per listing scraped.
Pricing
Pay per event
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 hours ago
Last modified
Categories
Share
🎯 What this scrapes
For each destination string you pass in (VRBO's own free-text search box format, e.g. "Orlando, Florida, United States of America"), this Actor:
- Opens a rendered VRBO search-results page for that destination and your check-in/check-out window.
- Captures up to your configured cap of listing cards — title, location, price per night, currency, bedrooms, bathrooms, and max guests.
- Optionally visits each listing's detail page for the fuller field set: rating, review count, amenities, host name, and latitude/longitude.
- Emits one row per listing to the default dataset, tagged with the destination query that found it.
🔥 Features
- We clear the JS-execution gate VRBO puts in front of raw HTTP requests — a hardened browser layer renders the page like a real visitor instead of bouncing off a "Bot or Not?" challenge screen.
- We rotate residential proxy sessions through Apify Proxy — a fresh exit IP and session on every block.
- We back off when the target pushes back. Partial successes surface with a clear status message — we never silently return an empty dataset.
- Run-wide wall-clock budget — the run stops opening new pages once your time budget is spent and finalizes cleanly with whatever it already scraped, instead of getting killed mid-write.
- Per-listing fault isolation — one dead page or navigation timeout skips that listing with a logged warning; it never fails the whole run.
- Pydantic v2 input + output validation — every row is a typed, schema-enforced record; nullable fields are always
null, never silently dropped. - Pay-Per-Event pricing — you're charged per listing row written to your dataset, not per page fetched.
💡 Use cases
- Market research — compare nightly rates, bedroom counts, and amenities across destinations for a vacation-rental market scan.
- Revenue-management benchmarking — property managers pull comparable listings to sanity-check their own pricing.
- Travel-content sourcing — bulk-pull listing photos-adjacent metadata (title, location, rating) for roundup articles or itinerary tools.
- Lead generation — identify active hosts and listings in a target destination for partnership or outreach lists.
⚙️ How to use it
- Click Try for free at the top of the page.
- Add 1-10 destination strings (VRBO's own free-text search format works best).
- Optionally set check-in/check-out dates — otherwise the Actor defaults to a near-future window so results actually populate.
- Click Start. Output streams into the run's dataset.
- Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
destinations | array | yes | — | 1-10 free-text VRBO destination search queries. |
checkin | string | no | +30 days from run date | Search window start (YYYY-MM-DD). |
checkout | string | no | +33 days from run date | Search window end (YYYY-MM-DD), must be after checkin. |
maxListingsPerDestination | integer | no | 20 | 1-50 listing rows collected per destination. |
scrapeListingDetails | boolean | no | true | If false, search-card fields only (cheaper, faster). |
maxRunMinutes | integer | no | 12 | Run-wide wall-clock budget; stop opening new pages past this. |
proxyConfiguration | object | no | RESIDENTIAL | Apify Proxy — mandatory, falls back to BUYPROXIES94952. |
Example input
{"destinations": ["Orlando, Florida, United States of America"],"checkin": "2026-09-10","checkout": "2026-09-13","maxListingsPerDestination": 20,"scrapeListingDetails": true,"maxRunMinutes": 12,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
📤 Output
Every row is one dataset item — one VRBO listing.
| Field | Type | Notes |
|---|---|---|
destination_query | string | The destination string that discovered this row. |
listing_url | string | Canonical VRBO listing URL. |
title | string | Listing title. |
location | string | Listing location as displayed by VRBO. |
price_per_night | float | null | Nightly price for the searched window. |
currency | string | ISO currency code. |
bedrooms | integer | null | Bedroom count. |
bathrooms | float | null | Bathroom count. |
max_guests | integer | null | Max occupancy. |
rating | float | null | Aggregate rating (detail-page field). |
reviews_count | integer | null | Review count (detail-page field). |
amenities | array | Amenity labels (detail-page field). |
host_name | string | null | Host display name (detail-page field). |
latitude | float | null | Listing latitude, where public. |
longitude | float | null | Listing longitude, where public. |
scraped_at | string | ISO-8601 UTC timestamp. |
Nullable fields are null, never omitted, when VRBO doesn't expose them publicly or scrapeListingDetails was false.
Example output
{"destination_query": "Orlando, Florida, United States of America","listing_url": "https://www.vrbo.com/1234567ha","title": "Lakefront Cabin near Disney with Private Pool","location": "Orlando, Florida, United States","price_per_night": 189.0,"currency": "USD","bedrooms": 3,"bathrooms": 2.0,"max_guests": 8,"rating": 4.8,"reviews_count": 214,"amenities": ["Pool", "Wifi", "Kitchen", "Air conditioning"],"host_name": "Jane D.","latitude": 28.3852,"longitude": -81.5639,"scraped_at": "2026-08-11T12:00:00.000Z"}
💰 Pricing
Pay-Per-Event — you pay only when these events fire:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.02 | One-off warm-up charge per run. |
result-row | $0.0028 | Per listing row written to your dataset. |
Example: 1 000 results at the rates above ≈ $2.82. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.
🚧 Limitations
v0.1 covers destination-string search only — no booking/availability-calendar scraping, no pricing quotes beyond the single search window used to populate results, no review text (aggregate rating + review count only), and no host-profile enrichment beyond the name shown on the listing. Map/geo bounding-box search is not supported.
❓ FAQ
Is this legal?
We only fetch content VRBO makes publicly available on its search and listing pages. Respect VRBO's terms of service before using output commercially.
Why is a field null?
Detail-page fields (rating, reviews_count, amenities, host_name, latitude, longitude) are null when scrapeListingDetails is false, or when VRBO doesn't expose that field publicly for a given listing.
Do I need my own proxy?
No — Apify Proxy (residential) is wired in by default.
Why did I get fewer rows than maxListingsPerDestination?
The run-wide maxRunMinutes budget stops opening new pages once it's spent, and any listing that hits a dead page or navigation timeout is skipped rather than failing the run — check the run's status message for a breakdown.
💬 Your feedback
Spotted a bug, hit a weird edge case, or need a new field? Open an issue on the Actor's Issues tab on Apify Console — we ship fixes weekly and we read every report.