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 actual 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 URL-encoded search URLs:
https://www.vrbo.com/search?destination={destination}&startDate={YYYY-MM-DD}&endDate={YYYY-MM-DD}&adults={adults}&bedroom_count_gt={minimum-bedrooms-minus-one}&sort=PRICE_LOW_TO_HIGH
This reaches the sorted result state in one navigation. Use the caller’s exact destination; do not silently substitute a nearby city. Verify returned bedroom text because bedroom_count_gt may be interpreted strictly. minBedrooms={minimum-bedrooms} is an alternative accepted form.
adults is the whole guest count and prices an adult-only party. Vrbo counts children and infants separately and prices them differently, so for a mixed-age party set the ages in Vrbo's guest selector on the results page and reuse the URL Vrbo generates; do not guess child or infant parameter names. Say which form was used.
2. For a strict bedroom threshold, an optional region-qualified form is:
https://www.vrbo.com/search?regionId={region-id}&destination={destination}&startDate={YYYY-MM-DD}&endDate={YYYY-MM-DD}&adults={adults}&bedroom_count_gt={minimum-bedrooms-minus-one}&sort=PRICE_LOW_TO_HIGH
Use a region ID only when Vrbo provides it for the requested destination; never guess one. For example, Palm Springs resolved to 180676 in one session — use it only if Vrbo returns it for the requested destination.
3. For nearby destinations or a caller-supplied destination set, issue one direct search per destination and merge results by property URL. A city search does not reliably cover neighboring cities. Retain each originating search URL.
4. Optional modifiers include sort=PRICE_LOW_TO_HIGH, a caller-specified destination list, and post-extraction filters for explicit complete-stay price, property type, or pet-friendly text. No reliable URL budget parameter was observed. If the caller gives a monthly budget for a multi-month stay, convert it to an approximate total ceiling using the requested number of months or nights, clearly label that conversion as approximate, and still require an explicit complete-stay amount before accepting a match.
5. Vrbo may present a CAPTCHA or another bot challenge before rendering results. If one appears, solve it, reload or continue on the same direct URL, and wait for results. Do not replace the direct search with homepage navigation.
6. After each result page renders, run this evaluator. It waits for client-side content, scrolls to trigger lazy loading, deduplicates nested cards, derives nights and the bedroom threshold from the current URL, and returns visible listing data:
(async()=>{const wait=ms=>new Promise(r=>setTimeout(r,ms)),q=new URLSearchParams(location.search),iso=q.get('startDate'),out=q.get('endDate'),nights=iso&&out?Math.round((Date.parse(out)-Date.parse(iso))/86400000):null,minBedrooms=q.get('minBedrooms')?Number(q.get('minBedrooms')):q.get('bedroom_count_gt')?Number(q.get('bedroom_count_gt'))+1:null;await wait(5000);for(const y of [1800,3600,6000,9000,12000]){window.scrollTo(0,y);await wait(1000)}const sels=['[data-stid*="lodging-card"]','[data-stid="property-listing-results"] > div','div[data-stid^="section-results"] li'],nodes=[...new Set(sels.flatMap(s=>[...document.querySelectorAll(s)]))],seen=new Set(),listings=[];for(const card of nodes){const text=(card.innerText||'').replace(/\s+/g,' ').trim();if(!text)continue;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),url=links[0]||null,name=(card.querySelector('h2,h3,[data-stid*="title"],[data-stid*="name"]')?.textContent||text.split(' | ')[0].slice(0,160)).replace(/\s+/g,' ').trim(),key=url||(name+'#'+(seen.size));if(seen.has(key))continue;seen.add(key);const bm=text.match(/(\d+)\s+bedrooms?/i),stay=nights?text.match(new RegExp('(?:US\\$|\\$)\\s?[\\d,]+(?:\\.\\d{2})?\\s+for\\s+'+nights+'\\s+nights?','i')):null,pm=stay&&stay[0].match(/[\d,]+(?:\.\d{2})?/),sleeps=text.match(/sleeps\s+(\d+)/i),beds=text.match(/(\d+)\s+beds?/i);if(minBedrooms!==null&&(!bm||+bm[1]<minBedrooms))continue;listings.push({name,url,bedrooms:bm?+bm[1]:null,sleeps:sleeps?+sleeps[1]:null,beds:beds?+beds[1]:null,stayPrice:stay?stay[0]:null,total:pm?Number(pm[0].replace(/,/g,'')):null,allFeesIncluded:/all fees included/i.test(text),isHouse:/\bHouse\s*·/i.test(text),petFriendly:/pet-friendly|dog-friendly|pets stay free|pets allowed/i.test(text),text})}return{url:location.href,listings,count:listings.length,nights,minBedrooms,note:'Verify availability, destination, sleeping arrangements, taxes, fees, and that the displayed amount is the complete stay total.'}})()- For a budgeted search, retain only records with an explicit
for {nights} nightsamount and apply the caller’s ceiling tototal; do not treat a nightly rate or subtotal as the complete trip total. For a monthly budget, compare the complete-stay total with the explicitly stated approximate aggregate ceiling, allowing for the caller’s requested interpretation of “around.” - If a card needs confirmation, open its direct property URL. Numeric property URLs such as
https://www.vrbo.com/{property-id}?chkin={YYYY-MM-DD}&chkout={YYYY-MM-DD}&adults={adults}are valid when the listing exposes the opaque property ID; never fabricate an ID.
Possible Friction Points
- The useful search state is directly addressable through
/searchquery parameters:destination,startDate,endDate,adults,minBedroomsorbedroom_count_gt, andsort=PRICE_LOW_TO_HIGH. - 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.
bedroom_count_gtmay be a strict greater-than filter rather than an inclusive minimum; inspect returned bedroom counts and post-filter explicitly.- Verified region-qualified searches can narrow nearby city searches, but region IDs are opaque and must come from Vrbo or a previously verified mapping; never infer or fabricate one.
- No dependable maximum-price query parameter was observed. Visible dollar amounts may be nightly rates, subtotals, or complete-stay totals; only accept a budget match when the card explicitly says
for {nights} nights, then verify fees and taxes. - Search results can be blocked by a CAPTCHA or another bot challenge, or delayed by client-side rendering. Solve the challenge if present, reload or continue on the same URL, wait, and scroll to trigger lazy loading.
minBedroomsis a practical URL filter, but listing text must still be checked because bedrooms, beds, and sleeping arrangements differ.- For a guest-count range,
adultsis a single query value; search each value when exact results for every party size are needed. - Card markup uses
data-stidselectors observed on Vrbo and may change. The evaluator deduplicates nested cards and extracts visible bedroom, bed, capacity, stay-price, property-type, and pet-friendly signals. - A bedroom count does not prove that every guest has a private room; confirm sleeping arrangements on the property page when that requirement matters.
- A monthly price target is not a dependable Vrbo URL filter. Convert it to an approximate complete-stay ceiling only after calculating the requested stay duration, and do not confuse nightly or subtotal amounts with the full booking total.