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) — whentrue, returns only active listings. Hidden listings are not inactive, so they are still returned; check theis_hiddenfield on each result to leave them outinclude_managed_listings(boolean, default:true) — includes listings you manage for another Wheelhouse account (shared/delegated access), in addition to your own. Set it tofalseto return only your own listingsowner_user_id(integer) — return only the listings owned by this Wheelhouse user (theowner_user.idon each listing). Pass a team membership'suser_idfromGET /teams/membershipsto 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 listinclude_photos(boolean, default:false) — set totrueto include the URLs of each listing's photos inmeta.photos.num_photosis returned either wayper_page(integer, default:50) — number of results per page (max 100)page(integer, default:1) — page numberoffset(integer) — number of items to skip; alternative topage
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 aslisting_idin all other endpoints)channel— the integration connected to this listing (use this as thechannelparameter in other endpoints)wheelhouse_id— Wheelhouse's internal numeric ID for this listingtitle— the listing name as it appears on the channelnickname— shortened name used internally in Wheelhousecurrency— ISO-4217 currency code for this listing's pricingnum_bedrooms/num_bathrooms— property details (bathrooms may be fractional, e.g. 1.5)location— nested object withaddress,country,latitude,longitude,postal_codeis_active— whether the listing is currently activenumber_of_active_units—nullfor standard listings; positive integer for multi-unit listings (see note below)wheelhouse_created_at— when the listing was added to Wheelhouseis_hidden— whether the listing has been hidden in the Wheelhouse app. Hiding does not deactivate or disconnect a listingowner_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 accessaccess_level— your access role:owner,viewer,restricted_editor,editor, ormanager.owner,editorandmanagerhave full read and write access.restricted_editorcan read and write the listing, except thatPUT /listings/:listing_id/tagsreturns403and the bulkPUT /preferencesreports the listing as an error with status403(usePUT /preferences/:listing_idinstead).vieweris read-only: PUT, POST and DELETE requests return403, except removing the listing from a set withDELETE /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 (fromGET /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, orPro Onboardinghorizon— 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 updatedrates— 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
429If a sync was already requested within the last 60 seconds, returns
423— wait before retryingPro 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