# Bundleport Connect — compact handoff for models Source: https://docs.bundleport.com/llms.txt Contract: https://docs.bundleport.com/ai/contract OpenAPI: https://docs.bundleport.com/openapi/hotels.yaml Content OpenAPI: https://docs.bundleport.com/openapi/content.yaml There is no official HTTP SDK. Credentials stay in the buyer’s environment. ## Auth Header: `Authorization: ApiKey sk_test_*` or `sk_prod_*`. No OAuth scopes such as `hotels:search`. Test host: https://test-api.bundleport.com (sk_test_* only). Production host: https://api.bundleport.com (sk_prod_* only). Gateway 401/403 = credential/environment/account. Gateway 429 = account rate limit (Retry-After / X-RateLimit-*). Body is not aggregator errors[]. ## REST paths (Booking API) POST /connect/hotels/v1/availability POST /connect/hotels/v1/prebooking (quote) POST /connect/hotels/v1/booking POST /connect/hotels/v1/bookingdetail POST /connect/hotels/v1/bookinglist POST /connect/hotels/v1/cancel Content catalog is a different service: /content/hotels/v1/... settings.connectionCodes is required. Search concatenates options from the list. Quote/book/cancel need exactly one connectionCode. ## Identifier handoff Search options[].id → quote criteria.optionRefId Quote optionQuote.optionRefId → book input.optionRefId Book booking.reference.bookingID → bookingdetail / cancel Cancel returns cancelReference (not a nested booking or penalties) No bookingReference. Do not send search id to book after a successful quote. Analytics only (not tokens): availability searchId → quote criteria.search_id; quote quoteId → book search_id / quote_id. ## Status enums (exact strings) Quote optionQuote.status: STATUS_TYPE_OK | STATUS_TYPE_RQ Book/detail/list booking.status: BOOK_STATUS_TYPE_OK | BOOK_STATUS_TYPE_KO | BOOK_STATUS_TYPE_ON_REQUEST | BOOK_STATUS_TYPE_CANCELLED | BOOK_STATUS_TYPE_UNKNOWN | BOOK_STATUS_TYPE_PENDING_COMMIT There is no BOOK_STATUS_TYPE_RQ. Never PENDING or CONFIRMED. Book/detail/list body field is `booking` = BookingDetail: status, reference, billingProviderCode, price, remarks[], rooms[]. Not hotel, holder, or stay dates on the response. holder and rooms[].paxes are book request fields. price.net, price.gross, price.suggested, price.markupGross are different. gross is not markupGross. ## Timeouts settings.timeout is milliseconds. Search default 10000, max 60000. Book floor 90000 ms. Cancel floor 60000 ms. Quote floor 2000 ms. HTTP client timeout must exceed settings.timeout. ## Errors Connect Hotels business: HTTP 200 + errors[] { code, type, description, additionalData, connectionCode }. code: ERR_CODE_NONE, ERR_CODE_UNKNOWN, ERR_CODE_CONNECTION_DATA_MISSING, ERR_CODE_BAD_RESPONSE, ERR_CODE_BAD_REQUEST, ERR_CODE_MISSING_FIELDS, ERR_CODE_CONFIGURATION type: ERR_TYPE_NONE, ERR_TYPE_UNKNOWN, ERR_TYPE_CLIENT, ERR_TYPE_PROVIDER, ERR_TYPE_SERVICE Unclassified search fan-out: ERR_CODE_UNKNOWN / ERR_TYPE_UNKNOWN. Quote/book/cancel/detail/list Go-error throw: ERR_CODE_BAD_RESPONSE / ERR_TYPE_SERVICE, connectionCode omitted (even when the text looks like a timeout or HTTP 502). Search fan-out of the same text is ERR_TYPE_PROVIDER with connectionCode. CONFIGURATION is ERR_TYPE_SERVICE. Search missing connectionCodes (null): "settings or connectionCodes is missing" Quote/book empty list: "settings is nil or connectionCodes is empty: exactly one connectionCode is required" Search missing provider: "there is no provider configured for connectionCode …" Quote/book missing provider: "provider implementation not found for connectionCode: …" Upstream HTTP: "unexpected status code: received HTTP %d from %s. Response body: %s" Quota: "connection %s rejected: provider capacity quota exhausted" Search timeout: "connection %s did not respond within %s" Search/SSE saturated only: HTTP 503 { "error": "aggregator saturated", "code": "RESOURCE_EXHAUSTED" } on /availability and /availability/_stream. Quote/book/cancel are not gated. Book parse: HTTP 400 { "code": "invalid_argument", "message" } Content: HTTP 400/404/500 + errors[]. Hotels booking has no HTTP 404. No PRICE_CHANGED, NO_AVAILABILITY, RATE_LIMIT_EXCEEDED, INTERNAL_SERVER_ERROR as errors[].code. No error_category on Hotels JSON (console/stats only). recommended_action (hints) match top-level description only, not additionalData.description: fix_request, restart_availability, requote_new_price, verify_booking_then_restart, backoff_and_retry. requote_new_price is phrase-matched; not computed from priceDelta. Missing hint is normal for timeouts, circuit breaker, unexpected HTTP status. Empty options + empty errors = no inventory, not a NO_AVAILABILITY code. Platform never retries book or cancel. Warnings do not fail the request. WARN_CODE_NONE + additionalData.warning_type (INFO_NO_MARKUP_CONFIGURED, STAY_DATE_NORMALIZED). Mapping: WARN_MAPPING_*. ## Runtime MCP https://api.connect.bundleport.com/mcp Streamable HTTP. Tools: availability, quote, book, bookingDetail, cancel. Same identifiers as REST. For agents that call the API, not for generating a production client. ## Console https://app.bundleport.com/connect/business-analytics https://app.bundleport.com/connect/observability https://app.bundleport.com/connect/transactions/hotels error_category buckets: rate_limit, allotment, timeout, confirmation, system_error, unknown — console only.