Dynamic sets are saved collections of relevant properties that meet your specified criteria. They're built inside Wheelhouse Navigator — a map-based interface that combines geographic, performance, pricing, inventory type, operator type, LOS & fees, and amenity data. Use dynamic sets for benchmarking, pricing strategy, owner comms, listing acquisition, and more.
Dynamic sets include two distinct listing types: the member listings inside the set (properties matching your criteria), and your own associated listings that you've linked for side-by-side comparison.
Important
The RM API only exposes paid dynamic sets. Free sets return 404 Not Found.
GET /sets
List all paid dynamic sets the authenticated user owns or has shared access to. Results are ordered by most recently updated first.
curl "https://api.usewheelhouse.com/ss_api/v1/sets" \
-H "X-Integration-Api-Key: your_api_key_here"
Query parameters
per_page(integer, optional, default:50) — number of sets per page (max 100)page(integer, optional) — page numberoffset(integer, optional) — number of items to skip
Response — array of dynamic set objects:
[
{
"id": 7,
"user_id": 1001,
"name": "Beachfront Comps",
"description": "Top comps near our Malibu property",
"kind": "competitive",
"currency": "USD",
"is_static": true,
"filters": {},
"boundary": [...],
"listing_counts": {
"active": 8,
"hidden": 1,
"review": 0,
"removed": 1
},
"updated_at": "2026-01-15T08:30:00Z"
}
]
Response fields
id— Wheelhouse's internal dynamic set ID (integer)kind— the use-case label for the set. One of:competitive,market,neighborhood,marketing,acquisition,underwriting,merchandising,otheris_static—trueif member listings are a frozen snapshot;falseif the set auto-syncs based on its boundary and filterslisting_counts— member counts broken down by status:active,hidden,review,removedboundary— geographic boundary of the set
Status codes
200— array of dynamic sets401— API key authorization failed
GET /sets/:set_id
Get detailed information about a single dynamic set, including its definition, boundary, and member counts per status.
curl "https://api.usewheelhouse.com/ss_api/v1/sets/7" \
-H "X-Integration-Api-Key: your_api_key_here"
Path parameters
set_id(integer, required) — Wheelhouse internal dynamic set ID
Status codes
200— dynamic set object (same shape as list response)401— API key authorization failed404— not found, not accessible, or not a paid set
GET /sets/:set_id/aggregated_metrics
Get monthly performance metrics aggregated across active member listings.
curl "https://api.usewheelhouse.com/ss_api/v1/sets/7/aggregated_metrics?currency=USD&dates=2026-05-01&dates=2026-06-01" \
-H "X-Integration-Api-Key: your_api_key_here"
Path parameters
set_id(integer, required) — Wheelhouse internal dynamic set ID
Query parameters
currency(string, optional) — ISO 4217 3-letter currency code. Defaults to the set's currency.dates(string[], optional) — restrict to months starting on these dates (YYYY-MM-DD, first of month). Send multiple as?dates=2026-05-01&dates=2026-06-01. Defaults to all available.
Status codes
200— aggregated metrics per period401— API key authorization failed404— not found, not accessible, or not a paid set
GET /sets/:set_id/listings
List member listings grouped by membership status, with trailing year performance metrics.
curl "https://api.usewheelhouse.com/ss_api/v1/sets/7/listings" \
-H "X-Integration-Api-Key: your_api_key_here"
Path parameters
set_id(integer, required) — Wheelhouse internal dynamic set ID
Response
json
{ "active": [...], "hidden": [...], "review": [...], "removed": [...] }
active— currently active membershidden— hidden from the set viewreview— pending review before being addedremoved— previously removed members
Status codes
200— member listings grouped by status401— API key authorization failed404— not found, not accessible, or not a paid set
GET /sets/:set_id/time_series
Get daily time-series metrics aggregated across active member listings over a date range.
curl "https://api.usewheelhouse.com/ss_api/v1/sets/7/time_series?metric=occupancy&metric=adr_w_fees&start_date=2026-01-01&end_date=2026-06-30" \
-H "X-Integration-Api-Key: your_api_key_here"
Path parameters
set_id(integer, required) — Wheelhouse internal dynamic set ID
Query parameters
metric(string[], optional) — metrics to include. Available:asking_rate_w_fees,occupancy,occupancy_adjusted,adr_w_fees,lead_time,revpar_adjusted_w_fees,revpar_w_fees,revenue_w_fees,nights_bookable. Defaults to all.start_date(string, optional) — YYYY-MM-DD. Defaults to today. Max 3 years past, 1 year future.end_date(string, optional) — YYYY-MM-DD. Defaults to 1 year from today. Must be afterstart_date.
Status codes
200— time-series data204— not enough data400— invalid parameter value401— API key authorization failed404— not found, not accessible, or not a paid set
GET /sets/:set_id/distribution
Get histogram distributions for one or more metrics for a given calendar month.
curl "https://api.usewheelhouse.com/ss_api/v1/sets/7/distribution?metric=occupancy&metric=adr_w_fees&month=2026-06-01" \
-H "X-Integration-Api-Key: your_api_key_here"
Path parameters
set_id(integer, required) — Wheelhouse internal dynamic set ID
Query parameters
metric(string[], optional) — metrics to include. Available:occupancy,occupancy_adjusted,asking_rate_w_fees,adr_w_fees,lead_time,revpar_adjusted_w_fees,revpar_w_fees,length_of_stay. Defaults to all.month(string, optional) — any date within the target month (YYYY-MM-DD). Defaults to start of current month.
Response
Each metric key maps to an array of histogram buckets:
{
"currency": "USD",
"month": "2026-06-01",
"data": {
"occupancy": [
{ "bucket_min_incl": 0.0, "bucket_max_excl": 0.1, "probability": 0.0625, "percentile": 0.0625 }
],
"adr_w_fees": [...],
"lead_time": [...],
"length_of_stay": [...]
}
}
Metric units:
asking_rate_w_fees,adr_w_fees,revpar_adjusted_w_fees,revpar_w_fees— monetary, in thecurrencyat the top leveloccupancy,occupancy_adjusted— decimal fraction (0–1); multiply by 100 for percentagelead_time— days; negative = advance booking (booked before stay date)length_of_stay— nights
Status codes
200— metric distributions for the month204— not enough data400— invalid parameter value401— API key authorization failed404— not found, not accessible, or not a paid set
GET /sets/:set_id/associated_listings
List the authenticated user's own listings associated with the set for comparison. For shared sets, listings you don't have access to are omitted.
curl "https://api.usewheelhouse.com/ss_api/v1/sets/7/associated_listings" \
-H "X-Integration-Api-Key: your_api_key_here"
Path parameters
set_id(integer, required) — Wheelhouse internal dynamic set ID
Status codes
200— array of associated listing objects401— API key authorization failed404— not found, not accessible, or not a paid set
PUT /sets/:set_id/associated_listings
Associate your own listings with a dynamic set. Already-associated listings are left unchanged. Requires editor or manager access on shared sets.
curl -X PUT "https://api.usewheelhouse.com/ss_api/v1/sets/7/associated_listings" \
-H "X-Integration-Api-Key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{ "listing_ids": ["abc123", "def456"], "channel": "airbnb" }'
Path parameters
set_id(integer, required) — Wheelhouse internal dynamic set ID
Request body
listing_ids(string[], required) — channel listing IDs to associate. Maximum 500.channel(string, conditional) — required if it cannot be derived from the API key.
Status codes
200— updated array of associated listing objects400— invalid parameters401— API key authorization failed403— insufficient access or read-only API key404— not found, not accessible, or not a paid set409— concurrent request in progress; retry after it completes
DELETE /sets/:set_id/associated_listings
Remove your own listings from a dynamic set. Requires editor or manager access on shared sets.
curl -X DELETE "https://api.usewheelhouse.com/ss_api/v1/sets/7/associated_listings?listing_ids=abc123&listing_ids=def456&channel=airbnb" \
-H "X-Integration-Api-Key: your_api_key_here"
Path parameters
set_id(integer, required) — Wheelhouse internal dynamic set IDlisting_ids(string[], required) — channel listing IDs to remove. Maximum 500.channel(string, conditional) — required if it cannot be derived from the API key.
Status codes
200— updated array of associated listing objects400— invalid parameters401— API key authorization failed403— insufficient access or read-only API key404— not found409— concurrent request in progress; retry after it completes
GET /sets/:set_id/changelog
Get the history of changes to a dynamic set — membership additions, removals, and edits — ordered oldest first.
curl "https://api.usewheelhouse.com/ss_api/v1/sets/7/changelog?after=2026-01-01" \
-H "X-Integration-Api-Key: your_api_key_here"
Path parameters
set_id(integer, required) — Wheelhouse internal dynamic set ID
Query parameters
after(string, optional) — only include changes on or after this date (YYYY-MM-DD)before(string, optional) — only include changes before this date (YYYY-MM-DD, exclusive)
Status codes
200— array of changelog entries401— API key authorization failed404— not found, not accessible, or not a paid set
Related
Segments: Portfolio Groups and Filters
Market Reports & Neighborhood Data: Market-level insights
How to organize and filter listings (tags, segments, dynamic sets)