# Vacation Rental Dynamic Pricing and Demand API: Wheelhouse (`nabeelbaghoor/vacation-rental-dynamic-pricing-demand-api`) Actor

Vacation rental and Airbnb dynamic pricing API: daily price recommendations, base price, occupancy, ADR, RevPAR and comp set KPIs, neighborhood prices, market time series and demand signals by latitude and longitude, through the Wheelhouse API. Bring your own key.

- **URL**: https://apify.com/nabeelbaghoor/vacation-rental-dynamic-pricing-demand-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 listing or market records

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

## Vacation Rental Dynamic Pricing and Demand API: Wheelhouse

Get vacation rental and Airbnb dynamic pricing data, daily price recommendations, occupancy, ADR and RevPAR KPIs, neighborhood prices, market time series and local demand signals from Wheelhouse with your own key, as clean rows you can export to CSV, Excel or JSON.

Wheelhouse is a revenue management and dynamic pricing platform for short term rentals, used by hosts and property managers on Airbnb, Vrbo and property management systems. This actor wraps the read endpoints of the Wheelhouse Revenue Management API (your portfolio, price recommendations, base price, rolling window and monthly KPIs, neighborhood pricing and occupancy, market reports) and the Wheelhouse Demand Signal API (demand by stay date for any coordinate). Use it for revenue management dashboards, owner reporting, pricing audits, comp set and market benchmarking, demand forecasting, BI pipelines and portfolio analytics. Bring your own API key.

BYOK, not live tested: every route, parameter and response field comes from Wheelhouse's own API documentation (the OpenAPI documents behind usewheelhouse.com/api-docs), and every route was probed on 2026-10-31 with an invalid key. The actor has not been run against a live Wheelhouse key.

### What it does

- **Portfolio listings**: every listing your key can access, owned or managed, with channel and Wheelhouse IDs, address and coordinates, bedrooms, bathrooms, property type, market ID, currency, base, minimum and maximum price and automatic rate posting status.
- **Daily price recommendations**: the recommended nightly price for each stay date, up to 18 months ahead on Pro listings (30 days on free ones), with minimum stay, custom rate type, base price and, on request, the per factor price attribution (seasonality, local demand, scarcity, occupancy pacing and more).
- **Base price recommendation**: the recommended, conservative and aggressive base price, your active base price, the anchor price and a breakdown by market baseline, bedrooms, location, amenities and occupancy.
- **Rolling window KPIs**: occupancy, open occupancy, ADR, asking rate, RevPAR, revenue, bookings, lead time, length of stay, pickup, revenue score and neighborhood and comp set occupancy for 7 to 365 day windows, past and future.
- **Monthly KPIs**: per month listing and comp set ADR, occupancy, RevPAR, revenue and lead time, 15 months back and forward.
- **Neighborhood pricing and occupancy**: the daily median, p25 and p75 nightly price of comparable listings near each listing, and daily neighborhood occupancy with expected and observed bookings.
- **Market list and market time series**: the Wheelhouse markets you hold Pro listings in, then daily market occupancy, ADR, RevPAR, asking rate, revenue, lead time and bookable nights, filtered by bedroom group, property type and performance tier.
- **Demand signal**: a demand index per stay date for any latitude and longitude (below 1.0 low, 1.0 average, above 1.0 high), blending asking prices and booking pace.
- **Two row layouts** for daily modes: one row per date, or one row per listing, market or location with every date plus min, max and mean.
- **Read only and pay only for results**: nothing is ever written to your Wheelhouse account, and empty answers and refused lookups become a free row that says why.

### How to get your own key

1. Sign in to, or sign up for, Wheelhouse at app.usewheelhouse.com and connect your listings. Pro tier listings unlock 18 month recommendations and market reports.
2. In your account settings open **Api Key** and create a Revenue Management API key. Each user can hold up to 5 active keys, and a read only key is enough for this actor.
3. Paste it into the **Wheelhouse RM API key** field, or set the DATA_API_KEY environment secret.
4. For the demand signal mode, ask Wheelhouse (tech-support@usewheelhouse.com) for a Demand Signal integration key and paste it into the **Demand Signal integration key** field.
5. Run the **Portfolio listings** mode first: the `listingId` and `channel` (or `wheelhouseId`) and `marketId` it returns are what the other modes take.

### Input

