When a request fails, the RM API returns a standard HTTP status code along with an error message in the response body. Here's what each code means and what to do about it.
400 Bad Request
The request was malformed — missing required fields, invalid values, or incorrect JSON syntax. Check your request body and query parameters. Common causes:
Missing a required field like
start_dateorend_dateon custom ratesSending a string where a number is expected
Malformed JSON in the request body
401 Unauthorized
Your API key is missing or invalid.
The RM API uses a custom header — not standard Bearer auth. Make sure your request includes exactly:
X-Integration-Api-Key: your_api_key_here
Common mistakes:
Using
Authorization: Bearer your_api_key— this won't workUsing
Api-KeyorX-Api-Keyinstead ofX-Integration-Api-KeyPassing the key as a query parameter instead of a header
If the header is correct and you're still getting 401, regenerate your API key in the Wheelhouse dashboard.
403 Forbidden
Your API key is valid but doesn't have permission to access this resource.
This usually means the listing_id belongs to a different Wheelhouse account than your API key. Verify listing IDs by calling GET /listings — only listings that appear in that response are accessible with your key.
404 Not Found
The requested resource doesn't exist.
Confirm the
listing_idis correctCheck that the listing is still active in Wheelhouse
Verify the endpoint path — a typo in the URL will return a 404
422 Unprocessable Entity
The request was well-formed but contained invalid data the server couldn't process.
The response body will include a description of what failed. Common causes:
Date ranges where
end_dateis beforestart_dateValues outside an accepted range (e.g.
per_pagegreater than 100)Unsupported
channelvalue
423 Locked
The listing hasn't completed its initial Wheelhouse setup. This happens with recently added listings that haven't been fully configured yet.
Wait for setup to complete, or have the property manager finish the initial configuration in the Wheelhouse dashboard before retrying. Build 423 handling into your integration so it skips unconfigured listings gracefully rather than failing the whole operation.
429 Too Many Requests
You've exceeded the rate limit — RM API keys are limited to 60 requests per minute by default, on a rolling one-minute window.
Implement exponential backoff: after the first 429, wait 1 second, then double the delay on each retry (2s, 4s, 8s, …) up to about 60 seconds, with ±10–20% jitter to avoid concurrent clients retrying in lockstep
For bulk preference updates, use
PUT /preferencesto update multiple listings in a single request instead of looping single-listing callsIf your integration regularly hits the limit, batch requests where possible or contact Wheelhouse to discuss a higher limit
500 Internal Server Error
Something went wrong on Wheelhouse's end. This is not caused by your request.
Wait a moment and retry. If the error persists, contact Wheelhouse support.
207 Multi-Status
Returned on bulk operations when some items succeeded and others failed. This is not an error — it means partial success.
Check the response body for a per-item breakdown of what succeeded and what failed. Common per-item failure causes: listing in 423 Locked state, invalid value for a setting, listing ID not belonging to your account. Retry only the failed items — don't re-send the full batch.
Common scenarios
Price recommendations are empty or missing dates
Confirm you're passing
channel=airbnb— the parameter is requiredCheck that the listing is active in Wheelhouse
The recommendation window length depends on your account's plan tier — a shorter window than expected may be a plan limit, not an error
Custom rates aren't appearing in Wheelhouse
Confirm the response was 200, not 400 or 422
Dates must be in
YYYY-MM-DDformat;end_datemust be afterstart_dateFor
rate_type: "adjustment",rateis a multiplier (e.g.0.9= 10% discount) — not a dollar amountFor
rate_type: "fixed",rateis the nightly price in the listing's currency
Listings are missing from GET /listings By default, GET /listings excludes inactive listings. Pass exclude_inactive=false to include all listings regardless of status.
Related
Making your first API request (step-by-step walkthrough)