Wheelhouse Revenue Management API (v1.0 (beta))

Download OpenAPI specification:

Overview

The Wheelhouse Revenue Management API provides direct access to price recommendations, listing preferences, custom rates, reservations, and portfolio management for Revenue Management integrations.

Beta Status

This API is currently in beta. The interface and response formats may change in future versions.

Authentication

MCP and AI agents

When using this API through the Wheelhouse MCP server, authenticate with OAuth (WorkOS AuthKit). Sign in with your Wheelhouse account through your MCP client's OAuth flow — the same credentials you use in the Wheelhouse app.

Do not send an RM API key yourself. The MCP server validates your OAuth token, resolves your user-specific RM API key, and attaches it as X-Integration-Api-Key on every upstream request. Your OAuth token is never forwarded to the RM API.

Direct API integrations

For HTTP integrations that call the RM API directly, send an RM API key in the X-Integration-Api-Key header. You can generate this in your Wheelhouse account under "Api Key".

The RM API key is a single key that authenticates both the integration and user context — no separate user key is required.

Read-only API keys

Keys configured as read-only may use the HTTP methods GET, HEAD, OPTIONS, and POST only. PUT and DELETE requests return 403 Forbidden with a message that the API key is read-only (other disallowed methods do as well). POST endpoints that create or modify data (such as creating a note) also return 403 Forbidden for read-only keys; only non-mutating POST endpoints (such as previews) are allowed.

Pagination

List endpoints that return large result sets support pagination via the page, per_page, and offset query parameters. per_page controls how many items are returned per page (up to 100). Use page (1-based) or offset (0-based item skip count) to advance through the result set — do not use both in the same request. Iterate by incrementing page until a response returns fewer items than per_page.

Rate Limits

RM API keys are rate-limited to 20 requests per minute by default. Exceeding this limit returns 429 Too Many Requests. The limit resets on a rolling one-minute window.

If you receive a 429, wait before retrying. The recommended strategy is exponential backoff: after the first failure wait 1 second, then double the delay on each subsequent retry (2 s, 4 s, 8 s, …), up to a reasonable maximum (e.g. 60 seconds). Adding a small random jitter (±10–20% of the wait time) prevents multiple concurrent clients from retrying in lockstep.

If your integration regularly reaches the limit, consider batching requests (e.g. using GET /preferences or PUT /preferences for multiple listings at once) or contact Wheelhouse to discuss a higher limit.

Identifying Listings

Most endpoints require a listing_id and channel path or query parameter to identify the listing a request is being made for. Both values come from the GET /listings endpoint (see Listings):

  • listing_id — use the id field from the listing object.
  • channel — use the channel field from the same listing object.

A typical flow is to call GET /listings once to build a local map of your listings, then use the id and channel values from that map for all subsequent listing-specific calls.

Multi-Unit Listings

Some listings represent a single bookable property that has multiple independently bookable units underneath it — for example, a building with several apartments, or a property with a main house and a guest cottage managed as one listing. These are called multi-unit listings.

You can identify a multi-unit listing by the number_of_active_units field on the listing object (returned by GET /listings and GET /listings/{listing_id}). A non-null value indicates a multi-unit listing; null indicates a standard single-unit listing.

For endpoints that return per-date data (such as GET /listings/{listing_id}/price_calendar and GET /listings/{listing_id}/last_posted_prices), multi-unit listings return one row per unit per date. Each row includes a unit_number field (a positive integer starting at 1) that identifies which unit the row belongs to. Single-unit listings always return unit_number: 0.

When processing calendar data for a multi-unit listing, group rows by unit_number to get the per-unit availability and pricing. Preferences and settings (fetched via GET /preferences/{listing_id}) apply at the listing level and are shared across all units.

Listings

Read listing data and metadata. The RM API provides read-only access to listings.

Retrieve all listings for the authenticated user.

By default, returns only listings owned by the authenticated user (connected via their channel accounts). Set include_managed_listings to true to also return listings they have been granted access to manage in Wheelhouse (shared / delegated access on another user's listings), alongside owned listings.

Authorizations:
RmApiKey
query Parameters
exclude_inactive
boolean
Default: true

Exclude inactive listings from the response.

include_managed_listings
boolean
Default: false

When true, includes listings the user manages for another Wheelhouse account (valid shared-access grants), in addition to listings they own. When false (default), only owned listings are returned.

per_page
integer [ 1 .. 100 ]
Default: 50

Number of listings per page.

page
integer

Page number to retrieve.

offset
integer

Number of items to skip before starting to collect the result set.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get a single listing.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "channel": "string",
  • "wheelhouse_id": 0,
  • "title": "string",
  • "nickname": "string",
  • "description": "string",
  • "location": {
    },
  • "num_bedrooms": 0,
  • "num_beds": 0,
  • "num_bathrooms": 0,
  • "room_type": "string",
  • "property_type": "string",
  • "currency": "string",
  • "star_rating": 0,
  • "num_reviews": 0,
  • "num_photos": 0,
  • "thumb_url": "string",
  • "access_level": "owner",
  • "amenities": [
    ],
  • "owner_name": "string",
  • "source_user_id": "string",
  • "channel_ids": {
    },
  • "links": {
    },
  • "security_deposit": 0,
  • "base_min_night_stay": 0,
  • "listing_preferences": { },
  • "market_id": 0,
  • "is_active": true,
  • "wheelhouse_created_at": "string",
  • "number_of_active_units": 0
}

Get the pricing tier for a listing.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

Responses

Response samples

Content type
application/json
{
  • "name": "Free",
  • "horizon": 0
}

Get times of latest changes for a listing.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

Responses

Response samples

Content type
application/json
{
  • "settings": "2019-08-24T14:15:22Z",
  • "rates": "2019-08-24T14:15:22Z"
}

Trigger a manual sync for a listing.

Enqueues a price-posting job that pushes the latest Wheelhouse price recommendations to the connected channel and refreshes reservation data. Equivalent to clicking the Sync button in the Wheelhouse UI.

Plan requirement: Manual syncs are only available on paid (Pro) plans. Listings on free or onboarding plans will receive 429 Too Many Requests.

Rate limit: The number of syncs allowed per day is determined by the listing's pricing plan. Returns 429 Too Many Requests when the daily limit is exceeded.

Debounce: To prevent duplicate jobs from stacking up, if another sync for the same listing was requested within the last 60 seconds, the endpoint returns 423 Locked. Wait at least 60 seconds before retrying.

The request returns 202 Accepted immediately — the sync runs asynchronously in the background. Use GET /listings/{listing_id}/pricing_tier or poll the Wheelhouse dashboard to confirm when the sync has completed.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

Responses

Get rolling-window KPIs for a listing.

Returns rolling-window performance metrics. Each metric is an object keyed by period strings such as "0_7" (next 7 days), "0_30" (next 30 days), "30_0" (past 30 days), etc.

Bidirectional metrics (periods 7/14/21/30/60/90/180/365, both past and future): occupancy, occupancy_adjusted, adr, asking_rate, revenue, revpar, revpar_fees, revpar_adjusted_occupancy, revpar_adjusted_occupancy_fees, bookings.

Forward-only metrics (periods 7/14/21/30/60/90/180/365, future only): nights_available, nights_blocked, revenue_available, revenue_blocked, min_price_occurrence, occupancy_neighborhood, occupancy_neighborhood_pp, occupancy_neighborhood_ratio, occupancy_neighborhood_adjusted, occupancy_neighborhood_adjusted_pp, occupancy_neighborhood_adjusted_ratio.

Comp-set metrics (periods 7/30/60, forward only): comp_set_occupancy, comp_set_occupancy_adjusted, comp_set_revenue.

Backward-only, limited periods: pickup (periods 7/14/30), asking_rate_lowest and asking_rate_highest (period 365 only).

Non-overlapping forward windows: revenue_score (windows 0–30, 31–60, 61–90 days).

Scalars: comp_set_count.

All metric fields are null when no KPIs have been generated yet for the listing. All monetary values are in the listing's currency.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

Responses

Response samples

Content type
application/json
{
  • "currency": "USD",
  • "model_date": "2019-08-24",
  • "last_booked_at": "2019-08-24T14:15:22Z",
  • "adr": {
    },
  • "asking_rate": {
    },
  • "asking_rate_highest": {
    },
  • "asking_rate_lowest": {
    },
  • "bookings": {
    },
  • "comp_set_count": 0,
  • "comp_set_occupancy": {
    },
  • "comp_set_occupancy_adjusted": {
    },
  • "comp_set_revenue": {
    },
  • "min_price_occurrence": {
    },
  • "nights_available": {
    },
  • "nights_blocked": {
    },
  • "occupancy": {
    },
  • "occupancy_adjusted": {
    },
  • "occupancy_neighborhood": {
    },
  • "occupancy_neighborhood_adjusted": {
    },
  • "occupancy_neighborhood_adjusted_pp": {
    },
  • "occupancy_neighborhood_adjusted_ratio": {
    },
  • "occupancy_neighborhood_pp": {
    },
  • "occupancy_neighborhood_ratio": {
    },
  • "pickup": {
    },
  • "revenue": {
    },
  • "revenue_available": {
    },
  • "revenue_blocked": {
    },
  • "revenue_score": {
    },
  • "revpar": {
    },
  • "revpar_adjusted_occupancy": {
    },
  • "revpar_adjusted_occupancy_fees": {
    },
  • "revpar_fees": {
    }
}

Get monthly historical stats for a listing.

Returns monthly historical performance stats, ordered oldest-to-newest. Includes comp-set metrics. Up to 15 months of history.

All monetary values are in the listing's currency.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

Responses

Response samples

Content type
application/json
{
  • "currency": "USD",
  • "data": [
    ]
}

Get quarterly historical stats for a listing.

Returns quarterly historical performance stats, ordered oldest-to-newest. Up to 5 recent quarters of history.

All monetary values are in the listing's currency.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

Responses

Response samples

Content type
application/json
{
  • "currency": "USD",
  • "data": [
    ]
}

Get yearly historical stats for a listing.

Returns yearly historical performance stats, ordered oldest-to-newest. Up to 5 years of history.

All monetary values are in the listing's currency.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

Responses

Response samples

Content type
application/json
{
  • "currency": "USD",
  • "data": [
    ]
}

Recommendations

Retrieve Wheelhouse price recommendations, base price suggestions, check-in/check-out calendars, min/max price calendars, and monthly seasonality factors.

Get daily price recommendations for a listing.

Returns most up-to-date price recommendations for the listing. The horizon of the price recommendations depends on the pricing tier this listing is in and can be queried using the pricing tier endpoint. Free listings get a preview horizon of 30 days, while Pro listings get 18 months. The data array starts from today's date and is returned in chronological order.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

currency
string

ISO-4217 3-letter currency code (e.g. 'USD', 'GBP') to convert prices to. Uses listing's currency by default.

attribution
boolean
Default: false

When true, includes detailed per-factor price attribution fields (attr_*) in each day's recommendation.

price_model
string
Enum: "current" "opt_in"

The price model version to use. If omitted, uses the price model currently active for the listing.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "base_price": 0,
  • "base_price_recommended": 0,
  • "base_price_conservative": 0,
  • "base_price_aggressive": 0,
  • "global_min_stay": 0,
  • "automatic_rate_posting_enabled": true
}

Preview price recommendations for a listing with hypothetical preference changes.

Returns price recommendations as if the provided preferences were applied to the listing, without actually saving any changes.

The response format is identical to GET /listings/{listing_id}/price_recommendations, except that global_min_stay and automatic_rate_posting_enabled are not included.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

Request Body schema: application/json
required
automatic_rate_posting_enabled
boolean

Whether Wheelhouse automatically posts its price recommendations to the channel calendar. When false, recommendations are computed but not pushed to the channel. This setting does not affect custom rates set via the API — those are posted independently.

