---
title: "Vrbo API: Vacation Rental Listings and Availability"
description: "Search Vrbo with required check_in and check_out, then pull a listing's availability and reviews by property_id. Parameters, cURL and the cost of 50 listings."
url: https://perceptlayer.com/blog/vrbo-api-vacation-rental-listings
---

[Blog](https://perceptlayer.com/blog) / [API guides](https://perceptlayer.com/blog/category/api-guides)

# Vrbo API: Vacation Rental Listings and Availability

21 Oct 2026 Perceptlayer 6 min read

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`.

## Key takeaways

-   The flow is `destinations` (a place name as `query`), then `search` (required `check_in` and `check_out`), then per-property calls by `property_id`.
-   Search filters include `min_price`, `max_price`, `price_type` ( `nightly` or `total`), `bedrooms`, `sort` and amenity and house-rule filters, with `limit` and `offset` for paging.
-   `listing-availability` takes a `property_id` with optional `start_date` and `end_date`, so one call covers a date range for one property.
-   `listing-reviews` sorts by `relevant`, `newest`, `highest_rated` or `lowest_rated`, with `limit` and `offset`.
-   All 6 Vrbo endpoints cost 1 credit per successful call. Checking availability for 50 listings found in 3 search pages is 3 + 50 = 53 credits.

## 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](https://developers.expediagroup.com/rapid/lodging/vacation-rentals/about-vacation-rentals-api), 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](https://developers.expediagroup.com/rapid/lodging/vacation-rentals/vrbo-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](https://perceptlayer.com/apis/vrbo) 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`](https://perceptlayer.com/apis/vrbo/destinations) | Destination matches | `query` | none |
| [`/v1/vrbo/filters`](https://perceptlayer.com/apis/vrbo/filters) | Available search filters | none | dates, guests, `destination`, `region_id`, `map_bounds` |
| [`/v1/vrbo/search`](https://perceptlayer.com/apis/vrbo/search) | A page of rentals | `check_in`, `check_out` | 35 others, plus `limit`, `offset` |
| [`/v1/vrbo/listing`](https://perceptlayer.com/apis/vrbo/listing) | One rental | `property_id` | `check_in`, `check_out`, `adults`, `children` |
| [`/v1/vrbo/listing-availability`](https://perceptlayer.com/apis/vrbo/listing-availability) | Its availability | `property_id` | `start_date`, `end_date` |
| [`/v1/vrbo/listing-reviews`](https://perceptlayer.com/apis/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:

```bash
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](https://perceptlayer.com/signup); the [authentication docs](https://docs.perceptlayer.com/authentication) 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 `…`:

```json
{
  "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.

```bash
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:

```bash
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.

```python
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](https://docs.perceptlayer.com/rate-limits) 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](https://docs.perceptlayer.com/credits) explain the balance, and [pricing](https://perceptlayer.com/pricing) has what credit packs cost.

For the same work on Airbnb, the [Airbnb listings data guide](https://perceptlayer.com/blog/airbnb-listings-data-api) covers its endpoints. To try Vrbo, run a search for your own dates in the playground on the [Vrbo API page](https://perceptlayer.com/apis/vrbo).

## APIs in this post

-   [Vrbo **1 credit per call** · 6 endpoints](https://perceptlayer.com/apis/vrbo)

## 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](https://perceptlayer.com/pricing) 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.

vrbo vacation rentals short-term rentals availability travel

## More from the blog

1.  [API guides](https://perceptlayer.com/blog/category/api-guides) 20 Jul 2026 Updated 26 Oct 2026 Perceptlayer 7 min read
    
    ## [Airbnb Listings Data API: Search, Details and Reviews](https://perceptlayer.com/blog/airbnb-listings-data-api)
    
    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.  [API guides](https://perceptlayer.com/blog/category/api-guides) 22 Oct 2026 Perceptlayer 7 min read
    
    ## [Booking.com Reviews API: Hotel Review Scores as JSON](https://perceptlayer.com/blog/booking-com-reviews-api-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.  [Web data by industry](https://perceptlayer.com/blog/category/web-data) 21 Sept 2026 Perceptlayer 7 min read
    
    ## [Vacation Rental Pricing Data: Fields That Matter](https://perceptlayer.com/blog/vacation-rental-data-pricing-analysis)
    
    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.