| Field | Modes | Notes |
| --- | --- | --- |
| `mode` | all | `listings`, `priceRecommendations`, `basePriceRecommendation`, `listingKpis`, `monthlyKpis`, `neighborhoodPricing`, `neighborhoodOccupancy`, `markets`, `marketTimeSeries`, `demandSignal` |
| `listingIds` | listing modes | one `channel:id` per line, such as `airbnb:12345678`, or a bare ID read under `channel` |
| `channel` | listing modes | channel for bare IDs; `wheelhouse` (default) reads them as Wheelhouse listing IDs |
| `allListings` | listing modes | with no IDs, read the portfolio first (free) and then every listing, up to 1,000 |
| `includeInactive`, `includeManagedListings`, `ownerUserId` | listings, All listings | portfolio filters |
| `includePhotos` | listings | add photo URLs |
| `currency` | price, base price | ISO-4217 code to convert to |
| `attribution`, `priceModel` | price recommendations | per factor attribution; `current` or `opt_in` model |
| `countryCode` | markets, demand | ISO-3166 code, default US |
| `marketIds` | market time series | market IDs from the market list or a listing |
| `metrics`, `startDate`, `endDate`, `performance`, `bedrooms`, `propertyType` | market time series | documented filters |
| `locations` | demand signal | `latitude,longitude` or `latitude,longitude,CC` per line |
| `baths`, `guestsIncluded` | demand signal | property size, API defaults 1 and 2 |
| `rowLayout` | daily modes | `days` or `series` |
| `maxResults` | all | most rows returned and charged, default 500 |
| `requestsPerMinute` | all | pacing, default 50 (RM) or 20 (demand) |
| `apiKey`, `demandApiKey` | all, demand | your keys, stored as secrets |

### Output

