Errors
Every error response is application/problem+json (RFC 9457):
{ "type": "about:blank", "title": "Not Found", "status": 404, "detail": "No such resource for this tenant.", "code": "resource_not_found"}statusalways matches the HTTP status code.detailis human-readable and safe to log — it’s written for you to debug with, not for you to show a guest verbatim.codeis a stable, machine-readable string. Match your error handling oncode, never ondetailtext, which can change wording without notice.
A deliberate 404 policy
Section titled “A deliberate 404 policy”If you get an unexpected 404, check in this order: the resource ID,
whether you’re using the key kind (sk_/pk_) the route expects, and —
for a pk_ key — whether the request’s Origin header is on that key’s
allowlist.
Common codes by endpoint
Section titled “Common codes by endpoint”| Endpoint | code |
Status |
|---|---|---|
GET /v1/availability, POST /v1/quotes |
resource_not_found |
404 |
POST /v1/quotes |
rate_plan_required, rate_plan_not_found |
400 / 404 |
POST /v1/quotes |
unavailable (carries reasons) |
409 |
POST /v1/quotes |
no_pricing_rule (carries missingDates), fx_rate_unavailable |
422 |
POST /v1/holds/{id}/otp |
hold_not_found, hold_not_held |
404 / 409 |
POST /v1/holds/{id}/otp/verify |
bad_code, expired, exhausted_attempts |
400 / 423 |
| guest-OTP routes | rate_limited |
429 |
POST /v1/holds |
idempotency_key_required, invalid_quote_token, quote_expired |
400 |
POST /v1/holds |
resource_locked, hold_conflict |
409 |
POST /v1/holds/{id}/confirm |
invalid_guest_token, wrong_reservation |
400 |
POST /v1/holds/{id}/confirm |
hold_not_found |
404 |
POST /v1/holds/{id}/confirm |
not_confirmable, payment_required (no succeeded payment yet for this hold — see Holds and confirmation) |
409 |
POST /v1/holds/{id}/payment-intent |
reservation_not_holdable, stripe_not_configured, already_paid |
409 |
POST /v1/holds/{id}/checkout-session |
reservation_not_holdable, stripe_not_configured, already_paid, payment_already_initiated, invalid_redirect_url |
400 / 404 / 409 |
GET/PATCH/DELETE /v1/bookings/{id} |
booking_not_found |
404 |
PATCH/DELETE /v1/bookings/{id} |
illegal_transition |
409 |
POST /v1/bookings/{id}/refunds |
booking_not_found |
404 |
POST /v1/bookings/{id}/refunds |
no_succeeded_payment, stripe_not_configured, refund_exceeds_payment, stripe_refund_failed, nothing_to_refund |
409 |
Full per-endpoint error lists live in the API Reference, generated straight from the checked-in OpenAPI spec.
Next steps
Section titled “Next steps”- Rate limits — the
429case andRetry-After. - Authentication — how key kind and scope affect the 404 policy above.