{
"error": {
"code": "BAD_REQUEST",
"message": "The request was declined for these inputs. Check the dates, places and travellers, then retry."
}
}
{
"error": {
"code": "AUTH_REQUIRED",
"message": "Invalid or expired API key.",
"doc_url": "https://docs.gojinko.com/authentication/api-keys"
}
}
{
"error": {
"code": "PAYMENT_REQUIRED",
"message": "Insufficient balance — this call costs $0.0150 and your organization has $0.0000 available. Top up at https://dashboard.gojinko.com/developers/billing/topup",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"error": {
"code": "CONFLICT",
"message": "The operation conflicts with the current state of the resource.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"error": {
"code": "GONE",
"message": "The resource no longer exists.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"error": {
"code": "DESTINATION_LOW_CONFIDENCE",
"message": "no confident city match for \"Sain Malo\" in FR (closest: \"Saint Malo\", FR at 0.75)",
"top_candidates": [
{
"city": "Saint Malo",
"country_code": "FR",
"hotel_count": 326,
"score": 0.75
}
],
"suggested_retry": {
"destination": {
"city_name": "Saint Malo",
"country_code": "FR"
},
"rationale": "the closest catalog city to the requested name; retry with it, or ask the user when the candidates differ"
}
}
}
{
"error": {
"code": "RATE_LIMITED",
"message": "Too many requests. Retry after the Retry-After delay.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"error": {
"code": "UPSTREAM_REJECTED",
"message": "The request was declined for this offer. Try another offer.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"error": {
"code": "UPSTREAM_UNAVAILABLE",
"message": "The service is temporarily unavailable. Retry after the Retry-After delay.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"error": {
"code": "UPSTREAM_TIMEOUT",
"message": "The request timed out before a result was available. Retry the request.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"error": {
"code": "BAD_REQUEST",
"message": "The request was declined for these inputs. Check the dates, places and travellers, then retry."
}
}
{
"error": {
"code": "AUTH_REQUIRED",
"message": "Invalid or expired API key.",
"doc_url": "https://docs.gojinko.com/authentication/api-keys"
}
}
{
"error": {
"code": "PAYMENT_REQUIRED",
"message": "Insufficient balance — this call costs $0.0150 and your organization has $0.0000 available. Top up at https://dashboard.gojinko.com/developers/billing/topup",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"error": {
"code": "CONFLICT",
"message": "The operation conflicts with the current state of the resource.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"error": {
"code": "GONE",
"message": "The resource no longer exists.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"error": {
"code": "DESTINATION_LOW_CONFIDENCE",
"message": "no confident city match for \"Sain Malo\" in FR (closest: \"Saint Malo\", FR at 0.75)",
"top_candidates": [
{
"city": "Saint Malo",
"country_code": "FR",
"hotel_count": 326,
"score": 0.75
}
],
"suggested_retry": {
"destination": {
"city_name": "Saint Malo",
"country_code": "FR"
},
"rationale": "the closest catalog city to the requested name; retry with it, or ask the user when the candidates differ"
}
}
}
{
"error": {
"code": "RATE_LIMITED",
"message": "Too many requests. Retry after the Retry-After delay.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"error": {
"code": "UPSTREAM_REJECTED",
"message": "The request was declined for this offer. Try another offer.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"error": {
"code": "UPSTREAM_UNAVAILABLE",
"message": "The service is temporarily unavailable. Retry after the Retry-After delay.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"error": {
"code": "UPSTREAM_TIMEOUT",
"message": "The request timed out before a result was available. Retry the request.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
Search live hotel inventory and nightly rates for a destination and stay window. It handles requests like “three nights in Lisbon next weekend for two adults” or “family room in Rome with one child in August”. Each result includes an htl_* offer token you can hand to the trip tool to start a booking.
Read hotel prices from the *_money fields.rates[].total_amount_money,
taxes_breakdown[].amount_money and cancellation_schedule[].amount_money
carry value in minor units with its decimal_places, the same shape as
every other money field: divide value by 10 ** decimal_places, or show
display. A cancellation step expressed as a percentage or a number of
nights carries percent or nights instead. The older total_amount,
amount and currency fields are deprecated and hold major units. A room’s
capacity is room_capacity; the deprecated max_occupancy repeats the
requested occupancy. See Money & prices.
Opaque continuation handle returned by a prior hotel_search. Send this field by itself; the search session keeps destination, dates, occupancy, currency and filters.
Other hotels near the one a hotel_name search matched, priced for the same dates and occupancy, so they can be compared without a second search. Same shape as hotels, and not counted in total. Present only on a hotel_name search that found usable neighbours.
Deprecated: use next_handle instead. The identifier of the search session on its own, which no endpoint accepts. next_handle carries the session and the next page, has_more says whether there is one and expires_at when the session ends.
Opaque handle for the next page. Send it by itself to hotel_search. The next page serves the hotels this answer held, then asks the hotel source for the next ones, and widens a city or default radius when its area has none left. Null means the search has nothing left.
Normalized first-request stay and occupancy frozen by the search session and repeated on every page. trip_id only associates the search with a trip for display.
How the request’s destination resolved into these hotels. Present on every successful search. Rendering rule for an agent or tool: say something ONLY when there is something to say — match is fuzzy or fallback_string, resolved_city differs from requested_city, or the platform located a place that is not a city (place_type other than city), or alternatives is present. exact and provider_matched otherwise need no header line of their own. When resolved_place is present, name it as the place searched, with place_type when it is not a city, instead of resolved_city. When alternatives is present, name them too and let the user pick before booking.
Why hotels is empty. Absent whenever hotels is non-empty.
Available options:
no_availability_for_dates,
destination_not_found,
catalog_exhausted,
all_dropped_by_budget,
no_catalog_match,
all_dropped_by_star_filter,
all_dropped_by_rating_filter
Example:
"no_availability_for_dates"
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Jinko Platform","description":"Connect your AI agent to flights, hotels, car rentals, and bookings through MCP, REST API, TypeScript SDK, or CLI.","colors":{"primary":"#FF6363","light":"#FF807C","dark":"#BA4B4A"},"logo":{"light":"https://mintcdn.com/jinko-dev/k6P2DyAYQF0FPJQi/logo/jinko-logo.png?fit=max\u0026auto=format\u0026n=k6P2DyAYQF0FPJQi\u0026q=85\u0026s=785a20dc553a2698bfffad325d1198d0","dark":"https://mintcdn.com/jinko-dev/k6P2DyAYQF0FPJQi/logo/jinko-logo.png?fit=max\u0026auto=format\u0026n=k6P2DyAYQF0FPJQi\u0026q=85\u0026s=785a20dc553a2698bfffad325d1198d0"},"favicon":"https://mintcdn.com/jinko-dev/k6P2DyAYQF0FPJQi/favicon.png?fit=max\u0026auto=format\u0026n=k6P2DyAYQF0FPJQi\u0026q=85\u0026s=770e72a193924011a067dcacdcb654cf","navbar":{"links":[{"href":"https://dashboard.gojinko.com","label":"Dashboard"}],"primary":{"type":"button","label":"Get API Key","href":"https://dashboard.gojinko.com/developers/keys"}},"footer":{"socials":{"website":"https://gojinko.com"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"jinko-dev","hasAudioNarration":false,"actualSubdomain":"jinko-dev","customDomains":["docs.dev.gojinko.com"],"gitSource":{"type":"github","owner":"jinkoso","repo":"jinko-dev-platform","deployBranch":"main","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":""},"entitlements":{},"buildId":"6aeece39c11f500273ffd5ec","clientVersion":"0.0.4076","searchFilterCounts":[{"language":"default","tag":"API reference","count":63},{"language":"default","tag":"CLI","count":49},{"language":"default","tag":"Flights","count":43},{"language":"default","tag":"Documentation","count":42},{"language":"default","tag":"MCP","count":23},{"language":"default","tag":"Manage","count":20},{"language":"default","tag":"Trip \u0026 Payment","count":19},{"language":"default","tag":"Discovery","count":17},{"language":"default","tag":"Hotels","count":16},{"language":"default","tag":"Travel Demand","count":14}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api/hotel-search","slug":"/api/hotel-search","pageMetadata":{"title":"hotel-search","sidebarTitle":"/v1/hotel_search","description":"Search live hotel inventory and rates","openapi":"api-reference/public-api.yaml POST /v1/hotel_search","href":"/api/hotel-search"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Search live hotel inventory and rates\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,p:`p`,strong:`strong`,..._provideComponents(),...props.components},{Note}=_components;if(!Note)_missingMdxReference(`Note`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Search live hotel inventory and nightly rates for a destination and stay window. It handles requests like “three nights in Lisbon next weekend for two adults” or “family room in Rome with one child in August”. Each result includes an `,_jsx(_components.code,{children:`htl_*`}),` offer token you can hand to the trip tool to start a booking.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[`Read hotel prices from the `,_jsx(_components.code,{children:`*_money`}),` fields.`]}),` `,_jsx(_components.code,{children:`rates[].total_amount_money`}),`,\n`,_jsx(_components.code,{children:`taxes_breakdown[].amount_money`}),` and `,_jsx(_components.code,{children:`cancellation_schedule[].amount_money`}),`\ncarry `,_jsx(_components.code,{children:`value`}),` in minor units with its `,_jsx(_components.code,{children:`decimal_places`}),`, the same shape as\nevery other money field: divide `,_jsx(_components.code,{children:`value`}),` by `,_jsx(_components.code,{children:`10 ** decimal_places`}),`, or show\n`,_jsx(_components.code,{children:`display`}),`. A cancellation step expressed as a percentage or a number of\nnights carries `,_jsx(_components.code,{children:`percent`}),` or `,_jsx(_components.code,{children:`nights`}),` instead. The older `,_jsx(_components.code,{children:`total_amount`}),`,\n`,_jsx(_components.code,{children:`amount`}),` and `,_jsx(_components.code,{children:`currency`}),` fields are deprecated and hold major units. A room’s\ncapacity is `,_jsx(_components.code,{children:`room_capacity`}),`; the deprecated `,_jsx(_components.code,{children:`max_occupancy`}),` repeats the\nrequested occupancy. See `,_jsx(_components.a,{href:`/concepts/money`,children:`Money \u0026 prices`}),`.`]})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"hotel-search","sidebarTitle":"/v1/hotel_search","description":"Search live hotel inventory and rates","openapi":"api-reference/public-api.yaml POST /v1/hotel_search","href":"/api/hotel-search"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Hotels"],"summary":"Search live hotel inventory and rates","description":"Search live hotel inventory and rates","security":["4b41b2f9-86a7-4a92-9596-3aeb3e48ff30","120525ec-7620-476c-a0df-124528a2b69e"],"requestBody":"13d0467b-f262-4675-b211-d1412307107b","responses":{"200":"a1024a1a-8996-4e56-8fbb-6c46218c0cb9","400":"67138d9a-4768-454b-88d5-851f05aab2fd","401":"bb4fdf13-ea5d-4989-a73a-bc39e4958203","402":"ee67e01b-1a8c-4970-8ef3-1c497c6aa6d9","404":"08bffd1c-2a85-4be0-9cfb-219e52110de6","409":"24518820-0686-48aa-b7a1-fdd2182db6cd","410":"c7486925-99d2-4f46-a96e-9a4fb5a07370","422":"d54d8559-b984-47cd-bcfe-794e2aff8a8a","429":"815b2a17-c89e-45c9-9f4b-7ec489153ea8","502":"513fb8b0-cc8d-4e06-b19f-42a9b3a8c7d4","503":"b9662256-ad8a-4adb-a249-2c673ea5aac3","504":"4929cee0-f732-4710-8bb8-f97eb0fd1f93"},"method":"post","type":"path","servers":["6c2e2c14-8667-4ef1-a6c7-d1e7fb982378","0b2c8592-7b6b-4acc-9351-2a69f3e0f42a"],"path":"/v1/hotel_search","baseUrlOptions":["https://api.gojinko.com","https://api.sandbox.gojinko.com"],"title":"Search live hotel inventory and rates","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object","required":["next_handle"],"properties":{"next_handle":{"type":"string","minLength":1,"description":"Opaque continuation handle returned by a prior hotel_search. Send this field by itself; the search session keeps destination, dates, occupancy, currency and filters.","example":"hp_example_2","isRequired":true,"uniqueKey":"oneOf.0.next_handle","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"oneOf.0","typeLabel":"object"},{"type":"object","required":["checkin","checkout"],"example":{"city_name":"Paris","country_code":"fr","checkin":"2027-03-10","checkout":"2027-03-13","occupancies":[{"adults":2}],"currency":"USD"},"properties":{"checkin":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Arrival date, `YYYY-MM-DD`. Today or later: today in `timezone` when given, else today anywhere in the `country_code` country, else today in UTC.","isRequired":true,"uniqueKey":"oneOf.1.checkin","typeLabel":"string"},"checkout":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Departure date, `YYYY-MM-DD`. After `checkin`: a stay has at least one night.","isRequired":true,"uniqueKey":"oneOf.1.checkout","typeLabel":"string"},"next_handle":{"oneOf":[{"not":{}}],"uniqueKey":"oneOf.1.next_handle","typeLabel":"any"},"query":{"type":"string","example":"Paris","uniqueKey":"oneOf.1.query","typeLabel":"string"},"city_name":{"type":"string","uniqueKey":"oneOf.1.city_name","typeLabel":"string"},"country_code":{"type":"string","minLength":2,"maxLength":2,"uniqueKey":"oneOf.1.country_code","typeLabel":"string"},"latitude":{"type":"number","uniqueKey":"oneOf.1.latitude","typeLabel":"number"},"longitude":{"type":"number","uniqueKey":"oneOf.1.longitude","typeLabel":"number"},"radius_km":{"type":"number","minimum":0,"exclusiveMinimum":true,"maximum":50,"description":"Half the side, in km, of the square searched around `latitude`/`longitude` (default 20, at most 50). The hotel source searches a square, not a circle, and no hotel is dropped by distance, so a hotel near a corner can be up to 1.414 × max(`radius_km`, 1) km from the centre (see each hotel’s `distance_km`). A value under 1 is searched at 1 km, the hotel source’s minimum.","uniqueKey":"oneOf.1.radius_km","typeLabel":"number"},"hotel_ids":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.1.hotel_ids.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.1.hotel_ids","typeLabel":"string[]"},"hotel_name":{"type":"string","minLength":1,"description":"Search one specific hotel by its name. The name is matched against the hotel catalog; the closest match is priced when it scores at least 0.7, and the response then has `destination_resolution.shape` `hotel_name` plus `nearby_alternatives` within 3 km. Add `city_name` and `country_code` to narrow the match. When no candidate scores 0.7, the call returns 422 `HOTEL_NAME_LOW_CONFIDENCE` with `top_candidates` and a `suggested_retry`. With `hotel_name`, `query`, `city_name` and coordinates do not set the search area. Property filters (min_rating, min_star_rating, max_star_rating, star_rating, min_reviews, hotel_type_ids, chain_ids, facility_ids) are ignored with hotel_name or hotel_ids, and when a `query` is read as one hotel: the named hotel is priced as if they were not sent. An out-of-range value, or a facility or hotel type that is not a numeric id, is still refused. `hotel_ids`, when also sent, takes precedence. Name lookup covers part of the hotel inventory only.","example":"Park Plaza Beijing Wangfujing","uniqueKey":"oneOf.1.hotel_name","typeLabel":"string"},"timezone":{"type":"string","description":"The traveler's IANA time zone, such as `Pacific/Honolulu`: `checkin` may be today there, so a stay that starts tonight is accepted while the UTC date is already tomorrow. Without it, today is the date anywhere in the `country_code` country (its latest time zone), or in UTC when the country is not given.","example":"America/New_York","uniqueKey":"oneOf.1.timezone","typeLabel":"string"},"occupancies":{"type":"array","items":{"type":"object","properties":{"adults":{"type":"integer","minimum":1,"isRequired":true,"uniqueKey":"oneOf.1.occupancies.items.[INDEX].adults","typeLabel":"integer"},"children_ages":{"type":"array","items":{"type":"integer","minimum":0,"maximum":17,"uniqueKey":"oneOf.1.occupancies.items.[INDEX].children_ages.items.[INDEX]","typeLabel":"integer"},"uniqueKey":"oneOf.1.occupancies.items.[INDEX].children_ages","typeLabel":"integer[]"}},"required":["adults"],"description":"The party one room is requested or priced for: the number of adults and the age of each child.","uniqueKey":"oneOf.1.occupancies.items.[INDEX]","typeLabel":"object"},"description":"Each array element requests one room. One occupancy returns a one-room offer and keeps the deprecated `rooms[].rates[]` compatibility projection; multiple occupancies return multi-room `offers[]`. Add the chosen offer’s trip_item_token to a trip once.","uniqueKey":"oneOf.1.occupancies","typeLabel":"object[]"},"adults":{"type":"integer","minimum":1,"description":"Deprecated: use `occupancies` instead, one element per room with its own `adults`. Shorthand for the adults of the whole party: without `rooms` one room is priced for all of them, with `rooms` they are spread evenly over that many rooms. Ignored when `occupancies` is sent.","deprecated":true,"uniqueKey":"oneOf.1.adults","typeLabel":"integer"},"children":{"type":"array","items":{"type":"integer","minimum":0,"maximum":17,"uniqueKey":"oneOf.1.children.items.[INDEX]","typeLabel":"integer"},"description":"Deprecated: use `occupancies[].children_ages` instead, which places each child in a room. Shorthand for the age of each child of the whole party, spread over the rooms of `rooms`. Ignored when `occupancies` is sent.","deprecated":true,"uniqueKey":"oneOf.1.children","typeLabel":"integer[]"},"rooms":{"type":"integer","minimum":1,"description":"Deprecated: use `occupancies` instead, one element per room. Shorthand for how many rooms the `adults` and `children` of the party are spread over, evenly. Ignored when `occupancies` is sent.","deprecated":true,"uniqueKey":"oneOf.1.rooms","typeLabel":"integer"},"currency":{"type":"string","uniqueKey":"oneOf.1.currency","typeLabel":"string"},"guest_nationality":{"type":"string","minLength":2,"maxLength":2,"description":"The lead guest’s nationality, ISO 3166-1 alpha-2 (`FR`). Sent to the hotel supplier, which can offer different rates and prices by nationality, and kept on the offers this search returns. When omitted, `US` is used. The value applied is echoed in `search_context.guest_nationality`.","example":"FR","uniqueKey":"oneOf.1.guest_nationality","typeLabel":"string"},"min_rating":{"type":"number","description":"Minimum guest score (0-10) for destination searches. When omitted, or 0, no floor applies, and hotels without a guest score are returned too. Ignored with hotel_name or hotel_ids.","uniqueKey":"oneOf.1.min_rating","typeLabel":"number"},"min_star_rating":{"type":"integer","minimum":1,"maximum":5,"uniqueKey":"oneOf.1.min_star_rating","typeLabel":"integer"},"star_rating":{"type":"integer","minimum":1,"maximum":5,"description":"Deprecated: use `min_star_rating` and `max_star_rating` instead; send the same value as both for an exact match. Still applied: it fills whichever of the two bounds the request leaves unset.","deprecated":true,"uniqueKey":"oneOf.1.star_rating","typeLabel":"integer"},"max_star_rating":{"type":"integer","minimum":1,"maximum":5,"uniqueKey":"oneOf.1.max_star_rating","typeLabel":"integer"},"min_reviews":{"type":"integer","description":"Minimum number of guest reviews.","uniqueKey":"oneOf.1.min_reviews","typeLabel":"integer"},"max_results":{"type":"integer","maximum":200,"description":"Requested page size (default 50, at most 200); next_handle returns the next page of the same search. A hotel_name or hotel_ids search returns every named hotel that has rates.","uniqueKey":"oneOf.1.max_results","typeLabel":"integer"},"offset":{"type":"integer","minimum":0,"description":"Deprecated: use `next_handle` instead. Skips this many hotels at the hotel source before the first page, default 0. A search that answers with `next_handle` refuses a non-zero offset: page by sending that handle alone.","deprecated":true,"uniqueKey":"oneOf.1.offset","typeLabel":"integer"},"max_budget_per_night":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"Keep only hotels whose cheapest per-night price (per room, in the request currency) is within this budget; qualifying hotels keep all their rates.","example":150,"uniqueKey":"oneOf.1.max_budget_per_night","typeLabel":"number"},"hotel_type_ids":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.1.hotel_type_ids.items.[INDEX]","typeLabel":"string"},"description":"Filter by property type id. Each entry is a numeric property type id, as a string; property type names are refused.","uniqueKey":"oneOf.1.hotel_type_ids","typeLabel":"string[]"},"chain_ids":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.1.chain_ids.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.1.chain_ids","typeLabel":"string[]"},"facility_ids":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.1.facility_ids.items.[INDEX]","typeLabel":"string"},"description":"Filter by facility. Each entry is a Jinko facility dictionary id (numeric, as a string), listed in the docs under Hotel facility dictionary. Facility names are refused on this endpoint.","uniqueKey":"oneOf.1.facility_ids","typeLabel":"string[]"},"sort_by":{"type":"string","enum":["recommended","lowest"],"description":"Order of the hotels of a destination search. `recommended`, the default, is the hotel source's own recommended order, weighted by popularity, review quality and content completeness. `lowest` is cheapest per night first (per room, in the request currency). With `intent.user_intent` the hotels of either order are re-ranked by how well each one matches the intent, and carry `recommendation_score`. A `hotel_ids` or `hotel_name` search ignores it.","example":"lowest","uniqueKey":"oneOf.1.sort_by","typeLabel":"enum\u003cstring>"},"intent":{"type":"object","properties":{"user_intent":{"oneOf":[{"type":"string","description":"The user's natural-language intent: the Alpic PII-stripped paraphrase when available, else a best-effort fallback to the client-provided NL query.","example":"find a cheap flight to Tokyo","uniqueKey":"oneOf.1.intent.user_intent.oneOf.0","typeLabel":"string"},{"type":"null","description":"The user's natural-language intent: the Alpic PII-stripped paraphrase when available, else a best-effort fallback to the client-provided NL query.","example":"find a cheap flight to Tokyo","uniqueKey":"oneOf.1.intent.user_intent.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.intent.user_intent","typeLabel":"string | null"}},"uniqueKey":"oneOf.1.intent","typeLabel":"object"}},"uniqueKey":"oneOf.1","typeLabel":"object"}],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"next_handle":"hp_example_2"}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"a1024a1a-8996-4e56-8fbb-6c46218c0cb9":{"description":"Matching hotels","content":{"application/json":{"schema":{"type":"object","properties":{"hotels":{"type":"array","items":{"type":"object","properties":{"hotel_id":{"type":"string","description":"Opaque hotel identifier. Pass it to hotel_details, hotel_reviews and `hotel_ids` exactly as received; do not parse or build it. The value a hotel is known by can change between contract versions, so read it from a fresh hotel_search rather than keeping it.","example":"lp1d2c3","uniqueKey":"hotels.items.[INDEX].hotel_id","typeLabel":"string"},"hotel_ref":{"type":"string","description":"Deprecated: use `hotel_id` (search) or `id` (details, reviews). The hotel's identifier behind a source prefix, as earlier contract versions returned it; hotel_details and hotel_reviews still accept it. Pass it back exactly as received; do not parse or build it.","example":"h1:lp1d2c3","deprecated":true,"uniqueKey":"hotels.items.[INDEX].hotel_ref","typeLabel":"string"},"name":{"type":"string","example":"Hôtel Le Marais","uniqueKey":"hotels.items.[INDEX].name","typeLabel":"string"},"address":{"type":"string","example":"12 Rue de Rivoli","uniqueKey":"hotels.items.[INDEX].address","typeLabel":"string"},"city":{"type":"string","example":"Paris","uniqueKey":"hotels.items.[INDEX].city","typeLabel":"string"},"country":{"type":"string","description":"ISO 3166-1 alpha-2 country code, LOWER case as the platform sends it.","example":"fr","uniqueKey":"hotels.items.[INDEX].country","typeLabel":"string"},"star_rating":{"type":"number","example":4,"uniqueKey":"hotels.items.[INDEX].star_rating","typeLabel":"number"},"category":{"type":"string","description":"The provider's own category wording, which `star_rating` cannot express. Free text.","example":"4 KEYS","uniqueKey":"hotels.items.[INDEX].category","typeLabel":"string"},"lodging_type":{"type":"string","example":"Aparthotel","uniqueKey":"hotels.items.[INDEX].lodging_type","typeLabel":"string"},"rating":{"type":"number","description":"Guest score out of 10.","example":8.6,"uniqueKey":"hotels.items.[INDEX].rating","typeLabel":"number"},"review_count":{"type":"number","description":"Number of guest reviews behind `rating`.","example":1243,"uniqueKey":"hotels.items.[INDEX].review_count","typeLabel":"number"},"main_photo":{"type":"string","description":"Full-size hero image URL.","example":"https://images.example.com/hotels/main.jpg","uniqueKey":"hotels.items.[INDEX].main_photo","typeLabel":"string"},"thumbnail":{"type":"string","description":"Small preview image URL.","example":"https://images.example.com/hotels/thumb.jpg","uniqueKey":"hotels.items.[INDEX].thumbnail","typeLabel":"string"},"latitude":{"type":"number","example":48.8566,"uniqueKey":"hotels.items.[INDEX].latitude","typeLabel":"number"},"longitude":{"type":"number","example":2.3522,"uniqueKey":"hotels.items.[INDEX].longitude","typeLabel":"number"},"distance_km":{"type":"number","minimum":0,"description":"Straight-line distance from the search center, in kilometers.","uniqueKey":"hotels.items.[INDEX].distance_km","typeLabel":"number"},"recommendation_score":{"type":"number","minimum":0,"maximum":1,"description":"How well the hotel fits `intent.user_intent`, from 0 to 1, present when the intent re-ranked the results, which are then ordered by it. Without an intent the results keep the order `sort_by` names. Not a guest rating.","uniqueKey":"hotels.items.[INDEX].recommendation_score","typeLabel":"number"},"rooms":{"type":"array","items":{"type":"object","properties":{"room_id":{"type":"string","example":"rm_1","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].room_id","typeLabel":"string"},"room_name":{"type":"string","example":"Superior Double","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].room_name","typeLabel":"string"},"description":{"type":"string","description":"Free-text room description, when the provider supplied one.","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].description","typeLabel":"string"},"requested_occupancy":{"type":"integer","description":"The occupancy these rates were priced for — an echo of what you searched, not a property of the room. Pricing a different party size means searching again.","example":2,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].requested_occupancy","typeLabel":"integer"},"room_capacity":{"type":"integer","description":"How many the room sleeps, from the provider’s content catalogue. Absent when the catalogue carries no figure — absent means unknown, never zero. Same field as on hotel_details and on a hotel trip item.","example":2,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].room_capacity","typeLabel":"integer"},"max_occupancy":{"type":"integer","description":"Deprecated: an alias of `requested_occupancy` (same value), never the room’s capacity. Read `requested_occupancy` for the priced party size and `room_capacity` for how many the room sleeps.","deprecated":true,"example":2,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].max_occupancy","typeLabel":"integer"},"images":{"type":"array","items":{"type":"string","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].images.items.[INDEX]","typeLabel":"string"},"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].images","typeLabel":"string[]"},"amenities":{"type":"array","items":{"type":"string","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].amenities.items.[INDEX]","typeLabel":"string"},"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].amenities","typeLabel":"string[]"},"beds":{"type":"array","items":{"type":"object","properties":{"bed_type":{"type":"string","isRequired":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].beds.items.[INDEX].bed_type","typeLabel":"string"},"count":{"type":"integer","minimum":1,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].beds.items.[INDEX].count","typeLabel":"integer"}},"required":["bed_type","count"],"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].beds.items.[INDEX]","typeLabel":"object"},"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].beds","typeLabel":"object[]"},"rates":{"type":"array","items":{"type":"object","properties":{"offer_id":{"type":"string","description":"Legacy rooms[].rates[] compatibility token. New integrations use the hotel-level `offers[].trip_item_token`; add that token to the trip exactly once.","example":"htl_2d67a7441c60e5de","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].offer_id","typeLabel":"string"},"board_type":{"type":"string","example":"RO","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].board_type","typeLabel":"string"},"board_name":{"type":"string","example":"Room Only","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].board_name","typeLabel":"string"},"total_amount":{"type":"number","description":"Deprecated: use `total_amount_money` instead. Price for the whole stay in `currency`, in MAJOR units at the currency’s own precision.","example":1818.4,"deprecated":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].total_amount","typeLabel":"number"},"total_amount_display":{"type":"string","description":"Deprecated: use `total_amount_money` instead. The rate total as a string ready to show: the ISO 4217 code, a space, then `total_amount` at the currency’s ISO digits, e.g. \"EUR 606.13\".","example":"EUR 606.13","deprecated":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].total_amount_display","typeLabel":"string"},"currency":{"type":"string","description":"Deprecated: use `total_amount_money` instead. The currency of `total_amount`.","example":"EUR","deprecated":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].currency","typeLabel":"string"},"total_amount_money":{"type":"object","description":"Price for the whole stay.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].total_amount_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].total_amount_money.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].total_amount_money.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].total_amount_money.display","typeLabel":"string"}},"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].total_amount_money","typeLabel":"object"},"is_refundable":{"type":"boolean","example":false,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].is_refundable","typeLabel":"boolean"},"free_cancellation_until":{"type":"string","description":"Last instant the stay can be cancelled at no charge. RFC 3339 with the supplier’s declared UTC offset. Absent when the supplier declared no timezone — the platform never invents an offset, so a deadline it cannot place on the clock is withheld rather than published ambiguously — and absent when the rate is non-refundable or the provider named no deadline.","example":"2026-08-18T10:00:00+02:00","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].free_cancellation_until","typeLabel":"string"},"cancellation_schedule":{"type":"array","items":{"type":"object","properties":{"cancel_time":{"type":"string","description":"Deadline after which this tier applies. RFC 3339 with the supplier’s declared UTC offset. Steps whose deadline has no declared timezone are omitted from the ladder — the platform never invents an offset — so a schedule can be shorter than the supplier’s own. Tiers are chronological, earliest first, so the first entry is the deadline that matters.","example":"2026-08-18T10:00:00+02:00","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].cancellation_schedule.items.[INDEX].cancel_time","typeLabel":"string"},"amount":{"type":"number","description":"Deprecated: use `amount_money` instead. Read `amount_money`, `percent` or `nights`, whichever this step carries. What the guest is charged on or after `cancel_time`: a sum in MAJOR units of `currency`, a percentage or a number of nights, as `type` says.","example":606.13,"deprecated":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].cancellation_schedule.items.[INDEX].amount","typeLabel":"number"},"currency":{"type":"string","description":"Deprecated: use `amount_money` instead. The currency of `amount`.","example":"EUR","deprecated":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].cancellation_schedule.items.[INDEX].currency","typeLabel":"string"},"type":{"type":"string","description":"How the charge is expressed — a sum (\"amount\", \"flat_fee\"; read `amount_money`), a percentage (\"percent\", \"percentage\"; read `percent`) or a number of nights (\"nights\"; read `nights`).","example":"amount","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].cancellation_schedule.items.[INDEX].type","typeLabel":"string"},"display":{"type":"string","description":"Deprecated: use `amount_money` instead. The same figure as a string ready to show: the ISO 4217 code, a space, then the amount, e.g. \"USD 159.77\". With decimal_places it is written at exactly that scale (value 1561500, JPY, decimal_places 2 is \"JPY 15615.00\"); without, at the ISO digits of the currency. Show this; compute with the number. Absent when the figure is not money (a cancellation step expressed as a percent or a number of nights) or could not be read unambiguously.","example":"EUR 606.13","deprecated":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].cancellation_schedule.items.[INDEX].display","typeLabel":"string"},"amount_money":{"type":"object","description":"What the guest is charged on or after `cancel_time`, when this step is a sum. Absent on a percentage or nights step, and when the supplier named no currency.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].cancellation_schedule.items.[INDEX].amount_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].cancellation_schedule.items.[INDEX].amount_money.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].cancellation_schedule.items.[INDEX].amount_money.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].cancellation_schedule.items.[INDEX].amount_money.display","typeLabel":"string"}},"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].cancellation_schedule.items.[INDEX].amount_money","typeLabel":"object"},"percent":{"type":"number","description":"The charge as a percentage of the stay price, when this step is a percentage, on the 0–100 scale the supplier states it in: 50 is half the stay price, 100 the whole of it. Never a 0–1 fraction. Absent otherwise.","example":50,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].cancellation_schedule.items.[INDEX].percent","typeLabel":"number"},"nights":{"type":"number","description":"The charge as a number of nights of the stay, when this step is expressed in nights. Absent otherwise.","example":1,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].cancellation_schedule.items.[INDEX].nights","typeLabel":"number"}},"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].cancellation_schedule.items.[INDEX]","typeLabel":"object"},"description":"The full penalty ladder, chronological. Absent when the provider published none — which is not a statement that cancelling is free.","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].cancellation_schedule","typeLabel":"object[]"},"taxes_breakdown":{"type":"array","items":{"type":"object","properties":{"amount":{"type":"number","description":"Deprecated: use `amount_money` instead. The tax in MAJOR units of `currency`.","example":164.49,"deprecated":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].taxes_breakdown.items.[INDEX].amount","typeLabel":"number"},"currency":{"type":"string","description":"Deprecated: use `amount_money` instead. The currency of `amount`.","example":"EUR","deprecated":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].taxes_breakdown.items.[INDEX].currency","typeLabel":"string"},"amount_money":{"type":"object","description":"The tax. When the supplier named no currency for the line, it is the currency the rate is priced in.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].taxes_breakdown.items.[INDEX].amount_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].taxes_breakdown.items.[INDEX].amount_money.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].taxes_breakdown.items.[INDEX].amount_money.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].taxes_breakdown.items.[INDEX].amount_money.display","typeLabel":"string"}},"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].taxes_breakdown.items.[INDEX].amount_money","typeLabel":"object"},"description":{"type":"string","description":"The provider’s own wording for the tax. Free text, not a code.","example":"19, VAT National taxes on accommodation","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].taxes_breakdown.items.[INDEX].description","typeLabel":"string"},"included":{"type":"boolean","description":"True when the amount is ALREADY inside `total_amount_money`; false when the guest pays it at the property on top. Getting this backwards misquotes the trip.","example":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].taxes_breakdown.items.[INDEX].included","typeLabel":"boolean"},"display":{"type":"string","description":"Deprecated: use `amount_money` instead. The same figure as a string ready to show: the ISO 4217 code, a space, then the amount, e.g. \"USD 159.77\". With decimal_places it is written at exactly that scale (value 1561500, JPY, decimal_places 2 is \"JPY 15615.00\"); without, at the ISO digits of the currency. Show this; compute with the number. Absent when the figure is not money (a cancellation step expressed as a percent or a number of nights) or could not be read unambiguously.","example":"EUR 164.49","deprecated":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].taxes_breakdown.items.[INDEX].display","typeLabel":"string"}},"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].taxes_breakdown.items.[INDEX]","typeLabel":"object"},"description":"Taxes and fees on this rate. ALWAYS present, so an empty array means \"no tax is known\" and can be shown as such; check `included` per line before adding anything to `total_amount_money`.","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].taxes_breakdown","typeLabel":"object[]"},"payment_types":{"type":"array","items":{"type":"string","enum":["pay_now","pay_at_property","deposit"],"description":"How the rate can be settled. `pay_now` — paid when the booking is made. `pay_at_property` — paid to the hotel at the property. `deposit` — a deposit is taken.","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].payment_types.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"How the rate can be settled. Each value appears at most once.","example":["pay_now"],"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].payment_types","typeLabel":"enum\u003cstring>[]"},"promotions":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].promotions.items.[INDEX].code","typeLabel":"string"},"name":{"type":"string","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].promotions.items.[INDEX].name","typeLabel":"string"},"remark":{"type":"string","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].promotions.items.[INDEX].remark","typeLabel":"string"}},"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].promotions.items.[INDEX]","typeLabel":"object"},"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].promotions","typeLabel":"object[]"},"booking_scope":{"type":"string","description":"LEGACY-ONLY compatibility metadata. Current canonical `offers[]` never returns `booking_scope`; use `room_rates.length` to determine how many rooms an offer covers.","example":"room_bundle","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].booking_scope","typeLabel":"string"},"num_rooms":{"type":"integer","minimum":1,"description":"LEGACY-ONLY compatibility metadata. Current canonical `offers[]` represents room count through `room_rates.length` and never returns `num_rooms`.","example":2,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].num_rooms","typeLabel":"integer"},"rooms":{"type":"array","items":{"type":"object","properties":{"occupancy_number":{"type":"integer","minimum":1,"description":"Stable one-based room slot within this bundle.","example":1,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].occupancy_number","typeLabel":"integer"},"occupancy":{"type":"object","properties":{"adults":{"type":"integer","minimum":1,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].occupancy.adults","typeLabel":"integer"},"children_ages":{"type":"array","items":{"type":"integer","minimum":0,"maximum":17,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].occupancy.children_ages.items.[INDEX]","typeLabel":"integer"},"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].occupancy.children_ages","typeLabel":"integer[]"}},"required":["adults"],"description":"The party one room is requested or priced for: the number of adults and the age of each child.","isRequired":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].occupancy","typeLabel":"object"},"room_id":{"type":"string","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].room_id","typeLabel":"string"},"mapped_room_id":{"type":"integer","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].mapped_room_id","typeLabel":"integer"},"room_name":{"type":"string","example":"Superior Double","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].room_name","typeLabel":"string"},"rate_id":{"type":"string","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].rate_id","typeLabel":"string"},"board_type":{"type":"string","example":"BB","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].board_type","typeLabel":"string"},"board_name":{"type":"string","example":"Breakfast Included","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].board_name","typeLabel":"string"},"max_occupancy":{"type":"integer","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].max_occupancy","typeLabel":"integer"},"taxes_and_fees":{"type":"array","items":{"type":"object","properties":{"amount":{"type":"number","description":"Deprecated: use `amount_money` instead. The tax in MAJOR units of `currency`.","example":164.49,"deprecated":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].amount","typeLabel":"number"},"currency":{"type":"string","description":"Deprecated: use `amount_money` instead. The currency of `amount`.","example":"EUR","deprecated":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].currency","typeLabel":"string"},"amount_money":{"type":"object","description":"The tax. When the supplier named no currency for the line, it is the currency the rate is priced in.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].amount_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].amount_money.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].amount_money.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].amount_money.display","typeLabel":"string"}},"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].amount_money","typeLabel":"object"},"description":{"type":"string","description":"The provider’s own wording for the tax. Free text, not a code.","example":"19, VAT National taxes on accommodation","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].description","typeLabel":"string"},"included":{"type":"boolean","description":"True when the amount is ALREADY inside `total_amount_money`; false when the guest pays it at the property on top. Getting this backwards misquotes the trip.","example":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].included","typeLabel":"boolean"},"display":{"type":"string","description":"Deprecated: use `amount_money` instead. The same figure as a string ready to show: the ISO 4217 code, a space, then the amount, e.g. \"USD 159.77\". With decimal_places it is written at exactly that scale (value 1561500, JPY, decimal_places 2 is \"JPY 15615.00\"); without, at the ISO digits of the currency. Show this; compute with the number. Absent when the figure is not money (a cancellation step expressed as a percent or a number of nights) or could not be read unambiguously.","example":"EUR 164.49","deprecated":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].display","typeLabel":"string"}},"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX]","typeLabel":"object"},"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].taxes_and_fees","typeLabel":"object[]"},"policies":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX].type","typeLabel":"string"},"description":{"type":"string","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX].description","typeLabel":"string"},"fee_amount":{"type":"number","description":"Deprecated: use `fee_amount_money` instead. Customer policy fee in MAJOR units of `fee_currency`.","deprecated":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX].fee_amount","typeLabel":"number"},"fee_currency":{"type":"string","description":"Deprecated: use `fee_amount_money` instead. The currency of `fee_amount`.","deprecated":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX].fee_currency","typeLabel":"string"},"fee_amount_money":{"type":"object","description":"Customer cancellation or policy fee, with exact minor units and currency precision.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX].fee_amount_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX].fee_amount_money.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX].fee_amount_money.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX].fee_amount_money.display","typeLabel":"string"}},"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX].fee_amount_money","typeLabel":"object"}},"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX]","typeLabel":"object"},"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].policies","typeLabel":"object[]"},"is_refundable":{"type":"boolean","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].is_refundable","typeLabel":"boolean"},"cancellation_policy":{"type":"array","items":{"type":"object","properties":{"cancel_time":{"type":"string","description":"Deadline after which this tier applies. RFC 3339 with the supplier’s declared UTC offset. Steps whose deadline has no declared timezone are omitted from the ladder — the platform never invents an offset — so a schedule can be shorter than the supplier’s own. Tiers are chronological, earliest first, so the first entry is the deadline that matters.","example":"2026-08-18T10:00:00+02:00","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].cancel_time","typeLabel":"string"},"amount":{"type":"number","description":"Deprecated: use `amount_money` instead. Read `amount_money`, `percent` or `nights`, whichever this step carries. What the guest is charged on or after `cancel_time`: a sum in MAJOR units of `currency`, a percentage or a number of nights, as `type` says.","example":606.13,"deprecated":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].amount","typeLabel":"number"},"currency":{"type":"string","description":"Deprecated: use `amount_money` instead. The currency of `amount`.","example":"EUR","deprecated":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].currency","typeLabel":"string"},"type":{"type":"string","description":"How the charge is expressed — a sum (\"amount\", \"flat_fee\"; read `amount_money`), a percentage (\"percent\", \"percentage\"; read `percent`) or a number of nights (\"nights\"; read `nights`).","example":"amount","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].type","typeLabel":"string"},"display":{"type":"string","description":"Deprecated: use `amount_money` instead. The same figure as a string ready to show: the ISO 4217 code, a space, then the amount, e.g. \"USD 159.77\". With decimal_places it is written at exactly that scale (value 1561500, JPY, decimal_places 2 is \"JPY 15615.00\"); without, at the ISO digits of the currency. Show this; compute with the number. Absent when the figure is not money (a cancellation step expressed as a percent or a number of nights) or could not be read unambiguously.","example":"EUR 606.13","deprecated":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].display","typeLabel":"string"},"amount_money":{"type":"object","description":"What the guest is charged on or after `cancel_time`, when this step is a sum. Absent on a percentage or nights step, and when the supplier named no currency.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].amount_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].amount_money.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].amount_money.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].amount_money.display","typeLabel":"string"}},"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].amount_money","typeLabel":"object"},"percent":{"type":"number","description":"The charge as a percentage of the stay price, when this step is a percentage, on the 0–100 scale the supplier states it in: 50 is half the stay price, 100 the whole of it. Never a 0–1 fraction. Absent otherwise.","example":50,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].percent","typeLabel":"number"},"nights":{"type":"number","description":"The charge as a number of nights of the stay, when this step is expressed in nights. Absent otherwise.","example":1,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].nights","typeLabel":"number"}},"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX]","typeLabel":"object"},"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].cancellation_policy","typeLabel":"object[]"},"free_cancellation_until":{"type":"string","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].free_cancellation_until","typeLabel":"string"},"payment_types":{"type":"array","items":{"type":"string","enum":["pay_now","pay_at_property","deposit"],"description":"How the rate can be settled. `pay_now` — paid when the booking is made. `pay_at_property` — paid to the hotel at the property. `deposit` — a deposit is taken.","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].payment_types.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"How the rate can be settled. Each value appears at most once.","example":["pay_now"],"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].payment_types","typeLabel":"enum\u003cstring>[]"},"remarks":{"type":"string","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].remarks","typeLabel":"string"}},"required":["occupancy_number","occupancy"],"description":"One room of a hotel item — the single room a one-room item books, or one slot of a room-bundle rate — with the party it was priced for (`occupancy`) and its display and policy details. The containing item owns the customer-facing total; supplier net, suggested retail, commission and room-local supplier price figures are intentionally not part of this public shape.","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX]","typeLabel":"object"},"description":"LEGACY-ONLY compatibility room details. Current canonical `offers[]` returns `room_rates[]` and never returns this `rooms` field.","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms","typeLabel":"object[]"}},"description":"Deprecated compatibility shape under `rooms[].rates[]`. Current canonical `offers[]` does not return `booking_scope`, `num_rooms`, or `rooms`; use `room_rates[]` instead.","uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX]","typeLabel":"object"},"description":"DEPRECATED compatibility projection. Read the hotel-level `offers[]` list for new integrations and add an offer’s `trip_item_token` to the trip. Multi-room searches return this as an empty array.","deprecated":true,"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX].rates","typeLabel":"object[]"}},"uniqueKey":"hotels.items.[INDEX].rooms.items.[INDEX]","typeLabel":"object"},"uniqueKey":"hotels.items.[INDEX].rooms","typeLabel":"object[]"},"offers":{"type":"array","items":{"type":"object","properties":{"offer_id":{"type":"string","description":"Deprecated: use `trip_item_token` instead. Same value.","example":"htl_2d67a7441c60e5de","deprecated":true,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].offer_id","typeLabel":"string"},"total_amount":{"type":"number","description":"Deprecated: use `total_amount_money` instead. Price for the whole stay in `currency`, in MAJOR units at the currency’s own precision.","example":1818.4,"deprecated":true,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].total_amount","typeLabel":"number"},"currency":{"type":"string","description":"Deprecated: use `total_amount_money` instead. The currency of `total_amount`.","example":"EUR","deprecated":true,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].currency","typeLabel":"string"},"is_refundable":{"type":"boolean","isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].is_refundable","typeLabel":"boolean"},"taxes_breakdown":{"type":"array","items":{"type":"object","properties":{"amount":{"type":"number","description":"Deprecated: use `amount_money` instead. The tax in MAJOR units of `currency`.","example":164.49,"deprecated":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].taxes_breakdown.items.[INDEX].amount","typeLabel":"number"},"currency":{"type":"string","description":"Deprecated: use `amount_money` instead. The currency of `amount`.","example":"EUR","deprecated":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].taxes_breakdown.items.[INDEX].currency","typeLabel":"string"},"amount_money":{"type":"object","description":"The tax. When the supplier named no currency for the line, it is the currency the rate is priced in.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].taxes_breakdown.items.[INDEX].amount_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].taxes_breakdown.items.[INDEX].amount_money.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].taxes_breakdown.items.[INDEX].amount_money.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].taxes_breakdown.items.[INDEX].amount_money.display","typeLabel":"string"}},"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].taxes_breakdown.items.[INDEX].amount_money","typeLabel":"object"},"description":{"type":"string","description":"The provider’s own wording for the tax. Free text, not a code.","example":"19, VAT National taxes on accommodation","uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].taxes_breakdown.items.[INDEX].description","typeLabel":"string"},"included":{"type":"boolean","description":"True when the amount is ALREADY inside `total_amount_money`; false when the guest pays it at the property on top. Getting this backwards misquotes the trip.","example":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].taxes_breakdown.items.[INDEX].included","typeLabel":"boolean"},"display":{"type":"string","description":"Deprecated: use `amount_money` instead. The same figure as a string ready to show: the ISO 4217 code, a space, then the amount, e.g. \"USD 159.77\". With decimal_places it is written at exactly that scale (value 1561500, JPY, decimal_places 2 is \"JPY 15615.00\"); without, at the ISO digits of the currency. Show this; compute with the number. Absent when the figure is not money (a cancellation step expressed as a percent or a number of nights) or could not be read unambiguously.","example":"EUR 164.49","deprecated":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].taxes_breakdown.items.[INDEX].display","typeLabel":"string"}},"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].taxes_breakdown.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].taxes_breakdown","typeLabel":"object[]"},"trip_item_token":{"type":"string","description":"The token `trip(add_item)` takes as `trip_item_token`. Add it once even when `room_rates` contains several occupancies.","example":"htl_2d67a7441c60e5de","isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].trip_item_token","typeLabel":"string"},"room_rates":{"type":"array","items":{"type":"object","properties":{"room_id":{"type":"string","description":"References one entry in this hotel’s `rooms[]` metadata.","isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].room_id","typeLabel":"string"},"occupancy_number":{"type":"integer","minimum":1,"description":"Stable one-based occupancy slot from the search request.","isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].occupancy_number","typeLabel":"integer"},"occupancy":{"type":"object","properties":{"adults":{"type":"integer","minimum":1,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].occupancy.adults","typeLabel":"integer"},"children_ages":{"type":"array","items":{"type":"integer","minimum":0,"maximum":17,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].occupancy.children_ages.items.[INDEX]","typeLabel":"integer"},"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].occupancy.children_ages","typeLabel":"integer[]"}},"required":["adults"],"description":"The party one room is requested or priced for: the number of adults and the age of each child.","isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].occupancy","typeLabel":"object"},"taxes_and_fees":{"type":"array","items":{"type":"object","properties":{"amount":{"type":"number","description":"Deprecated: use `amount_money` instead. The tax in MAJOR units of `currency`.","example":164.49,"deprecated":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].taxes_and_fees.items.[INDEX].amount","typeLabel":"number"},"currency":{"type":"string","description":"Deprecated: use `amount_money` instead. The currency of `amount`.","example":"EUR","deprecated":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].taxes_and_fees.items.[INDEX].currency","typeLabel":"string"},"amount_money":{"type":"object","description":"The tax. When the supplier named no currency for the line, it is the currency the rate is priced in.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].taxes_and_fees.items.[INDEX].amount_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].taxes_and_fees.items.[INDEX].amount_money.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].taxes_and_fees.items.[INDEX].amount_money.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].taxes_and_fees.items.[INDEX].amount_money.display","typeLabel":"string"}},"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].taxes_and_fees.items.[INDEX].amount_money","typeLabel":"object"},"description":{"type":"string","description":"The provider’s own wording for the tax. Free text, not a code.","example":"19, VAT National taxes on accommodation","uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].taxes_and_fees.items.[INDEX].description","typeLabel":"string"},"included":{"type":"boolean","description":"True when the amount is ALREADY inside `total_amount_money`; false when the guest pays it at the property on top. Getting this backwards misquotes the trip.","example":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].taxes_and_fees.items.[INDEX].included","typeLabel":"boolean"},"display":{"type":"string","description":"Deprecated: use `amount_money` instead. The same figure as a string ready to show: the ISO 4217 code, a space, then the amount, e.g. \"USD 159.77\". With decimal_places it is written at exactly that scale (value 1561500, JPY, decimal_places 2 is \"JPY 15615.00\"); without, at the ISO digits of the currency. Show this; compute with the number. Absent when the figure is not money (a cancellation step expressed as a percent or a number of nights) or could not be read unambiguously.","example":"EUR 164.49","deprecated":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].taxes_and_fees.items.[INDEX].display","typeLabel":"string"}},"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].taxes_and_fees.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].taxes_and_fees","typeLabel":"object[]"},"is_refundable":{"type":"boolean","isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].is_refundable","typeLabel":"boolean"},"room_name":{"type":"string","uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].room_name","typeLabel":"string"},"board_type":{"type":"string","uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].board_type","typeLabel":"string"},"board_name":{"type":"string","uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].board_name","typeLabel":"string"},"max_occupancy":{"type":"integer","uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].max_occupancy","typeLabel":"integer"},"policies":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].policies.items.[INDEX].type","typeLabel":"string"},"description":{"type":"string","uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].policies.items.[INDEX].description","typeLabel":"string"},"fee_amount":{"type":"number","description":"Deprecated: use `fee_amount_money` instead. Customer policy fee in MAJOR units of `fee_currency`.","deprecated":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].policies.items.[INDEX].fee_amount","typeLabel":"number"},"fee_currency":{"type":"string","description":"Deprecated: use `fee_amount_money` instead. The currency of `fee_amount`.","deprecated":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].policies.items.[INDEX].fee_currency","typeLabel":"string"},"fee_amount_money":{"type":"object","description":"Customer cancellation or policy fee, with exact minor units and currency precision.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].policies.items.[INDEX].fee_amount_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].policies.items.[INDEX].fee_amount_money.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].policies.items.[INDEX].fee_amount_money.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].policies.items.[INDEX].fee_amount_money.display","typeLabel":"string"}},"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].policies.items.[INDEX].fee_amount_money","typeLabel":"object"}},"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].policies.items.[INDEX]","typeLabel":"object"},"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].policies","typeLabel":"object[]"},"cancellation_policy":{"type":"array","items":{"type":"object","properties":{"cancel_time":{"type":"string","description":"Deadline after which this tier applies. RFC 3339 with the supplier’s declared UTC offset. Steps whose deadline has no declared timezone are omitted from the ladder — the platform never invents an offset — so a schedule can be shorter than the supplier’s own. Tiers are chronological, earliest first, so the first entry is the deadline that matters.","example":"2026-08-18T10:00:00+02:00","uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].cancellation_policy.items.[INDEX].cancel_time","typeLabel":"string"},"amount":{"type":"number","description":"Deprecated: use `amount_money` instead. Read `amount_money`, `percent` or `nights`, whichever this step carries. What the guest is charged on or after `cancel_time`: a sum in MAJOR units of `currency`, a percentage or a number of nights, as `type` says.","example":606.13,"deprecated":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].cancellation_policy.items.[INDEX].amount","typeLabel":"number"},"currency":{"type":"string","description":"Deprecated: use `amount_money` instead. The currency of `amount`.","example":"EUR","deprecated":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].cancellation_policy.items.[INDEX].currency","typeLabel":"string"},"type":{"type":"string","description":"How the charge is expressed — a sum (\"amount\", \"flat_fee\"; read `amount_money`), a percentage (\"percent\", \"percentage\"; read `percent`) or a number of nights (\"nights\"; read `nights`).","example":"amount","uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].cancellation_policy.items.[INDEX].type","typeLabel":"string"},"display":{"type":"string","description":"Deprecated: use `amount_money` instead. The same figure as a string ready to show: the ISO 4217 code, a space, then the amount, e.g. \"USD 159.77\". With decimal_places it is written at exactly that scale (value 1561500, JPY, decimal_places 2 is \"JPY 15615.00\"); without, at the ISO digits of the currency. Show this; compute with the number. Absent when the figure is not money (a cancellation step expressed as a percent or a number of nights) or could not be read unambiguously.","example":"EUR 606.13","deprecated":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].cancellation_policy.items.[INDEX].display","typeLabel":"string"},"amount_money":{"type":"object","description":"What the guest is charged on or after `cancel_time`, when this step is a sum. Absent on a percentage or nights step, and when the supplier named no currency.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].cancellation_policy.items.[INDEX].amount_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].cancellation_policy.items.[INDEX].amount_money.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].cancellation_policy.items.[INDEX].amount_money.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].cancellation_policy.items.[INDEX].amount_money.display","typeLabel":"string"}},"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].cancellation_policy.items.[INDEX].amount_money","typeLabel":"object"},"percent":{"type":"number","description":"The charge as a percentage of the stay price, when this step is a percentage, on the 0–100 scale the supplier states it in: 50 is half the stay price, 100 the whole of it. Never a 0–1 fraction. Absent otherwise.","example":50,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].cancellation_policy.items.[INDEX].percent","typeLabel":"number"},"nights":{"type":"number","description":"The charge as a number of nights of the stay, when this step is expressed in nights. Absent otherwise.","example":1,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].cancellation_policy.items.[INDEX].nights","typeLabel":"number"}},"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].cancellation_policy.items.[INDEX]","typeLabel":"object"},"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].cancellation_policy","typeLabel":"object[]"},"free_cancellation_until":{"type":"string","uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].free_cancellation_until","typeLabel":"string"},"payment_types":{"type":"array","items":{"type":"string","enum":["pay_now","pay_at_property","deposit"],"description":"How the rate can be settled. `pay_now` — paid when the booking is made. `pay_at_property` — paid to the hotel at the property. `deposit` — a deposit is taken.","uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].payment_types.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"How the rate can be settled. Each value appears at most once.","example":["pay_now"],"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].payment_types","typeLabel":"enum\u003cstring>[]"},"remarks":{"type":"string","uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].remarks","typeLabel":"string"}},"required":["room_id","occupancy_number","occupancy","taxes_and_fees","is_refundable"],"description":"Display and policy details for one requested room occupancy. It carries no customer price allocation; the containing offer owns the authoritative whole-stay total.","uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX]","typeLabel":"object"},"description":"One entry per requested occupancy. One occupancy means one room; multiple occupancies mean a multi-room offer.","isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].room_rates","typeLabel":"object[]"},"board_type":{"type":"string","example":"RO","uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].board_type","typeLabel":"string"},"board_name":{"type":"string","example":"Room Only","uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].board_name","typeLabel":"string"},"total_amount_display":{"type":"string","description":"Deprecated: use `total_amount_money` instead. The rate total as a string ready to show: the ISO 4217 code, a space, then `total_amount` at the currency’s ISO digits, e.g. \"EUR 606.13\".","example":"EUR 606.13","deprecated":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].total_amount_display","typeLabel":"string"},"total_amount_money":{"type":"object","description":"Price for the whole stay.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].total_amount_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].total_amount_money.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].total_amount_money.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].total_amount_money.display","typeLabel":"string"}},"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].total_amount_money","typeLabel":"object"},"free_cancellation_until":{"type":"string","description":"Last instant the stay can be cancelled at no charge. RFC 3339 with the supplier’s declared UTC offset. Absent when the supplier declared no timezone — the platform never invents an offset, so a deadline it cannot place on the clock is withheld rather than published ambiguously — and absent when the rate is non-refundable or the provider named no deadline.","example":"2026-08-18T10:00:00+02:00","uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].free_cancellation_until","typeLabel":"string"},"cancellation_schedule":{"type":"array","items":{"type":"object","properties":{"cancel_time":{"type":"string","description":"Deadline after which this tier applies. RFC 3339 with the supplier’s declared UTC offset. Steps whose deadline has no declared timezone are omitted from the ladder — the platform never invents an offset — so a schedule can be shorter than the supplier’s own. Tiers are chronological, earliest first, so the first entry is the deadline that matters.","example":"2026-08-18T10:00:00+02:00","uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].cancellation_schedule.items.[INDEX].cancel_time","typeLabel":"string"},"amount":{"type":"number","description":"Deprecated: use `amount_money` instead. Read `amount_money`, `percent` or `nights`, whichever this step carries. What the guest is charged on or after `cancel_time`: a sum in MAJOR units of `currency`, a percentage or a number of nights, as `type` says.","example":606.13,"deprecated":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].cancellation_schedule.items.[INDEX].amount","typeLabel":"number"},"currency":{"type":"string","description":"Deprecated: use `amount_money` instead. The currency of `amount`.","example":"EUR","deprecated":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].cancellation_schedule.items.[INDEX].currency","typeLabel":"string"},"type":{"type":"string","description":"How the charge is expressed — a sum (\"amount\", \"flat_fee\"; read `amount_money`), a percentage (\"percent\", \"percentage\"; read `percent`) or a number of nights (\"nights\"; read `nights`).","example":"amount","uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].cancellation_schedule.items.[INDEX].type","typeLabel":"string"},"display":{"type":"string","description":"Deprecated: use `amount_money` instead. The same figure as a string ready to show: the ISO 4217 code, a space, then the amount, e.g. \"USD 159.77\". With decimal_places it is written at exactly that scale (value 1561500, JPY, decimal_places 2 is \"JPY 15615.00\"); without, at the ISO digits of the currency. Show this; compute with the number. Absent when the figure is not money (a cancellation step expressed as a percent or a number of nights) or could not be read unambiguously.","example":"EUR 606.13","deprecated":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].cancellation_schedule.items.[INDEX].display","typeLabel":"string"},"amount_money":{"type":"object","description":"What the guest is charged on or after `cancel_time`, when this step is a sum. Absent on a percentage or nights step, and when the supplier named no currency.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].cancellation_schedule.items.[INDEX].amount_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].cancellation_schedule.items.[INDEX].amount_money.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].cancellation_schedule.items.[INDEX].amount_money.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].cancellation_schedule.items.[INDEX].amount_money.display","typeLabel":"string"}},"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].cancellation_schedule.items.[INDEX].amount_money","typeLabel":"object"},"percent":{"type":"number","description":"The charge as a percentage of the stay price, when this step is a percentage, on the 0–100 scale the supplier states it in: 50 is half the stay price, 100 the whole of it. Never a 0–1 fraction. Absent otherwise.","example":50,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].cancellation_schedule.items.[INDEX].percent","typeLabel":"number"},"nights":{"type":"number","description":"The charge as a number of nights of the stay, when this step is expressed in nights. Absent otherwise.","example":1,"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].cancellation_schedule.items.[INDEX].nights","typeLabel":"number"}},"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].cancellation_schedule.items.[INDEX]","typeLabel":"object"},"description":"The full penalty ladder, chronological. Absent when the provider published none — which is not a statement that cancelling is free.","uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].cancellation_schedule","typeLabel":"object[]"},"payment_types":{"type":"array","items":{"type":"string","enum":["pay_now","pay_at_property","deposit"],"description":"How the rate can be settled. `pay_now` — paid when the booking is made. `pay_at_property` — paid to the hotel at the property. `deposit` — a deposit is taken.","uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].payment_types.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"How the rate can be settled. Each value appears at most once.","example":["pay_now"],"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].payment_types","typeLabel":"enum\u003cstring>[]"},"promotions":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].promotions.items.[INDEX].name","typeLabel":"string"},"remark":{"type":"string","uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].promotions.items.[INDEX].remark","typeLabel":"string"}},"description":"A provider promotion applied to the offer, as it is to be shown to the guest: its name and the remark that goes with it.","uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].promotions.items.[INDEX]","typeLabel":"object"},"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX].promotions","typeLabel":"object[]"}},"required":["offer_id","total_amount","currency","is_refundable","taxes_breakdown","trip_item_token","room_rates"],"uniqueKey":"hotels.items.[INDEX].offers.items.[INDEX]","typeLabel":"object"},"description":"Bookable whole-stay offers. Choose one and add its `trip_item_token` to the trip exactly once.","uniqueKey":"hotels.items.[INDEX].offers","typeLabel":"object[]"}},"description":"A hotel and its available rooms. Until v0.2.0 this schema declared `images`, `thumbnail_url` and `country_code`, none of which hotel search has ever sent; the real names are `main_photo`, `thumbnail` and `country`.","uniqueKey":"hotels.items.[INDEX]","typeLabel":"object"},"uniqueKey":"hotels","typeLabel":"object[]"},"nearby_alternatives":{"type":"array","items":{"type":"object","properties":{"hotel_id":{"type":"string","description":"Opaque hotel identifier. Pass it to hotel_details, hotel_reviews and `hotel_ids` exactly as received; do not parse or build it. The value a hotel is known by can change between contract versions, so read it from a fresh hotel_search rather than keeping it.","example":"lp1d2c3","uniqueKey":"nearby_alternatives.items.[INDEX].hotel_id","typeLabel":"string"},"hotel_ref":{"type":"string","description":"Deprecated: use `hotel_id` (search) or `id` (details, reviews). The hotel's identifier behind a source prefix, as earlier contract versions returned it; hotel_details and hotel_reviews still accept it. Pass it back exactly as received; do not parse or build it.","example":"h1:lp1d2c3","deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].hotel_ref","typeLabel":"string"},"name":{"type":"string","example":"Hôtel Le Marais","uniqueKey":"nearby_alternatives.items.[INDEX].name","typeLabel":"string"},"address":{"type":"string","example":"12 Rue de Rivoli","uniqueKey":"nearby_alternatives.items.[INDEX].address","typeLabel":"string"},"city":{"type":"string","example":"Paris","uniqueKey":"nearby_alternatives.items.[INDEX].city","typeLabel":"string"},"country":{"type":"string","description":"ISO 3166-1 alpha-2 country code, LOWER case as the platform sends it.","example":"fr","uniqueKey":"nearby_alternatives.items.[INDEX].country","typeLabel":"string"},"star_rating":{"type":"number","example":4,"uniqueKey":"nearby_alternatives.items.[INDEX].star_rating","typeLabel":"number"},"category":{"type":"string","description":"The provider's own category wording, which `star_rating` cannot express. Free text.","example":"4 KEYS","uniqueKey":"nearby_alternatives.items.[INDEX].category","typeLabel":"string"},"lodging_type":{"type":"string","example":"Aparthotel","uniqueKey":"nearby_alternatives.items.[INDEX].lodging_type","typeLabel":"string"},"rating":{"type":"number","description":"Guest score out of 10.","example":8.6,"uniqueKey":"nearby_alternatives.items.[INDEX].rating","typeLabel":"number"},"review_count":{"type":"number","description":"Number of guest reviews behind `rating`.","example":1243,"uniqueKey":"nearby_alternatives.items.[INDEX].review_count","typeLabel":"number"},"main_photo":{"type":"string","description":"Full-size hero image URL.","example":"https://images.example.com/hotels/main.jpg","uniqueKey":"nearby_alternatives.items.[INDEX].main_photo","typeLabel":"string"},"thumbnail":{"type":"string","description":"Small preview image URL.","example":"https://images.example.com/hotels/thumb.jpg","uniqueKey":"nearby_alternatives.items.[INDEX].thumbnail","typeLabel":"string"},"latitude":{"type":"number","example":48.8566,"uniqueKey":"nearby_alternatives.items.[INDEX].latitude","typeLabel":"number"},"longitude":{"type":"number","example":2.3522,"uniqueKey":"nearby_alternatives.items.[INDEX].longitude","typeLabel":"number"},"distance_km":{"type":"number","minimum":0,"description":"Straight-line distance from the search center, in kilometers.","uniqueKey":"nearby_alternatives.items.[INDEX].distance_km","typeLabel":"number"},"recommendation_score":{"type":"number","minimum":0,"maximum":1,"description":"How well the hotel fits `intent.user_intent`, from 0 to 1, present when the intent re-ranked the results, which are then ordered by it. Without an intent the results keep the order `sort_by` names. Not a guest rating.","uniqueKey":"nearby_alternatives.items.[INDEX].recommendation_score","typeLabel":"number"},"rooms":{"type":"array","items":{"type":"object","properties":{"room_id":{"type":"string","example":"rm_1","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].room_id","typeLabel":"string"},"room_name":{"type":"string","example":"Superior Double","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].room_name","typeLabel":"string"},"description":{"type":"string","description":"Free-text room description, when the provider supplied one.","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].description","typeLabel":"string"},"requested_occupancy":{"type":"integer","description":"The occupancy these rates were priced for — an echo of what you searched, not a property of the room. Pricing a different party size means searching again.","example":2,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].requested_occupancy","typeLabel":"integer"},"room_capacity":{"type":"integer","description":"How many the room sleeps, from the provider’s content catalogue. Absent when the catalogue carries no figure — absent means unknown, never zero. Same field as on hotel_details and on a hotel trip item.","example":2,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].room_capacity","typeLabel":"integer"},"max_occupancy":{"type":"integer","description":"Deprecated: an alias of `requested_occupancy` (same value), never the room’s capacity. Read `requested_occupancy` for the priced party size and `room_capacity` for how many the room sleeps.","deprecated":true,"example":2,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].max_occupancy","typeLabel":"integer"},"images":{"type":"array","items":{"type":"string","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].images.items.[INDEX]","typeLabel":"string"},"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].images","typeLabel":"string[]"},"amenities":{"type":"array","items":{"type":"string","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].amenities.items.[INDEX]","typeLabel":"string"},"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].amenities","typeLabel":"string[]"},"beds":{"type":"array","items":{"type":"object","properties":{"bed_type":{"type":"string","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].beds.items.[INDEX].bed_type","typeLabel":"string"},"count":{"type":"integer","minimum":1,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].beds.items.[INDEX].count","typeLabel":"integer"}},"required":["bed_type","count"],"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].beds.items.[INDEX]","typeLabel":"object"},"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].beds","typeLabel":"object[]"},"rates":{"type":"array","items":{"type":"object","properties":{"offer_id":{"type":"string","description":"Legacy rooms[].rates[] compatibility token. New integrations use the hotel-level `offers[].trip_item_token`; add that token to the trip exactly once.","example":"htl_2d67a7441c60e5de","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].offer_id","typeLabel":"string"},"board_type":{"type":"string","example":"RO","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].board_type","typeLabel":"string"},"board_name":{"type":"string","example":"Room Only","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].board_name","typeLabel":"string"},"total_amount":{"type":"number","description":"Deprecated: use `total_amount_money` instead. Price for the whole stay in `currency`, in MAJOR units at the currency’s own precision.","example":1818.4,"deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].total_amount","typeLabel":"number"},"total_amount_display":{"type":"string","description":"Deprecated: use `total_amount_money` instead. The rate total as a string ready to show: the ISO 4217 code, a space, then `total_amount` at the currency’s ISO digits, e.g. \"EUR 606.13\".","example":"EUR 606.13","deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].total_amount_display","typeLabel":"string"},"currency":{"type":"string","description":"Deprecated: use `total_amount_money` instead. The currency of `total_amount`.","example":"EUR","deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].currency","typeLabel":"string"},"total_amount_money":{"type":"object","description":"Price for the whole stay.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].total_amount_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].total_amount_money.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].total_amount_money.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].total_amount_money.display","typeLabel":"string"}},"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].total_amount_money","typeLabel":"object"},"is_refundable":{"type":"boolean","example":false,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].is_refundable","typeLabel":"boolean"},"free_cancellation_until":{"type":"string","description":"Last instant the stay can be cancelled at no charge. RFC 3339 with the supplier’s declared UTC offset. Absent when the supplier declared no timezone — the platform never invents an offset, so a deadline it cannot place on the clock is withheld rather than published ambiguously — and absent when the rate is non-refundable or the provider named no deadline.","example":"2026-08-18T10:00:00+02:00","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].free_cancellation_until","typeLabel":"string"},"cancellation_schedule":{"type":"array","items":{"type":"object","properties":{"cancel_time":{"type":"string","description":"Deadline after which this tier applies. RFC 3339 with the supplier’s declared UTC offset. Steps whose deadline has no declared timezone are omitted from the ladder — the platform never invents an offset — so a schedule can be shorter than the supplier’s own. Tiers are chronological, earliest first, so the first entry is the deadline that matters.","example":"2026-08-18T10:00:00+02:00","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].cancellation_schedule.items.[INDEX].cancel_time","typeLabel":"string"},"amount":{"type":"number","description":"Deprecated: use `amount_money` instead. Read `amount_money`, `percent` or `nights`, whichever this step carries. What the guest is charged on or after `cancel_time`: a sum in MAJOR units of `currency`, a percentage or a number of nights, as `type` says.","example":606.13,"deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].cancellation_schedule.items.[INDEX].amount","typeLabel":"number"},"currency":{"type":"string","description":"Deprecated: use `amount_money` instead. The currency of `amount`.","example":"EUR","deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].cancellation_schedule.items.[INDEX].currency","typeLabel":"string"},"type":{"type":"string","description":"How the charge is expressed — a sum (\"amount\", \"flat_fee\"; read `amount_money`), a percentage (\"percent\", \"percentage\"; read `percent`) or a number of nights (\"nights\"; read `nights`).","example":"amount","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].cancellation_schedule.items.[INDEX].type","typeLabel":"string"},"display":{"type":"string","description":"Deprecated: use `amount_money` instead. The same figure as a string ready to show: the ISO 4217 code, a space, then the amount, e.g. \"USD 159.77\". With decimal_places it is written at exactly that scale (value 1561500, JPY, decimal_places 2 is \"JPY 15615.00\"); without, at the ISO digits of the currency. Show this; compute with the number. Absent when the figure is not money (a cancellation step expressed as a percent or a number of nights) or could not be read unambiguously.","example":"EUR 606.13","deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].cancellation_schedule.items.[INDEX].display","typeLabel":"string"},"amount_money":{"type":"object","description":"What the guest is charged on or after `cancel_time`, when this step is a sum. Absent on a percentage or nights step, and when the supplier named no currency.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].cancellation_schedule.items.[INDEX].amount_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].cancellation_schedule.items.[INDEX].amount_money.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].cancellation_schedule.items.[INDEX].amount_money.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].cancellation_schedule.items.[INDEX].amount_money.display","typeLabel":"string"}},"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].cancellation_schedule.items.[INDEX].amount_money","typeLabel":"object"},"percent":{"type":"number","description":"The charge as a percentage of the stay price, when this step is a percentage, on the 0–100 scale the supplier states it in: 50 is half the stay price, 100 the whole of it. Never a 0–1 fraction. Absent otherwise.","example":50,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].cancellation_schedule.items.[INDEX].percent","typeLabel":"number"},"nights":{"type":"number","description":"The charge as a number of nights of the stay, when this step is expressed in nights. Absent otherwise.","example":1,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].cancellation_schedule.items.[INDEX].nights","typeLabel":"number"}},"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].cancellation_schedule.items.[INDEX]","typeLabel":"object"},"description":"The full penalty ladder, chronological. Absent when the provider published none — which is not a statement that cancelling is free.","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].cancellation_schedule","typeLabel":"object[]"},"taxes_breakdown":{"type":"array","items":{"type":"object","properties":{"amount":{"type":"number","description":"Deprecated: use `amount_money` instead. The tax in MAJOR units of `currency`.","example":164.49,"deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].taxes_breakdown.items.[INDEX].amount","typeLabel":"number"},"currency":{"type":"string","description":"Deprecated: use `amount_money` instead. The currency of `amount`.","example":"EUR","deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].taxes_breakdown.items.[INDEX].currency","typeLabel":"string"},"amount_money":{"type":"object","description":"The tax. When the supplier named no currency for the line, it is the currency the rate is priced in.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].taxes_breakdown.items.[INDEX].amount_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].taxes_breakdown.items.[INDEX].amount_money.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].taxes_breakdown.items.[INDEX].amount_money.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].taxes_breakdown.items.[INDEX].amount_money.display","typeLabel":"string"}},"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].taxes_breakdown.items.[INDEX].amount_money","typeLabel":"object"},"description":{"type":"string","description":"The provider’s own wording for the tax. Free text, not a code.","example":"19, VAT National taxes on accommodation","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].taxes_breakdown.items.[INDEX].description","typeLabel":"string"},"included":{"type":"boolean","description":"True when the amount is ALREADY inside `total_amount_money`; false when the guest pays it at the property on top. Getting this backwards misquotes the trip.","example":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].taxes_breakdown.items.[INDEX].included","typeLabel":"boolean"},"display":{"type":"string","description":"Deprecated: use `amount_money` instead. The same figure as a string ready to show: the ISO 4217 code, a space, then the amount, e.g. \"USD 159.77\". With decimal_places it is written at exactly that scale (value 1561500, JPY, decimal_places 2 is \"JPY 15615.00\"); without, at the ISO digits of the currency. Show this; compute with the number. Absent when the figure is not money (a cancellation step expressed as a percent or a number of nights) or could not be read unambiguously.","example":"EUR 164.49","deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].taxes_breakdown.items.[INDEX].display","typeLabel":"string"}},"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].taxes_breakdown.items.[INDEX]","typeLabel":"object"},"description":"Taxes and fees on this rate. ALWAYS present, so an empty array means \"no tax is known\" and can be shown as such; check `included` per line before adding anything to `total_amount_money`.","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].taxes_breakdown","typeLabel":"object[]"},"payment_types":{"type":"array","items":{"type":"string","enum":["pay_now","pay_at_property","deposit"],"description":"How the rate can be settled. `pay_now` — paid when the booking is made. `pay_at_property` — paid to the hotel at the property. `deposit` — a deposit is taken.","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].payment_types.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"How the rate can be settled. Each value appears at most once.","example":["pay_now"],"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].payment_types","typeLabel":"enum\u003cstring>[]"},"promotions":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].promotions.items.[INDEX].code","typeLabel":"string"},"name":{"type":"string","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].promotions.items.[INDEX].name","typeLabel":"string"},"remark":{"type":"string","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].promotions.items.[INDEX].remark","typeLabel":"string"}},"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].promotions.items.[INDEX]","typeLabel":"object"},"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].promotions","typeLabel":"object[]"},"booking_scope":{"type":"string","description":"LEGACY-ONLY compatibility metadata. Current canonical `offers[]` never returns `booking_scope`; use `room_rates.length` to determine how many rooms an offer covers.","example":"room_bundle","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].booking_scope","typeLabel":"string"},"num_rooms":{"type":"integer","minimum":1,"description":"LEGACY-ONLY compatibility metadata. Current canonical `offers[]` represents room count through `room_rates.length` and never returns `num_rooms`.","example":2,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].num_rooms","typeLabel":"integer"},"rooms":{"type":"array","items":{"type":"object","properties":{"occupancy_number":{"type":"integer","minimum":1,"description":"Stable one-based room slot within this bundle.","example":1,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].occupancy_number","typeLabel":"integer"},"occupancy":{"type":"object","properties":{"adults":{"type":"integer","minimum":1,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].occupancy.adults","typeLabel":"integer"},"children_ages":{"type":"array","items":{"type":"integer","minimum":0,"maximum":17,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].occupancy.children_ages.items.[INDEX]","typeLabel":"integer"},"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].occupancy.children_ages","typeLabel":"integer[]"}},"required":["adults"],"description":"The party one room is requested or priced for: the number of adults and the age of each child.","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].occupancy","typeLabel":"object"},"room_id":{"type":"string","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].room_id","typeLabel":"string"},"mapped_room_id":{"type":"integer","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].mapped_room_id","typeLabel":"integer"},"room_name":{"type":"string","example":"Superior Double","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].room_name","typeLabel":"string"},"rate_id":{"type":"string","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].rate_id","typeLabel":"string"},"board_type":{"type":"string","example":"BB","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].board_type","typeLabel":"string"},"board_name":{"type":"string","example":"Breakfast Included","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].board_name","typeLabel":"string"},"max_occupancy":{"type":"integer","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].max_occupancy","typeLabel":"integer"},"taxes_and_fees":{"type":"array","items":{"type":"object","properties":{"amount":{"type":"number","description":"Deprecated: use `amount_money` instead. The tax in MAJOR units of `currency`.","example":164.49,"deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].amount","typeLabel":"number"},"currency":{"type":"string","description":"Deprecated: use `amount_money` instead. The currency of `amount`.","example":"EUR","deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].currency","typeLabel":"string"},"amount_money":{"type":"object","description":"The tax. When the supplier named no currency for the line, it is the currency the rate is priced in.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].amount_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].amount_money.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].amount_money.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].amount_money.display","typeLabel":"string"}},"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].amount_money","typeLabel":"object"},"description":{"type":"string","description":"The provider’s own wording for the tax. Free text, not a code.","example":"19, VAT National taxes on accommodation","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].description","typeLabel":"string"},"included":{"type":"boolean","description":"True when the amount is ALREADY inside `total_amount_money`; false when the guest pays it at the property on top. Getting this backwards misquotes the trip.","example":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].included","typeLabel":"boolean"},"display":{"type":"string","description":"Deprecated: use `amount_money` instead. The same figure as a string ready to show: the ISO 4217 code, a space, then the amount, e.g. \"USD 159.77\". With decimal_places it is written at exactly that scale (value 1561500, JPY, decimal_places 2 is \"JPY 15615.00\"); without, at the ISO digits of the currency. Show this; compute with the number. Absent when the figure is not money (a cancellation step expressed as a percent or a number of nights) or could not be read unambiguously.","example":"EUR 164.49","deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].display","typeLabel":"string"}},"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX]","typeLabel":"object"},"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].taxes_and_fees","typeLabel":"object[]"},"policies":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX].type","typeLabel":"string"},"description":{"type":"string","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX].description","typeLabel":"string"},"fee_amount":{"type":"number","description":"Deprecated: use `fee_amount_money` instead. Customer policy fee in MAJOR units of `fee_currency`.","deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX].fee_amount","typeLabel":"number"},"fee_currency":{"type":"string","description":"Deprecated: use `fee_amount_money` instead. The currency of `fee_amount`.","deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX].fee_currency","typeLabel":"string"},"fee_amount_money":{"type":"object","description":"Customer cancellation or policy fee, with exact minor units and currency precision.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX].fee_amount_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX].fee_amount_money.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX].fee_amount_money.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX].fee_amount_money.display","typeLabel":"string"}},"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX].fee_amount_money","typeLabel":"object"}},"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX]","typeLabel":"object"},"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].policies","typeLabel":"object[]"},"is_refundable":{"type":"boolean","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].is_refundable","typeLabel":"boolean"},"cancellation_policy":{"type":"array","items":{"type":"object","properties":{"cancel_time":{"type":"string","description":"Deadline after which this tier applies. RFC 3339 with the supplier’s declared UTC offset. Steps whose deadline has no declared timezone are omitted from the ladder — the platform never invents an offset — so a schedule can be shorter than the supplier’s own. Tiers are chronological, earliest first, so the first entry is the deadline that matters.","example":"2026-08-18T10:00:00+02:00","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].cancel_time","typeLabel":"string"},"amount":{"type":"number","description":"Deprecated: use `amount_money` instead. Read `amount_money`, `percent` or `nights`, whichever this step carries. What the guest is charged on or after `cancel_time`: a sum in MAJOR units of `currency`, a percentage or a number of nights, as `type` says.","example":606.13,"deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].amount","typeLabel":"number"},"currency":{"type":"string","description":"Deprecated: use `amount_money` instead. The currency of `amount`.","example":"EUR","deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].currency","typeLabel":"string"},"type":{"type":"string","description":"How the charge is expressed — a sum (\"amount\", \"flat_fee\"; read `amount_money`), a percentage (\"percent\", \"percentage\"; read `percent`) or a number of nights (\"nights\"; read `nights`).","example":"amount","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].type","typeLabel":"string"},"display":{"type":"string","description":"Deprecated: use `amount_money` instead. The same figure as a string ready to show: the ISO 4217 code, a space, then the amount, e.g. \"USD 159.77\". With decimal_places it is written at exactly that scale (value 1561500, JPY, decimal_places 2 is \"JPY 15615.00\"); without, at the ISO digits of the currency. Show this; compute with the number. Absent when the figure is not money (a cancellation step expressed as a percent or a number of nights) or could not be read unambiguously.","example":"EUR 606.13","deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].display","typeLabel":"string"},"amount_money":{"type":"object","description":"What the guest is charged on or after `cancel_time`, when this step is a sum. Absent on a percentage or nights step, and when the supplier named no currency.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].amount_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].amount_money.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].amount_money.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].amount_money.display","typeLabel":"string"}},"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].amount_money","typeLabel":"object"},"percent":{"type":"number","description":"The charge as a percentage of the stay price, when this step is a percentage, on the 0–100 scale the supplier states it in: 50 is half the stay price, 100 the whole of it. Never a 0–1 fraction. Absent otherwise.","example":50,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].percent","typeLabel":"number"},"nights":{"type":"number","description":"The charge as a number of nights of the stay, when this step is expressed in nights. Absent otherwise.","example":1,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].nights","typeLabel":"number"}},"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX]","typeLabel":"object"},"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].cancellation_policy","typeLabel":"object[]"},"free_cancellation_until":{"type":"string","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].free_cancellation_until","typeLabel":"string"},"payment_types":{"type":"array","items":{"type":"string","enum":["pay_now","pay_at_property","deposit"],"description":"How the rate can be settled. `pay_now` — paid when the booking is made. `pay_at_property` — paid to the hotel at the property. `deposit` — a deposit is taken.","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].payment_types.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"How the rate can be settled. Each value appears at most once.","example":["pay_now"],"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].payment_types","typeLabel":"enum\u003cstring>[]"},"remarks":{"type":"string","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX].remarks","typeLabel":"string"}},"required":["occupancy_number","occupancy"],"description":"One room of a hotel item — the single room a one-room item books, or one slot of a room-bundle rate — with the party it was priced for (`occupancy`) and its display and policy details. The containing item owns the customer-facing total; supplier net, suggested retail, commission and room-local supplier price figures are intentionally not part of this public shape.","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms.items.[INDEX]","typeLabel":"object"},"description":"LEGACY-ONLY compatibility room details. Current canonical `offers[]` returns `room_rates[]` and never returns this `rooms` field.","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX].rooms","typeLabel":"object[]"}},"description":"Deprecated compatibility shape under `rooms[].rates[]`. Current canonical `offers[]` does not return `booking_scope`, `num_rooms`, or `rooms`; use `room_rates[]` instead.","uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates.items.[INDEX]","typeLabel":"object"},"description":"DEPRECATED compatibility projection. Read the hotel-level `offers[]` list for new integrations and add an offer’s `trip_item_token` to the trip. Multi-room searches return this as an empty array.","deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX].rates","typeLabel":"object[]"}},"uniqueKey":"nearby_alternatives.items.[INDEX].rooms.items.[INDEX]","typeLabel":"object"},"uniqueKey":"nearby_alternatives.items.[INDEX].rooms","typeLabel":"object[]"},"offers":{"type":"array","items":{"type":"object","properties":{"offer_id":{"type":"string","description":"Deprecated: use `trip_item_token` instead. Same value.","example":"htl_2d67a7441c60e5de","deprecated":true,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].offer_id","typeLabel":"string"},"total_amount":{"type":"number","description":"Deprecated: use `total_amount_money` instead. Price for the whole stay in `currency`, in MAJOR units at the currency’s own precision.","example":1818.4,"deprecated":true,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].total_amount","typeLabel":"number"},"currency":{"type":"string","description":"Deprecated: use `total_amount_money` instead. The currency of `total_amount`.","example":"EUR","deprecated":true,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].currency","typeLabel":"string"},"is_refundable":{"type":"boolean","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].is_refundable","typeLabel":"boolean"},"taxes_breakdown":{"type":"array","items":{"type":"object","properties":{"amount":{"type":"number","description":"Deprecated: use `amount_money` instead. The tax in MAJOR units of `currency`.","example":164.49,"deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].taxes_breakdown.items.[INDEX].amount","typeLabel":"number"},"currency":{"type":"string","description":"Deprecated: use `amount_money` instead. The currency of `amount`.","example":"EUR","deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].taxes_breakdown.items.[INDEX].currency","typeLabel":"string"},"amount_money":{"type":"object","description":"The tax. When the supplier named no currency for the line, it is the currency the rate is priced in.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].taxes_breakdown.items.[INDEX].amount_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].taxes_breakdown.items.[INDEX].amount_money.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].taxes_breakdown.items.[INDEX].amount_money.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].taxes_breakdown.items.[INDEX].amount_money.display","typeLabel":"string"}},"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].taxes_breakdown.items.[INDEX].amount_money","typeLabel":"object"},"description":{"type":"string","description":"The provider’s own wording for the tax. Free text, not a code.","example":"19, VAT National taxes on accommodation","uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].taxes_breakdown.items.[INDEX].description","typeLabel":"string"},"included":{"type":"boolean","description":"True when the amount is ALREADY inside `total_amount_money`; false when the guest pays it at the property on top. Getting this backwards misquotes the trip.","example":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].taxes_breakdown.items.[INDEX].included","typeLabel":"boolean"},"display":{"type":"string","description":"Deprecated: use `amount_money` instead. The same figure as a string ready to show: the ISO 4217 code, a space, then the amount, e.g. \"USD 159.77\". With decimal_places it is written at exactly that scale (value 1561500, JPY, decimal_places 2 is \"JPY 15615.00\"); without, at the ISO digits of the currency. Show this; compute with the number. Absent when the figure is not money (a cancellation step expressed as a percent or a number of nights) or could not be read unambiguously.","example":"EUR 164.49","deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].taxes_breakdown.items.[INDEX].display","typeLabel":"string"}},"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].taxes_breakdown.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].taxes_breakdown","typeLabel":"object[]"},"trip_item_token":{"type":"string","description":"The token `trip(add_item)` takes as `trip_item_token`. Add it once even when `room_rates` contains several occupancies.","example":"htl_2d67a7441c60e5de","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].trip_item_token","typeLabel":"string"},"room_rates":{"type":"array","items":{"type":"object","properties":{"room_id":{"type":"string","description":"References one entry in this hotel’s `rooms[]` metadata.","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].room_id","typeLabel":"string"},"occupancy_number":{"type":"integer","minimum":1,"description":"Stable one-based occupancy slot from the search request.","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].occupancy_number","typeLabel":"integer"},"occupancy":{"type":"object","properties":{"adults":{"type":"integer","minimum":1,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].occupancy.adults","typeLabel":"integer"},"children_ages":{"type":"array","items":{"type":"integer","minimum":0,"maximum":17,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].occupancy.children_ages.items.[INDEX]","typeLabel":"integer"},"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].occupancy.children_ages","typeLabel":"integer[]"}},"required":["adults"],"description":"The party one room is requested or priced for: the number of adults and the age of each child.","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].occupancy","typeLabel":"object"},"taxes_and_fees":{"type":"array","items":{"type":"object","properties":{"amount":{"type":"number","description":"Deprecated: use `amount_money` instead. The tax in MAJOR units of `currency`.","example":164.49,"deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].taxes_and_fees.items.[INDEX].amount","typeLabel":"number"},"currency":{"type":"string","description":"Deprecated: use `amount_money` instead. The currency of `amount`.","example":"EUR","deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].taxes_and_fees.items.[INDEX].currency","typeLabel":"string"},"amount_money":{"type":"object","description":"The tax. When the supplier named no currency for the line, it is the currency the rate is priced in.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].taxes_and_fees.items.[INDEX].amount_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].taxes_and_fees.items.[INDEX].amount_money.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].taxes_and_fees.items.[INDEX].amount_money.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].taxes_and_fees.items.[INDEX].amount_money.display","typeLabel":"string"}},"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].taxes_and_fees.items.[INDEX].amount_money","typeLabel":"object"},"description":{"type":"string","description":"The provider’s own wording for the tax. Free text, not a code.","example":"19, VAT National taxes on accommodation","uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].taxes_and_fees.items.[INDEX].description","typeLabel":"string"},"included":{"type":"boolean","description":"True when the amount is ALREADY inside `total_amount_money`; false when the guest pays it at the property on top. Getting this backwards misquotes the trip.","example":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].taxes_and_fees.items.[INDEX].included","typeLabel":"boolean"},"display":{"type":"string","description":"Deprecated: use `amount_money` instead. The same figure as a string ready to show: the ISO 4217 code, a space, then the amount, e.g. \"USD 159.77\". With decimal_places it is written at exactly that scale (value 1561500, JPY, decimal_places 2 is \"JPY 15615.00\"); without, at the ISO digits of the currency. Show this; compute with the number. Absent when the figure is not money (a cancellation step expressed as a percent or a number of nights) or could not be read unambiguously.","example":"EUR 164.49","deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].taxes_and_fees.items.[INDEX].display","typeLabel":"string"}},"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].taxes_and_fees.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].taxes_and_fees","typeLabel":"object[]"},"is_refundable":{"type":"boolean","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].is_refundable","typeLabel":"boolean"},"room_name":{"type":"string","uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].room_name","typeLabel":"string"},"board_type":{"type":"string","uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].board_type","typeLabel":"string"},"board_name":{"type":"string","uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].board_name","typeLabel":"string"},"max_occupancy":{"type":"integer","uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].max_occupancy","typeLabel":"integer"},"policies":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].policies.items.[INDEX].type","typeLabel":"string"},"description":{"type":"string","uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].policies.items.[INDEX].description","typeLabel":"string"},"fee_amount":{"type":"number","description":"Deprecated: use `fee_amount_money` instead. Customer policy fee in MAJOR units of `fee_currency`.","deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].policies.items.[INDEX].fee_amount","typeLabel":"number"},"fee_currency":{"type":"string","description":"Deprecated: use `fee_amount_money` instead. The currency of `fee_amount`.","deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].policies.items.[INDEX].fee_currency","typeLabel":"string"},"fee_amount_money":{"type":"object","description":"Customer cancellation or policy fee, with exact minor units and currency precision.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].policies.items.[INDEX].fee_amount_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].policies.items.[INDEX].fee_amount_money.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].policies.items.[INDEX].fee_amount_money.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].policies.items.[INDEX].fee_amount_money.display","typeLabel":"string"}},"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].policies.items.[INDEX].fee_amount_money","typeLabel":"object"}},"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].policies.items.[INDEX]","typeLabel":"object"},"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].policies","typeLabel":"object[]"},"cancellation_policy":{"type":"array","items":{"type":"object","properties":{"cancel_time":{"type":"string","description":"Deadline after which this tier applies. RFC 3339 with the supplier’s declared UTC offset. Steps whose deadline has no declared timezone are omitted from the ladder — the platform never invents an offset — so a schedule can be shorter than the supplier’s own. Tiers are chronological, earliest first, so the first entry is the deadline that matters.","example":"2026-08-18T10:00:00+02:00","uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].cancellation_policy.items.[INDEX].cancel_time","typeLabel":"string"},"amount":{"type":"number","description":"Deprecated: use `amount_money` instead. Read `amount_money`, `percent` or `nights`, whichever this step carries. What the guest is charged on or after `cancel_time`: a sum in MAJOR units of `currency`, a percentage or a number of nights, as `type` says.","example":606.13,"deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].cancellation_policy.items.[INDEX].amount","typeLabel":"number"},"currency":{"type":"string","description":"Deprecated: use `amount_money` instead. The currency of `amount`.","example":"EUR","deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].cancellation_policy.items.[INDEX].currency","typeLabel":"string"},"type":{"type":"string","description":"How the charge is expressed — a sum (\"amount\", \"flat_fee\"; read `amount_money`), a percentage (\"percent\", \"percentage\"; read `percent`) or a number of nights (\"nights\"; read `nights`).","example":"amount","uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].cancellation_policy.items.[INDEX].type","typeLabel":"string"},"display":{"type":"string","description":"Deprecated: use `amount_money` instead. The same figure as a string ready to show: the ISO 4217 code, a space, then the amount, e.g. \"USD 159.77\". With decimal_places it is written at exactly that scale (value 1561500, JPY, decimal_places 2 is \"JPY 15615.00\"); without, at the ISO digits of the currency. Show this; compute with the number. Absent when the figure is not money (a cancellation step expressed as a percent or a number of nights) or could not be read unambiguously.","example":"EUR 606.13","deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].cancellation_policy.items.[INDEX].display","typeLabel":"string"},"amount_money":{"type":"object","description":"What the guest is charged on or after `cancel_time`, when this step is a sum. Absent on a percentage or nights step, and when the supplier named no currency.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].cancellation_policy.items.[INDEX].amount_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].cancellation_policy.items.[INDEX].amount_money.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].cancellation_policy.items.[INDEX].amount_money.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].cancellation_policy.items.[INDEX].amount_money.display","typeLabel":"string"}},"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].cancellation_policy.items.[INDEX].amount_money","typeLabel":"object"},"percent":{"type":"number","description":"The charge as a percentage of the stay price, when this step is a percentage, on the 0–100 scale the supplier states it in: 50 is half the stay price, 100 the whole of it. Never a 0–1 fraction. Absent otherwise.","example":50,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].cancellation_policy.items.[INDEX].percent","typeLabel":"number"},"nights":{"type":"number","description":"The charge as a number of nights of the stay, when this step is expressed in nights. Absent otherwise.","example":1,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].cancellation_policy.items.[INDEX].nights","typeLabel":"number"}},"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].cancellation_policy.items.[INDEX]","typeLabel":"object"},"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].cancellation_policy","typeLabel":"object[]"},"free_cancellation_until":{"type":"string","uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].free_cancellation_until","typeLabel":"string"},"payment_types":{"type":"array","items":{"type":"string","enum":["pay_now","pay_at_property","deposit"],"description":"How the rate can be settled. `pay_now` — paid when the booking is made. `pay_at_property` — paid to the hotel at the property. `deposit` — a deposit is taken.","uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].payment_types.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"How the rate can be settled. Each value appears at most once.","example":["pay_now"],"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].payment_types","typeLabel":"enum\u003cstring>[]"},"remarks":{"type":"string","uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX].remarks","typeLabel":"string"}},"required":["room_id","occupancy_number","occupancy","taxes_and_fees","is_refundable"],"description":"Display and policy details for one requested room occupancy. It carries no customer price allocation; the containing offer owns the authoritative whole-stay total.","uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates.items.[INDEX]","typeLabel":"object"},"description":"One entry per requested occupancy. One occupancy means one room; multiple occupancies mean a multi-room offer.","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].room_rates","typeLabel":"object[]"},"board_type":{"type":"string","example":"RO","uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].board_type","typeLabel":"string"},"board_name":{"type":"string","example":"Room Only","uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].board_name","typeLabel":"string"},"total_amount_display":{"type":"string","description":"Deprecated: use `total_amount_money` instead. The rate total as a string ready to show: the ISO 4217 code, a space, then `total_amount` at the currency’s ISO digits, e.g. \"EUR 606.13\".","example":"EUR 606.13","deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].total_amount_display","typeLabel":"string"},"total_amount_money":{"type":"object","description":"Price for the whole stay.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].total_amount_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].total_amount_money.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].total_amount_money.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].total_amount_money.display","typeLabel":"string"}},"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].total_amount_money","typeLabel":"object"},"free_cancellation_until":{"type":"string","description":"Last instant the stay can be cancelled at no charge. RFC 3339 with the supplier’s declared UTC offset. Absent when the supplier declared no timezone — the platform never invents an offset, so a deadline it cannot place on the clock is withheld rather than published ambiguously — and absent when the rate is non-refundable or the provider named no deadline.","example":"2026-08-18T10:00:00+02:00","uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].free_cancellation_until","typeLabel":"string"},"cancellation_schedule":{"type":"array","items":{"type":"object","properties":{"cancel_time":{"type":"string","description":"Deadline after which this tier applies. RFC 3339 with the supplier’s declared UTC offset. Steps whose deadline has no declared timezone are omitted from the ladder — the platform never invents an offset — so a schedule can be shorter than the supplier’s own. Tiers are chronological, earliest first, so the first entry is the deadline that matters.","example":"2026-08-18T10:00:00+02:00","uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].cancellation_schedule.items.[INDEX].cancel_time","typeLabel":"string"},"amount":{"type":"number","description":"Deprecated: use `amount_money` instead. Read `amount_money`, `percent` or `nights`, whichever this step carries. What the guest is charged on or after `cancel_time`: a sum in MAJOR units of `currency`, a percentage or a number of nights, as `type` says.","example":606.13,"deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].cancellation_schedule.items.[INDEX].amount","typeLabel":"number"},"currency":{"type":"string","description":"Deprecated: use `amount_money` instead. The currency of `amount`.","example":"EUR","deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].cancellation_schedule.items.[INDEX].currency","typeLabel":"string"},"type":{"type":"string","description":"How the charge is expressed — a sum (\"amount\", \"flat_fee\"; read `amount_money`), a percentage (\"percent\", \"percentage\"; read `percent`) or a number of nights (\"nights\"; read `nights`).","example":"amount","uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].cancellation_schedule.items.[INDEX].type","typeLabel":"string"},"display":{"type":"string","description":"Deprecated: use `amount_money` instead. The same figure as a string ready to show: the ISO 4217 code, a space, then the amount, e.g. \"USD 159.77\". With decimal_places it is written at exactly that scale (value 1561500, JPY, decimal_places 2 is \"JPY 15615.00\"); without, at the ISO digits of the currency. Show this; compute with the number. Absent when the figure is not money (a cancellation step expressed as a percent or a number of nights) or could not be read unambiguously.","example":"EUR 606.13","deprecated":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].cancellation_schedule.items.[INDEX].display","typeLabel":"string"},"amount_money":{"type":"object","description":"What the guest is charged on or after `cancel_time`, when this step is a sum. Absent on a percentage or nights step, and when the supplier named no currency.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].cancellation_schedule.items.[INDEX].amount_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].cancellation_schedule.items.[INDEX].amount_money.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].cancellation_schedule.items.[INDEX].amount_money.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].cancellation_schedule.items.[INDEX].amount_money.display","typeLabel":"string"}},"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].cancellation_schedule.items.[INDEX].amount_money","typeLabel":"object"},"percent":{"type":"number","description":"The charge as a percentage of the stay price, when this step is a percentage, on the 0–100 scale the supplier states it in: 50 is half the stay price, 100 the whole of it. Never a 0–1 fraction. Absent otherwise.","example":50,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].cancellation_schedule.items.[INDEX].percent","typeLabel":"number"},"nights":{"type":"number","description":"The charge as a number of nights of the stay, when this step is expressed in nights. Absent otherwise.","example":1,"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].cancellation_schedule.items.[INDEX].nights","typeLabel":"number"}},"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].cancellation_schedule.items.[INDEX]","typeLabel":"object"},"description":"The full penalty ladder, chronological. Absent when the provider published none — which is not a statement that cancelling is free.","uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].cancellation_schedule","typeLabel":"object[]"},"payment_types":{"type":"array","items":{"type":"string","enum":["pay_now","pay_at_property","deposit"],"description":"How the rate can be settled. `pay_now` — paid when the booking is made. `pay_at_property` — paid to the hotel at the property. `deposit` — a deposit is taken.","uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].payment_types.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"How the rate can be settled. Each value appears at most once.","example":["pay_now"],"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].payment_types","typeLabel":"enum\u003cstring>[]"},"promotions":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].promotions.items.[INDEX].name","typeLabel":"string"},"remark":{"type":"string","uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].promotions.items.[INDEX].remark","typeLabel":"string"}},"description":"A provider promotion applied to the offer, as it is to be shown to the guest: its name and the remark that goes with it.","uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].promotions.items.[INDEX]","typeLabel":"object"},"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX].promotions","typeLabel":"object[]"}},"required":["offer_id","total_amount","currency","is_refundable","taxes_breakdown","trip_item_token","room_rates"],"uniqueKey":"nearby_alternatives.items.[INDEX].offers.items.[INDEX]","typeLabel":"object"},"description":"Bookable whole-stay offers. Choose one and add its `trip_item_token` to the trip exactly once.","uniqueKey":"nearby_alternatives.items.[INDEX].offers","typeLabel":"object[]"}},"description":"A hotel and its available rooms. Until v0.2.0 this schema declared `images`, `thumbnail_url` and `country_code`, none of which hotel search has ever sent; the real names are `main_photo`, `thumbnail` and `country`.","uniqueKey":"nearby_alternatives.items.[INDEX]","typeLabel":"object"},"description":"Other hotels near the one a `hotel_name` search matched, priced for the same dates and occupancy, so they can be compared without a second search. Same shape as `hotels`, and not counted in `total`. Present only on a `hotel_name` search that found usable neighbours.","uniqueKey":"nearby_alternatives","typeLabel":"object[]"},"total":{"type":"number","example":87,"uniqueKey":"total","typeLabel":"number"},"search_handle":{"type":"string","description":"Deprecated: use `next_handle` instead. The identifier of the search session on its own, which no endpoint accepts. `next_handle` carries the session and the next page, `has_more` says whether there is one and `expires_at` when the session ends.","deprecated":true,"example":"hs_example","uniqueKey":"search_handle","typeLabel":"string"},"next_handle":{"oneOf":[{"type":"string","description":"Opaque handle for the next page. Send it by itself to hotel_search. The next page serves the hotels this answer held, then asks the hotel source for the next ones, and widens a `city` or `default` radius when its area has none left. Null means the search has nothing left.","example":"hp_example_2","uniqueKey":"next_handle.oneOf.0","typeLabel":"string"},{"type":"null","description":"Opaque handle for the next page. Send it by itself to hotel_search. The next page serves the hotels this answer held, then asks the hotel source for the next ones, and widens a `city` or `default` radius when its area has none left. Null means the search has nothing left.","example":"hp_example_2","uniqueKey":"next_handle.oneOf.1","typeLabel":"null"}],"uniqueKey":"next_handle","typeLabel":"string | null"},"has_more":{"type":"boolean","description":"Whether this fixed search session has another page.","uniqueKey":"has_more","typeLabel":"boolean"},"expires_at":{"type":"string","format":"date-time","description":"RFC 3339 expiry for the search session and its page handles.","example":"2027-01-15T10:30:00Z","uniqueKey":"expires_at","typeLabel":"string\u003cdate-time>"},"search_context":{"type":"object","properties":{"checkin":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","isRequired":true,"uniqueKey":"search_context.checkin","typeLabel":"string"},"checkout":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","isRequired":true,"uniqueKey":"search_context.checkout","typeLabel":"string"},"occupancies":{"type":"array","items":{"type":"object","properties":{"adults":{"type":"integer","minimum":1,"isRequired":true,"uniqueKey":"search_context.occupancies.items.[INDEX].adults","typeLabel":"integer"},"children_ages":{"type":"array","items":{"type":"integer","minimum":0,"maximum":17,"uniqueKey":"search_context.occupancies.items.[INDEX].children_ages.items.[INDEX]","typeLabel":"integer"},"uniqueKey":"search_context.occupancies.items.[INDEX].children_ages","typeLabel":"integer[]"}},"required":["adults"],"description":"The party one room is requested or priced for: the number of adults and the age of each child.","uniqueKey":"search_context.occupancies.items.[INDEX]","typeLabel":"object"},"minItems":1,"isRequired":true,"uniqueKey":"search_context.occupancies","typeLabel":"object[]"},"currency":{"type":"string","isRequired":true,"uniqueKey":"search_context.currency","typeLabel":"string"},"guest_nationality":{"type":"string","minLength":2,"maxLength":2,"uniqueKey":"search_context.guest_nationality","typeLabel":"string"},"trip_id":{"type":"string","uniqueKey":"search_context.trip_id","typeLabel":"string"}},"required":["checkin","checkout","occupancies","currency"],"description":"Normalized first-request stay and occupancy frozen by the search session and repeated on every page. trip_id only associates the search with a trip for display.","uniqueKey":"search_context","typeLabel":"object"},"warnings":{"type":"array","items":{"type":"string","uniqueKey":"warnings.items.[INDEX]","typeLabel":"string"},"description":"Non-fatal advisories, e.g. budget-filter outcomes or ignored filters.","uniqueKey":"warnings","typeLabel":"string[]"},"destination_resolution":{"type":"object","properties":{"shape":{"type":"string","enum":["city","coordinates","query","hotel_name","hotel_ids"],"description":"Which destination selector the request used. It says which of the other fields are present: the city fields on `city`, `hotel_id`/`hotel_name`/`hotel_city` on `hotel_name`, `hotel_ids` on `hotel_ids`.","example":"city","uniqueKey":"destination_resolution.shape","typeLabel":"enum\u003cstring>"},"match":{"type":"string","enum":["exact","fuzzy","provider_matched","fallback_string"],"description":"`exact` — the destination was found verbatim: a city catalog group, a place located under the name asked for (`resolved_place`), coordinates, hotel ids, or a hotel name scoring 1.0. `fuzzy` — a close-but-different label was auto-picked: on the city shape, a single candidate scoring ≥ 0.85 with no runner-up ≥ 0.6, or a place located under another name (`resolved_place`); on hotel_name, a lookup scoring \u003c 1.0 — the response also carries a warning naming the substitution. `provider_matched` — a `query` selector was forwarded as-is and the supplier chose the place. `fallback_string` — `city_name` could not be resolved at all, so the raw string was forwarded to the supplier unchanged; `status` says why.","example":"exact","uniqueKey":"destination_resolution.match","typeLabel":"enum\u003cstring>"},"status":{"type":"string","enum":["resolved","unknown_city","implausible_spread","unsupported_shape","resolver_unavailable","not_attempted"],"description":"City shape ONLY. Absent for coordinates, query, hotel_name and hotel_ids.","example":"resolved","uniqueKey":"destination_resolution.status","typeLabel":"enum\u003cstring>"},"requested_city":{"type":"string","example":"Sain Malo","uniqueKey":"destination_resolution.requested_city","typeLabel":"string"},"requested_country":{"type":"string","example":"FR","uniqueKey":"destination_resolution.requested_country","typeLabel":"string"},"resolved_city":{"type":"string","example":"Saint Malo","uniqueKey":"destination_resolution.resolved_city","typeLabel":"string"},"resolved_country":{"type":"string","example":"FR","uniqueKey":"destination_resolution.resolved_country","typeLabel":"string"},"latitude":{"type":"number","example":48.649,"uniqueKey":"destination_resolution.latitude","typeLabel":"number"},"longitude":{"type":"number","example":-2.0257,"uniqueKey":"destination_resolution.longitude","typeLabel":"number"},"radius_km":{"type":"number","description":"Half the side, in km, of the square searched around `latitude`/`longitude` (a hotel near a corner can be up to 1.414 × max(`radius_km`, 1) km away; under 1, the search ran at 1 km); `radius_source` says where it came from. City and query shapes: present when the destination resolved to a centre (a catalog city group or a located place). Coordinates shape: absent when the supplier default was used and is unknown to the platform.","uniqueKey":"destination_resolution.radius_km","typeLabel":"number"},"radius_source":{"type":"string","enum":["caller","city","default","place"],"description":"Where `radius_km` came from. `caller` — the request’s own `radius_km`. `city` — the resolved city’s extent (its catalog spread, or the located city’s size when `resolution_source` is `geocoder`), floored at the platform minimum. `default` — the platform default, for coordinates sent without a radius. `place` — the size of the located place for its `place_type` (a district, landmark, station, address, airport, island or region). A `city` or `default` radius may be widened: once when the first search finds too little, and on a next page when the area has no hotel left (doubling, up to 50 km); `radius_km` is then the radius searched for that page. Absent on the hotel_name and hotel_ids shapes.","example":"city","uniqueKey":"destination_resolution.radius_source","typeLabel":"enum\u003cstring>"},"catalog_hotel_count":{"type":"integer","description":"How many properties the matched city catalog group holds. Absent when the search centre did not come from a catalog group (`resolution_source` `geocoder`).","example":41,"uniqueKey":"destination_resolution.catalog_hotel_count","typeLabel":"integer"},"place_type":{"type":"string","enum":["city","district","poi","station","address","airport","island","region"],"description":"city and query shapes, when the platform located the destination itself: the kind of place searched. `poi` is a landmark or venue. More values may be added. Absent when the destination was not located this way.","example":"island","uniqueKey":"destination_resolution.place_type","typeLabel":"enum\u003cstring>"},"resolution_source":{"type":"string","enum":["catalog","geocoder"],"description":"With `place_type`: where the search centre came from. `catalog` — the platform’s city catalog group, used only when it agrees with the located place (`resolved_city` and `catalog_hotel_count` are then present). `geocoder` — the located place itself.","example":"geocoder","uniqueKey":"destination_resolution.resolution_source","typeLabel":"enum\u003cstring>"},"resolved_place":{"type":"string","description":"With `place_type`: the name of the place searched, the one to quote back to the user.","example":"Fuerteventura, Las Palmas, Spain","uniqueKey":"destination_resolution.resolved_place","typeLabel":"string"},"search_bounds":{"type":"object","properties":{"south":{"type":"number","isRequired":true,"uniqueKey":"destination_resolution.search_bounds.south","typeLabel":"number"},"west":{"type":"number","isRequired":true,"uniqueKey":"destination_resolution.search_bounds.west","typeLabel":"number"},"north":{"type":"number","isRequired":true,"uniqueKey":"destination_resolution.search_bounds.north","typeLabel":"number"},"east":{"type":"number","isRequired":true,"uniqueKey":"destination_resolution.search_bounds.east","typeLabel":"number"}},"required":["south","west","north","east"],"description":"Island and region searches only: the box, in degrees, of the place searched. The search covers the circle that reaches its corners and does not cut the hotels to the box, so a hotel near the place but outside the box can be returned.","example":{"south":28.0439,"west":-14.51,"north":28.757,"east":-13.8224},"uniqueKey":"destination_resolution.search_bounds","typeLabel":"object"},"alternatives":{"type":"array","items":{"type":"object","properties":{"resolved_place":{"type":"string","isRequired":true,"uniqueKey":"destination_resolution.alternatives.items.[INDEX].resolved_place","typeLabel":"string"},"place_type":{"type":"string","enum":["city","district","poi","station","address","airport","island","region"],"isRequired":true,"uniqueKey":"destination_resolution.alternatives.items.[INDEX].place_type","typeLabel":"enum\u003cstring>"},"latitude":{"type":"number","isRequired":true,"uniqueKey":"destination_resolution.alternatives.items.[INDEX].latitude","typeLabel":"number"},"longitude":{"type":"number","isRequired":true,"uniqueKey":"destination_resolution.alternatives.items.[INDEX].longitude","typeLabel":"number"},"radius_km":{"type":"number","minimum":0,"exclusiveMinimum":true,"maximum":50,"isRequired":true,"uniqueKey":"destination_resolution.alternatives.items.[INDEX].radius_km","typeLabel":"number"},"resolved_country":{"type":"string","uniqueKey":"destination_resolution.alternatives.items.[INDEX].resolved_country","typeLabel":"string"}},"required":["resolved_place","place_type","latitude","longitude","radius_km"],"uniqueKey":"destination_resolution.alternatives.items.[INDEX]","typeLabel":"object"},"maxItems":3,"description":"With `place_type`: up to three other places the destination may name — the same name in another country or state, the island or region around the town searched when an island or region was asked for, or another place the text names. To search one of them instead, send its `latitude`, `longitude` and `radius_km` (at most 50, the limit the request accepts). Absent when the destination names one place.","example":[{"resolved_place":"Lexington, MA, USA","place_type":"city","resolved_country":"US","latitude":42.4473497,"longitude":-71.2271531,"radius_km":6.1}],"uniqueKey":"destination_resolution.alternatives","typeLabel":"object[]"},"score":{"type":"number","minimum":0,"maximum":1,"description":"Only present when `match` is `fuzzy` (the city shape’s auto-pick similarity) or on the hotel_name shape (the name lookup’s own score).","example":0.9,"uniqueKey":"destination_resolution.score","typeLabel":"number"},"query":{"type":"string","uniqueKey":"destination_resolution.query","typeLabel":"string"},"hotel_id":{"type":"string","example":"lp1d2c3","uniqueKey":"destination_resolution.hotel_id","typeLabel":"string"},"hotel_name":{"type":"string","uniqueKey":"destination_resolution.hotel_name","typeLabel":"string"},"hotel_city":{"type":"string","uniqueKey":"destination_resolution.hotel_city","typeLabel":"string"},"nearby_alternatives_included":{"type":"boolean","description":"hotel_name shape only: true when nearby hotels were also priced.","uniqueKey":"destination_resolution.nearby_alternatives_included","typeLabel":"boolean"},"hotel_ids":{"type":"array","items":{"type":"string","uniqueKey":"destination_resolution.hotel_ids.items.[INDEX]","typeLabel":"string"},"description":"hotel_ids shape only: the ids that were rate-shopped.","uniqueKey":"destination_resolution.hotel_ids","typeLabel":"string[]"},"hotel_ids_without_rates":{"type":"array","items":{"type":"string","uniqueKey":"destination_resolution.hotel_ids_without_rates.items.[INDEX]","typeLabel":"string"},"description":"hotel_name shape: present when the matched hotel priced nothing. hotel_ids shape: the requested ids that priced nothing.","uniqueKey":"destination_resolution.hotel_ids_without_rates","typeLabel":"string[]"}},"description":"How the request’s destination resolved into these hotels. Present on every successful search. Rendering rule for an agent or tool: say something ONLY when there is something to say — `match` is `fuzzy` or `fallback_string`, `resolved_city` differs from `requested_city`, or the platform located a place that is not a city (`place_type` other than `city`), or `alternatives` is present. `exact` and `provider_matched` otherwise need no header line of their own. When `resolved_place` is present, name it as the place searched, with `place_type` when it is not a city, instead of `resolved_city`. When `alternatives` is present, name them too and let the user pick before booking.","uniqueKey":"destination_resolution","typeLabel":"object"},"empty_reason":{"type":"string","enum":["no_availability_for_dates","destination_not_found","catalog_exhausted","all_dropped_by_budget","no_catalog_match","all_dropped_by_star_filter","all_dropped_by_rating_filter"],"description":"Why `hotels` is empty. Absent whenever `hotels` is non-empty.","example":"no_availability_for_dates","uniqueKey":"empty_reason","typeLabel":"enum\u003cstring>"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"hotels":[{"hotel_id":"lp1d2c3","hotel_ref":"h1:lp1d2c3","name":"Hôtel Le Marais","address":"12 Rue de Rivoli","city":"Paris","country":"fr","star_rating":4,"category":"4 KEYS","lodging_type":"Aparthotel","rating":8.6,"review_count":1243,"main_photo":"https://images.example.com/hotels/main.jpg","thumbnail":"https://images.example.com/hotels/thumb.jpg","latitude":48.8566,"longitude":2.3522,"distance_km":1,"recommendation_score":0.5,"rooms":[{"room_id":"rm_1","room_name":"Superior Double","description":"\u003cstring>","requested_occupancy":2,"room_capacity":2,"max_occupancy":2,"images":["\u003cstring>"],"amenities":["\u003cstring>"],"beds":[{"bed_type":"\u003cstring>","count":2}],"rates":[{"offer_id":"htl_2d67a7441c60e5de","board_type":"RO","board_name":"Room Only","total_amount":1818.4,"total_amount_display":"EUR 606.13","currency":"EUR","total_amount_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"is_refundable":false,"free_cancellation_until":"2026-08-18T10:00:00+02:00","cancellation_schedule":[{"cancel_time":"2026-08-18T10:00:00+02:00","amount":606.13,"currency":"EUR","type":"amount","display":"EUR 606.13","amount_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"percent":50,"nights":1}],"taxes_breakdown":[{"amount":164.49,"currency":"EUR","amount_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"description":"19, VAT National taxes on accommodation","included":true,"display":"EUR 164.49"}],"payment_types":["pay_now"],"promotions":[{"code":"\u003cstring>","name":"\u003cstring>","remark":"\u003cstring>"}],"booking_scope":"room_bundle","num_rooms":2,"rooms":[{"occupancy_number":1,"occupancy":{"adults":2,"children_ages":[8]},"room_id":"\u003cstring>","mapped_room_id":123,"room_name":"Superior Double","rate_id":"\u003cstring>","board_type":"BB","board_name":"Breakfast Included","max_occupancy":123,"taxes_and_fees":[{"amount":164.49,"currency":"EUR","amount_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"description":"19, VAT National taxes on accommodation","included":true,"display":"EUR 164.49"}],"policies":[{"type":"\u003cstring>","description":"\u003cstring>","fee_amount":123,"fee_currency":"\u003cstring>","fee_amount_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"}}],"is_refundable":true,"cancellation_policy":[{"cancel_time":"2026-08-18T10:00:00+02:00","amount":606.13,"currency":"EUR","type":"amount","display":"EUR 606.13","amount_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"percent":50,"nights":1}],"free_cancellation_until":"\u003cstring>","payment_types":["pay_now"],"remarks":"\u003cstring>"}]}]}],"offers":[{"offer_id":"htl_2d67a7441c60e5de","total_amount":1818.4,"currency":"EUR","is_refundable":true,"taxes_breakdown":[{"amount":164.49,"currency":"EUR","amount_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"description":"19, VAT National taxes on accommodation","included":true,"display":"EUR 164.49"}],"trip_item_token":"htl_2d67a7441c60e5de","room_rates":[{"room_id":"\u003cstring>","occupancy_number":2,"occupancy":{"adults":2,"children_ages":[8]},"taxes_and_fees":[{"amount":164.49,"currency":"EUR","amount_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"description":"19, VAT National taxes on accommodation","included":true,"display":"EUR 164.49"}],"is_refundable":true,"room_name":"\u003cstring>","board_type":"\u003cstring>","board_name":"\u003cstring>","max_occupancy":123,"policies":[{"type":"\u003cstring>","description":"\u003cstring>","fee_amount":123,"fee_currency":"\u003cstring>","fee_amount_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"}}],"cancellation_policy":[{"cancel_time":"2026-08-18T10:00:00+02:00","amount":606.13,"currency":"EUR","type":"amount","display":"EUR 606.13","amount_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"percent":50,"nights":1}],"free_cancellation_until":"\u003cstring>","payment_types":["pay_now"],"remarks":"\u003cstring>"}],"board_type":"RO","board_name":"Room Only","total_amount_display":"EUR 606.13","total_amount_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"free_cancellation_until":"2026-08-18T10:00:00+02:00","cancellation_schedule":[{"cancel_time":"2026-08-18T10:00:00+02:00","amount":606.13,"currency":"EUR","type":"amount","display":"EUR 606.13","amount_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"percent":50,"nights":1}],"payment_types":["pay_now"],"promotions":[{"name":"\u003cstring>","remark":"\u003cstring>"}]}]}],"nearby_alternatives":[{"hotel_id":"lp1d2c3","hotel_ref":"h1:lp1d2c3","name":"Hôtel Le Marais","address":"12 Rue de Rivoli","city":"Paris","country":"fr","star_rating":4,"category":"4 KEYS","lodging_type":"Aparthotel","rating":8.6,"review_count":1243,"main_photo":"https://images.example.com/hotels/main.jpg","thumbnail":"https://images.example.com/hotels/thumb.jpg","latitude":48.8566,"longitude":2.3522,"distance_km":1,"recommendation_score":0.5,"rooms":[{"room_id":"rm_1","room_name":"Superior Double","description":"\u003cstring>","requested_occupancy":2,"room_capacity":2,"max_occupancy":2,"images":["\u003cstring>"],"amenities":["\u003cstring>"],"beds":[{"bed_type":"\u003cstring>","count":2}],"rates":[{"offer_id":"htl_2d67a7441c60e5de","board_type":"RO","board_name":"Room Only","total_amount":1818.4,"total_amount_display":"EUR 606.13","currency":"EUR","total_amount_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"is_refundable":false,"free_cancellation_until":"2026-08-18T10:00:00+02:00","cancellation_schedule":[{"cancel_time":"2026-08-18T10:00:00+02:00","amount":606.13,"currency":"EUR","type":"amount","display":"EUR 606.13","amount_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"percent":50,"nights":1}],"taxes_breakdown":[{"amount":164.49,"currency":"EUR","amount_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"description":"19, VAT National taxes on accommodation","included":true,"display":"EUR 164.49"}],"payment_types":["pay_now"],"promotions":[{"code":"\u003cstring>","name":"\u003cstring>","remark":"\u003cstring>"}],"booking_scope":"room_bundle","num_rooms":2,"rooms":[{"occupancy_number":1,"occupancy":{"adults":2,"children_ages":[8]},"room_id":"\u003cstring>","mapped_room_id":123,"room_name":"Superior Double","rate_id":"\u003cstring>","board_type":"BB","board_name":"Breakfast Included","max_occupancy":123,"taxes_and_fees":[{"amount":164.49,"currency":"EUR","amount_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"description":"19, VAT National taxes on accommodation","included":true,"display":"EUR 164.49"}],"policies":[{"type":"\u003cstring>","description":"\u003cstring>","fee_amount":123,"fee_currency":"\u003cstring>","fee_amount_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"}}],"is_refundable":true,"cancellation_policy":[{"cancel_time":"2026-08-18T10:00:00+02:00","amount":606.13,"currency":"EUR","type":"amount","display":"EUR 606.13","amount_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"percent":50,"nights":1}],"free_cancellation_until":"\u003cstring>","payment_types":["pay_now"],"remarks":"\u003cstring>"}]}]}],"offers":[{"offer_id":"htl_2d67a7441c60e5de","total_amount":1818.4,"currency":"EUR","is_refundable":true,"taxes_breakdown":[{"amount":164.49,"currency":"EUR","amount_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"description":"19, VAT National taxes on accommodation","included":true,"display":"EUR 164.49"}],"trip_item_token":"htl_2d67a7441c60e5de","room_rates":[{"room_id":"\u003cstring>","occupancy_number":2,"occupancy":{"adults":2,"children_ages":[8]},"taxes_and_fees":[{"amount":164.49,"currency":"EUR","amount_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"description":"19, VAT National taxes on accommodation","included":true,"display":"EUR 164.49"}],"is_refundable":true,"room_name":"\u003cstring>","board_type":"\u003cstring>","board_name":"\u003cstring>","max_occupancy":123,"policies":[{"type":"\u003cstring>","description":"\u003cstring>","fee_amount":123,"fee_currency":"\u003cstring>","fee_amount_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"}}],"cancellation_policy":[{"cancel_time":"2026-08-18T10:00:00+02:00","amount":606.13,"currency":"EUR","type":"amount","display":"EUR 606.13","amount_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"percent":50,"nights":1}],"free_cancellation_until":"\u003cstring>","payment_types":["pay_now"],"remarks":"\u003cstring>"}],"board_type":"RO","board_name":"Room Only","total_amount_display":"EUR 606.13","total_amount_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"free_cancellation_until":"2026-08-18T10:00:00+02:00","cancellation_schedule":[{"cancel_time":"2026-08-18T10:00:00+02:00","amount":606.13,"currency":"EUR","type":"amount","display":"EUR 606.13","amount_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"percent":50,"nights":1}],"payment_types":["pay_now"],"promotions":[{"name":"\u003cstring>","remark":"\u003cstring>"}]}]}],"total":87,"search_handle":"hs_example","next_handle":"hp_example_2","has_more":true,"expires_at":"2027-01-15T10:30:00Z","search_context":{"checkin":"\u003cstring>","checkout":"\u003cstring>","occupancies":[{"adults":2,"children_ages":[8]}],"currency":"\u003cstring>","guest_nationality":"\u003cstring>","trip_id":"\u003cstring>"},"warnings":["\u003cstring>"],"destination_resolution":{"shape":"city","match":"exact","status":"resolved","requested_city":"Sain Malo","requested_country":"FR","resolved_city":"Saint Malo","resolved_country":"FR","latitude":48.649,"longitude":-2.0257,"radius_km":123,"radius_source":"city","catalog_hotel_count":41,"place_type":"island","resolution_source":"geocoder","resolved_place":"Fuerteventura, Las Palmas, Spain","search_bounds":{"south":28.0439,"west":-14.51,"north":28.757,"east":-13.8224},"alternatives":[{"resolved_place":"Lexington, MA, USA","place_type":"city","resolved_country":"US","latitude":42.4473497,"longitude":-71.2271531,"radius_km":6.1}],"score":0.9,"query":"\u003cstring>","hotel_id":"lp1d2c3","hotel_name":"\u003cstring>","hotel_city":"\u003cstring>","nearby_alternatives_included":true,"hotel_ids":["\u003cstring>"],"hotel_ids_without_rates":["\u003cstring>"]},"empty_reason":"no_availability_for_dates"}}},"exampleType":"generated"}},"exampleType":"generated"},"67138d9a-4768-454b-88d5-851f05aab2fd":{"description":"The request was malformed or failed validation. When a supplier declined the request, `error.message` is “The request was declined for these inputs. Check the dates, places and travellers, then retry.” **`BAD_REQUEST`** — The request was malformed or failed validation. Fix the request as the message describes; retrying it unchanged cannot succeed.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["INVALID_SEGMENTS_TO_EXCHANGE","PARTIAL_EXCHANGE_UNSUPPORTED","LEG_ALREADY_DEPARTED","DEPARTURE_DATE_IN_PAST","LEG_DATES_OUT_OF_ORDER","INVALID_EXCHANGE_REQUEST","NOT_EXCHANGEABLE","CREDENTIAL_FORMAT_INVALID","PAYMENT_TYPE_NOT_ENABLED","PAYMENT_CREDENTIAL_INVALID","TRIP_OWNED_BY_OTHER_PAYMENT","IDEMPOTENCY_KEY_REUSED","ATTEMPT_IN_PROGRESS","ATTEMPT_TERMINAL","TEMPORARILY_UNAVAILABLE","AUTH_REQUIRED","PAYMENT_REQUIRED","RATE_LIMITED","BAD_REQUEST","FORBIDDEN","NOT_FOUND","CONFLICT","GONE","QUOTE_PENDING","QUOTE_EXPIRED","TRIP_EXPIRED","TRIP_STATE_CONFLICT","OFFER_EXPIRED","OFFER_UNAVAILABLE","MISSING_CUSTOMER_DETAILS","INVALID_PHONE_NUMBER","INVALID_FLIGHT_NUMBER","CURRENCY_UNSUPPORTED","HOTEL_NAME_LOW_CONFIDENCE","DESTINATION_LOW_CONFIDENCE","UPSTREAM_REJECTED","UPSTREAM_UNAVAILABLE","UPSTREAM_TIMEOUT","UPSTREAM_ERROR","INTERNAL"],"description":"What went wrong, as a stable machine-readable code. This is a closed set — branch on it rather than on `message`, which is prose and may change. New codes arrive in a minor version, so treat an unknown one as its HTTP status. A code can also stop being emitted: it leaves this set in a minor version, named in the changelog, and a branch you wrote for it goes unreached rather than wrong.","example":"BAD_REQUEST","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"What went wrong, in prose. These codes always carry the same message, and it never includes text from a supplier: `RATE_LIMITED` — \"Too many requests. Retry after the Retry-After delay.\"; `OFFER_EXPIRED` — \"This offer has expired. Search again.\"; `OFFER_UNAVAILABLE` — \"This offer is no longer available. Search again.\"; `UPSTREAM_REJECTED` — \"The request was declined for this offer. Try another offer.\"; `UPSTREAM_UNAVAILABLE` — \"The service is temporarily unavailable. Retry after the Retry-After delay.\"; `UPSTREAM_TIMEOUT` — \"The request timed out before a result was available. Retry the request.\"; `UPSTREAM_ERROR` — \"The request could not be completed.\".","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"error.doc_url","typeLabel":"string"},"field":{"type":"string","description":"On a 400 `BAD_REQUEST` that names one refused input: the path of that field in your request, e.g. `selections[1].quantity` for the second selection of a `select_ancillaries` call. Absent when the refusal names no single field.","example":"selections[1].quantity","uniqueKey":"error.field","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"BAD_REQUEST","message":"The request was declined for these inputs. Check the dates, places and travellers, then retry."}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"BAD_REQUEST","message":"The request was declined for these inputs. Check the dates, places and travellers, then retry."}}}},"exampleType":"examples"}},"exampleType":"examples"},"bb4fdf13-ea5d-4989-a73a-bc39e4958203":{"description":"Authentication required","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["INVALID_SEGMENTS_TO_EXCHANGE","PARTIAL_EXCHANGE_UNSUPPORTED","LEG_ALREADY_DEPARTED","DEPARTURE_DATE_IN_PAST","LEG_DATES_OUT_OF_ORDER","INVALID_EXCHANGE_REQUEST","NOT_EXCHANGEABLE","CREDENTIAL_FORMAT_INVALID","PAYMENT_TYPE_NOT_ENABLED","PAYMENT_CREDENTIAL_INVALID","TRIP_OWNED_BY_OTHER_PAYMENT","IDEMPOTENCY_KEY_REUSED","ATTEMPT_IN_PROGRESS","ATTEMPT_TERMINAL","TEMPORARILY_UNAVAILABLE","AUTH_REQUIRED","PAYMENT_REQUIRED","RATE_LIMITED","BAD_REQUEST","FORBIDDEN","NOT_FOUND","CONFLICT","GONE","QUOTE_PENDING","QUOTE_EXPIRED","TRIP_EXPIRED","TRIP_STATE_CONFLICT","OFFER_EXPIRED","OFFER_UNAVAILABLE","MISSING_CUSTOMER_DETAILS","INVALID_PHONE_NUMBER","INVALID_FLIGHT_NUMBER","CURRENCY_UNSUPPORTED","HOTEL_NAME_LOW_CONFIDENCE","DESTINATION_LOW_CONFIDENCE","UPSTREAM_REJECTED","UPSTREAM_UNAVAILABLE","UPSTREAM_TIMEOUT","UPSTREAM_ERROR","INTERNAL"],"description":"What went wrong, as a stable machine-readable code. This is a closed set — branch on it rather than on `message`, which is prose and may change. New codes arrive in a minor version, so treat an unknown one as its HTTP status. A code can also stop being emitted: it leaves this set in a minor version, named in the changelog, and a branch you wrote for it goes unreached rather than wrong.","example":"BAD_REQUEST","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"What went wrong, in prose. These codes always carry the same message, and it never includes text from a supplier: `RATE_LIMITED` — \"Too many requests. Retry after the Retry-After delay.\"; `OFFER_EXPIRED` — \"This offer has expired. Search again.\"; `OFFER_UNAVAILABLE` — \"This offer is no longer available. Search again.\"; `UPSTREAM_REJECTED` — \"The request was declined for this offer. Try another offer.\"; `UPSTREAM_UNAVAILABLE` — \"The service is temporarily unavailable. Retry after the Retry-After delay.\"; `UPSTREAM_TIMEOUT` — \"The request timed out before a result was available. Retry the request.\"; `UPSTREAM_ERROR` — \"The request could not be completed.\".","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"error.doc_url","typeLabel":"string"},"field":{"type":"string","description":"On a 400 `BAD_REQUEST` that names one refused input: the path of that field in your request, e.g. `selections[1].quantity` for the second selection of a `select_ancillaries` call. Absent when the refusal names no single field.","example":"selections[1].quantity","uniqueKey":"error.field","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"AUTH_REQUIRED","message":"Invalid or expired API key.","doc_url":"https://docs.gojinko.com/authentication/api-keys"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"AUTH_REQUIRED","message":"Invalid or expired API key.","doc_url":"https://docs.gojinko.com/authentication/api-keys"}}}},"exampleType":"examples"}},"exampleType":"examples"},"ee67e01b-1a8c-4970-8ef3-1c497c6aa6d9":{"description":"Payment required — organization balance exhausted","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["INVALID_SEGMENTS_TO_EXCHANGE","PARTIAL_EXCHANGE_UNSUPPORTED","LEG_ALREADY_DEPARTED","DEPARTURE_DATE_IN_PAST","LEG_DATES_OUT_OF_ORDER","INVALID_EXCHANGE_REQUEST","NOT_EXCHANGEABLE","CREDENTIAL_FORMAT_INVALID","PAYMENT_TYPE_NOT_ENABLED","PAYMENT_CREDENTIAL_INVALID","TRIP_OWNED_BY_OTHER_PAYMENT","IDEMPOTENCY_KEY_REUSED","ATTEMPT_IN_PROGRESS","ATTEMPT_TERMINAL","TEMPORARILY_UNAVAILABLE","AUTH_REQUIRED","PAYMENT_REQUIRED","RATE_LIMITED","BAD_REQUEST","FORBIDDEN","NOT_FOUND","CONFLICT","GONE","QUOTE_PENDING","QUOTE_EXPIRED","TRIP_EXPIRED","TRIP_STATE_CONFLICT","OFFER_EXPIRED","OFFER_UNAVAILABLE","MISSING_CUSTOMER_DETAILS","INVALID_PHONE_NUMBER","INVALID_FLIGHT_NUMBER","CURRENCY_UNSUPPORTED","HOTEL_NAME_LOW_CONFIDENCE","DESTINATION_LOW_CONFIDENCE","UPSTREAM_REJECTED","UPSTREAM_UNAVAILABLE","UPSTREAM_TIMEOUT","UPSTREAM_ERROR","INTERNAL"],"description":"What went wrong, as a stable machine-readable code. This is a closed set — branch on it rather than on `message`, which is prose and may change. New codes arrive in a minor version, so treat an unknown one as its HTTP status. A code can also stop being emitted: it leaves this set in a minor version, named in the changelog, and a branch you wrote for it goes unreached rather than wrong.","example":"BAD_REQUEST","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"What went wrong, in prose. These codes always carry the same message, and it never includes text from a supplier: `RATE_LIMITED` — \"Too many requests. Retry after the Retry-After delay.\"; `OFFER_EXPIRED` — \"This offer has expired. Search again.\"; `OFFER_UNAVAILABLE` — \"This offer is no longer available. Search again.\"; `UPSTREAM_REJECTED` — \"The request was declined for this offer. Try another offer.\"; `UPSTREAM_UNAVAILABLE` — \"The service is temporarily unavailable. Retry after the Retry-After delay.\"; `UPSTREAM_TIMEOUT` — \"The request timed out before a result was available. Retry the request.\"; `UPSTREAM_ERROR` — \"The request could not be completed.\".","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"error.doc_url","typeLabel":"string"},"field":{"type":"string","description":"On a 400 `BAD_REQUEST` that names one refused input: the path of that field in your request, e.g. `selections[1].quantity` for the second selection of a `select_ancillaries` call. Absent when the refusal names no single field.","example":"selections[1].quantity","uniqueKey":"error.field","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"PAYMENT_REQUIRED","message":"Insufficient balance — this call costs $0.0150 and your organization has $0.0000 available. Top up at https://dashboard.gojinko.com/developers/billing/topup","doc_url":"https://docs.gojinko.com/concepts/errors"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"PAYMENT_REQUIRED","message":"Insufficient balance — this call costs $0.0150 and your organization has $0.0000 available. Top up at https://dashboard.gojinko.com/developers/billing/topup","doc_url":"https://docs.gojinko.com/concepts/errors"}}}},"exampleType":"examples"}},"exampleType":"examples"},"08bffd1c-2a85-4be0-9cfb-219e52110de6":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["INVALID_SEGMENTS_TO_EXCHANGE","PARTIAL_EXCHANGE_UNSUPPORTED","LEG_ALREADY_DEPARTED","DEPARTURE_DATE_IN_PAST","LEG_DATES_OUT_OF_ORDER","INVALID_EXCHANGE_REQUEST","NOT_EXCHANGEABLE","CREDENTIAL_FORMAT_INVALID","PAYMENT_TYPE_NOT_ENABLED","PAYMENT_CREDENTIAL_INVALID","TRIP_OWNED_BY_OTHER_PAYMENT","IDEMPOTENCY_KEY_REUSED","ATTEMPT_IN_PROGRESS","ATTEMPT_TERMINAL","TEMPORARILY_UNAVAILABLE","AUTH_REQUIRED","PAYMENT_REQUIRED","RATE_LIMITED","BAD_REQUEST","FORBIDDEN","NOT_FOUND","CONFLICT","GONE","QUOTE_PENDING","QUOTE_EXPIRED","TRIP_EXPIRED","TRIP_STATE_CONFLICT","OFFER_EXPIRED","OFFER_UNAVAILABLE","MISSING_CUSTOMER_DETAILS","INVALID_PHONE_NUMBER","INVALID_FLIGHT_NUMBER","CURRENCY_UNSUPPORTED","HOTEL_NAME_LOW_CONFIDENCE","DESTINATION_LOW_CONFIDENCE","UPSTREAM_REJECTED","UPSTREAM_UNAVAILABLE","UPSTREAM_TIMEOUT","UPSTREAM_ERROR","INTERNAL"],"description":"What went wrong, as a stable machine-readable code. This is a closed set — branch on it rather than on `message`, which is prose and may change. New codes arrive in a minor version, so treat an unknown one as its HTTP status. A code can also stop being emitted: it leaves this set in a minor version, named in the changelog, and a branch you wrote for it goes unreached rather than wrong.","example":"BAD_REQUEST","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"What went wrong, in prose. These codes always carry the same message, and it never includes text from a supplier: `RATE_LIMITED` — \"Too many requests. Retry after the Retry-After delay.\"; `OFFER_EXPIRED` — \"This offer has expired. Search again.\"; `OFFER_UNAVAILABLE` — \"This offer is no longer available. Search again.\"; `UPSTREAM_REJECTED` — \"The request was declined for this offer. Try another offer.\"; `UPSTREAM_UNAVAILABLE` — \"The service is temporarily unavailable. Retry after the Retry-After delay.\"; `UPSTREAM_TIMEOUT` — \"The request timed out before a result was available. Retry the request.\"; `UPSTREAM_ERROR` — \"The request could not be completed.\".","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"error.doc_url","typeLabel":"string"},"field":{"type":"string","description":"On a 400 `BAD_REQUEST` that names one refused input: the path of that field in your request, e.g. `selections[1].quantity` for the second selection of a `select_ancillaries` call. Absent when the refusal names no single field.","example":"selections[1].quantity","uniqueKey":"error.field","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"NOT_FOUND","message":"Resource not found.","doc_url":"https://docs.gojinko.com/concepts/errors"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"NOT_FOUND","message":"Resource not found.","doc_url":"https://docs.gojinko.com/concepts/errors"}}}},"exampleType":"examples"}},"exampleType":"examples"},"24518820-0686-48aa-b7a1-fdd2182db6cd":{"description":"The operation conflicts with the current state of the resource","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["INVALID_SEGMENTS_TO_EXCHANGE","PARTIAL_EXCHANGE_UNSUPPORTED","LEG_ALREADY_DEPARTED","DEPARTURE_DATE_IN_PAST","LEG_DATES_OUT_OF_ORDER","INVALID_EXCHANGE_REQUEST","NOT_EXCHANGEABLE","CREDENTIAL_FORMAT_INVALID","PAYMENT_TYPE_NOT_ENABLED","PAYMENT_CREDENTIAL_INVALID","TRIP_OWNED_BY_OTHER_PAYMENT","IDEMPOTENCY_KEY_REUSED","ATTEMPT_IN_PROGRESS","ATTEMPT_TERMINAL","TEMPORARILY_UNAVAILABLE","AUTH_REQUIRED","PAYMENT_REQUIRED","RATE_LIMITED","BAD_REQUEST","FORBIDDEN","NOT_FOUND","CONFLICT","GONE","QUOTE_PENDING","QUOTE_EXPIRED","TRIP_EXPIRED","TRIP_STATE_CONFLICT","OFFER_EXPIRED","OFFER_UNAVAILABLE","MISSING_CUSTOMER_DETAILS","INVALID_PHONE_NUMBER","INVALID_FLIGHT_NUMBER","CURRENCY_UNSUPPORTED","HOTEL_NAME_LOW_CONFIDENCE","DESTINATION_LOW_CONFIDENCE","UPSTREAM_REJECTED","UPSTREAM_UNAVAILABLE","UPSTREAM_TIMEOUT","UPSTREAM_ERROR","INTERNAL"],"description":"What went wrong, as a stable machine-readable code. This is a closed set — branch on it rather than on `message`, which is prose and may change. New codes arrive in a minor version, so treat an unknown one as its HTTP status. A code can also stop being emitted: it leaves this set in a minor version, named in the changelog, and a branch you wrote for it goes unreached rather than wrong.","example":"BAD_REQUEST","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"What went wrong, in prose. These codes always carry the same message, and it never includes text from a supplier: `RATE_LIMITED` — \"Too many requests. Retry after the Retry-After delay.\"; `OFFER_EXPIRED` — \"This offer has expired. Search again.\"; `OFFER_UNAVAILABLE` — \"This offer is no longer available. Search again.\"; `UPSTREAM_REJECTED` — \"The request was declined for this offer. Try another offer.\"; `UPSTREAM_UNAVAILABLE` — \"The service is temporarily unavailable. Retry after the Retry-After delay.\"; `UPSTREAM_TIMEOUT` — \"The request timed out before a result was available. Retry the request.\"; `UPSTREAM_ERROR` — \"The request could not be completed.\".","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"error.doc_url","typeLabel":"string"},"field":{"type":"string","description":"On a 400 `BAD_REQUEST` that names one refused input: the path of that field in your request, e.g. `selections[1].quantity` for the second selection of a `select_ancillaries` call. Absent when the refusal names no single field.","example":"selections[1].quantity","uniqueKey":"error.field","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"CONFLICT","message":"The operation conflicts with the current state of the resource.","doc_url":"https://docs.gojinko.com/concepts/errors"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"CONFLICT","message":"The operation conflicts with the current state of the resource.","doc_url":"https://docs.gojinko.com/concepts/errors"}}}},"exampleType":"examples"}},"exampleType":"examples"},"c7486925-99d2-4f46-a96e-9a4fb5a07370":{"description":"The resource this request names no longer exists","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["INVALID_SEGMENTS_TO_EXCHANGE","PARTIAL_EXCHANGE_UNSUPPORTED","LEG_ALREADY_DEPARTED","DEPARTURE_DATE_IN_PAST","LEG_DATES_OUT_OF_ORDER","INVALID_EXCHANGE_REQUEST","NOT_EXCHANGEABLE","CREDENTIAL_FORMAT_INVALID","PAYMENT_TYPE_NOT_ENABLED","PAYMENT_CREDENTIAL_INVALID","TRIP_OWNED_BY_OTHER_PAYMENT","IDEMPOTENCY_KEY_REUSED","ATTEMPT_IN_PROGRESS","ATTEMPT_TERMINAL","TEMPORARILY_UNAVAILABLE","AUTH_REQUIRED","PAYMENT_REQUIRED","RATE_LIMITED","BAD_REQUEST","FORBIDDEN","NOT_FOUND","CONFLICT","GONE","QUOTE_PENDING","QUOTE_EXPIRED","TRIP_EXPIRED","TRIP_STATE_CONFLICT","OFFER_EXPIRED","OFFER_UNAVAILABLE","MISSING_CUSTOMER_DETAILS","INVALID_PHONE_NUMBER","INVALID_FLIGHT_NUMBER","CURRENCY_UNSUPPORTED","HOTEL_NAME_LOW_CONFIDENCE","DESTINATION_LOW_CONFIDENCE","UPSTREAM_REJECTED","UPSTREAM_UNAVAILABLE","UPSTREAM_TIMEOUT","UPSTREAM_ERROR","INTERNAL"],"description":"What went wrong, as a stable machine-readable code. This is a closed set — branch on it rather than on `message`, which is prose and may change. New codes arrive in a minor version, so treat an unknown one as its HTTP status. A code can also stop being emitted: it leaves this set in a minor version, named in the changelog, and a branch you wrote for it goes unreached rather than wrong.","example":"BAD_REQUEST","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"What went wrong, in prose. These codes always carry the same message, and it never includes text from a supplier: `RATE_LIMITED` — \"Too many requests. Retry after the Retry-After delay.\"; `OFFER_EXPIRED` — \"This offer has expired. Search again.\"; `OFFER_UNAVAILABLE` — \"This offer is no longer available. Search again.\"; `UPSTREAM_REJECTED` — \"The request was declined for this offer. Try another offer.\"; `UPSTREAM_UNAVAILABLE` — \"The service is temporarily unavailable. Retry after the Retry-After delay.\"; `UPSTREAM_TIMEOUT` — \"The request timed out before a result was available. Retry the request.\"; `UPSTREAM_ERROR` — \"The request could not be completed.\".","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"error.doc_url","typeLabel":"string"},"field":{"type":"string","description":"On a 400 `BAD_REQUEST` that names one refused input: the path of that field in your request, e.g. `selections[1].quantity` for the second selection of a `select_ancillaries` call. Absent when the refusal names no single field.","example":"selections[1].quantity","uniqueKey":"error.field","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"GONE","message":"The resource no longer exists.","doc_url":"https://docs.gojinko.com/concepts/errors"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"GONE","message":"The resource no longer exists.","doc_url":"https://docs.gojinko.com/concepts/errors"}}}},"exampleType":"examples"}},"exampleType":"examples"},"d54d8559-b984-47cd-bcfe-794e2aff8a8a":{"description":"The request failed validation, or named a destination the platform could not confidently resolve. Tell the causes apart by `error.code`. **`BAD_REQUEST`** — The request was malformed or failed validation. Fix the request as the message describes; retrying it unchanged cannot succeed. **`HOTEL_NAME_LOW_CONFIDENCE`** — A `hotel_name` lookup found no exact match, only close candidates none of which clearly wins. Read `error.top_candidates` (closest first). If the top one is an obvious match, retry with its `hotel_id`; if several fit, ask the user which one they meant — never say there is no such hotel. **`DESTINATION_LOW_CONFIDENCE`** — A `city_name` + `country_code` search found no exact catalog city, only close candidates none of which clearly wins. Read `error.top_candidates` (closest first). If the top one is an obvious typo fix, confirm and retry with `error.suggested_retry.destination`; if several fit, ask the user which city they meant — never say there are no hotels in the requested city.","content":{"application/json":{"schema":{"oneOf":[{"type":"object","required":["error"],"properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["HOTEL_NAME_LOW_CONFIDENCE"],"isRequired":true,"uniqueKey":"oneOf.0.error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"oneOf.0.error.message","typeLabel":"string"},"top_candidates":{"type":"array","items":{"type":"object","properties":{"hotel_id":{"type":"string","example":"lp1a2b3c","isRequired":true,"uniqueKey":"oneOf.0.error.top_candidates.items.[INDEX].hotel_id","typeLabel":"string"},"name":{"type":"string","example":"Hotel Le Marais","isRequired":true,"uniqueKey":"oneOf.0.error.top_candidates.items.[INDEX].name","typeLabel":"string"},"score":{"type":"number","minimum":0,"maximum":1,"example":0.82,"isRequired":true,"uniqueKey":"oneOf.0.error.top_candidates.items.[INDEX].score","typeLabel":"number"},"city":{"type":"string","example":"Paris","uniqueKey":"oneOf.0.error.top_candidates.items.[INDEX].city","typeLabel":"string"}},"required":["hotel_id","name","score"],"uniqueKey":"oneOf.0.error.top_candidates.items.[INDEX]","typeLabel":"object"},"description":"Closest matches, ordered by score descending, at most 5.","isRequired":true,"uniqueKey":"oneOf.0.error.top_candidates","typeLabel":"object[]"},"doc_url":{"type":"string","uniqueKey":"oneOf.0.error.doc_url","typeLabel":"string"},"suggested_retry":{"type":"object","properties":{"destination":{"type":"object","additionalProperties":{"oneOf":[{},{"type":"null","uniqueKey":"oneOf.0.error.suggested_retry.destination.additionalProperties.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.error.suggested_retry.destination.additionalProperties","typeLabel":"null"},"description":"The exact fields to retry the search with — merge into the failed request unchanged for an exact match.","example":{"city_name":"Saint Malo","country_code":"FR"},"isRequired":true,"uniqueKey":"oneOf.0.error.suggested_retry.destination","typeLabel":"object"},"rationale":{"type":"string","example":"the closest catalog city to the requested name; retry with it, or ask the user when the candidates differ","uniqueKey":"oneOf.0.error.suggested_retry.rationale","typeLabel":"string"}},"required":["destination"],"description":"The one-shot fix, when the top candidate is confident enough to name one.","uniqueKey":"oneOf.0.error.suggested_retry","typeLabel":"object"}},"required":["code","message","top_candidates"],"isRequired":true,"uniqueKey":"oneOf.0.error","typeLabel":"object"}},"uniqueKey":"oneOf.0","typeLabel":"object"},{"type":"object","required":["error"],"properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["DESTINATION_LOW_CONFIDENCE"],"isRequired":true,"uniqueKey":"oneOf.1.error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"oneOf.1.error.message","typeLabel":"string"},"top_candidates":{"type":"array","items":{"type":"object","properties":{"city":{"type":"string","example":"Saint Malo","isRequired":true,"uniqueKey":"oneOf.1.error.top_candidates.items.[INDEX].city","typeLabel":"string"},"country_code":{"type":"string","example":"FR","isRequired":true,"uniqueKey":"oneOf.1.error.top_candidates.items.[INDEX].country_code","typeLabel":"string"},"hotel_count":{"type":"integer","example":326,"isRequired":true,"uniqueKey":"oneOf.1.error.top_candidates.items.[INDEX].hotel_count","typeLabel":"integer"},"score":{"type":"number","minimum":0,"maximum":1,"example":0.75,"isRequired":true,"uniqueKey":"oneOf.1.error.top_candidates.items.[INDEX].score","typeLabel":"number"}},"required":["city","country_code","hotel_count","score"],"uniqueKey":"oneOf.1.error.top_candidates.items.[INDEX]","typeLabel":"object"},"description":"Closest catalog cities, ordered by score descending, at most 5.","isRequired":true,"uniqueKey":"oneOf.1.error.top_candidates","typeLabel":"object[]"},"doc_url":{"type":"string","uniqueKey":"oneOf.1.error.doc_url","typeLabel":"string"},"suggested_retry":{"type":"object","properties":{"destination":{"type":"object","additionalProperties":{"oneOf":[{},{"type":"null","uniqueKey":"oneOf.1.error.suggested_retry.destination.additionalProperties.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.error.suggested_retry.destination.additionalProperties","typeLabel":"null"},"description":"The exact fields to retry the search with — merge into the failed request unchanged for an exact match.","example":{"city_name":"Saint Malo","country_code":"FR"},"isRequired":true,"uniqueKey":"oneOf.1.error.suggested_retry.destination","typeLabel":"object"},"rationale":{"type":"string","example":"the closest catalog city to the requested name; retry with it, or ask the user when the candidates differ","uniqueKey":"oneOf.1.error.suggested_retry.rationale","typeLabel":"string"}},"required":["destination"],"description":"The one-shot fix, when the top candidate is confident enough to name one.","uniqueKey":"oneOf.1.error.suggested_retry","typeLabel":"object"}},"required":["code","message","top_candidates"],"isRequired":true,"uniqueKey":"oneOf.1.error","typeLabel":"object"}},"uniqueKey":"oneOf.1","typeLabel":"object"},{"type":"object","required":["error"],"properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["INVALID_SEGMENTS_TO_EXCHANGE","PARTIAL_EXCHANGE_UNSUPPORTED","LEG_ALREADY_DEPARTED","DEPARTURE_DATE_IN_PAST","LEG_DATES_OUT_OF_ORDER","INVALID_EXCHANGE_REQUEST","NOT_EXCHANGEABLE","CREDENTIAL_FORMAT_INVALID","PAYMENT_TYPE_NOT_ENABLED","PAYMENT_CREDENTIAL_INVALID","TRIP_OWNED_BY_OTHER_PAYMENT","IDEMPOTENCY_KEY_REUSED","ATTEMPT_IN_PROGRESS","ATTEMPT_TERMINAL","TEMPORARILY_UNAVAILABLE","AUTH_REQUIRED","PAYMENT_REQUIRED","RATE_LIMITED","BAD_REQUEST","FORBIDDEN","NOT_FOUND","CONFLICT","GONE","QUOTE_PENDING","QUOTE_EXPIRED","TRIP_EXPIRED","TRIP_STATE_CONFLICT","OFFER_EXPIRED","OFFER_UNAVAILABLE","MISSING_CUSTOMER_DETAILS","INVALID_PHONE_NUMBER","INVALID_FLIGHT_NUMBER","CURRENCY_UNSUPPORTED","HOTEL_NAME_LOW_CONFIDENCE","DESTINATION_LOW_CONFIDENCE","UPSTREAM_REJECTED","UPSTREAM_UNAVAILABLE","UPSTREAM_TIMEOUT","UPSTREAM_ERROR","INTERNAL"],"description":"What went wrong, as a stable machine-readable code. This is a closed set — branch on it rather than on `message`, which is prose and may change. New codes arrive in a minor version, so treat an unknown one as its HTTP status. A code can also stop being emitted: it leaves this set in a minor version, named in the changelog, and a branch you wrote for it goes unreached rather than wrong.","example":"BAD_REQUEST","isRequired":true,"uniqueKey":"oneOf.2.error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"What went wrong, in prose. These codes always carry the same message, and it never includes text from a supplier: `RATE_LIMITED` — \"Too many requests. Retry after the Retry-After delay.\"; `OFFER_EXPIRED` — \"This offer has expired. Search again.\"; `OFFER_UNAVAILABLE` — \"This offer is no longer available. Search again.\"; `UPSTREAM_REJECTED` — \"The request was declined for this offer. Try another offer.\"; `UPSTREAM_UNAVAILABLE` — \"The service is temporarily unavailable. Retry after the Retry-After delay.\"; `UPSTREAM_TIMEOUT` — \"The request timed out before a result was available. Retry the request.\"; `UPSTREAM_ERROR` — \"The request could not be completed.\".","isRequired":true,"uniqueKey":"oneOf.2.error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"oneOf.2.error.doc_url","typeLabel":"string"},"field":{"type":"string","description":"On a 400 `BAD_REQUEST` that names one refused input: the path of that field in your request, e.g. `selections[1].quantity` for the second selection of a `select_ancillaries` call. Absent when the refusal names no single field.","example":"selections[1].quantity","uniqueKey":"oneOf.2.error.field","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"oneOf.2.error","typeLabel":"object"}},"uniqueKey":"oneOf.2","typeLabel":"object"}],"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"DESTINATION_LOW_CONFIDENCE","message":"no confident city match for \"Sain Malo\" in FR (closest: \"Saint Malo\", FR at 0.75)","top_candidates":[{"city":"Saint Malo","country_code":"FR","hotel_count":326,"score":0.75}],"suggested_retry":{"destination":{"city_name":"Saint Malo","country_code":"FR"},"rationale":"the closest catalog city to the requested name; retry with it, or ask the user when the candidates differ"}}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"DESTINATION_LOW_CONFIDENCE","message":"no confident city match for \"Sain Malo\" in FR (closest: \"Saint Malo\", FR at 0.75)","top_candidates":[{"city":"Saint Malo","country_code":"FR","hotel_count":326,"score":0.75}],"suggested_retry":{"destination":{"city_name":"Saint Malo","country_code":"FR"},"rationale":"the closest catalog city to the requested name; retry with it, or ask the user when the candidates differ"}}}}},"exampleType":"examples"}},"exampleType":"examples"},"815b2a17-c89e-45c9-9f4b-7ec489153ea8":{"description":"Rate limit or quota exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying. Absent when no interval applies.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["INVALID_SEGMENTS_TO_EXCHANGE","PARTIAL_EXCHANGE_UNSUPPORTED","LEG_ALREADY_DEPARTED","DEPARTURE_DATE_IN_PAST","LEG_DATES_OUT_OF_ORDER","INVALID_EXCHANGE_REQUEST","NOT_EXCHANGEABLE","CREDENTIAL_FORMAT_INVALID","PAYMENT_TYPE_NOT_ENABLED","PAYMENT_CREDENTIAL_INVALID","TRIP_OWNED_BY_OTHER_PAYMENT","IDEMPOTENCY_KEY_REUSED","ATTEMPT_IN_PROGRESS","ATTEMPT_TERMINAL","TEMPORARILY_UNAVAILABLE","AUTH_REQUIRED","PAYMENT_REQUIRED","RATE_LIMITED","BAD_REQUEST","FORBIDDEN","NOT_FOUND","CONFLICT","GONE","QUOTE_PENDING","QUOTE_EXPIRED","TRIP_EXPIRED","TRIP_STATE_CONFLICT","OFFER_EXPIRED","OFFER_UNAVAILABLE","MISSING_CUSTOMER_DETAILS","INVALID_PHONE_NUMBER","INVALID_FLIGHT_NUMBER","CURRENCY_UNSUPPORTED","HOTEL_NAME_LOW_CONFIDENCE","DESTINATION_LOW_CONFIDENCE","UPSTREAM_REJECTED","UPSTREAM_UNAVAILABLE","UPSTREAM_TIMEOUT","UPSTREAM_ERROR","INTERNAL"],"description":"What went wrong, as a stable machine-readable code. This is a closed set — branch on it rather than on `message`, which is prose and may change. New codes arrive in a minor version, so treat an unknown one as its HTTP status. A code can also stop being emitted: it leaves this set in a minor version, named in the changelog, and a branch you wrote for it goes unreached rather than wrong.","example":"BAD_REQUEST","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"What went wrong, in prose. These codes always carry the same message, and it never includes text from a supplier: `RATE_LIMITED` — \"Too many requests. Retry after the Retry-After delay.\"; `OFFER_EXPIRED` — \"This offer has expired. Search again.\"; `OFFER_UNAVAILABLE` — \"This offer is no longer available. Search again.\"; `UPSTREAM_REJECTED` — \"The request was declined for this offer. Try another offer.\"; `UPSTREAM_UNAVAILABLE` — \"The service is temporarily unavailable. Retry after the Retry-After delay.\"; `UPSTREAM_TIMEOUT` — \"The request timed out before a result was available. Retry the request.\"; `UPSTREAM_ERROR` — \"The request could not be completed.\".","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"error.doc_url","typeLabel":"string"},"field":{"type":"string","description":"On a 400 `BAD_REQUEST` that names one refused input: the path of that field in your request, e.g. `selections[1].quantity` for the second selection of a `select_ancillaries` call. Absent when the refusal names no single field.","example":"selections[1].quantity","uniqueKey":"error.field","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"RATE_LIMITED","message":"Too many requests. Retry after the Retry-After delay.","doc_url":"https://docs.gojinko.com/concepts/errors"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"RATE_LIMITED","message":"Too many requests. Retry after the Retry-After delay.","doc_url":"https://docs.gojinko.com/concepts/errors"}}}},"exampleType":"examples"}},"exampleType":"examples"},"513fb8b0-cc8d-4e06-b19f-42a9b3a8c7d4":{"description":"The travel provider rejected the request, or an upstream call failed","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["INVALID_SEGMENTS_TO_EXCHANGE","PARTIAL_EXCHANGE_UNSUPPORTED","LEG_ALREADY_DEPARTED","DEPARTURE_DATE_IN_PAST","LEG_DATES_OUT_OF_ORDER","INVALID_EXCHANGE_REQUEST","NOT_EXCHANGEABLE","CREDENTIAL_FORMAT_INVALID","PAYMENT_TYPE_NOT_ENABLED","PAYMENT_CREDENTIAL_INVALID","TRIP_OWNED_BY_OTHER_PAYMENT","IDEMPOTENCY_KEY_REUSED","ATTEMPT_IN_PROGRESS","ATTEMPT_TERMINAL","TEMPORARILY_UNAVAILABLE","AUTH_REQUIRED","PAYMENT_REQUIRED","RATE_LIMITED","BAD_REQUEST","FORBIDDEN","NOT_FOUND","CONFLICT","GONE","QUOTE_PENDING","QUOTE_EXPIRED","TRIP_EXPIRED","TRIP_STATE_CONFLICT","OFFER_EXPIRED","OFFER_UNAVAILABLE","MISSING_CUSTOMER_DETAILS","INVALID_PHONE_NUMBER","INVALID_FLIGHT_NUMBER","CURRENCY_UNSUPPORTED","HOTEL_NAME_LOW_CONFIDENCE","DESTINATION_LOW_CONFIDENCE","UPSTREAM_REJECTED","UPSTREAM_UNAVAILABLE","UPSTREAM_TIMEOUT","UPSTREAM_ERROR","INTERNAL"],"description":"What went wrong, as a stable machine-readable code. This is a closed set — branch on it rather than on `message`, which is prose and may change. New codes arrive in a minor version, so treat an unknown one as its HTTP status. A code can also stop being emitted: it leaves this set in a minor version, named in the changelog, and a branch you wrote for it goes unreached rather than wrong.","example":"BAD_REQUEST","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"What went wrong, in prose. These codes always carry the same message, and it never includes text from a supplier: `RATE_LIMITED` — \"Too many requests. Retry after the Retry-After delay.\"; `OFFER_EXPIRED` — \"This offer has expired. Search again.\"; `OFFER_UNAVAILABLE` — \"This offer is no longer available. Search again.\"; `UPSTREAM_REJECTED` — \"The request was declined for this offer. Try another offer.\"; `UPSTREAM_UNAVAILABLE` — \"The service is temporarily unavailable. Retry after the Retry-After delay.\"; `UPSTREAM_TIMEOUT` — \"The request timed out before a result was available. Retry the request.\"; `UPSTREAM_ERROR` — \"The request could not be completed.\".","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"error.doc_url","typeLabel":"string"},"field":{"type":"string","description":"On a 400 `BAD_REQUEST` that names one refused input: the path of that field in your request, e.g. `selections[1].quantity` for the second selection of a `select_ancillaries` call. Absent when the refusal names no single field.","example":"selections[1].quantity","uniqueKey":"error.field","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"UPSTREAM_REJECTED","message":"The request was declined for this offer. Try another offer.","doc_url":"https://docs.gojinko.com/concepts/errors"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"UPSTREAM_REJECTED","message":"The request was declined for this offer. Try another offer.","doc_url":"https://docs.gojinko.com/concepts/errors"}}}},"exampleType":"examples"}},"exampleType":"examples"},"b9662256-ad8a-4adb-a249-2c673ea5aac3":{"description":"No travel provider can serve the request right now","headers":{"Retry-After":{"description":"Seconds to wait before retrying. Absent when no interval applies.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["INVALID_SEGMENTS_TO_EXCHANGE","PARTIAL_EXCHANGE_UNSUPPORTED","LEG_ALREADY_DEPARTED","DEPARTURE_DATE_IN_PAST","LEG_DATES_OUT_OF_ORDER","INVALID_EXCHANGE_REQUEST","NOT_EXCHANGEABLE","CREDENTIAL_FORMAT_INVALID","PAYMENT_TYPE_NOT_ENABLED","PAYMENT_CREDENTIAL_INVALID","TRIP_OWNED_BY_OTHER_PAYMENT","IDEMPOTENCY_KEY_REUSED","ATTEMPT_IN_PROGRESS","ATTEMPT_TERMINAL","TEMPORARILY_UNAVAILABLE","AUTH_REQUIRED","PAYMENT_REQUIRED","RATE_LIMITED","BAD_REQUEST","FORBIDDEN","NOT_FOUND","CONFLICT","GONE","QUOTE_PENDING","QUOTE_EXPIRED","TRIP_EXPIRED","TRIP_STATE_CONFLICT","OFFER_EXPIRED","OFFER_UNAVAILABLE","MISSING_CUSTOMER_DETAILS","INVALID_PHONE_NUMBER","INVALID_FLIGHT_NUMBER","CURRENCY_UNSUPPORTED","HOTEL_NAME_LOW_CONFIDENCE","DESTINATION_LOW_CONFIDENCE","UPSTREAM_REJECTED","UPSTREAM_UNAVAILABLE","UPSTREAM_TIMEOUT","UPSTREAM_ERROR","INTERNAL"],"description":"What went wrong, as a stable machine-readable code. This is a closed set — branch on it rather than on `message`, which is prose and may change. New codes arrive in a minor version, so treat an unknown one as its HTTP status. A code can also stop being emitted: it leaves this set in a minor version, named in the changelog, and a branch you wrote for it goes unreached rather than wrong.","example":"BAD_REQUEST","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"What went wrong, in prose. These codes always carry the same message, and it never includes text from a supplier: `RATE_LIMITED` — \"Too many requests. Retry after the Retry-After delay.\"; `OFFER_EXPIRED` — \"This offer has expired. Search again.\"; `OFFER_UNAVAILABLE` — \"This offer is no longer available. Search again.\"; `UPSTREAM_REJECTED` — \"The request was declined for this offer. Try another offer.\"; `UPSTREAM_UNAVAILABLE` — \"The service is temporarily unavailable. Retry after the Retry-After delay.\"; `UPSTREAM_TIMEOUT` — \"The request timed out before a result was available. Retry the request.\"; `UPSTREAM_ERROR` — \"The request could not be completed.\".","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"error.doc_url","typeLabel":"string"},"field":{"type":"string","description":"On a 400 `BAD_REQUEST` that names one refused input: the path of that field in your request, e.g. `selections[1].quantity` for the second selection of a `select_ancillaries` call. Absent when the refusal names no single field.","example":"selections[1].quantity","uniqueKey":"error.field","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"UPSTREAM_UNAVAILABLE","message":"The service is temporarily unavailable. Retry after the Retry-After delay.","doc_url":"https://docs.gojinko.com/concepts/errors"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"UPSTREAM_UNAVAILABLE","message":"The service is temporarily unavailable. Retry after the Retry-After delay.","doc_url":"https://docs.gojinko.com/concepts/errors"}}}},"exampleType":"examples"}},"exampleType":"examples"},"4929cee0-f732-4710-8bb8-f97eb0fd1f93":{"description":"The travel provider did not answer in time","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["INVALID_SEGMENTS_TO_EXCHANGE","PARTIAL_EXCHANGE_UNSUPPORTED","LEG_ALREADY_DEPARTED","DEPARTURE_DATE_IN_PAST","LEG_DATES_OUT_OF_ORDER","INVALID_EXCHANGE_REQUEST","NOT_EXCHANGEABLE","CREDENTIAL_FORMAT_INVALID","PAYMENT_TYPE_NOT_ENABLED","PAYMENT_CREDENTIAL_INVALID","TRIP_OWNED_BY_OTHER_PAYMENT","IDEMPOTENCY_KEY_REUSED","ATTEMPT_IN_PROGRESS","ATTEMPT_TERMINAL","TEMPORARILY_UNAVAILABLE","AUTH_REQUIRED","PAYMENT_REQUIRED","RATE_LIMITED","BAD_REQUEST","FORBIDDEN","NOT_FOUND","CONFLICT","GONE","QUOTE_PENDING","QUOTE_EXPIRED","TRIP_EXPIRED","TRIP_STATE_CONFLICT","OFFER_EXPIRED","OFFER_UNAVAILABLE","MISSING_CUSTOMER_DETAILS","INVALID_PHONE_NUMBER","INVALID_FLIGHT_NUMBER","CURRENCY_UNSUPPORTED","HOTEL_NAME_LOW_CONFIDENCE","DESTINATION_LOW_CONFIDENCE","UPSTREAM_REJECTED","UPSTREAM_UNAVAILABLE","UPSTREAM_TIMEOUT","UPSTREAM_ERROR","INTERNAL"],"description":"What went wrong, as a stable machine-readable code. This is a closed set — branch on it rather than on `message`, which is prose and may change. New codes arrive in a minor version, so treat an unknown one as its HTTP status. A code can also stop being emitted: it leaves this set in a minor version, named in the changelog, and a branch you wrote for it goes unreached rather than wrong.","example":"BAD_REQUEST","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"What went wrong, in prose. These codes always carry the same message, and it never includes text from a supplier: `RATE_LIMITED` — \"Too many requests. Retry after the Retry-After delay.\"; `OFFER_EXPIRED` — \"This offer has expired. Search again.\"; `OFFER_UNAVAILABLE` — \"This offer is no longer available. Search again.\"; `UPSTREAM_REJECTED` — \"The request was declined for this offer. Try another offer.\"; `UPSTREAM_UNAVAILABLE` — \"The service is temporarily unavailable. Retry after the Retry-After delay.\"; `UPSTREAM_TIMEOUT` — \"The request timed out before a result was available. Retry the request.\"; `UPSTREAM_ERROR` — \"The request could not be completed.\".","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"error.doc_url","typeLabel":"string"},"field":{"type":"string","description":"On a 400 `BAD_REQUEST` that names one refused input: the path of that field in your request, e.g. `selections[1].quantity` for the second selection of a `select_ancillaries` call. Absent when the refusal names no single field.","example":"selections[1].quantity","uniqueKey":"error.field","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"UPSTREAM_TIMEOUT","message":"The request timed out before a result was available. Retry the request.","doc_url":"https://docs.gojinko.com/concepts/errors"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"UPSTREAM_TIMEOUT","message":"The request timed out before a result was available. Retry the request.","doc_url":"https://docs.gojinko.com/concepts/errors"}}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{"4b41b2f9-86a7-4a92-9596-3aeb3e48ff30":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","scopes":[],"schemeName":"ApiKeyAuth"}},"120525ec-7620-476c-a0df-124528a2b69e":{"BearerAuth":{"type":"http","scheme":"bearer","scopes":[],"schemeName":"BearerAuth"}}},"servers":{"6c2e2c14-8667-4ef1-a6c7-d1e7fb982378":{"url":"https://api.gojinko.com","description":"Production"},"0b2c8592-7b6b-4acc-9351-2a69f3e0f42a":{"url":"https://api.sandbox.gojinko.com","description":"Sandbox"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"X-API-Key","scopes":[],"schemeName":"ApiKeyAuth"},"schema":{"title":"X-API-Key","type":"string","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"ApiKeyAuth","name":"X-API-Key"}],"title":"ApiKeyAuth"},{"schemes":[{"scheme":{"type":"http","scheme":"bearer","scopes":[],"schemeName":"BearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Bearer authentication header of the form `Bearer \u003ctoken>`, where `\u003ctoken>` is your auth token.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"BearerAuth","name":"Authorization"}],"title":"BearerAuth"}]},"originalFileLocation":"api-reference/public-api.yaml"},"subdomain":"jinko-dev","siteName":"Jinko Platform","title":"hotel-search - Jinko Platform","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-04T15:44:13.243Z","originalFileLocation":"api/hotel-search.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Search live hotel inventory and rates\">\u003cmeta data-mint-head name=\"application-name\" content=\"Jinko Platform\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/jinko-dev/jotmHl7NmaCERw_m/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/jinko-dev/jotmHl7NmaCERw_m/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/jinko-dev/jotmHl7NmaCERw_m/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/jinko-dev/jotmHl7NmaCERw_m/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/jinko-dev/jotmHl7NmaCERw_m/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/jinko-dev/jotmHl7NmaCERw_m/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/jinko-dev/jotmHl7NmaCERw_m/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/jinko-dev/jotmHl7NmaCERw_m/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/jinko-dev/jotmHl7NmaCERw_m/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"hotel-search - Jinko Platform\">\u003cmeta data-mint-head property=\"og:description\" content=\"Search live hotel inventory and rates\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Jinko Platform\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.dev.gojinko.com/api/hotel-search\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://jinko-dev.mintlify.site/_mintlify/api/og/v2?division=Hotels\u0026amp;title=hotel-search\u0026amp;description=Search+live+hotel+inventory+and+rates\u0026amp;theme=d8471b1916fc5bd660c4c758\u0026amp;signature=87e93b2e365d8df47c7e1c372d008e9669fbc6a79f49fbfc9c573b88230d9eb5\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"hotel-search - Jinko Platform\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Search live hotel inventory and rates\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://jinko-dev.mintlify.site/_mintlify/api/og/v2?division=Hotels\u0026amp;title=hotel-search\u0026amp;description=Search+live+hotel+inventory+and+rates\u0026amp;theme=d8471b1916fc5bd660c4c758\u0026amp;signature=87e93b2e365d8df47c7e1c372d008e9669fbc6a79f49fbfc9c573b88230d9eb5\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/jinko-dev/jotmHl7NmaCERw_m/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Jinko Platform\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#FF6363\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.dev.gojinko.com/api/hotel-search\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api/hotel-search.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.dev.gojinko.com/#organization\",\"name\":\"Jinko Platform\",\"url\":\"https://docs.dev.gojinko.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/jinko-dev/k6P2DyAYQF0FPJQi/logo/jinko-logo.png?fit=max\u0026auto=format\u0026n=k6P2DyAYQF0FPJQi\u0026q=85\u0026s=785a20dc553a2698bfffad325d1198d0\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.dev.gojinko.com#website\",\"name\":\"Jinko Platform\",\"url\":\"https://docs.dev.gojinko.com\",\"publisher\":{\"@id\":\"https://docs.dev.gojinko.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.dev.gojinko.com/api/hotel-search#webpage\",\"url\":\"https://docs.dev.gojinko.com/api/hotel-search\",\"name\":\"hotel-search\",\"description\":\"Search live hotel inventory and rates\",\"dateModified\":\"2026-10-04T15:44:13.243Z\",\"isPartOf\":{\"@id\":\"https://docs.dev.gojinko.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.dev.gojinko.com/api/hotel-search#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.dev.gojinko.com/api/hotel-search#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Jinko Platform\",\"item\":\"https://docs.dev.gojinko.com\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"hotel-search\",\"item\":\"https://docs.dev.gojinko.com/api/hotel-search\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.dev.gojinko.com/api/hotel-search#apireference\",\"headline\":\"hotel-search\",\"name\":\"hotel-search\",\"description\":\"Search live hotel inventory and rates\",\"url\":\"https://docs.dev.gojinko.com/api/hotel-search\",\"mainEntityOfPage\":{\"@id\":\"https://docs.dev.gojinko.com/api/hotel-search#webpage\"},\"dateModified\":\"2026-10-04T15:44:13.243Z\",\"publisher\":{\"@id\":\"https://docs.dev.gojinko.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.dev.gojinko.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Jinko Platform\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Jinko Platform","nav":{"global":null,"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":"/introduction"}]},{"tab":"MCP","pages":[{"title":"MCP","href":"/tools/overview"}]},{"tab":"CLI","pages":[{"title":"CLI","href":"/cli/overview"}]},{"tab":"API reference","groups":[{"group":"Introduction","pages":[{"title":"API reference","href":"/api-reference/introduction"}]},{"group":"Travel Demand","pages":[{"group":"Destination","pages":[{"title":"destination","sidebarTitle":"/v1/destination","openapi":"api-reference/public-api.yaml GET /v1/destination","href":"/api/destination"},{"title":"destination trend","sidebarTitle":"/v1/destination/trend","openapi":"api-reference/public-api.yaml GET /v1/destination/trend","href":"/api/destination/trend"}]},{"group":"Market","pages":[{"title":"market","sidebarTitle":"/v1/market","openapi":"api-reference/public-api.yaml GET /v1/market","href":"/api/market"},{"title":"market trend","sidebarTitle":"/v1/market/trend","openapi":"api-reference/public-api.yaml GET /v1/market/trend","href":"/api/market/trend"}]},{"group":"Audience","pages":[{"title":"audience","sidebarTitle":"/v1/audience","openapi":"api-reference/public-api.yaml GET /v1/audience","href":"/api/audience"},{"title":"audience trend","sidebarTitle":"/v1/audience/trend","openapi":"api-reference/public-api.yaml GET /v1/audience/trend","href":"/api/audience/trend"}]},{"group":"Trend","pages":[{"title":"trend","sidebarTitle":"/v1/trend","openapi":"api-reference/public-api.yaml GET /v1/trend","href":"/api/trend"}]}]},{"group":"Flights","pages":[{"group":"Discovery","pages":[{"title":"find-destination","sidebarTitle":"/v1/find_destination","openapi":"api-reference/public-api.yaml POST /v1/find_destination","href":"/api/find-destination"},{"title":"flight-calendar","sidebarTitle":"/v1/flight_calendar","openapi":"api-reference/public-api.yaml POST /v1/flight_calendar","href":"/api/flight-calendar"},{"title":"find-dates","sidebarTitle":"/v1/find_dates","openapi":"api-reference/public-api.yaml POST /v1/find_dates","href":"/api/find-dates"},{"title":"lowest-fare","sidebarTitle":"/v1/lowest_fare","openapi":"api-reference/public-api.yaml POST /v1/lowest_fare","href":"/api/lowest-fare"},{"title":"price-monitoring","sidebarTitle":"/v1/price_monitoring","openapi":"api-reference/public-api.yaml POST /v1/price_monitoring","href":"/api/price-monitoring"},{"title":"flight-price-advice","sidebarTitle":"/v1/flight_price_advice","openapi":"api-reference/public-api.yaml POST /v1/flight_price_advice","href":"/api/flight-price-advice"}]},{"group":"Search","pages":[{"title":"flight-search","sidebarTitle":"/v1/flight_search","openapi":"api-reference/public-api.yaml POST /v1/flight_search","href":"/api/flight-search"},{"title":"flight-award-search (preview)","sidebarTitle":"/v1/flight_award_search (preview)","openapi":"api-reference/public-api-dev.yaml POST /v1/flight_award_search","href":"/api/flight-award-search"}]},{"group":"Manage","pages":[{"title":"refund check","sidebarTitle":"/v1/refund_check","openapi":"api-reference/public-api.yaml POST /v1/refund_check","deprecated":true,"href":"/api/refund/check"},{"title":"refund commit","sidebarTitle":"/v1/refund_commit","openapi":"api-reference/public-api.yaml POST /v1/refund_commit","deprecated":true,"href":"/api/refund/commit"},{"title":"refund status","sidebarTitle":"/v1/refund_status","openapi":"api-reference/public-api.yaml POST /v1/refund_status","deprecated":true,"href":"/api/refund/status"},{"title":"exchange shop","sidebarTitle":"/v1/exchange_shop","openapi":"api-reference/public-api.yaml POST /v1/exchange_shop","href":"/api/exchange/shop"},{"title":"exchange price","sidebarTitle":"/v1/exchange_price","openapi":"api-reference/public-api.yaml POST /v1/exchange_price","href":"/api/exchange/price"},{"title":"exchange commit","sidebarTitle":"/v1/exchange_commit","openapi":"api-reference/public-api.yaml POST /v1/exchange_commit","href":"/api/exchange/commit"},{"title":"exchange status","sidebarTitle":"/v1/exchange_status","openapi":"api-reference/public-api.yaml POST /v1/exchange_status","href":"/api/exchange/status"},{"title":"flight-refund-preview","sidebarTitle":"/v1/flight_refund_preview","openapi":"api-reference/public-api.yaml POST /v1/flight_refund_preview","href":"/api/flight-refund-preview"},{"title":"flight-refund-commit","sidebarTitle":"/v1/flight_refund_commit","openapi":"api-reference/public-api.yaml POST /v1/flight_refund_commit","href":"/api/flight-refund-commit"},{"title":"flight-refund-status","sidebarTitle":"/v1/flight_refund_status","description":"Check how a flight refund or void ended","openapi":"api-reference/public-api.yaml POST /v1/flight_refund_status","href":"/api/flight-refund-status"}]}]},{"group":"Hotels","pages":[{"title":"hotel-search","sidebarTitle":"/v1/hotel_search","openapi":"api-reference/public-api.yaml POST /v1/hotel_search","href":"/api/hotel-search"},{"title":"hotel-details","sidebarTitle":"/v1/hotel_details/{hotel_id}","description":"Fetch rich metadata (gallery, facilities, policies, per-room details) for a single hotel","openapi":"api-reference/public-api.yaml GET /v1/hotel_details/{hotel_id}","href":"/api/hotel-details"},{"title":"hotel-reviews","sidebarTitle":"/v1/hotel_reviews/{hotel_id}","openapi":"api-reference/public-api.yaml GET /v1/hotel_reviews/{hotel_id}","href":"/api/hotel-reviews"},{"title":"hotel-cancel","sidebarTitle":"/v1/hotel_cancel","openapi":"api-reference/public-api.yaml POST /v1/hotel_cancel","deprecated":true,"href":"/api/hotel-cancel"},{"title":"hotel-cancel-preview","sidebarTitle":"/v1/hotel_cancel_preview","openapi":"api-reference/public-api.yaml POST /v1/hotel_cancel_preview","href":"/api/hotel-cancel-preview"},{"title":"hotel-cancel-commit","sidebarTitle":"/v1/hotel_cancel_commit","openapi":"api-reference/public-api.yaml POST /v1/hotel_cancel_commit","href":"/api/hotel-cancel-commit"},{"title":"hotel-cancel-status","sidebarTitle":"/v1/hotel_cancel_status","openapi":"api-reference/public-api.yaml POST /v1/hotel_cancel_status","href":"/api/hotel-cancel-status"}]},{"group":"AI","pages":[{"group":"Hotel search","pages":[{"title":"hotel-ai-search","sidebarTitle":"/v1/hotel_ai_search","openapi":"api-reference/public-api.yaml POST /v1/hotel_ai_search","href":"/api/hotel-ai-search"},{"title":"hotel-ai-search-task","sidebarTitle":"/v1/hotel_ai_search/tasks/{task_id}","openapi":"api-reference/public-api.yaml GET /v1/hotel_ai_search/tasks/{task_id}","href":"/api/hotel-ai-search-task"},{"title":"hotel-ai-search-events","sidebarTitle":"/v1/hotel_ai_search/tasks/{task_id}/events","openapi":"api-reference/public-api.yaml GET /v1/hotel_ai_search/tasks/{task_id}/events","href":"/api/hotel-ai-search-events"},{"title":"hotel-ai-search-cancel","sidebarTitle":"/v1/hotel_ai_search/tasks/{task_id}:cancel","openapi":"api-reference/public-api.yaml POST /v1/hotel_ai_search/tasks/{task_id}:cancel","href":"/api/hotel-ai-search-cancel"}]}]},{"group":"Cars","pages":[{"title":"car-search","sidebarTitle":"/v1/car_search","openapi":"api-reference/public-api.yaml POST /v1/car_search","href":"/api/car-search"},{"title":"car-cancel-preview","sidebarTitle":"/v1/car_cancel_preview","openapi":"api-reference/public-api.yaml POST /v1/car_cancel_preview","href":"/api/car-cancel-preview"},{"title":"car-cancel-commit","sidebarTitle":"/v1/car_cancel_commit","openapi":"api-reference/public-api.yaml POST /v1/car_cancel_commit","href":"/api/car-cancel-commit"},{"title":"car-cancel-status","sidebarTitle":"/v1/car_cancel_status","openapi":"api-reference/public-api.yaml POST /v1/car_cancel_status","href":"/api/car-cancel-status"}]},{"group":"Trip \u0026 Payment","pages":[{"title":"trip","sidebarTitle":"/v1/trip","openapi":"api-reference/public-api.yaml POST /v1/trip","href":"/api/trip"},{"group":"Ancillaries","pages":[{"title":"select-ancillaries","sidebarTitle":"/v1/select_ancillaries","openapi":"api-reference/public-api.yaml POST /v1/select_ancillaries","href":"/api/select-ancillaries"},{"title":"trip ancillaries","sidebarTitle":"/v1/trip/{trip_id}/ancillaries","openapi":"api-reference/public-api.yaml GET /v1/trip/{trip_id}/ancillaries","href":"/api/trip/ancillaries"}]},{"title":"checkout","sidebarTitle":"/v1/checkout","openapi":"api-reference/public-api.yaml POST /v1/checkout","href":"/api/checkout"},{"title":"agent-payment submit","sidebarTitle":"/v1/agent_payment/submit","openapi":"api-reference/public-api.yaml POST /v1/agent_payment/submit","href":"/api/agent-payment/submit"},{"title":"trip-status","sidebarTitle":"/v1/trip/{trip_id}","openapi":"api-reference/public-api.yaml GET /v1/trip/{trip_id}","href":"/api/trip-status"},{"title":"get-booking","sidebarTitle":"/v1/get_booking","openapi":"api-reference/public-api.yaml POST /v1/get_booking","href":"/api/get-booking"}]},{"group":"Marketing claim","tag":"Preview","pages":[{"title":"best-price-guarantee","sidebarTitle":"/v1/best_price_guarantee","openapi":"api-reference/public-api.yaml POST /v1/best_price_guarantee","href":"/api/best-price-guarantee"},{"title":"best-price-guarantee-status","sidebarTitle":"/v1/best_price_guarantee/{id}","openapi":"api-reference/public-api.yaml GET /v1/best_price_guarantee/{id}","href":"/api/best-price-guarantee-status"}]},{"group":"Webhooks","pages":[{"title":"webhooks register","sidebarTitle":"/v1/webhooks","openapi":"api-reference/public-api.yaml POST /v1/webhooks","href":"/api/webhooks/register"},{"title":"webhooks list","sidebarTitle":"/v1/webhooks","openapi":"api-reference/public-api.yaml GET /v1/webhooks","href":"/api/webhooks/list"},{"title":"webhooks get","sidebarTitle":"/v1/webhooks/{id}","openapi":"api-reference/public-api.yaml GET /v1/webhooks/{id}","href":"/api/webhooks/get"},{"title":"webhooks delete","sidebarTitle":"/v1/webhooks/{id}","openapi":"api-reference/public-api.yaml DELETE /v1/webhooks/{id}","href":"/api/webhooks/delete"},{"title":"webhooks test","sidebarTitle":"/v1/webhooks/{id}/test","openapi":"api-reference/public-api.yaml POST /v1/webhooks/{id}/test","href":"/api/webhooks/test"},{"title":"webhooks deliveries","sidebarTitle":"/v1/webhooks/{id}/deliveries","openapi":"api-reference/public-api.yaml GET /v1/webhooks/{id}/deliveries","href":"/api/webhooks/deliveries"},{"title":"webhooks replay","sidebarTitle":"/v1/webhooks/{id}/deliveries/{delivery_id}/replay","openapi":"api-reference/public-api.yaml POST /v1/webhooks/{id}/deliveries/{delivery_id}/replay","href":"/api/webhooks/replay"}]},{"group":"Other endpoints","pages":[{"title":"flight-ai-search","sidebarTitle":"/v1/flight_ai_search","openapi":"api-reference/public-api.yaml POST /v1/flight_ai_search","href":"/api/flight-ai-search"},{"title":"flight-ai-search-cancel","sidebarTitle":"/v1/flight_ai_search/tasks/{task_id}:cancel","openapi":"api-reference/public-api.yaml POST /v1/flight_ai_search/tasks/{task_id}:cancel","href":"/api/flight-ai-search-cancel"},{"title":"flight-ai-search-events","sidebarTitle":"/v1/flight_ai_search/tasks/{task_id}/events","openapi":"api-reference/public-api.yaml GET /v1/flight_ai_search/tasks/{task_id}/events","href":"/api/flight-ai-search-events"},{"title":"flight-ai-search-task","sidebarTitle":"/v1/flight_ai_search/tasks/{task_id}","openapi":"api-reference/public-api.yaml GET /v1/flight_ai_search/tasks/{task_id}","href":"/api/flight-ai-search-task"},{"title":"flight-schedule","sidebarTitle":"/v1/flight_schedule","openapi":"api-reference/public-api.yaml POST /v1/flight_schedule","href":"/api/flight-schedule"},{"title":"trip payment-attempts","sidebarTitle":"/v1/trip/{trip_id}/payment_attempts/{payment_attempt_id}","openapi":"api-reference/public-api.yaml GET /v1/trip/{trip_id}/payment_attempts/{payment_attempt_id}","href":"/api/trip/payment-attempts"}]}]}]},"basePath":"","title":"hotel-search - Jinko Platform","buildId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","deploymentId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-i2a3QZ8E.js","utils-ChLwp8m0.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-DRktVTDc.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-CA2pEs4T.js","snippetPresets-ClQ6XrKD.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-Ct_Lv36y.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-Cn2PYw9e.js","shallow-rkyymjXQ.js","getApiPlaygroundDisplay-BB9vkXtE.js","CodeSnippet-Bm5RU7m1.js","CodeSnippets-BgU9Deuz.js","Page-BUDYNlhG.js","getPastedJson-BD-6NNum.js","icon-8Z6tud2e.js","MethodPill-Tuzr4g3V.js","DuplicateIcon-0ceWFYhN.js","createIcon-FBXow_ST.js","DynamicMarkdown-CD8713Yy.js","SectionHeading-7zgzQbH-.js","axios-vUo_bRtp.js","Markdown-D7Ofw1oz.js","clsx-eKJ4rcii.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CwjSCXIK.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-9EK5IAXV.js"]}