Errors

The Brave gateway uses standard HTTP codes. The OS-Travel and Cyberesa compatible gateways always answer HTTP 200 and carry the error in the body — read all three sections.

Brave gateway — HTTP codes

CodeTypical error.codeMeaning
400validation_failedInvalid body or parameters (details in error.fields)
401invalid_signature, stale_timestamp, missing_credentialsAuthentication failed — see Request signing
403ip_not_allowed, key_revoked, gateway_not_enabledIP not allowed, key revoked, gateway or format not enabled
404not_foundUnknown hotel, booking or reference data
409invalid_stateState conflict (e.g. cancelling an already cancelled booking)
422rate_expired, stop_sales, on_request_onlyOffer expired, stop-sales, or “on request” offer not bookable
429rate_limitedQuota exceeded — the Retry-After header says when to retry
500internal_errorInternal error — retryable for reads only

Brave gateway — error envelope

JSON (Accept: application/json):

{
  "error": {
    "code": "rate_expired",
    "message": "The rate has expired. Run a new search.",
    "fields": { "rateKey": "expired on 2026-11-13T10:22:00+01:00" }
  }
}

XML (Accept: application/xml):

<ErrorResponse>
  <Code>rate_expired</Code>
  <Message>The rate has expired. Run a new search.</Message>
</ErrorResponse>

OS-Travel gateway — ErrorMessage

Always HTTP 200, even on errors: V1/V2 clients only parse 200.

{
  "ErrorMessage": {
    "Code": 401,
    "Description": "Invalid credentials."
  }
}
  • On success, ErrorMessage is always present with Code: null and Description: null (V2).
  • Quota exceeded: Description contains "Too many requests ... Retry after YYYY-MM-DD HH:MM:SS.".
  • For BookingCancellation, read the error in BookingCancellation.ErrorMessage (Code ≠ 200).

Cyberesa gateway — ErrorResult

Always HTTP 200 + valid XML, no CDATA. Business errors appear as:

<ErrorResult>
  <Message>Invalid credentials</Message>
</ErrorResult>

or <Error><Message>…</Message></Error>, or <Error>…</Error>. Check for these nodes before parsing the business response.

What to do

  • 429 — respect Retry-After and slow down; see Rate limits.
  • 401 — check the signature computation and clock sync (NTP).
  • 422 rate_expired — the rateKey is gone: new search, new checkrate.
  • Bookings — never retry blindly: replay with the same clientReference (see Idempotency).
  • Reads — a single retry is fine (GET, search) on 500 or timeout.

Was this page helpful?