Skip to main content

Listings: Retrieve and Inspect Your Properties

Written by Ryo

The listings endpoints are your starting point for any RM API integration. Use them to retrieve your full property portfolio or inspect a specific listing's details — including its listing_id and channel, which are required by most other endpoints.


GET /listings

Retrieve every listing you can access: the ones you own and, by default, the ones you manage for another Wheelhouse account.

curl "https://api.usewheelhouse.com/ss_api/v1/listings" \
-H "X-Integration-Api-Key: your_api_key_here"

Query parameters

  • exclude_inactive (boolean, default: true) — when true, returns only active listings. Hidden listings are not inactive, so they are still returned; check the is_hidden field on each result to leave them out

  • include_managed_listings (boolean, default: true) — includes listings you manage for another Wheelhouse account (shared/delegated access), in addition to your own. Set it to false to return only your own listings

  • owner_user_id (integer) — return only the listings owned by this Wheelhouse user (the owner_user.id on each listing). Pass a team membership's user_id from GET /teams/memberships to read one team's listings. It only narrows the listings you can already access; for a user whose listings you cannot access it returns an empty list

  • include_photos (boolean, default: false) — set to true to include the URLs of each listing's photos in meta.photos. num_photos is returned either way

  • per_page (integer, default: 50) — number of results per page (max 100)

  • page (integer, default: 1) — page number

  • offset (integer) — number of items to skip; alternative to page

Response

Returns a plain array of listing objects:

[
{
"id": "12345678",
"channel": "airbnb",
"wheelhouse_id": 987654,
"title": "2BR Beachfront Villa",
"nickname": "Beach Villa",
"currency": "USD",
"num_bedrooms": 2,
"num_bathrooms": 1.0,
"location": {
"address": "Miami Beach, FL",
"country": "US",
"latitude": 25.7825,
"longitude": -80.1340
},
"is_active": true,
"number_of_active_units": null,
"wheelhouse_created_at": "2024-01-15 08:00:00 -0800",
"is_hidden": false,
"access_level": "owner"
}
]

Response fields

  • id — the channel's unique listing ID (use this as listing_id in all other endpoints)

  • channel — the integration connected to this listing (use this as the channel parameter in other endpoints)

  • wheelhouse_id — Wheelhouse's internal numeric ID for this listing

  • title — the listing name as it appears on the channel

  • nickname — shortened name used internally in Wheelhouse

  • currency — ISO-4217 currency code for this listing's pricing

  • num_bedrooms / num_bathrooms — property details (bathrooms may be fractional, e.g. 1.5)

  • location — nested object with address, country, latitude, longitude, postal_code

  • is_active — whether the listing is currently active

  • number_of_active_units — null for standard listings; positive integer for multi-unit listings (see note below)

  • wheelhouse_created_at — when the listing was added to Wheelhouse

  • is_hidden — whether the listing has been hidden in the Wheelhouse app. Hiding does not deactivate or disconnect a listing

  • owner_user — the Wheelhouse account the listing belongs to (id, email, first_name, last_name). For listings you own it is your own account; for managed listings it is the account that granted you access

  • access_level — your access role: owner, viewer, restricted_editor, editor, or manager. owner, editor and manager have full read and write access. restricted_editor can read and write the listing, except that PUT /listings/:listing_id/tags returns 403 and the bulk PUT /preferences reports the listing as an error with status 403 (use PUT /preferences/:listing_id instead). viewer is read-only: PUT, POST and DELETE requests return 403, except removing the listing from a set with DELETE /sets/:set_id/associated_listings

Multi-unit listings

A non-null number_of_active_units means the listing has multiple independently bookable units. Calendar endpoints (/price_calendar, /last_posted_prices) return one row per unit per date, with a unit_number field identifying which unit the row belongs to.


GET /listings/:listing_id

Retrieve details for a single listing.

curl "https://api.usewheelhouse.com/ss_api/v1/listings/12345678?channel=airbnb" \
-H "X-Integration-Api-Key: your_api_key_here"
bash

Path parameters

  • listing_id (string, required) — the channel's unique listing identifier

Query parameters

  • channel (string, required) — the channel name for this listing (from GET /listings)

Response

Returns a single listing object with the same fields as above.


GET /listings/:listing_id/pricing_tier

Get the pricing tier for a listing — useful for understanding what features are available.

curl "https://api.usewheelhouse.com/ss_api/v1/listings/12345678/pricing_tier?channel=airbnb" \
-H "X-Integration-Api-Key: your_api_key_here"

Response fields

  • name — the listing's pricing tier: Free, Pro Flex, Pro Flat, Pro Trial, or Pro Onboarding

  • horizon — how many days into the future price recommendations are generated


GET /listings/:listing_id/recent_changes

Get timestamps of the most recent preference and rate changes for a listing. Useful for detecting changes since your last sync.

curl "https://api.usewheelhouse.com/ss_api/v1/listings/12345678/recent_changes?channel=airbnb" \
-H "X-Integration-Api-Key: your_api_key_here"

Response fields

  • settings — ISO 8601 datetime when the listing's preferences were last updated

  • rates — ISO 8601 datetime when custom rates were last updated (nullable)


POST /listings/:listing_id/sync

Trigger a manual price sync — pushes the latest Wheelhouse price recommendations to the connected channel and refreshes reservation data. Equivalent to clicking Sync in the Wheelhouse UI.

curl --request POST "https://api.usewheelhouse.com/ss_api/v1/listings/12345678/sync?channel=airbnb" \
-H "X-Integration-Api-Key: your_api_key_here"

Returns 202 Accepted immediately — the sync runs asynchronously.

Important notes:

  • Manual syncs require a paid (Pro) plan — free plan listings return 429

  • If a sync was already requested within the last 60 seconds, returns 423 — wait before retrying

  • Pro listings have no daily limit on manual syncs. Each sync uses 3 to 4 API calls, which count toward your key's limit of 60 requests per minute


Code examples

Python — fetch all active listing IDs and channels

import requests

headers = {"X-Integration-Api-Key": "your_api_key_here"}
BASE_URL = "https://api.usewheelhouse.com/ss_api/v1"

resp = requests.get(f"{BASE_URL}/listings", headers=headers, params={"exclude_inactive": "true"})
listings = resp.json()

for listing in listings:
print(f"ID: {listing['id']} | Channel: {listing['channel']} | Name: {listing['title']}")

Python — check for recently changed listings

import requests

headers = {"X-Integration-Api-Key": "your_api_key_here"}
BASE_URL = "https://api.usewheelhouse.com/ss_api/v1"

listings = requests.get(f"{BASE_URL}/listings", headers=headers).json()

for listing in listings:
changes = requests.get(
f"{BASE_URL}/listings/{listing['id']}/recent_changes",
headers=headers,
params={"channel": listing["channel"]}
).json()
if changes.get("settings"):
print(f"{listing['title']}: preferences last changed {changes['settings']}")
python

Related

Understanding listing_id and channel — the two required parameters Pagination: using per_page, page, and offset

Did this answer your question?