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.