base_price
integer or null >= 1

The manually set base price. If set, overrides Wheelhouse's data-driven recommendation. Must be a whole number of at least 1.

base_price_adjustment
number or null

A percentage adjustment to the Wheelhouse recommended base price. Only used if base_price is not set. Cannot be 0.

monthly_discount
integer or null
Default: 0

Monthly discount percentage as an integer in the range 0–100 (e.g. 5 = 5%). Applied to bookings ≥ 28 nights. Kept in sync with the global rule in long_term_discounts.rules['28'] — setting one automatically updates the other. When both are sent in the same PUT, long_term_discounts takes precedence.

weekly_discount
integer or null
Default: 0

Weekly discount percentage as an integer in the range 0–100 (e.g. 5 = 5%). Applied to bookings ≥ 7 nights. Kept in sync with the global rule in long_term_discounts.rules['7'] — setting one automatically updates the other. When both are sent in the same PUT, long_term_discounts takes precedence.

nickname
string or null

Listing nickname. Overrides the listing's default nickname.

object or null

UI: 'Last minute' — Last-minute discount configuration.

object or null

UI: 'Far future' — Far-future premium configuration.

object or null

UI: 'Seasonality' — Seasonality adjustment configuration.

object or null

Day-of-week pricing factor configuration.

object or null

Gap night pricing strategy (UI: 'Gaps & Adjacencies' in the Pricing Engine panel). Controls the price multiplier for gap nights between bookings. When type is CUS, provide custom rules; the server rejects CUS without custom. This is a pricing-only setting. It is unrelated to the gap and adjacency/one_sided_gap rule types in minimum_stay_rules_v3, which control minimum stay behavior for gap nights.

Array of any (integer_calendar_rule)
Default: []

UI: 'Minimum stays' — minimum stay rules. The _v3 suffix is a stable historical identifier; this field name is not expected to change.

min_stays_enabled
boolean

Whether minimum stay rules are enabled.

Array of any
Default: []

UI: 'Minimum prices' — Minimum price rules. Valid rule types: global, time_based, seasonal, event, monthly, day_of_week, custom. The _v3 suffix is a stable historical identifier; this field name is not expected to change.

Array of any
Default: []

UI: 'Maximum prices' — Maximum price rules. Valid rule types: global, time_based, seasonal, event, monthly, day_of_week, custom. The _v3 suffix is a stable historical identifier; this field name is not expected to change.

object or null

Check-in/check-out rule configuration identifier.

object
Default: {"active":false,"weekly_rules":[],"monthly_rules":[],"rules":{}}

Rule-based long-term discount configuration.

object or null
Default: {}

Occupancy pacing configuration. When occupancy_pacing is sent as a non-empty object, both adjusted and pacing are required.

Array of any
Default: []

Demand sensitivity rules. Valid rule types: global, time_based, seasonal, event, monthly, day_of_week, custom.

Array of any
Default: []

Historical anchoring rules. Valid rule types: global, time_based, seasonal, event, monthly, day_of_week, custom.

Array of objects (custom_date_range)
Default: []

Represents an Event or Season entry used by the Wheelhouse Events & Seasons feature. Calendar rules reference these entries by id to apply settings (e.g. min stay, pricing) over named date windows.

Each listing stores its own copy of every Event or Season it belongs to. Entries for the same event or season share the same id across listings — this shared id is what enables bulk adjustments in the Wheelhouse UI. If you write a custom_date_ranges entry with a new or changed id, that listing's entry is no longer linked to the others and will not be included in future bulk edits of the original Event or Season.

To safely modify an event or season's definition (dates or name) on one listing without affecting others, omit the id field — the server assigns a new independent ID scoped to that listing. To update only a rule value (e.g. raise the minimum price) without changing dates, include the existing id unchanged.

A new custom_date_ranges entry and a rule referencing it can be submitted in the same PUT request. Manually assign an id on the new entry so that the referencing rule can use it in the same payload. Alternatively, use two sequential PUTs: the first PUT creates the entry without an id (the server assigns one, returned in the response); the second PUT adds the rule referencing that server-assigned id.

min_min_price
integer
Default: 0

UI: 'Absolute minimum price' — Hard lower bound that overrides all pricing rules. No recommended price will fall below this value regardless of any rule configuration. Distinct from a global rule in minimum_price_rules_v3, which can be overridden by higher-priority rules. Must be an integer (whole currency units).

min_min_stay
integer
Default: 0

UI: 'Absolute minimum stay' — Hard lower bound that overrides all minimum stay rules. No minimum stay will be set below this value regardless of any rule configuration. Distinct from both a global rule in minimum_stay_rules_v3 (which can be overridden by higher-priority rules) and from global_min_stay in the price recommendations response (which reflects the current effective default rule value, not a hard floor).

apply_gap_night_rules_to_overrides
boolean

UI: 'Apply Gap Night Rules to Overrides' — When true, gap-night minimum stay rules take priority over custom (date override) rules. When false (default), custom rules win over gap-night rules.

price_model
string
Enum: "current" "opt_in"

The price model version to use. If omitted, uses the price model currently active for the listing.

Responses

Request samples

Content type
application/json
{
  • "automatic_rate_posting_enabled": true,
  • "base_price": 1,
  • "base_price_adjustment": 0,
  • "monthly_discount": 0,
  • "weekly_discount": 0,
  • "nickname": "string",
  • "last_minute_discount": {
    },
  • "far_future_premium": {
    },
  • "seasonality_adjustment": {
    },
  • "day_of_week": {
    },
  • "gap_night": {
    },
  • "minimum_stay_rules_v3": [ ],
  • "min_stays_enabled": true,
  • "minimum_price_rules_v3": [ ],
  • "maximum_price_rules_v3": [ ],
  • "checkin_checkout": {
    },
  • "long_term_discounts": {
    },
  • "occupancy_pacing": { },
  • "demand_sensitivity_rules": [ ],
  • "historical_anchoring_rules": [ ],
  • "custom_date_ranges": [ ],
  • "min_min_price": 0,
  • "min_min_stay": 0,
  • "apply_gap_night_rules_to_overrides": true,
  • "price_model": "current"
}

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "base_price": 0,
  • "base_price_recommended": 0,
  • "base_price_conservative": 0,
  • "base_price_aggressive": 0
}

Get base price recommendation options for a listing.

Returns recommended, conservative, and aggressive base prices, the listing's active base price, anchoring fields (anchor_price, anchor_credibility), and a consolidated base_price_attribution object aligned with the Wheelhouse app Recommended Breakdown.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

currency
string

ISO-4217 3-letter currency code (e.g. 'USD', 'GBP') to convert prices to. Uses listing's currency by default.

Responses

Response samples

Content type
application/json
{
  • "base_price_recommended": 0,
  • "base_price_conservative": 0,
  • "base_price_aggressive": 0,
  • "base_price_selected": 0,
  • "anchor_credibility": 100,
  • "anchor_price": 0,
  • "base_price_attribution": {
    },
  • "currency": "string"
}

Get check-in/check-out calendar for a listing.

Returns a daily calendar of check-in and check-out rules. Returns 204 if check-in/check-out rules are not configured for the listing.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Get minimum and maximum price calendar for a listing.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Get recommended monthly seasonality adjustment factors for a listing.

Returns conservative (CON), recommended (REC), and aggressive (AGG) seasonality multipliers grouped by month number (1–12).

The factors represent the average seasonality multiplier for each month based on market data and can be used to understand seasonal pricing patterns.

A factor of 1.0 means no seasonal adjustment, values above 1.0 indicate higher demand periods, and values below 1.0 indicate lower demand periods.

The three levels differ in how much they amplify the seasonality signal:

  • CON: 80% of the base seasonality variation
  • REC: 100% of the base seasonality variation
  • AGG: 120% of the base seasonality variation
Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

Responses

Response samples

Content type
application/json
{
  • "CON": {
    },
  • "REC": {
    },
  • "AGG": {
    }
}

Get the base price recommendation history for a listing.

Returns a daily log of Wheelhouse base price recommendations and settings for the listing. Each record reflects the model's recommendation, any adjustments applied, and the effective base price used on that day.

Defaults to the last 30 days when start_date and end_date are omitted.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

start_date
string <date>

First model date to include (YYYY-MM-DD). Defaults to 30 days before end_date.

end_date
string <date>

Last model date to include (YYYY-MM-DD). Defaults to today.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Listing Preferences

Read and update detailed pricing preferences for listings, including base price, seasonality, discounts, min stay rules, and more.

Note: These preferences are called "Settings" in the Wheelhouse app.

UI settings panel groups

The Wheelhouse Settings panel organizes preferences into labeled groups. The table below maps each group to its corresponding API fields.

UI Group UI Setting Name API Field(s)
Pricing Engine Base price base_price, base_price_adjustment
Pricing Engine Seasonality seasonality_adjustment
Pricing Engine Day of week day_of_week
Pricing Engine Last minute last_minute_discount
Pricing Engine Far future far_future_premium
Pricing Engine Gaps & Adjacencies gap_night
Model Weights Demand sensitivity demand_sensitivity_rules
Model Weights Historical anchoring historical_anchoring_rules
Limits Maximum prices maximum_price_rules_v3
Limits Minimum prices minimum_price_rules_v3, min_min_price
Operations Minimum stays minimum_stay_rules_v3, min_min_stay
Operations Length of stay pricing long_term_discounts, weekly_discount, monthly_discount
Calendar Pacing Occupancy pacing occupancy_pacing
Configuration Events & Seasons custom_date_ranges

Retrieve preferences for a batch of listings.

Authorizations:
RmApiKey
query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

listing_ids
Array of strings

Array of integration listing IDs to retrieve preferences for. Send as repeated query parameters: ?listing_ids=A&listing_ids=B. If omitted, returns an empty array — it does not default to all listings. Always provide explicit listing IDs. This endpoint has no pagination; all matched preferences are returned in a single response.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Update preferences for a batch of listings.

Updates pricing preferences for multiple listings in one request.

Returns status 207 if some updates failed, 424 if all updates failed.

All fields are optional; only provided fields will be updated. This partial-update behavior applies at the top level only — omitting a field (e.g. minimum_stay_rules_v3) leaves it unchanged, but providing a field that holds an array of rules (e.g. minimum_price_rules_v3) will completely replace the existing rule set for that field; individual rules within an array cannot be merged or patched. Always fetch the current preferences before writing and include every rule you wish to retain — any rules omitted from an array will be permanently deleted.

Authorizations:
RmApiKey
query Parameters
channel
required
string

Channel name the listings are on. See return value of the /listings endpoint.

Request Body schema: application/json
required
required
Array of objects

Responses

Request samples

Content type
application/json
{
  • "listing_preferences": [
    ]
}

Response samples

Content type
application/json
{
  • "updated_preferences": [
    ]
}

Get preferences for a listing.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

Responses

Response samples

Content type
application/json
{
  • "listing_id": 0,
  • "partner_listing_id": "string",
  • "currency": "string",
  • "automatic_rate_posting_enabled": true,
  • "base_price": 0,
  • "base_price_adjustment": 0,
  • "monthly_discount": 0,
  • "weekly_discount": 0,
  • "nickname": "string",
  • "last_minute_discount": {
    },
  • "far_future_premium": {
    },
  • "seasonality_adjustment": {
    },
  • "day_of_week": {
    },
  • "gap_night": {
    },
  • "minimum_stay_rules_v3": [ ],
  • "min_stays_enabled": true,
  • "minimum_price_rules_v3": [ ],
  • "maximum_price_rules_v3": [ ],
  • "checkin_checkout": {
    },
  • "long_term_discounts": {
    },
  • "occupancy_pacing": { },
  • "demand_sensitivity_rules": [ ],
  • "historical_anchoring_rules": [ ],
  • "custom_date_ranges": [ ],
  • "min_min_price": 0,
  • "min_min_stay": 0,
  • "apply_gap_night_rules_to_overrides": true,
  • "update_from": "string",
  • "update_from_id": 0,
  • "created_at": "string",
  • "updated_at": "string"
}

