Find Vrbo rentals matching a destination, stay dates, guest count, minimum bedrooms, and optional budget. Direct search URLs support destination, dates, guests, bedroom filtering, and price sorting. Verify the sleeping arrangement and final price from rendered cards or the property page.
Use Cases
Use for Vrbo searches where the caller supplies a destination or set of destinations, check-in/check-out dates, guest count or guest-count range, minimum bedrooms, and optionally a target price ceiling or range. For a guest-count range, run the direct search once for each requested adults value, or use the largest value when the caller accepts properties accommodating the whole range.
Automation Flow
Build and navigate directly to one or more URLs, URL-encoding the destination:
https://www.vrbo.com/search?destination={destination}&startDate={YYYY-MM-DD}&endDate={YYYY-MM-DD}&adults={adults}&minBedrooms={minBedrooms}&sort=PRICE_LOW_TO_HIGHThis form searches an adult-only party:
adults={adults}is the whole guest count. Vrbo counts children and infants separately and prices them differently, so sending a mixed-age party asadultsreturns properties that may not fit or price the real group. For a party with children or infants, set the ages in Vrbo's own guest selector on the results page and reuse the URL Vrbo then generates; do not guess child or infant parameter names. Say which form was used when reporting results.When available, Vrbo also accepts the observed alternative form
regionId={region-id}&destination={destination}&startDate={YYYY-MM-DD}&endDate={YYYY-MM-DD}&adults={adults}&bedroom_count_gt={minimum-bedrooms}&sort=PRICE_LOW_TO_HIGH.regionId=180676was observed for Palm Springs; use it only when obtained from Vrbo for the requested destination, never guess a region ID.bedroom_count_gtmay express a strict greater-than filter, so compare returned bedroom text with the requested threshold.For several nearby destinations, run one direct search URL per destination rather than visiting the homepage. Express each destination in the form Vrbo accepts, such as
{city}, {region}, {country}; do not assume one city search covers a surrounding region.Vrbo may present a CAPTCHA or another bot challenge before rendering results. If a challenge appears, solve it, reload the same URL, and wait for results. Do not replace the direct search with homepage navigation.
In one page evaluation after rendering, wait for client-side content, scroll to trigger lazy-loaded cards, and run this extractor. Repeat on each requested destination or guest-count URL and merge results by listing URL:
(async()=>{const wait=ms=>new Promise(r=>setTimeout(r,ms));await wait(7000);for(const y of [1800,3600,6000,9000]){window.scrollTo(0,y);await wait(1200)}const sels=['[data-stid*="lodging-card"]','[data-stid="property-listing-results"] > div','div[data-stid^="section-results"] li'];const nodes=[...new Set(sels.flatMap(s=>[...document.querySelectorAll(s)]))];const seen=new Set();const listings=nodes.map(card=>{const text=(card.innerText||'').replace(/\s+/g,' ').trim();if(!text)return null;const links=[...card.querySelectorAll('a[href]')].map(a=>{try{return new URL(a.getAttribute('href'),location.origin)}catch{return null}}).filter(u=>u&&/^https?:$/.test(u.protocol)&&/(^|\.)vrbo\.com$/i.test(u.hostname)&&/^\/(?:vacation-rental|pdp|p|units|\d+)(?:\/|$)/i.test(u.pathname)).map(u=>u.href);const url=links[0]||null;const name=(card.querySelector('h2,h3,[data-stid*="title"],[data-stid*="name"]')?.textContent||'').replace(/\s+/g,' ').trim()||text.split(' | ')[0].slice(0,160);const bedrooms=(text.match(/(\d+)\s+bedrooms?/i)||[])[1];const sleeps=(text.match(/sleeps\s+(\d+)/i)||[])[1];const beds=(text.match(/(\d+)\s+beds?/i)||[])[1];const prices=[...new Set(text.match(/(?:US\$|\$)\s?\d[\d,]*(?:\.\d{2})?/g)||[])];const stayPrice=(text.match(/(?:US\$|\$)\s?[\d,]+(?:\.\d{2})?\s+for\s+\d+\s+nights?/i)||[])[0]||null;const key=url||name+'|'+text.slice(0,180);if(seen.has(key))return null;seen.add(key);return{name,url,bedrooms:bedrooms?+bedrooms:null,sleeps:sleeps?+sleeps:null,beds:beds?+beds:null,prices,stayPrice,allFeesIncluded:/all fees included/i.test(text),text}}).filter(Boolean);return JSON.stringify({url:location.href,listings,count:listings.length,note:'Verify whether prices are nightly, subtotal, or complete-stay totals.'})})()- Filter the returned records for the requested destination, dates, capacity, and bedroom threshold. Use the property page URL from the card for final verification when necessary. Distinguish nightly rates from trip totals and confirm taxes, fees, and availability.
Possible Friction Points
- The useful search state is directly addressable through
/searchquery parameters:destination,startDate,endDate,adults,minBedrooms, andsort=PRICE_LOW_TO_HIGH. - An observed alternative uses
regionId,destination, andbedroom_count_gt; region IDs are opaque and must come from Vrbo rather than being fabricated. - Search results can be blocked by a CAPTCHA or delayed by client-side rendering. Solve the challenge if present, reload the same URL, wait, and scroll to trigger lazy loading.
- If the caller wants one bedroom per guest,
minBedroomsis the practical URL filter, but the listing text must still be read: bedrooms, beds, and sleeping arrangements differ, and enough beds is not the same as enough bedrooms.bedroom_count_gtmay be a strict greater-than filter. - For a guest-count range,
adultsis a single query value; search each value when exact results for every party size are needed. - No dependable maximum-price query parameter was observed. Dollar amounts may be nightly rates, stay totals, or fee subtotals; verify the complete trip total on the property page.
- A listing link is accepted only after parsing the URL and checking its hostname and pathname separately. Testing the whole URL string lets an external link through whenever its query carries a Vrbo path, and the card then reports the external link as the listing.
- Card markup uses
data-stidselectors observed on Vrbo and may change. The extractor deduplicates nested result cards and captures both bedroom/capacity signals and visible pricing.