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

All requests require an RM API key sent 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.

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.

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.

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: false

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": { },
  • "in_market": true,
  • "market_id": 0,
  • "is_active": true,
  • "wheelhouse_created_at": "2019-08-24T14:15:22Z"
}

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"
}

Get KPIs for a listing.

Returns occupancy, revenue, and booking KPIs for a given look-ahead window.

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.

days
integer [ 1 .. 365 ]
Default: 30

The number of look-ahead days for which to calculate KPIs.

Responses

Response samples

Content type
application/json
{
  • "adjusted_occupancy": 0,
  • "occupancy": 0,
  • "available_nights": 0,
  • "average_asking_rate": 0,
  • "average_nightly_rate": 0,
  • "adjusted_nightly_revpar": 0,
  • "nightly_revpar": 0,
  • "last_booked_at": "2019-08-24T14:15:22Z",
  • "booked": 0
}

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.

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 automated price posting is enabled for this listing.

base_price
number

The manually set base price. If set, overrides Wheelhouse's data-driven recommendation.

base_price_adjustment
number

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

monthly_discount
number
Default: 0

Monthly discount percentage. This is a simplified setting for a single discount that applies to all bookings >= 28 days. Alternatively a channel can use the full daily discount rules under long_term_discounts.

weekly_discount
number
Default: 0

Weekly discount percentage. This is a simplified setting for a single discount that applies to all bookings >= 7 days. Alternatively a channel can use the full daily discount rules under long_term_discounts.

nickname
string

Listing nickname. Overrides the listing's default nickname.

object

Last-minute discount configuration.

object

Far-future premium configuration.

object

Seasonality adjustment configuration.

object

Day-of-week pricing factor configuration.

object (gap_night)

Gap night pricing strategy. When type is CUS, provide custom rules; the server rejects CUS without custom.

Array of any (integer_calendar_rule)
Default: []

Minimum stay rules.

min_stays_enabled
boolean

Whether minimum stay rules are enabled.

Array of any (integer_calendar_rule)
Default: []

Minimum price rules.

Array of any (integer_calendar_rule)
Default: []

Maximum price rules.

object

Check-in/check-out rule configuration identifier.

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

Rule-based long-term discount configuration.

object
Default: {}

Occupancy pacing configuration.

Array of any (integer_calendar_rule)
Default: []

Demand sensitivity rules.

Array of any (integer_calendar_rule)
Default: []

Historical anchoring rules.

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.

min_min_price
number
Default: 0

Hard lower bound that overrides all pricing rules — no recommended price will fall below this value regardless of other rule configurations.

min_min_stay
integer
Default: 0

Hard lower bound that overrides all minimum stay rules — no minimum stay will be set below this value regardless of other rule configurations.

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": 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,
  • "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": {
    }
}

Listing Preferences

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

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. Must be sent using Rails-style bracket notation: ?listing_ids[]=A&listing_ids[]=B.

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.

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,
  • "update_from": "string",
  • "update_from_id": 0,
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Update preferences for a listing.

Updates pricing 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.

Request Body schema: application/json
required
automatic_rate_posting_enabled
boolean

Whether automated price posting is enabled for this listing.

base_price
number

The manually set base price. If set, overrides Wheelhouse's data-driven recommendation.

base_price_adjustment
number

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

monthly_discount
number
Default: 0

Monthly discount percentage. This is a simplified setting for a single discount that applies to all bookings >= 28 days. Alternatively a channel can use the full daily discount rules under long_term_discounts.

weekly_discount
number
Default: 0

Weekly discount percentage. This is a simplified setting for a single discount that applies to all bookings >= 7 days. Alternatively a channel can use the full daily discount rules under long_term_discounts.

nickname
string

Listing nickname. Overrides the listing's default nickname.

object

Last-minute discount configuration.

object

Far-future premium configuration.

object

Seasonality adjustment configuration.

object

Day-of-week pricing factor configuration.

object (gap_night)

Gap night pricing strategy. When type is CUS, provide custom rules; the server rejects CUS without custom.

Array of any (integer_calendar_rule)
Default: []

Minimum stay rules.

min_stays_enabled
boolean

Whether minimum stay rules are enabled.

Array of any (integer_calendar_rule)
Default: []

Minimum price rules.

Array of any (integer_calendar_rule)
Default: []

Maximum price rules.

object

Check-in/check-out rule configuration identifier.

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

Rule-based long-term discount configuration.

object
Default: {}

Occupancy pacing configuration.

Array of any (integer_calendar_rule)
Default: []

Demand sensitivity rules.

Array of any (integer_calendar_rule)
Default: []

Historical anchoring rules.

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.

min_min_price
number
Default: 0

Hard lower bound that overrides all pricing rules — no recommended price will fall below this value regardless of other rule configurations.

min_min_stay
integer
Default: 0

Hard lower bound that overrides all minimum stay rules — no minimum stay will be set below this value regardless of other rule configurations.

Responses

Request samples

Content type
application/json
{
  • "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
}

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,
  • "update_from": "string",
  • "update_from_id": 0,
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

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
{
  • "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,
  • "update_from": "string",
  • "update_from_id": 0,
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

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. Cannot be more than 90 days in the past.

end_date
string <date>

End of the date range to retrieve changes for. Defaults to tomorrow.

Responses

Response samples

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

Custom Rates

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

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.

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

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
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "listing_id": 0,
  • "rate_type": "fixed",
  • "fixed": true,
  • "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,
  • "is_blocked": true,
  • "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. Any partially covered custom rates will be adequately shortened and the affected date range will be set to the recommended price again.

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.

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.

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.

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

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.

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

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Segments

Portfolio segments allow users to group listings by filter criteria. Use these endpoints to list a user's segments and to retrieve the listings that belong to a given segment. Segments are defined in the Wheelhouse UI; the API exposes read-only access.

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
[
  • {
    }
]

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
[
  • {
    }
]

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

Filter to a property type (e.g. house, apartment, cabin). 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

Filter to a property type (e.g. house, apartment, cabin). 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 and generated report.

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"
}

Get the report of a dynamic set.

Returns a signed URL to the set's generated report. The URL is valid for 10 minutes — download the report promptly after requesting it. Reports are generated asynchronously when a set changes; fetching the URL of a report that has not been generated yet results in an error when the URL is accessed.

Authorizations:
RmApiKey
path Parameters
set_id
required
integer

The Wheelhouse internal dynamic set ID.

Responses

Response samples

Content type
application/json
{
  • "url": "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
[
  • {
    }
]

Changelog

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, and GET /sets/{set_id}/report. 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.