Update preferences for a listing.

Updates pricing preferences for a listing.

All fields are optional; only provided fields will be updated. This partial-update behavior applies at the top level only — omitting a field (e.g. minimum_stay_rules_v3) leaves it unchanged, but providing a field that holds an array of rules (e.g. minimum_price_rules_v3) will completely replace the existing rule set for that field; individual rules within an array cannot be merged or patched. Always fetch the current preferences before writing and include every rule you wish to retain — any rules omitted from an array will be permanently deleted.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

Request Body schema: application/json
required
automatic_rate_posting_enabled
boolean

Whether Wheelhouse automatically posts its price recommendations to the channel calendar. When false, recommendations are computed but not pushed to the channel. This setting does not affect custom rates set via the API — those are posted independently.

base_price
integer or null >= 1

The manually set base price. If set, overrides Wheelhouse's data-driven recommendation. Must be a whole number of at least 1.

base_price_adjustment
number or null

A percentage adjustment to the Wheelhouse recommended base price. Only used if base_price is not set. Cannot be 0.

monthly_discount
integer or null
Default: 0

Monthly discount percentage as an integer in the range 0–100 (e.g. 5 = 5%). Applied to bookings ≥ 28 nights. Kept in sync with the global rule in long_term_discounts.rules['28'] — setting one automatically updates the other. When both are sent in the same PUT, long_term_discounts takes precedence.

weekly_discount
integer or null
Default: 0

Weekly discount percentage as an integer in the range 0–100 (e.g. 5 = 5%). Applied to bookings ≥ 7 nights. Kept in sync with the global rule in long_term_discounts.rules['7'] — setting one automatically updates the other. When both are sent in the same PUT, long_term_discounts takes precedence.

nickname
string or null

Listing nickname. Overrides the listing's default nickname.

object or null

UI: 'Last minute' — Last-minute discount configuration.

object or null

UI: 'Far future' — Far-future premium configuration.

object or null

UI: 'Seasonality' — Seasonality adjustment configuration.

object or null

Day-of-week pricing factor configuration.

object or null

Gap night pricing strategy (UI: 'Gaps & Adjacencies' in the Pricing Engine panel). Controls the price multiplier for gap nights between bookings. When type is CUS, provide custom rules; the server rejects CUS without custom. This is a pricing-only setting. It is unrelated to the gap and adjacency/one_sided_gap rule types in minimum_stay_rules_v3, which control minimum stay behavior for gap nights.

Array of any (integer_calendar_rule)
Default: []

UI: 'Minimum stays' — minimum stay rules. The _v3 suffix is a stable historical identifier; this field name is not expected to change.

min_stays_enabled
boolean

Whether minimum stay rules are enabled.

Array of any
Default: []

UI: 'Minimum prices' — Minimum price rules. Valid rule types: global, time_based, seasonal, event, monthly, day_of_week, custom. The _v3 suffix is a stable historical identifier; this field name is not expected to change.

Array of any
Default: []

UI: 'Maximum prices' — Maximum price rules. Valid rule types: global, time_based, seasonal, event, monthly, day_of_week, custom. The _v3 suffix is a stable historical identifier; this field name is not expected to change.

object or null

Check-in/check-out rule configuration identifier.

object
Default: {"active":false,"weekly_rules":[],"monthly_rules":[],"rules":{}}

Rule-based long-term discount configuration.

object or null
Default: {}

Occupancy pacing configuration. When occupancy_pacing is sent as a non-empty object, both adjusted and pacing are required.

Array of any
Default: []

Demand sensitivity rules. Valid rule types: global, time_based, seasonal, event, monthly, day_of_week, custom.

Array of any
Default: []

Historical anchoring rules. Valid rule types: global, time_based, seasonal, event, monthly, day_of_week, custom.

Array of objects (custom_date_range)
Default: []

Represents an Event or Season entry used by the Wheelhouse Events & Seasons feature. Calendar rules reference these entries by id to apply settings (e.g. min stay, pricing) over named date windows.

Each listing stores its own copy of every Event or Season it belongs to. Entries for the same event or season share the same id across listings — this shared id is what enables bulk adjustments in the Wheelhouse UI. If you write a custom_date_ranges entry with a new or changed id, that listing's entry is no longer linked to the others and will not be included in future bulk edits of the original Event or Season.

To safely modify an event or season's definition (dates or name) on one listing without affecting others, omit the id field — the server assigns a new independent ID scoped to that listing. To update only a rule value (e.g. raise the minimum price) without changing dates, include the existing id unchanged.

A new custom_date_ranges entry and a rule referencing it can be submitted in the same PUT request. Manually assign an id on the new entry so that the referencing rule can use it in the same payload. Alternatively, use two sequential PUTs: the first PUT creates the entry without an id (the server assigns one, returned in the response); the second PUT adds the rule referencing that server-assigned id.

min_min_price
integer
Default: 0

UI: 'Absolute minimum price' — Hard lower bound that overrides all pricing rules. No recommended price will fall below this value regardless of any rule configuration. Distinct from a global rule in minimum_price_rules_v3, which can be overridden by higher-priority rules. Must be an integer (whole currency units).

min_min_stay
integer
Default: 0

UI: 'Absolute minimum stay' — Hard lower bound that overrides all minimum stay rules. No minimum stay will be set below this value regardless of any rule configuration. Distinct from both a global rule in minimum_stay_rules_v3 (which can be overridden by higher-priority rules) and from global_min_stay in the price recommendations response (which reflects the current effective default rule value, not a hard floor).

apply_gap_night_rules_to_overrides
boolean

UI: 'Apply Gap Night Rules to Overrides' — When true, gap-night minimum stay rules take priority over custom (date override) rules. When false (default), custom rules win over gap-night rules.

Responses

Request samples

Content type
application/json
{
  • "automatic_rate_posting_enabled": true,
  • "base_price": 1,
  • "base_price_adjustment": 0,
  • "monthly_discount": 0,
  • "weekly_discount": 0,
  • "nickname": "string",
  • "last_minute_discount": {
    },
  • "far_future_premium": {
    },
  • "seasonality_adjustment": {
    },
  • "day_of_week": {
    },
  • "gap_night": {
    },
  • "minimum_stay_rules_v3": [ ],
  • "min_stays_enabled": true,
  • "minimum_price_rules_v3": [ ],
  • "maximum_price_rules_v3": [ ],
  • "checkin_checkout": {
    },
  • "long_term_discounts": {
    },
  • "occupancy_pacing": { },
  • "demand_sensitivity_rules": [ ],
  • "historical_anchoring_rules": [ ],
  • "custom_date_ranges": [ ],
  • "min_min_price": 0,
  • "min_min_stay": 0,
  • "apply_gap_night_rules_to_overrides": true
}

Response samples

Content type
application/json
{
  • "listing_id": 0,
  • "partner_listing_id": "string",
  • "currency": "string",
  • "automatic_rate_posting_enabled": true,
  • "base_price": 0,
  • "base_price_adjustment": 0,
  • "monthly_discount": 0,
  • "weekly_discount": 0,
  • "nickname": "string",
  • "last_minute_discount": {
    },
  • "far_future_premium": {
    },
  • "seasonality_adjustment": {
    },
  • "day_of_week": {
    },
  • "gap_night": {
    },
  • "minimum_stay_rules_v3": [ ],
  • "min_stays_enabled": true,
  • "minimum_price_rules_v3": [ ],
  • "maximum_price_rules_v3": [ ],
  • "checkin_checkout": {
    },
  • "long_term_discounts": {
    },
  • "occupancy_pacing": { },
  • "demand_sensitivity_rules": [ ],
  • "historical_anchoring_rules": [ ],
  • "custom_date_ranges": [ ],
  • "min_min_price": 0,
  • "min_min_stay": 0,
  • "apply_gap_night_rules_to_overrides": true,
  • "update_from": "string",
  • "update_from_id": 0,
  • "created_at": "string",
  • "updated_at": "string"
}

Copy preferences from one listing to another.

Copies the preferences (and optionally custom rates) from a source listing to the target listing. This is a destructive action — it will overwrite the target listing's existing preferences.

The source listing is identified in the request body by copy_preferences_from. The target listing is identified by the listing_id path parameter.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier of the target listing (the one to copy preferences to).

Request Body schema: application/json
required
copy_custom_rates
boolean
Default: true

If true, also copies the source listing's custom rates to the target.

channel
required
string

Channel name the target listing is on. See return value of the /listings endpoint.

required
object

Identifies the source listing to copy preferences from.

Responses

Request samples

Content type
application/json
{
  • "copy_custom_rates": true,
  • "channel": "string",
  • "copy_preferences_from": {
    }
}

Response samples

Content type
application/json
{
  • "error": "API token is at rate limit"
}

Update a single pricing setting for a listing.

Updates one of the following settings to a preset level (conservative/recommended/aggressive), or toggles automatic rate posting on/off.

Setting Accepted parameters
base_price_adjustment type: CON, REC, or AGG
seasonality_adjustment type: CON, REC, or AGG
last_minute_discount type: CON, REC, or AGG
far_future_premium type: CON, REC, or AGG
automatic_rate_posting enabled: true or false
Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

setting
required
string
Enum: "base_price_adjustment" "seasonality_adjustment" "last_minute_discount" "far_future_premium" "automatic_rate_posting"

The setting to update.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

Request Body schema: application/json
required
type
string
Enum: "CON" "REC" "AGG"

The preset level to apply. Required for all settings except automatic_rate_posting.

enabled
boolean

The enabled state. Required for automatic_rate_posting only.

Responses

Request samples

Content type
application/json
{
  • "type": "CON",
  • "enabled": true
}

Response samples

Content type
application/json
{
  • "error": "API token is at rate limit"
}

Get the long-term discount settings for a listing.

This endpoint can be used to fetch weekly and monthly discounts set up through Wheelhouse for a listing.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

Responses

Response samples

Content type
application/json
{
  • "weekly_discount": 0,
  • "monthly_discount": 0
}

Get the recent changelog for a listing's preferences.

Returns a list of recent change events for the listing's pricing settings.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

start_date
string <date>

Start of the date range to retrieve changes for. Defaults to 30 days ago. Values earlier than 90 days in the past are clamped to 90 days ago (no error is returned).

end_date
string <date>

End of the date range to retrieve changes for. Defaults to tomorrow. Clamped to the range [start_date + 1 day, tomorrow] (no error is returned).

Responses

Response samples

Content type
application/json
{
  • "events": [
    ]
}

Preferences Rules

Calendar rules are scoped overrides stored on preference settings such as minimum stay, min/max price, and discount configurations. When the pricing engine evaluates a date, it finds the highest-priority rule whose conditions match that date and applies its value. Rules that do not match that date are skipped; if no rule matches, the engine falls back to a default or applies no constraint.

Rule types and default priority

Each rule has a type that determines its default priority. Higher priority overrides lower priority when multiple rules match the same date. The priority field is assigned automatically by the server — any value submitted in a request body is ignored.

Priority Rule type(s) Scope
1 global Whole calendar — at most one per rule set, applies to every date
2 day_of_week, monthly Weekday pattern or specific calendar month(s)
3 time_based Booking window relative to today (days_before / days_after)
4 seasonal Named seasonal date range (references custom_date_ranges)
5 event Named event date range (references custom_date_ranges)
6 adjacency / one_sided_gap Adjacent-gap nights — minimum_stay_rules_v3 only
7 gap Gap-night minimum stay — minimum_stay_rules_v3 only
8 custom Fixed calendar date range (start_date / end_date)

