Blog / API guides

Vrbo API: Vacation Rental Listings and Availability

Vrbo has no public API for searching its rentals; its inventory reaches other sites through Expedia Group's partner API, which is open to a limited set of partners. To read Vrbo listings as JSON, call GET /v1/vrbo/search with the two required dates, check_in and check_out, and a destination or region_id. Each successful call costs 1 credit. listing, listing-availability and listing-reviews then take the property_id.

Is there an official Vrbo API?

Not for the public. Vrbo is part of Expedia Group, and its listings reach other travel sites through Expedia Group's Rapid API. The developer documentation for that API says Vrbo inventory is currently available only to a limited number of partners (Expedia Group Developer Hub, 2026). Its integration guide adds that Vrbo properties on Rapid are whole properties with a single unit, and support geography, content, guest reviews, availability and booking APIs (Vrbo on Rapid integration guide, 2026).

If you're a travel company that wants to sell and book Vrbo stays, apply for that partnership: it's the only route that books. If you want to read listings, prices, availability and reviews for research, pricing analysis or an agent, the Vrbo API returns them as JSON with one key and no partnership. It doesn't book anything. Data is collected from publicly available sources and returned as found at the time of the call.

Which Vrbo endpoints are there?

Six GET endpoints, each 1 credit per successful call. Two help you build a search (destinations and filters), one runs it, and three work on one property. The per-property endpoints all need a property_id, which you take from the search results. The table lists each with its required parameters.

Endpoint Returns Required Optional
/v1/vrbo/destinations Destination matches query none
/v1/vrbo/filters Available search filters none dates, guests, destination, region_id, map_bounds
/v1/vrbo/search A page of rentals check_in, check_out 35 others, plus limit, offset
/v1/vrbo/listing One rental property_id check_in, check_out, adults, children
/v1/vrbo/listing-availability Its availability property_id start_date, end_date
/v1/vrbo/listing-reviews Its reviews property_id sort, limit, offset

destinations turns a place name into something search can use: send query=Lake Tahoe and read the matches. filters returns the filter options for a destination and dates, which tells you the values the amenity and house-rule parameters accept.

How do you search Vrbo rentals?

Send check_in and check_out, both required, with a destination (free text up to 120 characters) or a region_id from destinations. Add adults and children for the party, and limit and offset to page. This request asks for rentals in Lake Tahoe for a week in July, for four adults, cheapest first:

curl "https://api.perceptlayer.com/v1/vrbo/search?destination=Lake+Tahoe&check_in=2027-07-10&check_out=2027-07-17&adults=4&sort=price_low_to_high" \
  -H "X-API-Key: $API_KEY"

Keys go in the X-API-Key header and start with sk_live_. Get a free API key; the authentication docs explain the header and its query-string fallback.

Which search parameters matter most?

Search takes 39 parameters. Most are filters for amenities, rules and bed types, and each of those is a string of up to 300 characters whose values come from filters. These are the ones most projects use:

Parameter Type Notes
check_in, check_out string, required Stay dates
destination string Up to 120 characters
region_id string From destinations
map_bounds string Search a map area instead
adults integer Number of adults
children string Children in the party
sort string recommended, price_low_to_high, price_high_to_low, review, review_count
min_price, max_price integer Price bounds
price_type string nightly or total
bedrooms, bathrooms, beds integer Room and bed counts
premier_host, virtual_tour string true, false, 1 or 0
free_cancellation, amenities, house_rules string Values from filters
limit, offset integer Paging

price_type decides how min_price and max_price are read: as a nightly rate or as the total for the stay. Pick one and keep it fixed, or price bands from different runs won't compare. Prices in the response come both ways, so you can store either.

What does a search response contain?

Our recorded search for destination=Lake Tahoe, California&check_in=2026-12-10&check_out=2026-12-13&adults=2 returned total_results 361, 20 properties per page (limit 20, next_offset 20) and a properties array. The second property, trimmed with …:

{
  "success": true,
  "data": {
    "destination": "Lake Tahoe, California",
    "check_in": "2026-12-10",
    "check_out": "2026-12-13",
    "sort": "recommended",
    "total_results": 361,
    "pagination_label": "1 - 50 of 300+",
    "offset": 0,
    "limit": 20,
    "has_more": true,
    "next_offset": 20,
    "properties": [
      …,
      {
        "property_id": "33933784",
        "url": "https://www.vrbo.com/503284",
        "listing_id": "503284",
        "overview": "House · 2 bedrooms · 4 beds",
        "property_type": "House",
        "bedrooms": 2,
        "beds": 4,
        "rating": 9.8,
        "rating_scale": 10,
        "rating_label": "Exceptional",
        "review_count": 161,
        "price": {
          "currency": "USD",
          "nightly": 280,
          "nightly_original": 289,
          "stay_total": 839,
          "stay_total_text": "$839 for 3 nights",
          "nights": 3,
          "fees_note": "All fees included"
        },
        …
      },
      …
    ]
  }
}

property_id is what the listing, availability and reviews endpoints take; listing_id is the number in the Vrbo URL, and they differ. Ratings are out of 10 (rating_scale), not 5, so convert before comparing with other sites. nightly_original next to nightly shows a discount, 289 down to 280 here, and fees_note says the stay total includes fees. The pagination_label reads "1 - 50 of 300+" while limit is 20 and total_results is 361, so page by next_offset and has_more, not by the label.

How do you check a listing's availability?

Call GET /v1/vrbo/listing-availability with the property_id, and narrow it with start_date and end_date. One call returns availability for one property over the range you ask for, so you don't have to run a search per date to see when a rental is free. This is the call to schedule if you track occupancy or open dates over time.

