---
title: "Vacation Rental Pricing Data: Fields That Matter"
description: "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."
url: https://perceptlayer.com/blog/vacation-rental-data-pricing-analysis
---

[Blog](https://perceptlayer.com/blog) / [Web data by industry](https://perceptlayer.com/blog/category/web-data)

# Vacation Rental Pricing Data: Fields That Matter

21 Sept 2026 Perceptlayer 7 min read

Vacation rental pricing data is the advertised price of a stay, for specific dates and guests, as a listing site shows it. For nightly-rate analysis, the fields that matter are the stay total and its breakdown, the dates and party it was quoted for, the listing's size and location, and its availability and reviews over time. What the data can't give you is the booked rate: an advertised price shows what a host asks, not what a guest paid.

## Key takeaways

-   A price only means something with its stay attached: the recorded Airbnb search gives `price.amount` 714 EUR `for 4 nights`, with `price_breakdown` "4 nights x €178.34".
-   Keep the request as part of the row: `checkin`, `checkout`, guests and `currency` change the price, so a rate without them can't be compared.
-   `bedrooms`, `beds`, `bathrooms`, `latitude`, `longitude`, `rating` and `review_count` explain most of the price spread between listings.
-   Advertised rates aren't booked rates. Availability calendars and review counts are the evidence you have for demand, and both need assumptions.
-   Tracking 200 listings weekly, 100 on each site, is about 200 credits a week, 800 a month, inside the 1,000 free monthly credits.

## What does a vacation rental price actually measure?

The price a listing site quotes for one stay: these dates, this many guests, this currency, at the moment you asked. Change any of them and the price can change, because hosts price by night, by season and by length of stay. That makes vacation rental prices different from hotel rack rates or rents: there's no single "price of the listing", only prices of stays.

Since April 2025, Airbnb shows guests the total price of a stay, including all fees before taxes, from the start of their search; in some countries taxes are included too ( [Airbnb Newsroom](https://news.airbnb.com/total-price-display-is-now-standard-globally), 2025). So a total from search is close to what a guest sees before checkout, but whether taxes are in it depends on the market. Store the market with the price.

## Which fields matter for nightly-rate analysis?

Five groups: the price and its basis, the stay you asked about, the listing's size, its location, and its demand signals. Our recorded Airbnb search for Paris, 10 to 14 November 2026, 2 adults, in EUR, shows most of them on each result. Here is the first result, trimmed with `…`:

```json
{
  "id": "1669612146929039736",
  "title": "Apartment in Paris",
  "rating": 5,
  "review_count": 17,
  "price": { "amount": 714, "currency": "EUR", "nights": 4, "qualifier": "for 4 nights" },
  "price_breakdown": [{ "description": "4 nights x €178.34", "amount": 713.37 }],
  "bedrooms": 1,
  "beds": 1,
  "bathrooms": 1,
  "latitude": 48.84223,
  "longitude": 2.29241,
  "badges": ["Guest favorite"],
  …
}
```

| Field | Why it matters | Watch out for |
| --- | --- | --- |
| `price.amount`, `price.nights`, `price.currency` | The stay total and its basis | It's a total; divide by `nights` for a nightly figure |
| `price_breakdown` | Shows the nightly rate behind the total | Text such as "4 nights x €178.34"; 713.37 against a 714 total shows rounding |
| `checkin`, `checkout`, guests (your request) | The price is for this stay only | Not in the result; store it with every row |
| `bedrooms`, `beds`, `bathrooms` | The main drivers of price within an area | Compare like with like: 1-bedroom against 1-bedroom |
| `latitude`, `longitude` | Location, the other main driver | Use for distance bands, not exact addresses |
| `rating`, `review_count` | Quality signal, and a proxy for past bookings | Missing on the second recorded result, which has no rating yet |
| `badges` | Site labels such as "Guest favorite" | A label, not a measured quality |

Divide `price.amount` by `price.nights` for the nightly rate: 714 ÷ 4 = 178.50 EUR, against 178.34 in the breakdown. Use the total for "what would this stay cost" and the breakdown's nightly rate when you compare across stay lengths. The other two results in the recording are 765 EUR and 435 EUR for the same 4 nights, so three Paris apartments for the same stay span 108.75 to 191.25 EUR a night. The third has no `bedrooms` field at all, so expect gaps.

Vrbo adds what Airbnb's three endpoints don't: an availability calendar per property. `/v1/vrbo/listing-availability` takes a `property_id` with optional `start_date` and `end_date`, and `/v1/vrbo/search` requires `check_in` and `check_out` and takes `price_type` ( `nightly` or `total`). Our recorded Vrbo search, for Lake Tahoe, 10 to 13 December 2026, 2 adults, maps onto the same table with different names. One property's price block, trimmed:

```json
{
  "property_id": "33933784",
  "property_type": "House",
  "bedrooms": 2,
  "beds": 4,
  "rating": 9.8,
  "rating_scale": 10,
  "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"
  },
  …
}
```

Vrbo gives the nightly rate and the stay total as separate numbers, flags a discount with `nightly_original`, and says fees are included. Its ratings are out of 10, not 5, so rescale before you put the two sites in one column. We haven't recorded a Vrbo availability calendar, so check `listing-availability` in the playground on the [Vrbo API page](https://perceptlayer.com/apis/vrbo) before you design its table.

## Why aren't advertised rates booked rates?

Because nothing in public listing data says a stay was booked, or at what price. A host can ask 178 EUR a night and accept a discount, or leave dates unsold. Analysts infer demand from two indirect signals, and both carry assumptions you should state when you publish a number.

The first is the availability calendar. A date that turns from open to blocked may be a booking, or the host blocking it for their own use. A calendar can't tell you which, so treat blocked nights as an upper bound on bookings. The second is review counts. Inside Airbnb, which publishes short-term rental data for many cities, estimates occupancy from reviews by assuming 50% of stays leave a review, applying an average stay of 3 nights where no published figure exists, and capping the estimate at 70% ( [Inside Airbnb](https://insideairbnb.com/data-assumptions/), 2026). Its own page explains why it picked 50% and calls the alternative figure probably not conservative enough.

So report what you measured. "Median advertised nightly rate for 1-bedroom apartments in the 15th arrondissement, for stays booked 30 days ahead" is a fact you can stand behind. "Average daily rate" implies booked stays and needs those assumptions spelled out.

## How do you build a weekly price panel?

Fix the stays you quote and the listings you track, then repeat the same requests every week. A panel answers "how did prices for the same stay change", which a fresh search each week can't, because the search returns different listings. Pick a small set of reference stays, such as Friday to Sunday four weeks ahead and Monday to Friday six weeks ahead, and quote each tracked listing for each one.

For Airbnb, `/v1/airbnb/listing` takes the `listing_id` with `checkin`, `checkout` and `adults`, so one call prices one listing for one stay. For Vrbo, `/v1/vrbo/listing` takes the `property_id` with `check_in`, `check_out` and `adults`, and `listing-availability` returns the calendar. This script prices a list of Airbnb listings for one reference stay and appends rows to a CSV, keeping the request with each price:

```python
import csv
import datetime as dt
import os
import requests

URL = "https://api.perceptlayer.com/v1/airbnb/listing"
HEADERS = {"X-API-Key": os.environ["API_KEY"]}
LISTINGS = ["1669612146929039736"]  # your tracked listing IDs
today = dt.date.today()
checkin = today + dt.timedelta(days=(4 - today.weekday()) % 7 + 28)  # a Friday ~4 weeks out
checkout = checkin + dt.timedelta(days=2)

with open("airbnb_panel.csv", "a", newline="") as f:
    out = csv.writer(f)
    for lid in LISTINGS:
        r = requests.get(URL, headers=HEADERS, timeout=60, params={
            "listing_id": lid, "checkin": checkin.isoformat(),
            "checkout": checkout.isoformat(), "adults": 2})
        status = r.status_code
        body = r.text if status == 200 else r.json()["error"]["code"]
        out.writerow([today.isoformat(), lid, checkin, checkout, 2, status, body])
```

We haven't run this script live for this article. The script stores the whole listing response, because we haven't recorded `/v1/airbnb/listing` and you should check where its price sits before you parse it. A failed call stores its error code and costs nothing. To discover listings for the panel in the first place, run `/v1/airbnb/search` with `place`, dates and `room_type` ( `entire_home`, `private_room` or `hotel_room`), and page with the returned `next_cursor` passed back as `cursor`.

## What does tracking 200 listings weekly cost?

Each successful call is 1 credit, so the cost is calls per week. Split 200 listings evenly: 100 Airbnb listings priced for one reference stay, and 100 Vrbo properties checked with `listing-availability`. That's 100 + 100 = 200 calls a week. Add reviews monthly, one call per listing, and a monthly search sweep to replace delisted properties.

| Step | Calls | Credits a month |
| --- | --- | --- |
| Airbnb `listing`, 100 listings × 1 stay, weekly | 100 a week | 400 |
| Vrbo `listing-availability`, 100 properties, weekly | 100 a week | 400 |
| Reviews for all 200, monthly | 200 a month | 200 |
| **Total** |  | **1,000** |

Without the monthly reviews, it's 800 credits, inside the 1,000 free credits every verified account gets. With them it's exactly 1,000. A second reference stay doubles the pricing rows to 1,600 credits a month, within the Starter pack's 10,000. Failed calls cost nothing. The [credits docs](https://docs.perceptlayer.com/credits) explain the balance, and [pricing](https://perceptlayer.com/pricing) has what packs cost.

## What are the limits of this data?

Three to keep in front of anyone who reads your analysis. Prices are advertised prices as found at the time of the call, not booked rates, and they move with demand, so a weekly panel shows asking-price trends. Coverage is the listings you chose: a panel of 200 is a sample of a market, and new or removed listings change it. And fees and taxes vary by market, so compare totals only within one market and currency.

For the endpoint details behind the Airbnb half, the [Airbnb listings data guide](https://perceptlayer.com/blog/airbnb-listings-data-api) covers search, listing and reviews; the [Vrbo API guide](https://perceptlayer.com/blog/vrbo-api-vacation-rental-listings) covers search, availability and reviews. For hotels rather than private rentals, see [hotel price data for rate monitoring](https://perceptlayer.com/blog/hotel-price-data-rate-monitoring). To start, run a Paris search for your own dates in the playground on the [Airbnb API page](https://perceptlayer.com/apis/airbnb).

## APIs in this post

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

## Frequently asked questions

### Can I get booked rates or occupancy from Airbnb or Vrbo data?

Not directly. Listing data shows advertised prices, availability calendars and reviews. Blocked calendar nights may be bookings or owner blocks, and review-based occupancy estimates depend on assumptions such as the share of stays that leave a review. State those assumptions, or report advertised rates and calendar availability as what they are.

### Why does the same listing show different prices?

Prices are for a stay, so dates, length of stay, number of guests and currency all change them. Hosts can price weekends, holidays and short stays differently. Always store the `checkin`, `checkout`, guests and `currency` you requested with each price, and compare only prices quoted for the same kind of stay.

### Does the Airbnb price include fees?

Airbnb says it has shown guests the total price including all fees before taxes since April 2025, with taxes included in some countries. The recorded search returns `price.amount` as a total `for 4 nights` with a nightly breakdown. Whether taxes are included depends on the market you searched.

### How much does a weekly price panel cost?

One credit per successful call. Pricing 100 Airbnb listings and checking availability for 100 Vrbo properties weekly is 200 credits a week, about 800 a month, inside the 1,000 free monthly credits. Failed calls cost nothing. The [pricing page](https://perceptlayer.com/pricing) has what credit packs cost beyond the free tier.

### Should I store host names or guest reviews?

Keep what you need for pricing analysis: ratings, review counts and review dates. Host names and reviewer names identify people and rarely help a pricing model, so drop them unless you have a reason and a lawful basis to keep them, and never use them to contact anyone.

vacation rentals short-term rentals pricing airbnb vrbo

## More from the blog

1.  [API guides](https://perceptlayer.com/blog/category/api-guides) 21 Oct 2026 Perceptlayer 6 min read
    
    ## [Vrbo API: Vacation Rental Listings and Availability](https://perceptlayer.com/blog/vrbo-api-vacation-rental-listings)
    
    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.
    
2.  [Web data by industry](https://perceptlayer.com/blog/category/web-data) 21 Oct 2026 Perceptlayer 8 min read
    
    ## [Job Posting Data for Labour-Market Research](https://perceptlayer.com/blog/job-posting-data-labour-market-research)
    
    Which Indeed posting fields support trend analysis, where postings mislead versus hires, and a weekly collection plan that costs 3,000 credits a month.
    
3.  [Web data by industry](https://perceptlayer.com/blog/category/web-data) 6 Oct 2026 Perceptlayer 7 min read
    
    ## [Salary Data from Job Sites: Reading Ranges Without Bias](https://perceptlayer.com/blog/salary-data-job-sites-bias)
    
    Glassdoor's salaries endpoint returns p10 to p90 total pay, a currency and a national count. How to read those ranges and the biases of self-reported pay.