custom rules always win. global is the catch-all baseline that every other rule type can override.

Conflict resolution

When multiple rules match the same date, the highest-priority rule wins (largest priority number). Within the same rule type, the engine applies additional specificity ordering:

  • time_based — a narrower booking window (smaller days_before) overrides a wider one on the same date.
  • custom — a one-time range (yearly: false) overrides a recurring range (yearly: true) on the same dates.
  • day_of_week and monthly — when multiple rules of the same type cover the same date, the one with the more specific condition (e.g. with months set vs. without) takes precedence.

Per-day values and fall-through

Rules can carry either a scalar value (applies to every matching date) or day_of_week_values (a 7-element array, index 0 = Sunday). A null element in day_of_week_values means the rule does not apply for that specific weekday — the engine falls through to the next applicable rule in the priority hierarchy for that day.

Seasonal and event rules

seasonal and event rules reference a custom_date_ranges entry by id. The date window (start, end) is defined in that entry; the rule sets the value to apply over the window. A new entry and a rule referencing it can be sent in the same PUT request — manually assign the id on the new entry so the referencing rule can use it in the same payload.

Which rule types apply to each setting

Setting Supported rule types
last_minute_discount time_based, seasonal, event, monthly, day_of_week, custom
far_future_premium time_based, seasonal, event, monthly, day_of_week, custom
seasonality_adjustment seasonal, event, monthly
day_of_week global, time_based, seasonal, event, monthly, day_of_week, custom
minimum_stay_rules_v3 global, time_based, seasonal, event, monthly, day_of_week, custom, gap, adjacency
minimum_price_rules_v3 global, time_based, seasonal, event, monthly, day_of_week, custom
maximum_price_rules_v3 global, time_based, seasonal, event, monthly, day_of_week, custom
checkin_checkout > check_in_rules global, time_based, seasonal, event, monthly, day_of_week, custom
checkin_checkout > check_out_rules global, time_based, seasonal, event, monthly, day_of_week, custom
demand_sensitivity_rules global, time_based, seasonal, event, monthly, day_of_week, custom
historical_anchoring_rules global, time_based, seasonal, event, monthly, day_of_week, custom

Custom Rates

Set and delete custom fixed or adjustment rates for specific date ranges on a listing.

Get all active and upcoming custom rates for a listing.

Returns all custom rate periods that are currently active and affect future stay dates. Expired rate periods (those whose expires_at timestamp has passed) are excluded.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Set a custom rate for a listing.

Creates or replaces a custom rate for a date range. Setting a fixed rate applies an absolute nightly price; setting an adjustment rate applies a percentage multiplier to the Wheelhouse recommendation. For adjustment rates, per-day values are percentages where 100 = no adjustment, 110 = +10%, and 90 = −10%.

If the specified date range overlaps an existing custom rate, the existing rate is shortened or split so the new rate takes precedence for the overlapping dates. Custom rates are not stacked — a new adjustment rate replaces rather than compounds with any existing adjustment for the same dates. To combine adjustments, compute the target multiplier explicitly and submit the combined value.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

Request Body schema: application/json
required
start_date
required
string <date>

The first date of the custom rate period (YYYY-MM-DD).

end_date
required
string <date>

The last date of the custom rate period (YYYY-MM-DD).

rate_type
required
string
Enum: "fixed" "adjustment"

The type of custom rate.

  • fixed: A fixed nightly price. Requires currency. Per-day values (sundaysaturday) are absolute prices.
  • adjustment: A percentage adjustment to the Wheelhouse recommendation. Per-day values are percentages where 100 = no adjustment, 110 = +10%, and 90 = −10%.

Minimum price interactions: Fixed rates are constrained only by min_min_price (the absolute floor) — they bypass minimum_price_rules_v3 entirely. Adjustment rates are additionally constrained by per-date minimum_price_rules_v3 floors; the resulting dollar price after applying the multiplier must meet or exceed the effective minimum price rule for each date.

Read-side representation: When reading prices via GET /listings/{listing_id}/price_recommendations, an adjustment rate appears as custom_type: "adjusted" (past-tense form). The write value (adjustment) and the read value (adjusted) differ in form; match them accordingly when reconciling written rates against recommendation responses.

currency
string

The ISO-4217 3-letter currency code. Required for fixed type.

sunday
integer >= 1

Price or adjustment value for Sundays.

monday
integer >= 1

Price or adjustment value for Mondays.

tuesday
integer >= 1

Price or adjustment value for Tuesdays.

wednesday
integer >= 1

Price or adjustment value for Wednesdays.

thursday
integer >= 1

Price or adjustment value for Thursdays.

friday
integer >= 1

Price or adjustment value for Fridays.

saturday
integer >= 1

Price or adjustment value for Saturdays.

expires_at
string <date-time>

When the custom rate expires (ISO-8601). Once past this timestamp the rate is no longer applied. Omit to create a rate that never expires.

Responses

Request samples

