# Airbnb and Vrbo Market Data API - Occupancy, ADR, RevPAR (`nabeelbaghoor/airbnb-vrbo-market-data-api`) Actor

Short-term rental data API for Airbnb and Vrbo markets: weekly and monthly occupancy, ADR, RevPAR and revenue KPIs, listings with 12-month performance and 6-month forecasts, listing calendars and nightly rates, and arrival benchmarking. Bring your own key.

- **URL**: https://apify.com/nabeelbaghoor/airbnb-vrbo-market-data-api.md
- **Developed by:** [Nabeel Hassan](https://apify.com/nabeelbaghoor) (community)
- **Categories:** Real estate, Travel, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 market reference row returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Airbnb and Vrbo Market Data API - Occupancy, ADR, RevPAR

Turn a list of vacation rental markets or listings into a dataset of occupancy, ADR, RevPAR, revenue, nightly rates and competing listings, straight from a short-term rental market data API with your own key.

### What it collects

- **Market KPIs, weekly or monthly**: listing count, ADR, ADR on unbooked nights, RevPAR and adjusted RevPAR, guest and calendar occupancy, rental revenue, average stay length, average booking window, guest check-ins and check-outs, and property, available, open, guest and hold nights. Airbnb and Vrbo combined, or one platform at a time.
- **Listings in a market**: every Airbnb and Vrbo listing the provider tracks in a market, with title, URL, property type, bedrooms, beds, bathrooms, max guests, minimum stay, location, amenities, reviews, professional management flags, and trailing 12 month revenue, occupancy, ADR and RevPAR with percentile ranks, plus a 6 month forward forecast. Filter by platform, property type, bedroom, bed, bathroom and review ranges, amenities, Superhost status, professional management, property manager domain and performance or ADR tier.
- **One listing**: the full profile of a single Airbnb or Vrbo listing, including cross-platform matching and the markets it belongs to.
- **Listing KPIs, weekly or monthly**: the same KPI set as the market series, for one listing.
- **Listing availability and nightly rates**: one row per night with availability, quoted nightly rate, rate type, check-in availability, guest night, check-in and check-out flags, hold nights and the booking timestamp.
- **Benchmarking by arrival date**: market performance grouped by guest arrival, including owner nights, cancellations and non-rental revenue, bucketed by day, week, month, quarter or year, optionally split by bedrooms, sleeps, property type, booking source, length of stay or booking window, with a point-in-time as-of snapshot and a rollup row.
- **Available markets**: the UUID, name and level of every market your account covers, which is where every market query starts.

### Input

- **What to read**: one service per run.
- **Market UUIDs** or **Listing ids or URLs**: one per line. Listing ids look like `airbnb_17024610` or `vrbo_3700771`; an Airbnb `/rooms/` URL or a Vrbo listing URL is converted for you.
- **Start date** and **End date**: the range for KPI, availability and benchmarking services. Left blank, the last twelve months.
- **Currency**: any ISO code; the provider converts every money value.
- **Platform** and the listing filters: apply to market KPIs and market listings as described on each field.
- **Maximum results**: the cap that bounds the cost of a run.
- **API key**: your own key, or the `DATA_API_KEY` environment secret.

### Example output

```json
{
  "service": "marketKpisWeekly",
  "serviceLabel": "Market KPIs - weekly",
  "endpoint": "/api/v1/ota/market/kpis/week",
  "requested": "745b0198-3202-4679-83a1-faf3ccd8406c",
  "found": true,
  "recordType": "kpi",
  "listingId": null,
  "marketId": "745b0198-3202-4679-83a1-faf3ccd8406c",
  "date": "2024-01-01",
  "retrievedAt": "2026-09-25T09:14:52.118Z",
  "record": {
    "market_uuid": "745b0198-3202-4679-83a1-faf3ccd8406c",
    "market_name": "30A",
    "market_type": "Vacation Area",
    "ota_source": "airbnb",
    "time_scale": "weekly",
    "date": "2024-01-01",
    "listing_count": 5507,
    "adr": 324.32,
    "adr_unbooked": 322.9,
    "revpar": 55.19,
    "revpar_adj": 68.14,
    "avg_stay_length": 9.73,
    "...": "every other field the provider returned, unchanged"
  },
  "note": null
}
```

### FAQ

#### What is a short-term rental market data API used for?

Sizing and pricing vacation rentals with real numbers. An investor compares monthly occupancy, ADR and RevPAR across beach, mountain and lake markets before buying. A property manager benchmarks a portfolio against the top Airbnb and Vrbo earners in the same market and bedroom count. A revenue manager feeds nightly competitor rates and availability into a pricing model. A lender or municipality tracks listing supply and professional management share over time.

#### Do I need an API key?

Yes. This actor is bring-your-own-key: it calls the short-term rental market data provider's API with your own subscription key and never ships a key of its own. Paste the key into the API key field, or set it once as the `DATA_API_KEY` environment secret. It travels as the `x-api-key` header. Your provider plan decides which markets you can read; a market or listing outside it comes back as a row marked `found: false` with the provider's reason, and is not charged.

#### How do I find a market UUID?

Run the **Available markets** service. It lists every market your account covers with its UUID, name and level. Paste the UUIDs you want into the market field of any market service.

#### What is the difference between guest occupancy and calendar occupancy?

Guest occupancy is guest nights divided by available nights: how full the bookable calendar was. Calendar occupancy is the share of all nights that were unavailable, including owner holds and blocks. A market with heavy owner use can show high calendar occupancy and modest guest occupancy.

#### Does it return host names or guest details?

No. The host's personal display name is removed from every listing record, because many hosts are private individuals and the name adds nothing a market analysis needs; the professionally managed flag, property manager company and domain, and host id are kept. The provider's property manager routes that read a subscriber's own guest reservations are not wired at all.

#### Can this actor change anything on my account?

No. Every route it reaches reads data. The listing and KPI searches are sent as POST bodies because that is how the provider takes search criteria, not because they write anything.

#### Why is a market or listing row marked found false?

The provider answered that request without data: the market or listing is outside your plan's coverage, the id is unknown, the date range could not be processed, or the filters matched nothing. The row's note carries the provider's own wording. These rows are never charged, so a run over fifty markets returns fifty answers rather than leaving you to work out which were empty.

#### What does it cost?

Pay per result. A full listing profile costs the most, a weekly or monthly KPI period costs less, and a single calendar night or a market reference row costs the least, since a year of one listing's calendar is 365 rows. Rows that carry no record are free.

### Keyword map

Airbnb data API, Vrbo data API, short-term rental data API, vacation rental market data, STR market analytics, Airbnb occupancy rate data, ADR data by market, RevPAR data, vacation rental revenue data, Airbnb comps API, short-term rental comparables, vacation rental benchmarking, STR pricing data, nightly rate data, Airbnb calendar availability data, vacation rental investment analysis, short-term rental market research, professional property manager benchmarking.

# Actor input Schema

## `service` (type: `string`):

One service per run. Market services read one or more market UUIDs; listing services read one or more listing ids. Run Available markets first to see which markets your account covers and their UUIDs.

## `marketIds` (type: `array`):

One market UUID per line, for the market KPI, market listings and benchmarking services. The prefilled UUID is the provider's own documentation example (30A, Florida). Benchmarking sends up to 10 markets per request.

## `listingIds` (type: `array`):

One listing per line, for the listing services: the provider's id such as airbnb\_17024610 or vrbo\_3700771, or an Airbnb or Vrbo listing URL, which is converted to that id.

## `startDate` (type: `string`):

First day of the range, inclusive (YYYY-MM-DD). For benchmarking this is the first arrival date. Left blank, the range is the twelve months before the end date. The provider recommends at most 104 weeks for weekly KPIs, 36 months for monthly KPIs, 365 days for availability and 1 year for benchmarking.

## `endDate` (type: `string`):

Last day of the range, inclusive (YYYY-MM-DD). Must be after the start date. Left blank, it is today.

## `currency` (type: `string`):

ISO 4217 code for every money value, for example USD, EUR, GBP or CAD. The provider converts at current exchange rates. Defaults to USD.

## `ota` (type: `string`):

Restrict market KPIs and market listings to one platform. Leave on both for figures aggregated across Airbnb and Vrbo.

## `sortBy` (type: `string`):

Order of the market listings. Trailing 12 month revenue is the provider's default and puts the top earners first; listing id gives stable paging.

## `propertyTypes` (type: `array`):

Market listings only. One per line, lower case as the provider returns them, for example house, apartment, hotel or unique.

## `bedroomsMin` (type: `integer`):

Market listings only. Smallest number of bedrooms.

## `bedroomsMax` (type: `integer`):

Market listings only. Largest number of bedrooms.

## `bedsMin` (type: `integer`):

Market listings only. Smallest number of beds.

## `bedsMax` (type: `integer`):

Market listings only. Largest number of beds.

## `bathroomsMin` (type: `number`):

Market listings only. Smallest number of bathrooms (half baths allowed, for example 2.5).

## `bathroomsMax` (type: `number`):

Market listings only. Largest number of bathrooms (half baths allowed, for example 2.5).

## `reviewCountMin` (type: `integer`):

Market listings only. Smallest number of reviews.

## `reviewCountMax` (type: `integer`):

Market listings only. Largest number of reviews.

## `amenities` (type: `array`):

Market listings only. Keep listings the provider flags with every selected amenity.

## `professionallyManaged` (type: `string`):

Market listings only. Keep only listings run by a professional management company, or only those that are not.

## `propertyManagerDomain` (type: `string`):

Market listings only. Keep listings run by the manager with this web domain.

## `superhostOnly` (type: `boolean`):

Market listings only. Keep listings whose host is an Airbnb Superhost.

## `last12moPerformanceTier` (type: `array`):

Market listings only. Keep listings the provider ranks in any selected tier, relative to their market and property type cohort.

## `last12moAdrTier` (type: `array`):

Market listings only. Keep listings the provider ranks in any selected tier, relative to their market and property type cohort.

## `next6moPerformanceTier` (type: `array`):

Market listings only. Keep listings the provider ranks in any selected tier, relative to their market and property type cohort.

## `next6moAdrTier` (type: `array`):

Market listings only. Keep listings the provider ranks in any selected tier, relative to their market and property type cohort.

## `excludeSections` (type: `array`):

Market listings only. Drop these sections from each listing to shrink the answer, for example performance for a plain supply count.

## `includeRawAmenities` (type: `boolean`):

One listing only. Add the raw amenities list the provider leaves out by default.

## `timeScale` (type: `string`):

Benchmarking only. Size of each time bucket. The provider defaults to week.

## `startDayOfWeek` (type: `string`):

Benchmarking only. First day of each weekly bucket. The provider defaults to Saturday, the usual vacation rental changeover day.

## `groupBy` (type: `string`):

Benchmarking only. Split each bucket by one dimension.

## `aggregateAreas` (type: `boolean`):

Benchmarking only. Combine all markets in a request into one result. Turn off for one set of rows per market.

## `asOfDate` (type: `string`):

Benchmarking only. Point-in-time booking snapshot (YYYY-MM-DD): what was on the books on that date. Leave blank for the latest data.

## `includeCanceled` (type: `boolean`):

Benchmarking only, with an as-of date. Include reservations canceled after the as-of date.

## `benchmarkFilters` (type: `object`):

Benchmarking only. The provider's filters object, passed exactly as written. Documented keys are bedrooms, sleeps, property\_types, amenities, locations and stay\_lengths, each as {"type": "include" or "exclude", "values": \[...]}, for example {"bedrooms": {"type": "include", "values": \[3, 4]}}.

## `maxResults` (type: `integer`):

Stop after this many rows. Market listings can run to thousands per market and a year of availability is 365 rows per listing, so this is what bounds the cost of a run.

## `requestsPerMinute` (type: `integer`):

Pacing ceiling for calls to the provider. Lower it if your plan rate limits you.

## `apiKey` (type: `string`):

Your own API key for the short-term rental market data provider, sent as the x-api-key header. This actor is bring-your-own-key and never ships a key of its own. Leave blank to use the DATA\_API\_KEY environment secret instead.

## `baseUrl` (type: `string`):

Override the host the actor calls. Only useful for testing against a different environment.

## Actor input object example

```json
{
  "service": "marketKpisMonthly",
  "marketIds": [
    "745b0198-3202-4679-83a1-faf3ccd8406c"
  ],
  "currency": "USD",
  "ota": "both",
  "sortBy": "last_12mo_revenue",
  "professionallyManaged": "either",
  "superhostOnly": false,
  "includeRawAmenities": false,
  "timeScale": "week",
  "startDayOfWeek": "saturday",
  "groupBy": "none",
  "aggregateAreas": true,
  "includeCanceled": false,
  "maxResults": 500,
  "requestsPerMinute": 30
}
```

# Actor output Schema

## `records` (type: `string`):

One row per record, alongside the market or listing that produced it.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "marketIds": [
        "745b0198-3202-4679-83a1-faf3ccd8406c"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("nabeelbaghoor/airbnb-vrbo-market-data-api").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "marketIds": ["745b0198-3202-4679-83a1-faf3ccd8406c"] }

# Run the Actor and wait for it to finish
run = client.actor("nabeelbaghoor/airbnb-vrbo-market-data-api").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "marketIds": [
    "745b0198-3202-4679-83a1-faf3ccd8406c"
  ]
}' |
apify call nabeelbaghoor/airbnb-vrbo-market-data-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nabeelbaghoor/airbnb-vrbo-market-data-api"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/kR3mCiRMAl54ayHFW/builds/F2UNokhhuGctEnxEa/openapi.json
