Skip to content
StayingAPI
Docs

Errors & the failed-calls-free rule

A locked error-type catalog mapped 1:1 to HTTP status, a complete machine-stable sub-code list, and one guarantee: failed, empty, blocked and not-found calls are never billed.

Failed / bad-data calls are NEVER billed

The error object

Branch on type (the error class, mapped to HTTP status), then on code (a stable, finer-grained reason). Every response also carries a requestId, retryable flag, and a docUrl that links to the matching page below.

Error types

HTTPtypeWhen it firesRetryable
400invalid_requestMalformed, missing or contradictory input you control.No — fix the request
401authentication_errorMissing / malformed Authorization, unknown or revoked key.No — fix credentials
402insufficient_creditsThe plan / balance lacks the credits this call would cost.No — until topped up
403permission_deniedAuthenticated but not allowed: a missing scope, an unverified email, or a disabled account.No — change plan/scope
404not_foundThe addressed resource does not exist (job, listing, route).No
429rate_limitedThe per-plan token-bucket rate limit was exceeded.Yes — after Retry-After
500internal_errorAn unexpected StayingAPI-side fault.Maybe — retry with backoff
503upstream_unavailableEvery upstream source for the request failed or was blocked.Yes — with backoff
504upstream_timeoutSynchronous upstream work exceeded the request deadline.Yes — with backoff

Sub-code catalog

The complete error.code set. New codes may be added over time (additive) — branch on them for precise handling but tolerate unknown ones. Each links to its own page (the value of error.docUrl).

codetypeTrigger
missing_parameterinvalid_requestA required parameter is absent (e.g. checkOut given checkIn).
invalid_parameterinvalid_requestA parameter is present but malformed (bad type, format or enum value).
invalid_date_rangeinvalid_requestcheckOut / endDate is not strictly after checkIn / startDate.
date_in_pastinvalid_requestA supplied date (checkIn / startDate) is in the past (evaluated in UTC).
child_ages_mismatchinvalid_requestchildAges[] length does not equal children.
stay_too_longinvalid_requestThe booking window exceeds the per-endpoint maximum stay.
window_too_longinvalid_requestThe query date window exceeds the per-endpoint cap (availability > 365 days).
invalid_listing_urlinvalid_requestThe supplied url is not a recognisable listing URL for the platform.
invalid_property_typeinvalid_requestA propertyType[] value is not in the enum.
invalid_amenityinvalid_requestAn amenities[] token is not in the canonical taxonomy.
invalid_price_rangeinvalid_requestpriceMin / priceMax is invalid (negative, or priceMax < priceMin).
invalid_languageinvalid_requestA language filter value is not a valid ISO-639-1 code.
invalid_sortinvalid_requestA sort value is not in the endpoint's allowed enum.
invalid_cursorinvalid_requestThe pagination cursor is malformed or not base64-decodable.
limit_out_of_rangeinvalid_requestlimit is < 1 or > 100.
mutually_exclusive_paramsinvalid_requestConflicting or ambiguous identifiers were supplied (e.g. both listingId and url, or none).
platform_not_enabledinvalid_requestA requested platform is not enabled for the request (fast-follow, or not on the plan).
no_enabled_platforminvalid_requestAfter resolving platforms[], no platform remains to query.
needs_countryinvalid_requestA bare booking.com slug was passed to /v1/listing without a country. Booking slugs are NOT globally unique — the same slug exists per country — so the target cannot be safely resolved.
missing_api_keyauthentication_errorNo Authorization header.
invalid_api_keyauthentication_errorThe Authorization header is present but the key is unknown or malformed.
revoked_api_keyauthentication_errorThe key was revoked or soft-deleted.
scope_insufficientpermission_deniedThe key / token lacks a scope required for the operation.
email_unverifiedpermission_deniedThe API key is valid, but the account email has not been verified yet — so LIVE credit (calls made with a stay_live_ key) is locked until you confirm your email (§7.5.1). Your stay_test_ sandbox key is unaffected and keeps returning deterministic fixtures at zero cost.
subscription_requiredpermission_deniedThe account tried to buy a top-up (POST /v1/billing/topups) without an active paid subscription. Top-up credits are a SUBSCRIBER add-on — a free / unsubscribed account cannot purchase them.
free_tier_budget_exhaustedpermission_deniedYour free-plan account has reached its cumulative free-tier upstream-spend budget. We declined to spend further on live calls — no upstream source was contacted and no credits were charged.
listing_not_foundnot_foundThe addressed listing / property does not exist upstream.
job_not_foundnot_foundUnknown or expired jobId.
identity_mismatchnot_foundThe resolved listing's canonical identity (booking country/slug, or vrbo numeric id) did not match what was requested — StayingAPI refuses to return a different (wrong) property rather than serve plausible-looking wrong data.
no_availabilitynot_foundThe listing exists, but the requested STAY is not bookable — at least one night between checkIn and checkOut is already taken, so the platform quotes no price for that range. This is a true answer about the property’s calendar, not an upstream failure.
price_not_foundnot_foundThe platform did not quote this listing for the requested dates and party, and did not say why. On Vrbo this means the listing was not in Vrbo’s own priced search for that stay: most often the stay is shorter than the listing’s minimum, a night is taken, or the party is too large.
credit_balance_too_lowinsufficient_creditsThe balance is below the call's cost.
rate_limit_exceededrate_limitedThe token bucket is exhausted (per-key for REST, per-user for MCP).
all_actors_failedupstream_unavailableEvery primary + fallback source for the request failed.
actor_blockedupstream_unavailableUpstream anti-bot / block detected with no usable rows.
upstream_degradedupstream_unavailableEvery upstream source for the request failed or was blocked.
actor_timeoutupstream_timeoutSynchronous upstream source work timed out without producing data.
internal_errorinternal_errorAn unhandled StayingAPI-side fault.