curl "https://api.perceptlayer.com/v1/vrbo/listing-availability?property_id=$PROPERTY_ID&start_date=2027-06-01&end_date=2027-08-31" \
  -H "X-API-Key: $API_KEY"

Blocked dates on a calendar can mean a booking or an owner's own block; a calendar can't tell you which. Treat a newly blocked date as a signal rather than as a confirmed booking.

listing takes the same property_id, with optional check_in, check_out, adults and children if you want the details priced for a stay. Reviews come from listing-reviews, sorted newest when you only want what's arrived since your last run:

curl "https://api.perceptlayer.com/v1/vrbo/listing-reviews?property_id=$PROPERTY_ID&sort=newest&limit=20" \
  -H "X-API-Key: $API_KEY"

Reviews are written by guests. Keep ratings, dates and text if you need them, and drop names unless you have a reason and a lawful basis to keep them.

How do you check availability for 50 listings in Python?

Page through a search with next_offset until you have 50 property_id values, then call listing-availability for each and save the response. The script uses the search fields from the recording above; we haven't recorded an availability response, so it stores each calendar as returned. It counts the credits it spends.

import json
import os
import requests

BASE = "https://api.perceptlayer.com/v1/vrbo"
HEADERS = {"X-API-Key": os.environ["API_KEY"]}
SEARCH = {"destination": "Lake Tahoe, California", "check_in": "2026-12-10",
          "check_out": "2026-12-13", "adults": 2}
RANGE = {"start_date": "2027-06-01", "end_date": "2027-08-31"}

spent, ids, offset = 0, [], 0
while len(ids) < 50:
    r = requests.get(f"{BASE}/search", params={**SEARCH, "offset": offset}, headers=HEADERS, timeout=60)
    r.raise_for_status()
    spent += int(r.headers["X-Credits-Used"])
    data = r.json()["data"]
    ids += [p["property_id"] for p in data["properties"]]
    if not data.get("has_more"):
        break
    offset = data["next_offset"]

for pid in ids[:50]:
    r = requests.get(f"{BASE}/listing-availability", params={"property_id": pid, **RANGE}, headers=HEADERS, timeout=60)
    if r.status_code != 200:
        print(pid, r.status_code, r.json()["error"]["code"])
        continue
    spent += int(r.headers["X-Credits-Used"])
    with open(f"vrbo-{pid}-availability.json", "w") as f:
        json.dump(r.json(), f)
print("credits used:", spent)

A property that fails prints its error code and adds nothing to spent. On a rate_limited (429) response, wait the seconds in Retry-After; the rate limits docs explain per-account limits.

What does a 50-listing availability check cost?

Every Vrbo endpoint costs 1 credit per successful call, so the cost is searches plus one call per property. At the recorded 20 properties a page, 50 listings take 3 search pages. Availability for each is 50 calls, so one check is 3 + 50 = 53 credits. Add the newest reviews for each and it's 103.

Step Calls Credits
search, 3 pages of 20 3 3
listing-availability × 50 50 50
listing-reviews × 50, optional 50 50
Total with reviews 103 103

Run the availability check weekly and it's 53 × 4 = 212 credits a month; with reviews, 103 × 4 = 412. Both fit inside the 1,000 free credits a month. Failed calls return X-Credits-Used: 0. The credits docs explain the balance, and pricing has what credit packs cost.

For the same work on Airbnb, the Airbnb listings data guide covers its endpoints. To try Vrbo, run a search for your own dates in the playground on the Vrbo API page.

APIs in this post

Frequently asked questions

How much does the Vrbo API cost?

Each of the 6 Vrbo endpoints costs 1 credit per successful call, and failed calls cost nothing. Availability for 50 listings, found in 3 search pages, is 53 credits. Every verified account gets 1,000 free credits a month, and the pricing page has what credit packs cost.

Why does search require check-in and check-out dates?

Vrbo prices and availability depend on the stay, so the search endpoint requires check_in and check_out and returns rentals for those dates. Leaving either out fails with invalid_parameters (422) and costs nothing. To see a property's open dates without fixing a stay, use listing-availability with a date range instead.

Can I book a Vrbo rental through this API?

No. The API reads listings, availability and reviews as the site shows them. Booking Vrbo stays from your own product needs a partnership with Expedia Group, whose Rapid API carries Vrbo inventory for a limited number of partners.

Are the prices nightly or total?

Search lets you choose how the price filters are read with price_type, set to nightly or total. The recorded response gives both anyway: price.nightly and price.stay_total, with a fees_note of "All fees included". Store the price_type you used with every run so prices from different days compare.

How do I page through search results?

Use offset for where the page starts and read next_offset and has_more from each response: the recorded search returned 20 properties with next_offset 20. limit sets the page size, but nothing is documented about the largest value accepted, so test it in the playground. Each page is one call and 1 credit.

  1. Airbnb Listings Data API: Search, Details and Reviews

    Search Airbnb listings by place and dates as JSON: price, rating, beds and coordinates from a recorded response, plus the listing and reviews calls.

  2. Booking.com Reviews API: Hotel Review Scores as JSON

    Pull Booking.com review scores and guest reviews as JSON with two GET calls at 1 credit each. Parameters, sorting, paging and the cost of covering a city.

  3. Vacation Rental Pricing Data: Fields That Matter

    Which Airbnb and Vrbo fields drive nightly-rate analysis, why advertised rates aren't booked rates, and what tracking 200 listings weekly costs in credits.

Start with 1,000 free credits

No password to set. We email you a sign-in link, and your key works on every API.

No credit card. 1,000 free credits a month.