Content type
application/json
{
  • "start_date": "2019-08-24",
  • "end_date": "2019-08-24",
  • "rate_type": "fixed",
  • "currency": "string",
  • "sunday": 1,
  • "monday": 1,
  • "tuesday": 1,
  • "wednesday": 1,
  • "thursday": 1,
  • "friday": 1,
  • "saturday": 1,
  • "expires_at": "2019-08-24T14:15:22Z"
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "listing_id": 0,
  • "rate_type": "fixed",
  • "currency": "string",
  • "start_date": "2019-08-24",
  • "end_date": "2019-08-24",
  • "sunday": 0,
  • "monday": 0,
  • "tuesday": 0,
  • "wednesday": 0,
  • "thursday": 0,
  • "friday": 0,
  • "saturday": 0,
  • "created_user_id": 0,
  • "split_user_id": 0,
  • "expires_at": "2019-08-24T14:15:22Z",
  • "valid_until": "2019-08-24T14:15:22Z",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Delete custom rates for a date range on a listing.

Removes all custom rates overlapping the specified date range. If a custom rate period extends beyond the deleted range on one side only, it is truncated to the non-overlapping portion. If the deleted range falls in the middle of an existing rate period, that period is split into two — one before and one after the deleted range. The deleted dates revert to the Wheelhouse recommended price.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

start_date
required
string <date>

The start date of the range to delete (YYYY-MM-DD). This date is inclusive.

end_date
required
string <date>

The end date of the range to delete (YYYY-MM-DD). This date is inclusive.

Responses

Response samples

Content type
application/json
{
  • "error": "API token is at rate limit"
}

Set multiple custom rates for a listing in bulk.

Creates or replaces multiple custom rates in a single request. Partially successful requests return status 207; fully failed requests return 424.

For adjustment rates, per-day values are percentages where 100 = no adjustment, 110 = +10%, and 90 = −10%.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

Request Body schema: application/json
required
required
Array of objects (custom_rate_input)

Responses

Request samples

Content type
application/json
{
  • "custom_rates": [
    ]
}

Response samples

Content type
application/json
{
  • "updated_custom_rates": [
    ]
}

Delete multiple custom rate ranges for a listing in bulk.

Removes custom rates for multiple date ranges in a single request. Partially successful requests return status 207; fully failed requests return 424.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

Request Body schema: application/json
required
channel
string

Channel name the listing is on. See return value of the /listings endpoint.

required
Array of objects

Responses

Request samples

Content type
application/json
{
  • "channel": "string",
  • "delete_ranges": [
    ]
}

Response samples

Content type
application/json
{
  • "errors": [
    ]
}

Reservations

Retrieve reservations for a listing.

Get reservations for a listing.

Returns a list of reservations for a listing.

Deriving pickup metrics: Use date_filter_type=booked_at to filter by booking date rather than stay date:

  • Pickup (Booked Nights) — new nights booked in a time window — sum end_date − start_date (in days) across returned reservations.
  • Pickup (Bookings) — new reservations created in a time window — count the number of reservation records returned.
Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

start_date
string <date>

Filter start date (YYYY-MM-DD). Behavior depends on date_filter_type:

  • stay_date (default): returns reservations whose stay period overlaps with this date (i.e. end_date > start_date).
  • booked_at: returns reservations booked on or after the start of this date.
end_date
string <date>

Filter end date (YYYY-MM-DD). Behavior depends on date_filter_type:

  • stay_date (default): returns reservations whose stay period overlaps with this date (i.e. start_date <= end_date).
  • booked_at: returns reservations booked before the end of this date.
date_filter_type
string
Default: "stay_date"
Enum: "stay_date" "booked_at"

Controls which date field is used for filtering:

  • stay_date (default): filter by the reservation's stay dates.
  • booked_at: filter by the date the reservation was booked.
per_page
integer [ 1 .. 100 ]
Default: 50

Number of reservations per page.

page
integer

Page number to retrieve.

offset
integer

Number of items to skip before starting to collect the result set.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Listing Tags

Read and update user-defined tags on listings for filtering and grouping.

Get user-defined tags for a listing.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Update user-defined tags for a listing.

Adds (or overwrites) tags on a listing. If overwrite is false, provided tags are merged with existing tags. If overwrite is true, existing tags are replaced and all tags that are not in the list are deleted.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

Request Body schema: application/json
required
names
required
Array of strings

Array of tag names to add (or set if overwrite is true).

overwrite
boolean
Default: false

If true, replaces all existing tags with the provided list. If false (default), merges with existing tags.

Responses

Request samples

Content type
application/json
{
  • "names": [
    ],
  • "overwrite": false
}

Response samples

Content type
application/json
[
  • {
    }
]

Listing Flags

Flags are system-managed tags that Wheelhouse sets automatically on listings to convey internal state or signals. Unlike user-defined tags, flags are read-only and cannot be modified via the API.

Get system-defined flags for a listing.

Returns system-managed flags (as opposed to user-defined tags) associated with the listing.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Notes

Notes are user-created annotations on a listing, optionally tied to a date range, a settings category, and a reminder. Use these endpoints to fetch, create, update, and delete the notes of a listing. Notes can be active or archived; deleting a note removes it permanently — deleted notes are no longer returned by the API and cannot be restored.

Get the notes of a listing.

Returns the notes of the listing, most recently updated first. Deleted notes are not included. Optionally restrict the response to notes whose date range overlaps a given date range — start_date and end_date must be provided together.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

start_date
string <date>

Only include notes whose date range overlaps the given range (YYYY-MM-DD). Must be provided together with end_date.

end_date
string <date>

Only include notes whose date range overlaps the given range (YYYY-MM-DD). Must be provided together with start_date.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a note on a listing.

Creates a note on the listing. All fields are optional — provide a description, an optional stay date range (start_date/end_date), settings categories, and an optional reminder (remind_by with repeat_by).

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

Request Body schema: application/json
required
description
string

The note text.

category
Array of strings

The settings categories the note relates to. See the note_response schema for allowed values.

start_date
string <date>

First stay date the note applies to (YYYY-MM-DD). Must be provided together with end_date and must be on or before it.

end_date
string <date>

Last stay date the note applies to (YYYY-MM-DD). Must be provided together with start_date.

remind_by
string <date>

Date of the note's reminder (YYYY-MM-DD). Must be provided together with repeat_by.

repeat_by
string
Enum: "daily" "weekly" "monthly" "does_not_repeat"

How the reminder repeats. Must be provided together with remind_by (use does_not_repeat for a one-time reminder).

status
string
Enum: "active" "archived"

The note status. Defaults to active.

Responses

Request samples

Content type
application/json
{
  • "description": "string",
  • "category": [
    ],
  • "start_date": "2019-08-24",
  • "end_date": "2019-08-24",
  • "remind_by": "2019-08-24",
  • "repeat_by": "daily",
  • "status": "active"
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "description": "string",
  • "category": [
    ],
  • "start_date": "2019-08-24",
  • "end_date": "2019-08-24",
  • "remind_by": "2019-08-24",
  • "repeat_by": "daily",
  • "status": "active",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Update a note.

Updates the given fields of a note. Fields that are not provided are left unchanged. Set status to archived to archive a note, or back to active to restore it.

Note: it is not currently possible to clear an optional field once set (for example, removing an existing date range or reminder). Omitting a field in the request body leaves the current value in place; there is no way to unset start_date/end_date or remind_by/repeat_by via this endpoint.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

note_id
required
integer

The Wheelhouse internal note ID.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

Request Body schema: application/json
required
description
string

The note text.

category
Array of strings

The settings categories the note relates to. See the note_response schema for allowed values.

start_date
string <date>

First stay date the note applies to (YYYY-MM-DD). Must be provided together with end_date and must be on or before it.

end_date
string <date>

Last stay date the note applies to (YYYY-MM-DD). Must be provided together with start_date.

remind_by
string <date>

Date of the note's reminder (YYYY-MM-DD). Must be provided together with repeat_by.

repeat_by
string
Enum: "daily" "weekly" "monthly" "does_not_repeat"

How the reminder repeats. Must be provided together with remind_by (use does_not_repeat for a one-time reminder).

status
string
Enum: "active" "archived"

The note status.

Responses

Request samples

Content type
application/json
{
  • "description": "string",
  • "category": [
    ],
  • "start_date": "2019-08-24",
  • "end_date": "2019-08-24",
  • "remind_by": "2019-08-24",
  • "repeat_by": "daily",
  • "status": "active"
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "description": "string",
  • "category": [
    ],
  • "start_date": "2019-08-24",
  • "end_date": "2019-08-24",
  • "remind_by": "2019-08-24",
  • "repeat_by": "daily",
  • "status": "active",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Delete a note.

Deletes the note. Deletion is permanent — the note is no longer returned by the API and cannot be restored.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

note_id
required
integer

The Wheelhouse internal note ID.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

Responses

Response samples

Content type
application/json
{
  • "error": "API token is at rate limit"
}

Calendar

Fetch the price calendar for a listing. The calendar reflects current prices, availability, and booking state for each stay date.

Get the price calendar for a listing.

Returns the price calendar for a single listing. Each entry represents one stay date and includes the price, availability, and booking state.

The data reflects the current state of the calendar as of the time of the request:

  • Future dates — the current price and availability as they stand right now.
  • Past dates — the state the date ended up in (e.g. whether it was booked, blocked, or left available, and the price that was in effect at the time).

Defaults to today through the maximum calendar horizon (1.5 years) when start_date and end_date are omitted. The total date range may not exceed 3 years.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

start_date
string <date>

First stay date to include (YYYY-MM-DD). Defaults to today.

end_date
string <date>

Last stay date to include (YYYY-MM-DD). Defaults to the maximum calendar horizon (1.5 years from today). The total range (start_date to end_date) may not exceed 3 years.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get the last posted price per stay date for a listing.

Returns the last price posted to the channel for each stay date in the requested range.

  • Available nights: the most recently posted price for that date.
  • Booked nights: the last price posted at or before block_time (when the booking was recorded), reflecting the price that was live when the booking came in.

Dates with no posting history return null for last_posted_price.

Defaults to today through the maximum calendar horizon (1.5 years) when start_date and end_date are omitted. The total date range may not exceed 3 years.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

start_date
string <date>

First stay date to include (YYYY-MM-DD). Defaults to today.

end_date
string <date>

Last stay date to include (YYYY-MM-DD). Defaults to the maximum calendar horizon (1.5 years from today). The total range (start_date to end_date) may not exceed 3 years.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get the historical snapshots of a calendar day for a listing.

Returns a history of price postings and calendar state snapshots for a specific stay date.

  • posted_prices — each entry records a price that Wheelhouse posted to the channel for this date, in chronological order.
  • calendar_snapshots — historical snapshots of the calendar day's state (availability, price, booking, etc.) over time.

Requires a Pro tier listing. Returns 402 if the feature is not available. The maximum lookback window is 180 days.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

stay_date
required
string <date>

The stay date to retrieve history for (YYYY-MM-DD).

Responses

Response samples

Content type
application/json
{
  • "stay_date": "2019-08-24",
  • "posted_prices": [
    ],
  • "calendar_snapshots": [
    ]
}

Get the estimated fee multiplier per stay date for a listing.

Returns a per-date fee multiplier derived from the listing's estimated fee setting. Multiply any nightly price by fee_multiplier to obtain the fee-inclusive price. A fee_multiplier of 1.0 means no fee adjustment is configured.

Currently the multiplier is uniform across all dates. The per-date shape is intentional — future releases will allow fee variation by date range or season, and the response format will remain compatible.

Defaults to today through the maximum calendar horizon (1.5 years) when start_date and end_date are omitted. The total date range may not exceed 3 years.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

start_date
string <date>

First stay date to include (YYYY-MM-DD). Defaults to today.

end_date
string <date>

Last stay date to include (YYYY-MM-DD). Defaults to the maximum calendar horizon (1.5 years from today). The total range (start_date to end_date) may not exceed 3 years.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get the minimum stay calendar for a listing.

Returns the per-date minimum stay derived from the listing's minimum stay rules for a given date range. One entry is returned for each date in the range.

A null value for min_stay means no specific rule covers that date.

Defaults to today through the maximum calendar horizon (1.5 years) when start_date and end_date are omitted. The total date range may not exceed 3 years.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

start_date
string <date>

First stay date to include (YYYY-MM-DD). Defaults to today.

end_date
string <date>

Last stay date to include (YYYY-MM-DD). Defaults to the maximum calendar horizon (1.5 years from today). The total range (start_date to end_date) may not exceed 3 years.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Segments

Portfolio segments group listings by filter criteria. The filter_backend field is the core of a segment — it defines which listings belong to it.

Use POST /segments to create a segment, PUT /segments/{segment_id} to update one, GET /segments to list all segments for the authenticated user, GET /segments/{segment_id}/listings to retrieve the listings matched by a segment's filter, and GET /segments/{segment_id}/aggregated_metrics to fetch aggregated performance metrics for those listings.

See the filter_backend_object schema for a full reference of available filter keys, operator suffixes, and value formats.

List portfolio segments.

Returns all portfolio segments for the authenticated user. Segments are used in the Wheelhouse UI to group listings by filter criteria; this endpoint provides read-only access to the segment list.

Authorizations:
RmApiKey

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a portfolio segment.

Creates a new portfolio segment owned by the authenticated user.

Authorizations:
RmApiKey
Request Body schema: application/json
required
name
required
string

Name of the segment.

description
string

Optional description.

object (filter_backend_object)

A map that controls which listings belong to a segment. Keys are listing attribute paths with optional operator suffixes; values are the match criteria. All entries are ANDed — a listing must satisfy every condition to be included.

Structure: { "key[_suffix]": value, ... }


Boolean parameters

Accept true or false. No operator suffixes.

Key Description
is_live Listing is live on its channel
user_removed Listing has been marked removed by the user
listings.is_active Listing is active in Wheelhouse
listing_preferences.automatic_rate_posting_enabled Automatic rate posting is enabled
listing_views.in_market Listing is in a Wheelhouse-covered market

Numeric range parameters

Each base key supports six operator suffixes: key (=), key_ne (≠), key_lt (<), key_gt (>), key_lte (≤), key_gte (≥). Values are integers (floats accepted for bathrooms).

Key Description
bedrooms Number of bedrooms
bathrooms Number of bathrooms
sleeps Maximum guest capacity
beds Number of beds
guests_included Guests included in the base rate
number_of_units Number of units at the property
review_count Total guest reviews
listings.minimum_stay Default minimum stay in nights
listings.cleaning_fee Cleaning fee amount
listings.security_deposit Security deposit amount
listing_preferences.base_price Wheelhouse base price
listing_preferences.weekly_discount Weekly discount percentage
listing_preferences.monthly_discount Monthly discount percentage
listing_views.number_of_editors Co-host editor count
listing_views.number_of_restricted_editors Restricted editor count
listing_views.number_of_viewers Viewer-level co-host count
listing_views.minimum_stay_rules_count Minimum-stay rules configured
listing_views.minimum_price_rules_count Minimum-price rules configured

Performance stats follow the pattern listing_stats.{metric}_{days_ahead}_{days_behind}. Supported metrics: revenue, occupancy, booking_count. Supported windows: 0_7, 0_14, 0_30, 7_0, 14_0, 30_0. Example: "listing_stats.revenue_0_30_gte": 5000.


Enumeration parameters

Three operator suffixes: key (=), key_ne (≠), key_enum (returns the distinct values present on the authenticated user's listings — useful for discovering valid values).

Key Value type Notes
source string Channel short ID: "A" (Airbnb), "V" (Vrbo), "B" (Booking.com)
market_id integer Wheelhouse market ID
country_code string ISO 3166-1 alpha-2 (e.g. "US", "GB")
room_type string As reported by the channel (e.g. "Entire place")
channel_account_id integer Wheelhouse channel connection ID
listings.currency string ISO 4217 currency code (e.g. "USD", "EUR")
listings.price_model_id integer Active price model ID
channel_accounts.status string "active", "failed", "disabled", "pending", "empty", "invalid_auth"
charge_bee_items.id string Billing plan (e.g. "Free", "Flex_Plan", "Flat_Plan")
managed_listings.level string Co-host level: "editor", "restricted_editor", "viewer"
listings.operating_user_id integer User ID of the operating account

String match parameters

Two operator suffixes: key (contains), key_not (does not contain). Case-insensitive substring match. Comma-separate multiple values for OR logic: "listings.title": "Beach,Ocean" matches titles containing either word.

Key Description
listings.title Listing title
listing_views.display_name Display name
listing_views.display_nickname Display nickname
source_address Source address

Tag parameters

Filter by Wheelhouse tag IDs (integers). Four operator suffixes:

Suffix Match logic
tags.id Has any of the listed tag IDs (OR)
tags.id_ne Has none of the listed tag IDs
tags.id_and Has all of the listed tag IDs (AND)
tags.id_and_ne Does not have all of the listed tag IDs

To combine multiple independent tag conditions in one object, append any unique identifier after the suffix — the system strips it before evaluating. Example: "tags.id_pool": [12] and "tags.id_certified_and": [5, 7] are treated as two separate filters on the same object.


Date range parameters

Six operator suffixes, same as numeric range. Values are either an ISO 8601 date string ("2025-01-01") or an integer for a rolling window relative to today (30 means "30 days ago").

Key Description
listings.created_at When the listing was created in Wheelhouse
listing_stats.last_booked_at Date of the listing's most recent booking

Membership parameters

Key Value type Description
listings.id_in integer[] Include only listings with these internal IDs
listings.id_not_in integer[] Exclude listings with these internal IDs
listings.source_not_in string[] Exclude listings from these channels

Geographic parameter

Key Value format Description
latlong_distance_from_lte "latitude,longitude,meters" Listings within the radius of the given coordinates

Example

{
  "is_live": true,
  "bedrooms_gte": 2,
  "source": "A",
  "listings.title": "Beach,Ocean",
  "tags.id_pool": [12],
  "listings.created_at_gte": "2025-01-01",
  "listings.id_in": [101, 102, 103]
}
is_default
boolean

Set as the default segment. Any existing default is cleared.

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "description": "string",
  • "filter_backend": { },
  • "is_default": true
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "name": "string",
  • "description": "string",
  • "filter_backend": { },
  • "is_default": true,
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Update a portfolio segment.

Updates the name, description, and/or default status of an existing portfolio segment. All fields are optional; omitted fields are left unchanged.

Authorizations:
RmApiKey
path Parameters
segment_id
required
integer

The Wheelhouse internal segment ID.

Request Body schema: application/json
required
name
string

New name for the segment.

description
string

New description for the segment. Omit to leave unchanged.

object (filter_backend_object)

A map that controls which listings belong to a segment. Keys are listing attribute paths with optional operator suffixes; values are the match criteria. All entries are ANDed — a listing must satisfy every condition to be included.

Structure: { "key[_suffix]": value, ... }


Boolean parameters

Accept true or false. No operator suffixes.

Key Description
is_live Listing is live on its channel
user_removed Listing has been marked removed by the user
listings.is_active Listing is active in Wheelhouse
listing_preferences.automatic_rate_posting_enabled Automatic rate posting is enabled
listing_views.in_market Listing is in a Wheelhouse-covered market

Numeric range parameters

Each base key supports six operator suffixes: key (=), key_ne (≠), key_lt (<), key_gt (>), key_lte (≤), key_gte (≥). Values are integers (floats accepted for bathrooms).

Key Description
bedrooms Number of bedrooms
bathrooms Number of bathrooms
sleeps Maximum guest capacity
beds Number of beds
guests_included Guests included in the base rate
number_of_units Number of units at the property
review_count Total guest reviews
listings.minimum_stay Default minimum stay in nights
listings.cleaning_fee Cleaning fee amount
listings.security_deposit Security deposit amount
listing_preferences.base_price Wheelhouse base price
listing_preferences.weekly_discount Weekly discount percentage
listing_preferences.monthly_discount Monthly discount percentage
listing_views.number_of_editors Co-host editor count
listing_views.number_of_restricted_editors Restricted editor count
listing_views.number_of_viewers Viewer-level co-host count
listing_views.minimum_stay_rules_count Minimum-stay rules configured
listing_views.minimum_price_rules_count Minimum-price rules configured

Performance stats follow the pattern listing_stats.{metric}_{days_ahead}_{days_behind}. Supported metrics: revenue, occupancy, booking_count. Supported windows: 0_7, 0_14, 0_30, 7_0, 14_0, 30_0. Example: "listing_stats.revenue_0_30_gte": 5000.


Enumeration parameters

Three operator suffixes: key (=), key_ne (≠), key_enum (returns the distinct values present on the authenticated user's listings — useful for discovering valid values).

Key Value type Notes
source string Channel short ID: "A" (Airbnb), "V" (Vrbo), "B" (Booking.com)
market_id integer Wheelhouse market ID
country_code string ISO 3166-1 alpha-2 (e.g. "US", "GB")
room_type string As reported by the channel (e.g. "Entire place")
channel_account_id integer Wheelhouse channel connection ID
listings.currency string ISO 4217 currency code (e.g. "USD", "EUR")
listings.price_model_id integer Active price model ID
channel_accounts.status string "active", "failed", "disabled", "pending", "empty", "invalid_auth"
charge_bee_items.id string Billing plan (e.g. "Free", "Flex_Plan", "Flat_Plan")
managed_listings.level string Co-host level: "editor", "restricted_editor", "viewer"
listings.operating_user_id integer User ID of the operating account

String match parameters

Two operator suffixes: key (contains), key_not (does not contain). Case-insensitive substring match. Comma-separate multiple values for OR logic: "listings.title": "Beach,Ocean" matches titles containing either word.

Key Description
listings.title Listing title
listing_views.display_name Display name
listing_views.display_nickname Display nickname
source_address Source address

Tag parameters

Filter by Wheelhouse tag IDs (integers). Four operator suffixes:

Suffix Match logic
tags.id Has any of the listed tag IDs (OR)
tags.id_ne Has none of the listed tag IDs
tags.id_and Has all of the listed tag IDs (AND)
tags.id_and_ne Does not have all of the listed tag IDs

To combine multiple independent tag conditions in one object, append any unique identifier after the suffix — the system strips it before evaluating. Example: "tags.id_pool": [12] and "tags.id_certified_and": [5, 7] are treated as two separate filters on the same object.


Date range parameters

Six operator suffixes, same as numeric range. Values are either an ISO 8601 date string ("2025-01-01") or an integer for a rolling window relative to today (30 means "30 days ago").

Key Description
listings.created_at When the listing was created in Wheelhouse
listing_stats.last_booked_at Date of the listing's most recent booking

Membership parameters

Key Value type Description
listings.id_in integer[] Include only listings with these internal IDs
listings.id_not_in integer[] Exclude listings with these internal IDs
listings.source_not_in string[] Exclude listings from these channels

Geographic parameter

Key Value format Description
latlong_distance_from_lte "latitude,longitude,meters" Listings within the radius of the given coordinates

Example

{
  "is_live": true,
  "bedrooms_gte": 2,
  "source": "A",
  "listings.title": "Beach,Ocean",
  "tags.id_pool": [12],
  "listings.created_at_gte": "2025-01-01",
  "listings.id_in": [101, 102, 103]
}
is_default
boolean

Set as the default segment. Any existing default is cleared.

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "description": "string",
  • "filter_backend": { },
  • "is_default": true
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "name": "string",
  • "description": "string",
  • "filter_backend": { },
  • "is_default": true,
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

List listings in a segment.

Returns the listings that belong to the given portfolio segment. The segment's filter criteria are applied to the user's listings. Supports pagination and optional exclusion of inactive listings.

Authorizations:
RmApiKey
path Parameters
segment_id
required
integer

The Wheelhouse internal segment ID.

query Parameters
exclude_inactive
boolean
Default: true

Exclude inactive listings from the response. Defaults to true.

per_page
integer [ 1 .. 100 ]
Default: 50

Number of listings per page.

page
integer

Page number to retrieve.

offset
integer

Number of items to skip before starting to collect the result set.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get aggregated metrics for a segment.

Returns monthly performance metrics aggregated across the listings matched by the segment's filter. Monetary values are converted to the requested currency. Because a segment has no currency of its own, the default is the currency of the most common market among the segment's listings (falling back to USD).

Authorizations:
RmApiKey
path Parameters
segment_id
required
integer

The Wheelhouse internal segment ID.

query Parameters
currency
string

ISO-4217 3-letter currency code to convert monetary metrics to. Defaults to the currency of the most common market among the segment's listings.

dates
Array of strings <date> [ items <date > ]

Restrict the response to periods starting on these dates (first of month, YYYY-MM-DD). Send as ?dates=2026-05-01&dates=2026-06-01. Defaults to all available periods.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "currency": "string"
}

Market Reports

Access aggregated market-level data for the markets in which the authenticated user has at least one Pro tier listing. Use these endpoints to retrieve time-series metrics (e.g. occupancy, asking rate, RevPAR) and metric distributions across a market for a given month. Results can be filtered by bedroom count, property type, and performance tier.

List markets for a country.

Returns all active Wheelhouse markets which the authenticated user has at least one Pro tier listing in for the given country.

Each market includes its geographic shape and the postal codes it covers.

Authorizations:
RmApiKey
query Parameters
country_code
required
string

ISO-3166 2-letter country code (e.g. US, GB).

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get time-series market metrics.

Returns daily time-series data for one or more market-level metrics over a date range. RM API users can only access markets in which they have at least one Pro tier listing.

Available metrics: asking_rate_w_fees, occupancy, occupancy_adjusted, adr_w_fees, lead_time, revpar_adjusted_w_fees, revpar_w_fees, revenue_w_fees, nights_bookable.

Authorizations:
RmApiKey
path Parameters
market_id
required
integer

The Wheelhouse internal market ID (from GET /market_report or /listings).

query Parameters
metric
Array of strings
Items Enum: "occupancy" "occupancy_adjusted" "nights_bookable" "asking_rate_w_fees" "adr_w_fees" "lead_time" "revpar_adjusted_w_fees" "revpar_w_fees" "revenue_w_fees"

Metrics to include. Defaults to all metrics. Send as ?metric=asking_rate_w_fees&metric=occupancy.

start_date
string <date>

Start of the date range (YYYY-MM-DD). Defaults to today. Must be within 3 years in the past and 1 year in the future.

end_date
string <date>

End of the date range (YYYY-MM-DD). Defaults to 1 year from today. Must be after start_date.

performance
string
Enum: "low" "average" "high"

Filter to a performance tier. Omit to include all tiers.

bedrooms
string
Enum: "0" "1" "2" "3" "4+"

Filter to listings with this bedroom count. Omit to include all bedroom counts.

property_type
string
Enum: "apartment" "bnb" "boat" "bus" "cabin" "camper" "camping" "castle" "holiday_home" "hostel" "hotel" "house" "houseboat" "island" "mill" "other" "room" "shared" "tower"

Filter to a property type. Omit to include all property types.

Responses

Response samples

Content type
application/json
{
  • "currency": "string",
  • "updated_at": "2019-08-24T14:15:22Z",
  • "data": [
    ]
}

Get market metric distributions for a month.

Returns histogram distributions for one or more market-level metrics for a given calendar month. RM API users can only access markets in which they have at least one Pro tier listing.

Available metrics: occupancy, occupancy_adjusted, asking_rate_w_fees, adr_w_fees, lead_time, revpar_adjusted_w_fees, revpar_w_fees, length_of_stay.

Authorizations:
RmApiKey
path Parameters
market_id
required
integer

The Wheelhouse internal market ID (from GET /market_report).

query Parameters
metric
Array of strings
Items Enum: "occupancy" "occupancy_adjusted" "asking_rate_w_fees" "adr_w_fees" "lead_time" "revpar_adjusted_w_fees" "revpar_w_fees" "length_of_stay"

Metrics to include. Defaults to all metrics. Send as ?metric=asking_rate_w_fees&metric=occupancy.

month
string <date>

The month to retrieve distributions for (any date within the month, YYYY-MM-DD). Defaults to the start of the current month.

performance
string
Enum: "low" "average" "high"

Filter to a performance tier. Omit to include all tiers.

bedrooms
string
Enum: "0" "1" "2" "3" "4+"

Filter to listings with this bedroom count. Omit to include all bedroom counts.

property_type
string
Enum: "apartment" "bnb" "boat" "bus" "cabin" "camper" "camping" "castle" "holiday_home" "hostel" "hotel" "house" "houseboat" "island" "mill" "other" "room" "shared" "tower"

Filter to a property type. Omit to include all property types.

Responses

Response samples

Content type
application/json
{
  • "currency": "string",
  • "month": "2019-08-24",
  • "updated_at": "2019-08-24T14:15:22Z",
  • "data": {
    }
}

Neighborhood Data

Daily market and neighborhood price data for a listing's location. The neighborhood data reflects the local cluster of comparable properties near the listing (same bedroom count, same geographic cluster), providing context for competitive pricing.

Additional data sources — including market-wide aggregates and dynamic comparison sets — will be added here in future releases.

Get daily neighborhood pricing data for a listing.

Returns a daily time series of neighborhood price data for the listing's local cluster — a geographic group of comparable properties with the same bedroom count near the listing.

Each entry includes the median nightly price, the p25 (low_price) and p75 (high_price) price percentiles, and the number of listings in the cluster for that stay date. All prices are in the market's native currency, reported in the currency field.

This is the same neighborhood data shown in the Wheelhouse pricing chart.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "currency": "string"
}

Get daily neighborhood occupancy and booking data for a listing.

Returns a daily time series of occupancy and booking model data for the listing's local neighborhood cluster. This is the same data used to render the occupancy, expected bookings, and observed bookings series in the Wheelhouse pricing chart.

  • occupancy — raw occupancy rate (booked nights / calendar nights).
  • adjusted_occupancy — occupancy computed against bookable (unblocked) nights only.
  • expected_bookings — model-predicted booking count for the stay date.
  • expected_bookings_sd — standard deviation of the expected bookings prediction.
  • observed_bookings — actual booking count observed for the stay date.
  • calendar_nights — total calendar nights in the cluster for the stay date.

Returns 404 if no neighborhood cluster is found for the listing's location, or if no occupancy data has been generated for the cluster.

Authorizations:
RmApiKey
path Parameters
listing_id
required
string

The channel's unique listing identifier.

query Parameters
channel
required
string

Channel name the listing is on. See return value of the /listings endpoint.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Dynamic Sets

Dynamic sets are user-curated sets of comparison listings used to track competitive performance. Use these endpoints to list a user's paid dynamic sets, inspect a set's definition and member listings, retrieve aggregated performance metrics, manage which of the user's own listings the set is associated with, and fetch a set's change history, time-series metrics, and metric distributions.

The RM API only exposes paid dynamic sets — free sets are not accessible and respond with 404 Not Found. Sets the user owns as well as sets shared with the user are included; modifying a shared set requires editor or manager access to it.

List dynamic sets.

Returns all paid dynamic sets the authenticated user owns or has shared access to. Free sets are not included. Results are ordered by most recently updated first and paginated.

Authorizations:
RmApiKey
query Parameters
per_page
integer [ 1 .. 100 ]
Default: 50

Number of sets per page.

page
integer

Page number to retrieve.

offset
integer

Number of items to skip before starting to collect the result set.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get a single dynamic set.

Returns detailed information about one dynamic set, including its definition (kind, filters, boundary) and member listing counts per status.

Authorizations:
RmApiKey
path Parameters
set_id
required
integer

The Wheelhouse internal dynamic set ID.

Responses

Response samples

Content type
application/json
{
  • "id": 0,
  • "user_id": 0,
  • "name": "string",
  • "description": "string",
  • "kind": "competitive",
  • "currency": "string",
  • "is_static": true,
  • "filters": { },
  • "boundary": [
    ],
  • "listing_counts": {
    },
  • "updated_at": "2019-08-24T14:15:22Z"
}

Get aggregated metrics for a dynamic set.

Returns monthly performance metrics aggregated across the active member listings of the set. Monetary values are converted to the requested currency (defaults to the set's currency).

Authorizations:
RmApiKey
path Parameters
set_id
required
integer

The Wheelhouse internal dynamic set ID.

query Parameters
currency
string

ISO-4217 3-letter currency code to convert monetary metrics to. Defaults to the set's currency.

dates
Array of strings <date> [ items <date > ]

Restrict the response to periods starting on these dates (first of month, YYYY-MM-DD). Send as ?dates=2026-05-01&dates=2026-06-01. Defaults to all available periods.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "currency": "string"
}

List the listings in a dynamic set.

Returns the member listings of the set with their trailing-year performance metrics, grouped by membership status (active, hidden, review, removed). Monetary metrics are converted to the set's currency.

Authorizations:
RmApiKey
path Parameters
set_id
required
integer

The Wheelhouse internal dynamic set ID.

Responses

Response samples

Content type
application/json
{
  • "active": [
    ],
  • "hidden": [
    ],
  • "review": [
    ],
  • "removed": [
    ]
}

List the user listings associated with a dynamic set.

Returns the user's own listings that are associated with the set for comparison. Listings are returned in the standard RM API listing format; the id field is the channel listing ID used by the PUT and DELETE endpoints. For shared sets, associated listings the authenticated user does not have access to are omitted.

Authorizations:
RmApiKey
path Parameters
set_id
required
integer

The Wheelhouse internal dynamic set ID.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Associate user listings with a dynamic set.

Associates the given listings (the authenticated user's own listings, identified by their channel listing IDs) with the set for comparison. Listings that are already associated are left unchanged. Requires editor or manager access to the set when the set is shared.

Authorizations:
RmApiKey
path Parameters
set_id
required
integer

The Wheelhouse internal dynamic set ID.

Request Body schema: application/json
required
listing_ids
required
Array of strings <= 500 items

Channel listing IDs of the user's listings to associate. At most 500 per request.

channel
string

Channel name the listings are on. Required if it cannot be derived from the API key.

Responses

Request samples

Content type
application/json
{
  • "listing_ids": [
    ],
  • "channel": "string"
}

Response samples

Content type
application/json
[
  • {
    }
]

Remove associated user listings from a dynamic set.

Removes the association between the given listings (identified by their channel listing IDs) and the set. Requires editor or manager access to the set when the set is shared.

Authorizations:
RmApiKey
path Parameters
set_id
required
integer

The Wheelhouse internal dynamic set ID.

query Parameters
listing_ids
required
Array of strings <= 500 items

Channel listing IDs of the user's listings to disassociate. At most 500 per request. Send as ?listing_ids=abc&listing_ids=def.

channel
string

Channel name the listings are on. Required if it cannot be derived from the API key.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get the changelog of a dynamic set.

Returns the history of changes made to the set (membership changes, edits), ordered oldest first and optionally restricted to a date range.

Authorizations:
RmApiKey
path Parameters
set_id
required
integer

The Wheelhouse internal dynamic set ID.

query Parameters
after
string <date>

Only include changes on or after this date (YYYY-MM-DD).

before
string <date>

Only include changes before this date (YYYY-MM-DD, exclusive).

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get time-series metrics for a dynamic set.

Returns daily time-series data for one or more metrics over a date range, aggregated across the active member listings of the set.

Available metrics: asking_rate_w_fees, occupancy, occupancy_adjusted, adr_w_fees, lead_time, revpar_adjusted_w_fees, revpar_w_fees, revenue_w_fees, nights_bookable.

Authorizations:
RmApiKey
path Parameters
set_id
required
integer

The Wheelhouse internal dynamic set ID.

query Parameters
metric
Array of strings
Items Enum: "occupancy" "occupancy_adjusted" "nights_bookable" "asking_rate_w_fees" "adr_w_fees" "lead_time" "revpar_adjusted_w_fees" "revpar_w_fees" "revenue_w_fees"

Metrics to include. Defaults to all metrics. Send as ?metric=asking_rate_w_fees&metric=occupancy.

start_date
string <date>

Start of the date range (YYYY-MM-DD). Defaults to today. Must be within 3 years in the past and 1 year in the future.

end_date
string <date>

End of the date range (YYYY-MM-DD). Defaults to 1 year from today. Must be after start_date.

Responses

Response samples

Content type
application/json
{
  • "currency": "string",
  • "updated_at": "2019-08-24T14:15:22Z",
  • "data": [
    ]
}

Get metric distributions for a dynamic set.

Returns histogram distributions for one or more metrics for a given calendar month, aggregated across the active member listings of the set.

Available metrics: occupancy, occupancy_adjusted, asking_rate_w_fees, adr_w_fees, lead_time, revpar_adjusted_w_fees, revpar_w_fees, length_of_stay.

Authorizations:
RmApiKey
path Parameters
set_id
required
integer

The Wheelhouse internal dynamic set ID.

query Parameters
metric
Array of strings
Items Enum: "occupancy" "occupancy_adjusted" "asking_rate_w_fees" "adr_w_fees" "lead_time" "revpar_adjusted_w_fees" "revpar_w_fees" "length_of_stay"

Metrics to include. Defaults to all metrics. Send as ?metric=asking_rate_w_fees&metric=occupancy.

month
string <date>

The month to retrieve distributions for (any date within the month, YYYY-MM-DD). Defaults to the start of the current month.

Responses

Response samples

Content type
application/json
{
  • "currency": "string",
  • "month": "2019-08-24",
  • "updated_at": "2019-08-24T14:15:22Z",
  • "data": {
    }
}

Notifications

In-app notifications surfaced in the Wheelhouse dashboard at /u/account/notifications. Use these endpoints to list a user's active notifications and to dismiss them. Only non-dismissed, non-expired notifications are returned.

Use the notification settings endpoints to configure which alerts the user receives, and on which channel (in-app or email).

List active notifications.

Returns all active (non-dismissed, non-expired) notifications for the authenticated user, ordered most-recent first. These are the same notifications displayed in the Wheelhouse dashboard at /u/account/notifications.

review_url is a relative Wheelhouse dashboard URL that links to the relevant feature page for each notification (e.g. the market report, listing calendar, or dynamic set it relates to).

Authorizations:
RmApiKey

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Dismiss notifications.

Marks one or more notifications as dismissed. Dismissed notifications are no longer returned by GET /notifications.

Authorizations:
RmApiKey
Request Body schema: application/json
required
ids
required
Array of integers

IDs of notifications to dismiss.

Responses

Request samples

Content type
application/json
{
  • "ids": [
    ]
}

Response samples

Content type
application/json
{
  • "error": "API token is at rate limit"
}

List notification alert settings.

Returns the alert delivery settings for the authenticated user — the event/channel pairs the user currently receives. These control which alerts trigger the notifications returned by GET /notifications (and their email equivalents).

Authorizations:
RmApiKey

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Configure notification alert settings.

Enables or disables which alerts the authenticated user receives. Only the settings included in the request are affected — a setting is created when enabled is true and removed when enabled is false. Any event/channel pair not included is left unchanged. Enabling an already-enabled setting (or disabling one that is already off) is a no-op. Returns the user's full set of active settings after the update.

Authorizations:
RmApiKey
Request Body schema: application/json
required
required
Array of objects

Alert settings to update.

Responses

Request samples

Content type
application/json
{
  • "settings": [
    ]
}

Response samples

Content type
application/json
[
  • {
    }
]

Teams

Teams let a Wheelhouse account (the team owner) grant other Wheelhouse accounts access to manage its listings.

Use GET /teams/members to list the team members the authenticated user manages, POST /teams/members/invite to invite a new member by email, DELETE /teams/members/{sub_user_id} to remove one, and the auto_managed_listing_level, assigned_segments, and refresh_auto_managed_listings endpoints to control which of the owner's listings a member can access and at what level.

Use GET /teams/memberships to list the teams the authenticated user belongs to as a member, POST /teams/memberships/{master_user_id} to accept a pending invitation, and DELETE /teams/memberships/{master_user_id} to leave a team or decline an invitation.

List team members.

Returns the team members managed by the authenticated user.

Authorizations:
RmApiKey
query Parameters
include_managed_subs
boolean
Default: false

Also include the team members of any other Wheelhouse account for which the authenticated user has been granted manager-level (co-host) access to at least one listing — i.e., accounts the authenticated user administers on the owner's behalf.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Invite a team member.

Invites a user by email to join the authenticated user's team. If the invitee does not yet have a Wheelhouse account, a pending one is created for them.

Authorizations:
RmApiKey
Request Body schema: application/json
required
email
required
string

Email address of the invitee.

billing_delegated
boolean

Delegate billing for the invitee to the authenticated user.

Responses

Request samples

Content type
application/json
{
  • "email": "string",
  • "billing_delegated": true
}

Response samples

Content type
application/json
{
  • "user_id": 0,
  • "sub_user_id": 0,
  • "status": "A",
  • "user_first_name": "string",
  • "user_last_name": "string",
  • "user_email": "string",
  • "subuser_first_name": "string",
  • "subuser_last_name": "string",
  • "subuser_email": "string",
  • "billing_delegated": true,
  • "billing_delegated_at": "2019-08-24T14:15:22Z",
  • "auto_managed_listing_level": "N",
  • "sub_user_assignments": [
    ]
}

Remove a team member.

Deactivates a team member, revoking their access to the authenticated user's listings.

Authorizations:
RmApiKey
path Parameters
sub_user_id
required
integer

The Wheelhouse internal user ID of the team member (the sub_user_id field from a team member response).

Responses

Response samples

Content type
application/json
{
  • "user_id": 0,
  • "sub_user_id": 0,
  • "status": "A",
  • "user_first_name": "string",
  • "user_last_name": "string",
  • "user_email": "string",
  • "subuser_first_name": "string",
  • "subuser_last_name": "string",
  • "subuser_email": "string",
  • "billing_delegated": true,
  • "billing_delegated_at": "2019-08-24T14:15:22Z",
  • "auto_managed_listing_level": "N",
  • "sub_user_assignments": [
    ]
}

Set a team member's auto managed listing level.

Sets the access level a team member is automatically granted on the authenticated user's listings. When no portfolio segments are assigned to the team member (see POST /teams/members/{sub_user_id}/assigned_segments), this level applies to all of the authenticated user's listings.

Authorizations:
RmApiKey
path Parameters
sub_user_id
required
integer

The Wheelhouse internal user ID of the team member.

Request Body schema: application/json
required
level
required
string
Enum: "N" "R" "E" "F" "M"

The auto managed listing level. N disabled, R viewer, E restricted editor, F editor, M manager.

Responses

Request samples

Content type
application/json
{
  • "level": "N"
}

Response samples

Content type
application/json
{
  • "user_id": 0,
  • "sub_user_id": 0,
  • "status": "A",
  • "user_first_name": "string",
  • "user_last_name": "string",
  • "user_email": "string",
  • "subuser_first_name": "string",
  • "subuser_last_name": "string",
  • "subuser_email": "string",
  • "billing_delegated": true,
  • "billing_delegated_at": "2019-08-24T14:15:22Z",
  • "auto_managed_listing_level": "N",
  • "sub_user_assignments": [
    ]
}

Assign portfolio segments to a team member.

Sets the portfolio segments a team member auto manages listings for, then immediately refreshes their auto managed listing access to match. Replaces any previously assigned segments.

Authorizations:
RmApiKey
path Parameters
sub_user_id
required
integer

The Wheelhouse internal user ID of the team member.

Request Body schema: application/json
required
ids
required
Array of integers

Portfolio segment IDs.

Responses

Request samples

Content type
application/json
{
  • "ids": [
    ]
}

Response samples

Content type
application/json
{
  • "user_id": 0,
  • "sub_user_id": 0,
  • "status": "A",
  • "user_first_name": "string",
  • "user_last_name": "string",
  • "user_email": "string",
  • "subuser_first_name": "string",
  • "subuser_last_name": "string",
  • "subuser_email": "string",
  • "billing_delegated": true,
  • "billing_delegated_at": "2019-08-24T14:15:22Z",
  • "auto_managed_listing_level": "N",
  • "sub_user_assignments": [
    ]
}

Refresh a team member's auto managed listing access.

Re-evaluates and applies the auto managed listing level and assigned segments for a team member against the authenticated user's current listings.

Authorizations:
RmApiKey
path Parameters
sub_user_id
required
integer

The Wheelhouse internal user ID of the team member.

Responses

Response samples

Content type
application/json
{
  • "user_id": 0,
  • "sub_user_id": 0,
  • "status": "A",
  • "user_first_name": "string",
  • "user_last_name": "string",
  • "user_email": "string",
  • "subuser_first_name": "string",
  • "subuser_last_name": "string",
  • "subuser_email": "string",
  • "billing_delegated": true,
  • "billing_delegated_at": "2019-08-24T14:15:22Z",
  • "auto_managed_listing_level": "N",
  • "sub_user_assignments": [
    ]
}

List team memberships.

Returns the teams the authenticated user belongs to as a team member (i.e. teams owned by another Wheelhouse account).

Authorizations:
RmApiKey

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Accept a team invitation.

Accepts a pending invitation to join another Wheelhouse account's team. Does nothing (still returns success) if there is no matching pending invitation.

Authorizations:
RmApiKey
path Parameters
master_user_id
required
integer

The Wheelhouse internal user ID of the team owner (the user_id field from a team membership response).

Responses

Response samples

Content type
application/json
{
  • "error": "API token is at rate limit"
}

Leave a team, or decline an invitation.

Deactivates the authenticated user's membership in another Wheelhouse account's team. Also used to decline a pending invitation.

Authorizations:
RmApiKey
path Parameters
master_user_id
required
integer

The Wheelhouse internal user ID of the team owner.

Responses

Response samples

Content type
application/json
{
  • "error": "API token is at rate limit"
}

Changelog

2026-07-07

  • Added GET /segments/{segment_id}/aggregated_metrics endpoint. Returns monthly performance metrics aggregated across the listings matched by a segment's filter, mirroring GET /sets/{set_id}/aggregated_metrics. Monetary values default to the currency of the segment's most common market.

2026-07-03

  • Added GET /notification_settings and PUT /notification_settings endpoints. Users can now read which alerts they receive and enable or disable individual alert event/channel (in-app or email) settings via the API.

2026-07-02

  • Added the Team endpoints: GET /teams/members, POST /teams/members/invite, DELETE /teams/members/{sub_user_id}, POST /teams/members/{sub_user_id}/auto_managed_listing_level, POST /teams/members/{sub_user_id}/assigned_segments, POST /teams/members/{sub_user_id}/refresh_auto_managed_listings, GET /teams/memberships, POST /teams/memberships/{master_user_id}, and DELETE /teams/memberships/{master_user_id} to manage team members and memberships.

2026-06-30

  • Added POST /segments endpoint. Creates a new portfolio segment owned by the authenticated user. Accepts filter_backend to define the listing filter criteria.
  • Added PUT /segments/{segment_id} endpoint. Updates the name, description, filter_backend, and/or default status of an existing segment.

2026-06-29

  • Added POST /listings/{listing_id}/sync endpoint. Triggers a manual sync that pushes the latest Wheelhouse price recommendations to the connected channel and refreshes reservation data — equivalent to the Sync button in the UI. Available on paid plans only; subject to a per-day rate limit and a 60-second debounce.

2026-06-26

  • Added GET /listings/{listing_id}/base_price_history endpoint. Returns a daily log of Wheelhouse base price recommendations and effective base prices for a listing over the last 30 days (or a custom date range).
  • Added GET /listings/{listing_id}/calendar_day_history endpoint. Returns the history of price postings and calendar state snapshots for a specific stay date. Requires the Historical Price Changes feature on the listing's plan.

2026-06-24

  • Extended GET /listings/{listing_id}/kpis with additional metrics: revenue_available, revenue_blocked, min_price_occurrence, occupancy_neighborhood, occupancy_neighborhood_pp, occupancy_neighborhood_ratio, occupancy_neighborhood_adjusted, occupancy_neighborhood_adjusted_pp, occupancy_neighborhood_adjusted_ratio (all forward-only, periods 7/14/21/30/60/90/180/365); comp_set_occupancy, comp_set_occupancy_adjusted, comp_set_revenue (forward-only, periods 7/30/60); pickup (backward-only, periods 7/14/30); asking_rate_lowest and asking_rate_highest (backward-only, period 365); revenue_score (non-overlapping windows 0–30, 31–60, 61–90 days); and scalar comp_set_count.

2026-06-23

  • Added GET /listings/{listing_id}/custom_rates endpoint. Returns all active and upcoming custom rate periods for a listing, excluding expired ones.

2026-06-18

  • Split GET /listings/{listing_id}/kpis into four dedicated endpoints: GET /listings/{listing_id}/kpis (rolling-window metrics — bidirectional periods 7/14/21/30/60/90/180/365), GET /listings/{listing_id}/kpis/monthly (up to 15 months back incl. default dynamic-set metrics), GET /listings/{listing_id}/kpis/quarterly (up to 5 recent quarters), and GET /listings/{listing_id}/kpis/yearly (up to 5 years). Each response includes currency. The old days parameter is no longer accepted.

2026-06-17

  • Added GET /notifications and POST /notifications/dismiss endpoints. Users can now list their active in-app notifications and dismiss specific ones by ID via the API.
  • Added optional expires_at field to PUT /listings/{listing_id}/custom_rates and PUT /listings/{listing_id}/bulk_custom_rates. Custom rates can now be set with an expiry timestamp after which they are no longer applied.
  • Added GET /listings/{listing_id}/fee_impact_calendar endpoint. Returns a per-date fee multiplier derived from the listing's estimated fee setting. Multiply any nightly price by the multiplier to get the fee-inclusive price.
  • Added GET /listings/{listing_id}/min_stay_calendar endpoint. Returns the per-date minimum stay derived from the listing's minimum stay rules for a given date range.

2026-06-10

  • Added the Notes endpoints: GET /listings/{listing_id}/notes, POST /listings/{listing_id}/notes, PUT /listings/{listing_id}/notes/{note_id}, and DELETE /listings/{listing_id}/notes/{note_id} to manage the notes of a listing.
  • Added the Dynamic Sets endpoints: GET /sets, GET /sets/{set_id}, GET /sets/{set_id}/aggregated_metrics, GET /sets/{set_id}/listings, GET /sets/{set_id}/associated_listings, PUT /sets/{set_id}/associated_listings, DELETE /sets/{set_id}/associated_listings, GET /sets/{set_id}/changelog, GET /sets/{set_id}/time_series, and GET /sets/{set_id}/distribution. RM API users can access their paid dynamic sets.
  • Added GET /listings/{listing_id}/neighborhood/pricing endpoint to fetch daily neighborhood price data (median, p25, p75, listing count) for the listing's local cluster.
  • Added GET /listings/{listing_id}/neighborhood/occupancy endpoint to fetch daily neighborhood occupancy and booking model data for the listing's local cluster.

2026-06-09

  • Added GET /listings/{listing_id}/last_posted_prices endpoint. Returns the last price posted to the channel per stay date. For available nights this is the most recently posted price; for booked nights it is the last price posted at or before the time the booking was recorded.
  • Added GET /market_report, GET /market_report/{market_id}/time_series, and GET /market_report/{market_id}/distribution endpoints. RM API users can access market-level data for markets in which they have listings.

2026-04-20

  • All PUT endpoints now return 409 Conflict when a concurrent request for the same resource is already in progress. Retry the request after the concurrent request completes.
  • Added GET /listings/{listing_id}/price_calendar endpoint to fetch the price calendar for a single listing.

2026-04-16

  • Documented 403 Forbidden for read-only RM API keys on PUT and DELETE operations.

2026-04-08

  • Extension of GET /listings/{listing_id}/base_price_recommendation endpoint to include attribution breakdown.

2026-03-09

  • Initial release of the Wheelhouse Revenue Management API.
  • Endpoints: GET /listings, GET /listings/{listing_id}, GET /listings/{listing_id}/pricing_tier, GET /listings/{listing_id}/recent_changes, GET /listings/{listing_id}/kpis.
  • Endpoints: GET /listings/{listing_id}/price_recommendations, GET /listings/{listing_id}/base_price_recommendation, GET /listings/{listing_id}/checkin_checkout, GET /listings/{listing_id}/min_max_prices, GET /listings/{listing_id}/monthly_seasonality.
  • Endpoints: GET /preferences, PUT /preferences, GET /preferences/{listing_id}, PUT /preferences/{listing_id}, PUT /preferences/{listing_id}/copy, PUT /preferences/{listing_id}/{setting}, GET /preferences/{listing_id}/long_term_discounts, GET /preferences/{listing_id}/changelog, POST /preferences/{listing_id}/preview.
  • Endpoints: PUT /listings/{listing_id}/custom_rates, DELETE /listings/{listing_id}/custom_rates, PUT /listings/{listing_id}/bulk_custom_rates, DELETE /listings/{listing_id}/bulk_custom_rates.
  • Endpoints: GET /listings/{listing_id}/reservations (with date_filter_type parameter).
  • Endpoints: GET /listings/{listing_id}/tags, PUT /listings/{listing_id}/tags, GET /listings/{listing_id}/flags.
  • Endpoints: GET /segments, GET /segments/{segment_id}/listings.