Error codes
Look up every error code travel.tech can return, its HTTP status, and what to do next.
What this covers
Every non-2xx response from travel.tech uses the error envelope described in
Errors: a
code, a human-readable message, and (for most codes) a recoveryAction
your integration can branch on. This page is the lookup table for every
code a partner-facing endpoint can return, its HTTP status, and what each
one means.
How it works
The code field always rides inside the error object:
{
"error": {
"code": "OFFER_EXPIRED",
"message": "Human-readable description of what went wrong.",
"details": [],
"recoveryAction": "CHANGE_SELECTION",
"retryAfterSeconds": null
}
}Branch your integration on code, not on message — message is
human-readable prose and may change between releases. code is a stable,
machine-readable contract.
What you need to handle
| Code | HTTP status | Meaning | Recovery action |
|---|---|---|---|
API_ERROR | 500 | A generic failure with no more specific code. | CONTACT_SUPPORT |
APPROVAL_MESSAGE_REQUIRED | 422 | Your company requires a message for its approver on bookings that need approval; add one and book again. | FIX_INPUT |
APPROVAL_OUT_OF_TURN | 409 | An earlier approval level has not decided yet, so this level cannot act. | BLOCKED |
APPROVAL_REQUEST_CLOSED | 409 | This booking's approval request was rejected or expired; search again to request a new one. | CHANGE_SELECTION |
BAD_GATEWAY | 502 | An upstream dependency rejected the request or returned an unusable response. | RETRY_NOW |
BAD_REQUEST | 400 | The request is malformed in a way other codes do not describe more specifically. | FIX_INPUT |
BILLING_ADDRESS_ELECTRONIC_INVOICE_REQUIRED | 422 | An SDI code or a PEC address is needed for an Italian business billing address; add one and try again. | FIX_INPUT |
BILLING_ADDRESS_REGION_REQUIRED | 422 | A region or province is needed for this billing address; add one and try again. | FIX_INPUT |
BILLING_ADDRESS_REQUIRED | 422 | A billing address is needed to complete this booking; add one and book again. | FIX_INPUT |
BILLING_CONTEXT_FARE_MISMATCH | 422 | This fare is tied to a different billing context than the one the request named; search again to book under another. | CHANGE_SELECTION |
BILLING_CONTEXT_INVOICE_PROFILE_CONFLICT | 422 | The invoice profile named does not match the one the billing context bills to. | FIX_INPUT |
BILLING_CONTEXT_NOT_AVAILABLE | 422 | The billing context named in this request cannot be used for it; choose a different one. | CHANGE_SELECTION |
BIZAWAY_SESSION_UNAVAILABLE | 503 | Your session could not be established; retry the exchange. | RETRY_LATER |
BOOKING_ALREADY_ASSIGNED | 409 | This booking is already assigned to a trip. | CONTACT_SUPPORT |
BOOKING_COMMIT_FAILED | 502 | The booking could not be confirmed. The response's reason and retryable fields describe why, and whether retrying helps. | Varies by reason |
BOOKING_CONFLICT | 409 | The booking cannot be modified because it is in a conflicting state. | CONTACT_SUPPORT |
BOOKING_DESTINATION_EXTRACTION_FAILED | 422 | The destination for this trip could not be determined automatically. | CONTACT_SUPPORT |
BOOKING_FARE_SUPERSEDED | 409 | Confirm was refused because the booking was created on a fare a later price change moved away from; no charge was made. | RETRY_NOW |
BOOKING_NOT_FOUND | 404 | The referenced booking does not exist, or is not visible to you. | CONTACT_SUPPORT |
BOOKING_UNSUPPORTED_VERTICAL | 422 | This booking's vertical cannot be attached to a trip. | BLOCKED |
CANCELLATION_FEE_CHANGED | 409 | The cancellation fee you quoted no longer matches the current fee; the booking was not cancelled. | FIX_INPUT |
CARDHOLDER_STOP_CC | 400 | This card was stopped by its holder; try a different card. | CHANGE_PAYMENT |
CAR_DRIVER_ADDRESS_INCOMPLETE | 502 | The rental company refused this booking over the driver details we sent. Contact support to complete it. | CONTACT_SUPPORT |
CAR_OFFER_REJECTED_BY_SUPPLIER | 410 | The rental company could not confirm this car. Choose another car or search again. | CHANGE_SELECTION |
CHANGE_PRICE_CHANGED | 409 | The change total you quoted no longer matches the current total; the booking was not changed. | FIX_INPUT |
CHECKOUT_DETAILS_LOCKED | 409 | These account-bearer details can no longer be edited at this stage of checkout. | BLOCKED |
CHECKOUT_SESSION_ALREADY_CLAIMED | 409 | This guest checkout session is already claimed by a different account. | CONTACT_SUPPORT |
CHECKOUT_SESSION_CLAIM_IN_PROGRESS | 409 | Another claim on this session is in progress; it resolves within a few seconds. | RETRY_LATER |
CHECKOUT_SESSION_NOT_CLAIMABLE | 409 | This guest checkout session's current status rules out claiming it. | BLOCKED |
CLOSED_CC | 400 | This card's account is closed. | CHANGE_PAYMENT |
COLLEAGUE_CREATION_UNAVAILABLE | 422 | A new person cannot be added to this booking; it only accepts people matching its existing invoice profiles. | FIX_INPUT |
COMPROMISED_CC | 400 | Your bank blocked this card as compromised; this card cannot be retried. | CONTACT_SUPPORT |
CONFLICT | 409 | The request conflicts with the resource's current state. | CONTACT_SUPPORT |
CONSUMER_AUTH_REQUIRED | 401 | Your consumer identity is unknown or revoked, or your request signature is invalid, missing, or stale. | CONTACT_SUPPORT |
CONTACT_TO_THE_BANK | 400 | Your bank declined this charge; contact your bank. | CHANGE_PAYMENT |
CONTACT_TO_THE_BANK_HIGH_RISK | 400 | Your bank declined this charge as high-risk; contact your bank, or try a different card. | CHANGE_PAYMENT |
DATABASE_UNAVAILABLE | 503 | A required data store is temporarily unavailable. | RETRY_LATER |
EMAIL_DELIVERY_NOT_CONFIGURED | 503 | Email delivery is not configured for this deployment; nothing was sent. | CONTACT_SUPPORT |
ERROR_SEAT_SELECTION | 400 | The selected seats could not be booked; pick other seats or fare. | CHANGE_SELECTION |
EXPIRED_CARD_CC | 400 | This card has expired. | CHANGE_PAYMENT |
FARE_CONTEXT_REQUIRED | 422 | This request needs a fareId or bookingId to resolve payment methods, and neither was supplied. | FIX_INPUT |
FORBIDDEN | 403 | You are authenticated, but you do not have permission to access this resource. | BLOCKED |
FRAUD_CC | 400 | Your bank blocked this card over a suspected fraud attempt; this card cannot be retried. | CONTACT_SUPPORT |
GATEWAY_TIMEOUT | 504 | An upstream dependency did not respond in time. | RETRY_NOW |
GUEST_BIRTHDAY_REQUIRED | 422 | This fare requires a birthday for every guest, and one is missing. | FIX_INPUT |
HANDOFF_RESOLVED | 404 | This support conversation is finished and is now read-only. | BLOCKED |
INSUFFICIENT_CREDIT_LINE | 409 | The company's credit line cannot cover the new total for this change. | CONTACT_SUPPORT |
INSUFFICIENT_FOUNDS_CC | 400 | This card does not have sufficient funds available for this amount. | CHANGE_PAYMENT |
INTERNAL_SERVER_ERROR | 500 | An unexpected server error occurred. | RETRY_NOW |
INVALID_CARDHOLDER_CC | 400 | The cardholder name is invalid. | CHANGE_PAYMENT |
INVALID_CARD_CC | 400 | This card is invalid or unsupported. | CHANGE_PAYMENT |
INVALID_CHANGE_SELECTION | 422 | The legs, journeys, or fare you selected do not fit this booking or its change rules. | FIX_INPUT |
INVALID_CURSOR | 400 | The pagination cursor you supplied is malformed. | BLOCKED |
INVALID_CVV_CC | 400 | The card's security code (CVV) is invalid. | CHANGE_PAYMENT |
INVALID_EXPIRATION_DATE_CC | 400 | The card's expiration date is invalid. | CHANGE_PAYMENT |
INVALID_NUMBER_CC | 400 | The card number is invalid. | CHANGE_PAYMENT |
INVALID_POSTAL_CODE_CC | 400 | The card's postal code is incorrect or missing. | CHANGE_PAYMENT |
INVALID_REQUEST | 400 | The request body is not valid for this endpoint. | FIX_INPUT |
INVALID_VALUE | 422 | A field holds a value that is not valid for its type or constraints. | FIX_INPUT |
LIMIT_EXCEEDED_CC | 400 | This charge exceeds the card's limit. | CHANGE_PAYMENT |
LOST_CC | 400 | Your bank blocked this card; this card cannot be retried. | CONTACT_SUPPORT |
METHOD_NOT_ALLOWED | 405 | This HTTP method is not supported on this endpoint. | BLOCKED |
NOT_ACTIVATED_CC | 400 | This card has not been activated yet. | CHANGE_PAYMENT |
NOT_ENOUGH_SEATS | 410 | There are not enough seats left for this request; pick another fare. | CHANGE_SELECTION |
NO_INVOICE_PROFILE | 422 | The booking needs an invoice profile, and none is set. | FIX_INPUT |
NO_PASSENGER_PROFILE | 422 | The booking needs a passenger profile, and none is set. | FIX_INPUT |
OFFER_EXPIRED | 410 | The fare or search result you selected has expired; search again. | CHANGE_SELECTION |
OFFER_LOCK_IN_PROGRESS | 409 | Another request to lock this offer with the same key is still running; retry shortly. | RETRY_LATER |
PASSENGER_COUNT_MISMATCH | 422 | The passenger count does not match the one on the locked fare. | FIX_INPUT |
PASSENGER_DOCUMENT_EXPIRES_DURING_TRIP | 422 | A passenger's identity document expires before the trip ends. | FIX_INPUT |
PASSENGER_DOCUMENT_REQUIRED | 422 | A passenger is missing a required identity document. | FIX_INPUT |
PERMISSION_DENIED | 403 | You do not have the capability required for this action on this booking. | BLOCKED |
POSTPAY_LIMIT_EXHAUSTED | 422 | The company's postpay spending limit is used up; this booking cannot be paid on postpay. | CHANGE_PAYMENT |
POSTPAY_UNAVAILABLE | 422 | Postpay is not available as a payment method for this booking. | CHANGE_PAYMENT |
PRICE_ACCEPTANCE_REQUIRED | 409 | Confirm was refused because the checkout session has a new price that has not been accepted yet; no charge was made. | RETRY_NOW |
PRICE_ACCEPTANCE_STALE | 409 | The total you accepted is no longer the checkout session's current total; re-read it and accept again. | FIX_INPUT |
PROVIDER_DRIVER_AGE_RESTRICTION | 422 | The driver's age is outside the range this fare allows. | FIX_INPUT |
PROVIDER_DUPLICATE_BOOKING | 409 | This looks like a duplicate of an existing booking. | CONTACT_SUPPORT |
PROVIDER_ERROR | 503 | An upstream system returned an internal error. | RETRY_LATER |
PROVIDER_FORBIDDEN | 403 | An upstream system denied authorization for this request. | BLOCKED |
PROVIDER_MISSING_USER_INFO | 422 | The traveler profile is missing a field required to book, for example gender, birthday, or nationality. | FIX_INPUT |
PROVIDER_NOT_FOUND | 404 | The upstream resource this request refers to does not exist. | CONTACT_SUPPORT |
PROVIDER_POLICY_NOT_RESPECTED | 400 | This booking violates the account's corporate travel policy. | BLOCKED |
PROVIDER_UNAUTHORIZED | 401 | Authentication with an upstream system failed. | — |
PROVIDER_VALIDATION_FAILED | 422 | The upstream system rejected this request as invalid. | FIX_INPUT |
QUOTE_EXPIRED | 410 | The protection or insurance quote you referenced is stale or unknown; request a new one. | CHANGE_SELECTION |
RATE_LIMITER_UNAVAILABLE | 503 | The safeguard that throttles this action is temporarily unavailable, so the action was refused rather than sent unthrottled. | RETRY_LATER |
RATE_LIMIT_EXCEEDED | 429 | You exceeded the rate limit for this endpoint. | RETRY_LATER |
RENEWED_FARE_ID_UNAVAILABLE | 409 | This renewal predates the information needed to identify the re-locked fare; renew again. | RETRY_NOW |
RESOURCE_NOT_FOUND | 404 | The requested resource does not exist, or is not visible to you. | CONTACT_SUPPORT |
SEARCH_NOT_AVAILABLE | 503 | Search is not available for this vertical right now. | CONTACT_SUPPORT |
SEAT_BOOKING_FAILED | 400 | The selected seat could not be booked; pick another seat or fare. | CHANGE_SELECTION |
SEAT_NO_LONGER_AVAILABLE | 410 | The seat you selected is no longer available; pick another seat or fare. | CHANGE_SELECTION |
SEAT_REQUIRED | 422 | This fare requires a seat selection before booking; choose seats and book again. | FIX_INPUT |
SECURITY_VIOLATION_CC | 400 | Your bank blocked this card for a security violation; this card cannot be retried. | CONTACT_SUPPORT |
SELECTION_HOLD_EXPIRED | 409 | Your hold on this selection lapsed before you confirmed; renew it and retry. | RETRY_NOW |
SERVICE_UNAVAILABLE | 503 | A dependency this request needs is temporarily unavailable. | RETRY_LATER |
STAY_CHILD_AGE_MISMATCH | 422 | A child's age does not match the age searched for that room, or was not supplied. | FIX_INPUT |
STAY_GUEST_TYPE_UNSUPPORTED | 422 | A guest type in the request is not supported for this booking. | FIX_INPUT |
STAY_ROOM_COUNT_MISMATCH | 422 | The room count does not match the locked fare's room split. | FIX_INPUT |
STAY_ROOM_OCCUPANCY_MISMATCH | 422 | A room's guest count does not match the locked fare's per-room split. | FIX_INPUT |
STOLEN_CC | 400 | Your bank blocked this card; this card cannot be retried. | CONTACT_SUPPORT |
TEMPORARY_ISSUE_CC | 400 | Your bank will not authorize this card right now; try a different card. | CHANGE_PAYMENT |
TRIP_NOT_EMPTY | 409 | This trip still has bookings attached; detach them before deleting it. | BLOCKED |
TRIP_NOT_FOUND | 404 | The referenced trip does not exist, or is not visible to you. | CONTACT_SUPPORT |
UNAUTHORIZED | 401 | Your bearer token is missing, invalid, or expired. | — |
VALIDATION_ERROR | 422 | One or more request fields failed validation; see details[] for which ones. | FIX_INPUT |
recoveryAction is omitted from a response when no recovery action applies
(for example, an authentication failure your integration resolves by
re-authenticating rather than retrying or correcting the request). The table
above shows "—" for those codes. A few codes choose their recovery action per
failure reason; the table shows "Varies by reason" and the response
carries the action to follow. A RETRY_NOW or RETRY_LATER action says a
retry can help, not that it is free of side effects: before you retry an
operation that charges or books, read
Idempotency and retries so a retry never
duplicates the booking or the charge. Here is what each published
recoveryAction value means:
recoveryAction | What you should do |
|---|---|
RETRY_NOW | Retry the request. Follow the code's meaning for any step to take first. |
RETRY_LATER | Wait, then retry the request (see retryAfterSeconds when present). |
CHANGE_PAYMENT | Ask the traveler for a different payment method before retrying. |
CHANGE_SELECTION | The chosen option is gone; make a new selection. |
REFRESH | What was shown is out of date; run the search again. |
CONTACT_SUPPORT | Route the traveler to support; this is not self-serviceable. |
BLOCKED | The action is not permitted; no client-side recovery is possible. |
FIX_INPUT | Correct the request input before retrying. |
Related guides
- Errors — the error envelope shape and
validation details. - Pagination — how paged lists work.
- Authentication — how
UNAUTHORIZEDand
CONSUMER_AUTH_REQUIREDrelate to your credentials.
Updated about 17 hours ago