Skip to content
Business
Skill

/vrbo

Search VRBO (Vrbo / Expedia Group) vacation rentals including entire homes, condos, and cabins via Patchright browser automation. VRBO sits behind Akamai Bot Manager so plain HTTP and standard Playwright get a 429 bot wall. Use for whole-home or group stays, multi-bedroom

BOOST
From plugin
travel-hacker
69748 skills1 agent6 MCP
Install
$ npx -y skills add borski/travel-hacking-toolkit --skill vrbo --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/vrbo

Context preview

The summary Claude sees to decide when to auto-load this skill.

Search VRBO (Vrbo / Expedia Group) vacation rentals including entire homes, condos, and cabins via Patchright browser automation. VRBO sits behind Akamai Bot Manager so plain HTTP and standard Playwright get a 429 bot wall. Use for whole-home or group stays, multi-bedroom

SKILL.md

vrbo.SKILL.md
name: vrbo
description: Search VRBO (Vrbo / Expedia Group) vacation rentals including entire homes, condos, and cabins via Patchright browser automation. VRBO sits behind Akamai Bot Manager so plain HTTP and standard Playwright get a 429 bot wall. Use for whole-home or group stays, multi-bedroom rentals, and Airbnb-vs-VRBO comparisons. Trigger phrases include search VRBO, Vrbo rentals, vacation rental, cabin rental, whole house, condo for the group.
category: hotels
summary: VRBO whole-home, condo, and cabin search via Patchright. Complements Airbnb for group stays.
api_key: None (requires Patchright)
docker_image: ghcr.io/borski/vrbo

VRBO Search

Search VRBO vacation rentals via Patchright and return whole-home / condo / cabin listings with pricing and booking links. VRBO is the natural complement to the Airbnb MCP for group and family stays — many mountain-town and resort property managers cross-list on both, but VRBO carries professionally-managed condos and cabins that don't always appear on Airbnb.

**Requires Patchright** (undetected Playwright fork). VRBO sits behind **Akamai Bot Manager** — plain HTTP, standard Playwright, `@playwright/mcp`, and agent-browser all get a `429 Too Many Requests` ("Provisioned request rate has been exceeded") bot wall. Patchright passes Akamai's sensor and earns the `_abck` cookie. This is the same wall — and the same fix — as the chase-travel / amex-travel / southwest skills.

**Must run headed (`headless=False`).** Akamai flags headless browsers. On macOS a Chrome window briefly appears. For background / unattended runs, use Docker (Xvfb provides the virtual display).

**No login required.** VRBO search results are public — unlike chase-travel / amex-travel, there are no credentials. The persistent profile only caches the Akamai cookie so repeat searches re-challenge less.

Prerequisites

pip install patchright && patchright install chromium

Or use Docker (no local install, headed via Xvfb):

docker build -t vrbo skills/vrbo/

When to Use

  • Group / family stays where you want a whole home, condo, or cabin
  • "Compare Airbnb vs VRBO in <place>"
  • Multi-bedroom rentals with separate rooms (the multi-person trip pattern)
  • Resort / mountain towns (Canmore, Banff-area, Whistler, Muskoka) where

professional property managers list condos on VRBO that aren't on Airbnb

When NOT to Use

  • **Completing a booking.** This skill finds rentals and returns links only. Do

not attempt to complete a purchase.

  • **Hotels.** Use compare-hotels / serpapi / liteapi / the portal skills.
  • **Single rooms / shared rooms.** VRBO is whole-property only; for private

rooms in a shared home use the Airbnb MCP (`private_room`).

Usage

# Local (pops up a Chrome window on macOS)
python3 skills/vrbo/scripts/search_vrbo.py \
  --dest "Canmore, Alberta, Canada" \
  --checkin 2026-06-26 --checkout 2026-07-02 --adults 3 --json

# Whole homes with 3+ bedrooms
python3 skills/vrbo/scripts/search_vrbo.py \
  --dest "Canmore, Alberta" --checkin 2026-06-26 --checkout 2026-07-02 \
  --adults 3 --min-bedrooms 3 --json

# Docker (headless host, headed browser via Xvfb)
docker run --rm vrbo \
  --dest "Canmore, Alberta" --checkin 2026-06-26 --checkout 2026-07-02 \
  --adults 3 --json

Arguments

| Flag | Default | Notes | |------|---------|-------| | `--dest` | required | Destination keyword, e.g. `"Canmore, Alberta, Canada"`. VRBO resolves it to a regionId server-side. | | `--checkin` / `--checkout` | required | ISO `YYYY-MM-DD`. Must be today or later. | | `--adults` | 2 | Traveler count. | | `--children` | 0 | | | `--pets` | off | Pet-friendly only. | | `--min-bedrooms` | 0 | Client-side filter (VRBO's URL filter is unreliable). | | `--limit` | 20 | Max listings returned. | | `--retries` | 4 | Akamai retry attempts (homepage warm-up → SERP). | | `--json` | off | Emit JSON to stdout (use this for orchestration). |

Output

JSON shape (with `--json`):

{
  "source": "vrbo",
  "extractor": "__PLUS_REDUX_STORE__ | dom:lodging-card | dom:anchors",
  "searchUrl": "https://www.vrbo.com/search?...",
  "count": 12,
  "listings": [
    {
      "id": "1234567",
      "name": "Mountain-View Condo Steps from Main St",
      "bedrooms": 3, "bathrooms": 2, "sleeps": 6,
      "rating": 4.9, "reviewCount": 84,
      "priceText": "The current price is CA $312 CA $312 CA $2,184 total includes taxes & fees",
      "pricePerNight": 312, "priceTotal": 2184, "priceIncludesTaxes": true,
      "lat": 51.08, "lng": -115.35,
      "url": "https://www.vrbo.com/en-ca/cottage-rental/p1234567?..."
    }
  ]
}

`extractor` tells you which layer produced the data. `__PLUS_REDUX_STORE__` is richest (bedrooms, coords, review counts); `dom:lodging-card` is reliable but thinner (the common case — names, prices, URLs); `dom:anchors` is a last-ditch id+url scrape — if you see that, the page shape changed and selectors need a refresh (file a P2 task).

**Prices:** the SERP price string is parsed into `pricePerNight` and `priceTotal`. Verified against live data: VRBO's SERP **total includes taxes & fees** (`priceIncludesTaxes: true`) — `priceTotal` is the all-in for the whole stay, `pricePerNight` is the lead nightly rate. This satisfies the hotel-comparison standard's all-in requirement directly; still open the listing URL to confirm before booking, since a damage deposit or optional add-ons may not be in the SERP figure.

Tests

The pure logic (search-URL building, Akamai block/challenge detection, SERP price parsing, skeleton filtering, listing enrichment) is covered by stdlib `unittest` tests — no browser, network, or Patchright needed (the `patchright` import is lazy):

python3 -m unittest discover -s skills/vrbo/tests -v   # or: python3 -m pytest skills/vrbo/tests

17 tests, no third-party deps. The browser-driven path (Akamai bypass, DOM extraction) can't be unit-tested without a live residential connection — verify it manual

Read more
Ships withtravel-hacker

AI-powered travel hacking with points, miles, and award flights. Drop-in skills and MCP servers for OpenCode, Claude Code, and Codex. Ask your AI to find you a 60,000-mile business class flight to Tokyo.

Get the whole plugin

Other skills on travel-hacker.