One row per date by default. Illustrative price recommendation row (shape from Wheelhouse's documented response, values made up, not a live response):

```json
{
    "mode": "priceRecommendations",
    "recordType": "day",
    "found": true,
    "query": "airbnb:12345678",
    "listingId": "12345678",
    "channel": "airbnb",
    "marketId": null,
    "date": "2026-11-14",
    "currency": "USD",
    "price": 245,
    "minStay": 2,
    "customType": null,
    "basePrice": 210,
    "basePriceRecommended": 215,
    "note": null,
    "values": { "stay_date": "2026-11-14", "price": 245, "currency": "USD", "min_stay": 2, "custom_type": null }
}
```

Neighborhood pricing rows fill `medianPrice`, `lowPrice`, `highPrice` and `listingsCount`; neighborhood occupancy rows `occupancy`, `adjustedOccupancy`, `expectedBookings`, `observedBookings` and `calendarNights`; market time series rows `occupancy`, `adjustedOccupancy`, `askingRateWithFees`, `adrWithFees`, `revparWithFees`, `revenueWithFees`, `leadTime` and `nightsBookable`; demand rows `demand` and `demandLevel` (low, average, high); monthly rows `occupancy`, `adr`, `revenue`, `revpar`, `compSetOccupancy` and `compSetAdr`. KPI rows flatten the 30 day windows (`occupancyNext30`, `occupancyPast30`, `adrNext30`, `revenuePast30`, `revparPast30` and more) and keep every window in `kpis`. Listing rows carry `wheelhouseId`, `title`, `address`, `latitude`, `longitude`, `bedrooms`, `propertyType`, `basePrice`, `minPrice`, `maxPrice` and `values`. In the `series` layout each row adds `pointCount`, `firstDate`, `lastDate`, `stats` (min, max and mean per value), `primaryField`, `primaryMean`, `primaryMin`, `primaryMax` and `points`; demand series also count `highDemandDays` and `lowDemandDays`.

### Pricing

Pay per event, only for rows that carry real Wheelhouse data:

| Event | Price |
| --- | --- |
| Listing or market record | $0.005 |
| Daily price, market, demand or monthly KPI row | $0.005 |
| Listing KPI snapshot or base price recommendation | $0.01 |
| Whole daily series for one listing, market or location (series layout) | $0.02 |

Your Wheelhouse plan, and any usage budget you set on your RM key, apply on top. Each listing, market or location is one Wheelhouse request whatever the layout, and the portfolio read behind All listings is never charged. For 18 months of daily prices across a portfolio, the series layout is far cheaper than one row per date.

### FAQ

#### What is the Wheelhouse API?

Wheelhouse offers a Revenue Management API (beta) that gives programmatic access to the same dynamic pricing data as the Wheelhouse app: listings, daily price recommendations, base price options, KPIs, neighborhood data and market reports, plus a separate Demand Signal API that scores demand by stay date for any location. Both are served from api.usewheelhouse.com.

#### Do I need my own Wheelhouse API key?

Yes. This actor is bring your own key: it sends your RM API key (or Demand Signal integration key) in the X-Integration-Api-Key header to api.usewheelhouse.com and never stores or logs it. Without a key the run ends cleanly with a message saying how to add one.

#### Can this actor change my prices?

No. It calls only documented GET endpoints. Price settings, custom rates, preferences, tags, notes, sets and webhooks are never touched, so a read only RM key is all it needs.

#### What does the demand signal mean?

It is a demand index per future stay date for a location: below 1.0 is lower than usual demand, 1.0 average and above 1.0 higher than usual, blending asking prices and booking pace in the local market. Use it to spot events and peak dates before you price them.

#### Which listing ID do I use?

Either the channel listing ID with its channel (`airbnb:12345678`), or the Wheelhouse listing ID with the channel `wheelhouse`. Both come from the Portfolio listings mode. Or tick All listings and the actor finds them itself.

#### Why does the market time series refuse my market?

Wheelhouse opens a market report only to accounts holding at least one Pro tier listing in that market. The market list mode shows exactly which markets your key can read.

#### How far ahead do price recommendations go?

18 months for Pro listings and a 30 day preview for free listings, starting today. Monthly KPIs cover up to 15 months back and forward; market time series reach 3 years back and 1 year ahead.

#### What do I pay?

$0.005 per listing, market or dated row, $0.01 per KPI snapshot or base price recommendation, and $0.02 per whole series row, plus your own Wheelhouse plan. Refused and empty lookups are free.

### Keyword map

vacation rental pricing API, Airbnb dynamic pricing API, short term rental revenue management API, STR price recommendations, Wheelhouse API, base price recommendation, Airbnb occupancy ADR RevPAR data, comp set benchmarking, neighborhood nightly price data, vacation rental market data, STR demand forecast, demand signal API, Vrbo pricing data, property manager revenue dashboard.

### Routes and verification

| Mode | Route | Probe with invalid key (twice) |
| --- | --- | --- |
| Portfolio listings | GET /ss_api/v1/listings | 401 {"error":"Unauthenticated"} |
| Price, base price, KPI and neighborhood modes | GET /ss_api/v1/listings/{listing_id}/price_recommendations, /base_price_recommendation, /kpis, /kpis/monthly, /neighborhood/pricing, /neighborhood/occupancy | 401 on neighborhood/pricing |
| Market list | GET /ss_api/v1/market_report | 401 |
| Market time series | GET /ss_api/v1/market_report/{market_id}/time_series | same API, same key gate |
| Demand signal | GET /ss_api/v1/demand_signal/ | 401 |
| Invented control routes | GET /ss_api/v1/market_forecast, /ss_api/v1/listings/12345/comp_prices | 404 {"error":"Not Found"} |

Every request sends the key in the documented `X-Integration-Api-Key` header, never in a URL or a log line. The Wheelhouse Pro API (integration plus user keys) and Wheelhouse Lite API are partner integration APIs and are not wrapped; nor are the Market and Comps data feeds, which Wheelhouse delivers by arrangement.

### Licensing and data use

This actor works only with your own Wheelhouse key, and your agreement with Wheelhouse applies. The Wheelhouse Terms of Service let you share your RM API keys with third parties, with you remaining responsible for their usage and billing, and set no cache or retention limit on API results; the general license to Wheelhouse content is for your own use, and the terms bar mirroring Wheelhouse content on other sites. Keep the data for your own revenue management and reporting. This actor is not affiliated with or endorsed by Wheelhouse.

# Actor input Schema

## `mode` (type: `string`):

Each mode calls one documented read endpoint of the Wheelhouse Revenue Management API, or the Demand Signal API. Listing modes take listing IDs (or All listings); the market time series takes market IDs; the demand signal takes coordinates. Nothing is ever written to your Wheelhouse account.

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

Listing modes. One listing per line as channel:id with the id and channel from the listings mode (such as airbnb:12345678 or vrbo:321.4567), or a bare ID read under the channel below. A Wheelhouse listing ID works with the channel wheelhouse.

## `channel` (type: `string`):

Listing modes. The channel a bare listing ID is read under: wheelhouse (the default) reads it as a Wheelhouse listing ID; otherwise the channel field from the listings mode, such as airbnb.

## `allListings` (type: `boolean`):

Listing modes. When no listing IDs are given, read the portfolio first (not charged) and then every listing in it, up to 1,000.

## `includeInactive` (type: `boolean`):

Listings mode and All listings. Also return inactive listings; hidden listings are returned either way.

## `includeManagedListings` (type: `boolean`):

Listings mode and All listings. Include listings you manage for another Wheelhouse account through shared access, not only your own.

## `includePhotos` (type: `boolean`):

Listings mode. Add the URL of each listing photo to the listing record.

## `ownerUserId` (type: `integer`):

Optional, listings mode and All listings. Return only the listings of this Wheelhouse user, such as a team you belong to.

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

Optional, price and base price modes. ISO-4217 code such as USD, EUR or GBP to convert prices to; the listing currency by default.

## `attribution` (type: `boolean`):

Price recommendations mode. Add the per factor attribution of each daily price: seasonality, local demand, availability, time, day of week, scarcity, occupancy pacing, historical anchoring, restrictions and your adjustments.

## `priceModel` (type: `string`):

Optional, price recommendations mode. The price model version to read; empty uses the model active for the listing.

## `countryCode` (type: `string`):

Market list mode (required) and demand signal mode. 2 letter ISO-3166 code such as US, GB, FR or ES. A demand location line may carry its own code instead.

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

Market time series mode. One Wheelhouse market ID per line, from the market list mode or the market_id of a listing. Only markets where you hold a Pro listing are readable.

## `metrics` (type: `array`):

Optional, market time series mode. Metrics to return; empty returns all.

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

Optional, market time series mode. yyyy-mm-dd, within 3 years back and 1 year ahead; today by default.

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

Optional, market time series mode. yyyy-mm-dd after the start date; one year from today by default.

## `performance` (type: `string`):

Optional, market time series mode. Limit the market to listings of one performance tier.

## `bedrooms` (type: `string`):

Optional, market time series mode. A bedroom group of the market such as 0, 1, 2 or 6+; groups differ by market, and a group the market lacks is refused with the groups it has.

## `propertyType` (type: `string`):

Optional, market time series mode. Limit the market to one property type.

## `locations` (type: `array`):

Demand signal mode. One latitude,longitude pair in decimal degrees per line, optionally followed by a country code, such as 34.0522,-118.2437,US or 41.3874,2.1686,ES.

## `baths` (type: `integer`):

Optional, demand signal mode. Bathrooms of the property, 1 to 10; the API default is 1.

## `guestsIncluded` (type: `integer`):

Optional, demand signal mode. Guests included in the nightly price; the API default is 2.

## `rowLayout` (type: `string`):

Daily modes. One row per stay date (or month), or one row per listing, market or location holding every date with point count, first and last date, and min, max and mean per value.

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

The most rows this run returns and charges for. Price recommendations for a Pro listing run about 540 daily rows; a market year is 365.

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

Pacing for calls to Wheelhouse. Empty means 50 for the RM API (its default limit is 60) and 20 for the Demand Signal API. Throttled calls are retried after the Retry-After pause.

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

Your Revenue Management API key from your Wheelhouse account settings (Api Key). Stored as a secret, sent only in the X-Integration-Api-Key header to api.usewheelhouse.com and never logged. You can instead set the DATA_API_KEY environment secret.

## `demandApiKey` (type: `string`):

Optional, demand signal mode. The integration key Wheelhouse issued you for the Demand Signal API; when empty the RM API key is tried.

## Actor input object example

```json
{
  "mode": "listings",
  "channel": "wheelhouse",
  "allListings": false,
  "includeInactive": false,
  "includeManagedListings": true,
  "includePhotos": false,
  "attribution": false,
  "priceModel": "",
  "countryCode": "US",
  "performance": "",
  "propertyType": "",
  "rowLayout": "days",
  "maxResults": 500
}
```

# Actor output Schema

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

One row per listing, market, date, month or series the chosen mode read.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("nabeelbaghoor/vacation-rental-dynamic-pricing-demand-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("nabeelbaghoor/vacation-rental-dynamic-pricing-demand-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 '{}' |
apify call nabeelbaghoor/vacation-rental-dynamic-pricing-demand-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nabeelbaghoor/vacation-rental-dynamic-pricing-demand-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/uWEIu8gsr69dLXiBX/builds/t2cccQaxVbgkg8JFo/openapi.json
