{
"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": "GONE",
"message": "The resource no longer exists.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"error": {
"code": "BAD_REQUEST",
"message": "A required field is missing or invalid.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"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": "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": "GONE",
"message": "The resource no longer exists.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"error": {
"code": "BAD_REQUEST",
"message": "A required field is missing or invalid.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"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"
}
}
List the alternative itineraries available to swap a booked flight onto. Pick one and price it with exchange price.Name each leg to change in segments_to_exchange by its first departure and final arrival airport, as get_booking lists it under items[].confirmation.details.flight.legs; legs you do not name stay as booked. preferred_departure_date moves the first leg to that date and reshops every leg, so use it only for a booking with a single leg.A selection the booking refuses answers 400 before any supplier is asked: LEG_ALREADY_DEPARTED, DEPARTURE_DATE_IN_PAST, LEG_DATES_OUT_OF_ORDER or INVALID_SEGMENTS_TO_EXCHANGE. error.message lists the booked legs, except for an INVALID_SEGMENTS_TO_EXCHANGE entry that is malformed (a field of the wrong type, or a date not written YYYY-MM-DD). A booking that cannot be exchanged as it stands answers 409 NOT_EXCHANGEABLE. See Errors.
The booked item, from get_booking items[].booked_item_id. Preserved across exchanges. Omit only when the booking has exactly one item of the requested domain; otherwise a 409 returns items to choose from.
Deprecated: name the booking with booking_ref and booked_item_id from get_booking. Names the booking instead of booking_ref, never beside it, and needs a credential that owns the booking. Accepted until 2027-04-30; a request that sends it is answered with Deprecation and Sunset headers.
Deprecated: omit it. The platform uses the supplier recorded with the booking. Accepted until 2027-04-30; a request that sends it is answered with Deprecation and Sunset headers.
The legs to change. Each entry is matched to a booked leg by its origin and destination and gives the new departure date. Booked legs you do not list are kept unchanged: every offer is the whole itinerary, with the kept legs as booked. Name each leg by its booked airport codes (type: airport): the first departure and the last arrival airport of that journey, as get_booking lists the leg — not a connection airport. A city code cannot be matched and is refused. An entry that matches no booked leg is refused with 400 INVALID_SEGMENTS_TO_EXCHANGE; a leg that has already departed with 400 LEG_ALREADY_DEPARTED; a date before today at the departure airport with 400 DEPARTURE_DATE_IN_PAST; new dates that would put the legs out of order with 400 LEG_DATES_OUT_OF_ORDER. Each refusal lists the booked legs. Some suppliers cannot keep a leg yet; for those bookings a request that names only some of the legs is refused with 400 PARTIAL_EXCHANGE_UNSUPPORTED — name every leg to reshop the whole itinerary.
Legacy. Moves the FIRST leg of the booking to this date and reshops every leg, so it cannot change only a later leg (a return) and can replace the flights of a leg you meant to keep. Use segments_to_exchange instead.
How this action can be carried out. AUTO — the platform completes it end to end through the API. MANUAL_REQUIRED — it is possible, but a Jinko agent has to act; call the API to raise it and expect a delay rather than an immediate result. UNSUPPORTED — the provider or fare does not allow it at all; nothing you send will change that. Do not treat MANUAL_REQUIRED as a failure, and do not retry UNSUPPORTED. On the refund check manual_reason says why it is not AUTO, on the exchange shop reason.
Why the exchange is not automatic, as a Jinko code to route on, never a supplier’s. Present whenever support_level is not AUTO, absent when it is. Today NOT_EXCHANGEABLE with support_level: UNSUPPORTED — the booking cannot be exchanged online — and MANUAL_REQUIRED with support_level: MANUAL_REQUIRED — a Jinko agent has to carry out the exchange.
Why the exchange is not automatic, in words the customer can be shown. Present whenever support_level is not AUTO, absent when it is. It is a fixed Jinko sentence and never the supplier’s wording: “This booking cannot be exchanged online. Contact Jinko support.” with NOT_EXCHANGEABLE, “This request needs manual handling by Jinko support.” with MANUAL_REQUIRED.
Example:
"This booking cannot be exchanged online. Contact Jinko support."
Notes about the booking and its documents, each said once, in words the customer can be shown. A note the supplier sends as free text without a code is left out.
{"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/exchange/shop","slug":"/api/exchange/shop","pageMetadata":{"title":"exchange shop","sidebarTitle":"/v1/exchange_shop","description":"Shop for flight exchange alternatives","openapi":"api-reference/public-api.yaml POST /v1/exchange_shop","href":"/api/exchange/shop"},"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: \"Shop for flight exchange alternatives\"\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`,..._provideComponents(),...props.components};return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`List the alternative itineraries available to swap a booked flight onto. Pick one and price it with `,_jsx(_components.a,{href:`/api/exchange/price`,children:_jsx(_components.code,{children:`exchange price`})}),`.`]}),`\n`,_jsxs(_components.p,{children:[`Name each leg to change in `,_jsx(_components.code,{children:`segments_to_exchange`}),` by its first departure and final arrival airport, as `,_jsx(_components.code,{children:`get_booking`}),` lists it under `,_jsx(_components.code,{children:`items[].confirmation.details.flight.legs`}),`; legs you do not name stay as booked. `,_jsx(_components.code,{children:`preferred_departure_date`}),` moves the first leg to that date and reshops every leg, so use it only for a booking with a single leg.`]}),`\n`,_jsxs(_components.p,{children:[`A selection the booking refuses answers 400 before any supplier is asked: `,_jsx(_components.code,{children:`LEG_ALREADY_DEPARTED`}),`, `,_jsx(_components.code,{children:`DEPARTURE_DATE_IN_PAST`}),`, `,_jsx(_components.code,{children:`LEG_DATES_OUT_OF_ORDER`}),` or `,_jsx(_components.code,{children:`INVALID_SEGMENTS_TO_EXCHANGE`}),`. `,_jsx(_components.code,{children:`error.message`}),` lists the booked legs, except for an `,_jsx(_components.code,{children:`INVALID_SEGMENTS_TO_EXCHANGE`}),` entry that is malformed (a field of the wrong type, or a date not written YYYY-MM-DD). A booking that cannot be exchanged as it stands answers 409 `,_jsx(_components.code,{children:`NOT_EXCHANGEABLE`}),`. See `,_jsx(_components.a,{href:`/concepts/errors#error-code-reference`,children:`Errors`}),`.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"exchange shop","sidebarTitle":"/v1/exchange_shop","description":"Shop for flight exchange alternatives","openapi":"api-reference/public-api.yaml POST /v1/exchange_shop","href":"/api/exchange/shop"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Post-booking"],"summary":"Shop for flight exchange alternatives","description":"Shop for flight exchange alternatives","security":["bb54bb3a-aaa4-48a3-bf6a-70df2182041f","f489f2b1-a2d2-44bc-8ff2-41008b7e9b92"],"requestBody":"213e9799-f1de-4274-99af-1e75a264e0b7","responses":{"200":"00766c20-3f49-420c-b92a-305b91593b30","400":"b8134c81-fd9b-4b9f-a753-ee5e45518a34","401":"c143fa8b-cd09-493b-b37a-8416128f0dbd","402":"e0362a59-8e48-4709-a8fc-1b6679d07bbc","404":"8c70e54e-b85f-48a4-8644-430a04b49df6","409":"abe64667-0a6b-43b6-92db-0fe881c6cee0","410":"1bf4f8a9-b91f-4905-b5e9-9fd6704a94d7","422":"fec2026c-c63d-4657-a8d9-9739a2fa4a39","429":"c882ab5b-29d1-4956-ba94-1d59bf4ac33e","502":"1eaca8aa-0473-410e-9bde-af8b4fb10afc","503":"9abf386a-66e6-4786-a31d-0ef5e82df8e6","504":"fb82dfb8-c206-4891-8869-d4e3c8c63c8d"},"method":"post","type":"path","servers":["6c2e2c14-8667-4ef1-a6c7-d1e7fb982378","0b2c8592-7b6b-4acc-9351-2a69f3e0f42a"],"path":"/v1/exchange_shop","baseUrlOptions":["https://api.gojinko.com","https://api.sandbox.gojinko.com"],"title":"Shop for flight exchange alternatives","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"booking_ref":{"type":"string","minLength":1,"description":"Jinko booking reference. Call get_booking first, then select its booked_item_id for servicing.","example":"JNK-A0AUR2","uniqueKey":"booking_ref","typeLabel":"string"},"booked_item_id":{"type":"string","pattern":"^itm_[a-z2-7]+$(?![\\s\\S])","description":"The booked item, from get_booking items[].booked_item_id. Preserved across exchanges. Omit only when the booking has exactly one item of the requested domain; otherwise a 409 returns items to choose from.","example":"itm_aaaaaaaaaaaaafhuxsdxpbzrbfz5hm3a","uniqueKey":"booked_item_id","typeLabel":"string"},"last_name":{"type":"string","minLength":1,"description":"Required for guest lookup. A credential that owns the booking may omit it; ownership is checked by the platform.","example":"Doe","uniqueKey":"last_name","typeLabel":"string"},"order_id":{"type":"string","minLength":1,"description":"Deprecated: name the booking with booking_ref and booked_item_id from get_booking. Names the booking instead of booking_ref, never beside it, and needs a credential that owns the booking. Accepted until 2027-04-30; a request that sends it is answered with `Deprecation` and `Sunset` headers.","deprecated":true,"uniqueKey":"order_id","typeLabel":"string"},"provider":{"type":"string","description":"Deprecated: omit it. The platform uses the supplier recorded with the booking. Accepted until 2027-04-30; a request that sends it is answered with `Deprecation` and `Sunset` headers.","deprecated":true,"uniqueKey":"provider","typeLabel":"string"},"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":"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":"intent.user_intent.oneOf.1","typeLabel":"null"}],"uniqueKey":"intent.user_intent","typeLabel":"string | null"}},"uniqueKey":"intent","typeLabel":"object"},"segments_to_exchange":{"type":"array","items":{"type":"object","properties":{"origin_location":{"type":"object","properties":{"code":{"type":"string","isRequired":true,"uniqueKey":"segments_to_exchange.items.[INDEX].origin_location.code","typeLabel":"string"},"type":{"type":"string","enum":["city","airport"],"isRequired":true,"uniqueKey":"segments_to_exchange.items.[INDEX].origin_location.type","typeLabel":"enum\u003cstring>"}},"required":["code","type"],"isRequired":true,"uniqueKey":"segments_to_exchange.items.[INDEX].origin_location","typeLabel":"object"},"destination_location":{"type":"object","properties":{"code":{"type":"string","isRequired":true,"uniqueKey":"segments_to_exchange.items.[INDEX].destination_location.code","typeLabel":"string"},"type":{"type":"string","enum":["city","airport"],"isRequired":true,"uniqueKey":"segments_to_exchange.items.[INDEX].destination_location.type","typeLabel":"enum\u003cstring>"}},"required":["code","type"],"isRequired":true,"uniqueKey":"segments_to_exchange.items.[INDEX].destination_location","typeLabel":"object"},"departure_date":{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"The new departure date for this booked leg (YYYY-MM-DD).","isRequired":true,"uniqueKey":"segments_to_exchange.items.[INDEX].departure_date","typeLabel":"string\u003cdate>"}},"required":["origin_location","destination_location","departure_date"],"uniqueKey":"segments_to_exchange.items.[INDEX]","typeLabel":"object"},"minItems":1,"description":"The legs to change. Each entry is matched to a booked leg by its origin and destination and gives the new departure date. Booked legs you do not list are kept unchanged: every offer is the whole itinerary, with the kept legs as booked. Name each leg by its booked airport codes (`type: airport`): the first departure and the last arrival airport of that journey, as get_booking lists the leg — not a connection airport. A city code cannot be matched and is refused. An entry that matches no booked leg is refused with 400 `INVALID_SEGMENTS_TO_EXCHANGE`; a leg that has already departed with 400 `LEG_ALREADY_DEPARTED`; a date before today at the departure airport with 400 `DEPARTURE_DATE_IN_PAST`; new dates that would put the legs out of order with 400 `LEG_DATES_OUT_OF_ORDER`. Each refusal lists the booked legs. Some suppliers cannot keep a leg yet; for those bookings a request that names only some of the legs is refused with 400 `PARTIAL_EXCHANGE_UNSUPPORTED` — name every leg to reshop the whole itinerary.","uniqueKey":"segments_to_exchange","typeLabel":"object[]"},"preferred_departure_date":{"type":"string","description":"Legacy. Moves the FIRST leg of the booking to this date and reshops every leg, so it cannot change only a later leg (a return) and can replace the flights of a leg you meant to keep. Use `segments_to_exchange` instead.","uniqueKey":"preferred_departure_date","typeLabel":"string"}},"example":{"booking_ref":"JNK-A0AUR2","last_name":"Doe"},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"booking_ref":"JNK-A0AUR2","last_name":"Doe"}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"00766c20-3f49-420c-b92a-305b91593b30":{"description":"Shop for flight exchange alternatives","content":{"application/json":{"schema":{"type":"object","properties":{"support_level":{"type":"string","enum":["AUTO","MANUAL_REQUIRED","UNSUPPORTED"],"description":"How this action can be carried out. `AUTO` — the platform completes it end to end through the API. `MANUAL_REQUIRED` — it is possible, but a Jinko agent has to act; call the API to raise it and expect a delay rather than an immediate result. `UNSUPPORTED` — the provider or fare does not allow it at all; nothing you send will change that. Do not treat MANUAL_REQUIRED as a failure, and do not retry UNSUPPORTED. On the refund check `manual_reason` says why it is not `AUTO`, on the exchange shop `reason`.","uniqueKey":"support_level","typeLabel":"enum\u003cstring>"},"reason_code":{"type":"string","description":"Why the exchange is not automatic, as a Jinko code to route on, never a supplier’s. Present whenever `support_level` is not `AUTO`, absent when it is. Today `NOT_EXCHANGEABLE` with `support_level: UNSUPPORTED` — the booking cannot be exchanged online — and `MANUAL_REQUIRED` with `support_level: MANUAL_REQUIRED` — a Jinko agent has to carry out the exchange.","example":"NOT_EXCHANGEABLE","uniqueKey":"reason_code","typeLabel":"string"},"reason":{"type":"string","description":"Why the exchange is not automatic, in words the customer can be shown. Present whenever `support_level` is not `AUTO`, absent when it is. It is a fixed Jinko sentence and never the supplier’s wording: “This booking cannot be exchanged online. Contact Jinko support.” with `NOT_EXCHANGEABLE`, “This request needs manual handling by Jinko support.” with `MANUAL_REQUIRED`.","example":"This booking cannot be exchanged online. Contact Jinko support.","uniqueKey":"reason","typeLabel":"string"},"offers":{"type":"array","items":{"type":"object","properties":{"offer_id":{"type":"string","description":"The handle POST /v1/exchange_price and /v1/exchange_commit take.","example":"exch_offer_3c1a9f","uniqueKey":"offers.items.[INDEX].offer_id","typeLabel":"string"},"description":{"type":"string","example":"AA100, 23 Sep, JFK-DFW-SJC","uniqueKey":"offers.items.[INDEX].description","typeLabel":"string"},"estimated_payment_outcome":{"type":"string","description":"What the money is expected to do — additional payment due, a refund, or even. An ESTIMATE from the shop step; POST /v1/exchange_price is the binding figure.","example":"additional_payment_due","uniqueKey":"offers.items.[INDEX].estimated_payment_outcome","typeLabel":"string"},"estimated_amount":{"type":"object","properties":{"amount":{"type":"number","description":"Deprecated: use `value` instead (the same integer) where this object carries decimal_places. Where it does not, the figure is in MAJOR units and the field holding this object is itself deprecated: read its `*_money` sibling. The two-scale rule applies only to deprecated fields. Alternative to `value` on some endpoints (the two never appear together); its scale depends on decimal_places. When this object carries decimal_places, amount is an INTEGER in minor units — divide by 10 ** decimal_places (e.g. select_ancillaries total_with_ancillaries). When there is no decimal_places field, amount is a decimal in MAJOR units, safe to display as-is (e.g. trip and checkout totals).","deprecated":true,"uniqueKey":"offers.items.[INDEX].estimated_amount.amount","typeLabel":"number"},"value":{"type":"integer","description":"Integer amount in MINOR units, always paired with decimal_places — divide by 10 ** decimal_places to display. Example: value 15977 with decimal_places 2 is 159.77 USD. Rendering this field directly shows prices 100x too high for 2-decimal currencies.","example":41250,"uniqueKey":"offers.items.[INDEX].estimated_amount.value","typeLabel":"integer"},"currency":{"type":"string","description":"ISO 4217 currency code.","example":"USD","uniqueKey":"offers.items.[INDEX].estimated_amount.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"Scale of the integer value/amount: display = integer / 10 ** decimal_places. Always sent alongside minor-unit amounts. Usually the ISO 4217 digits of the currency (2 for USD/EUR/GBP, 0 for JPY/KRW, 3 for BHD/JOD/KWD) but currency-converted prices can carry a different scale — ALWAYS use the decimal_places sent with the amount, never a hardcoded 2. Only if the field is genuinely absent on a value-shaped object, fall back to the ISO digits for the currency.","example":2,"uniqueKey":"offers.items.[INDEX].estimated_amount.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, 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":"USD 412.50","uniqueKey":"offers.items.[INDEX].estimated_amount.display","typeLabel":"string"}},"description":"A money figure in one of two scales. New integrations read the `*_money` field beside it (a `MoneyValue`) where there is one, and `value` on objects that carry it; the rule below applies only to the deprecated forms. When `decimal_places` is present, `value` (or the deprecated `amount`) is an INTEGER in minor units: divide by 10 ** decimal_places. When it is absent, the deprecated `amount` is already in MAJOR units. Branch on whether decimal_places is present in the response you received, never on the currency code or the field name. `display` is the same figure as a string to show.","uniqueKey":"offers.items.[INDEX].estimated_amount","typeLabel":"object"},"non_refundable_amount":{"type":"object","properties":{"amount":{"type":"number","description":"Deprecated: use `value` instead (the same integer) where this object carries decimal_places. Where it does not, the figure is in MAJOR units and the field holding this object is itself deprecated: read its `*_money` sibling. The two-scale rule applies only to deprecated fields. Alternative to `value` on some endpoints (the two never appear together); its scale depends on decimal_places. When this object carries decimal_places, amount is an INTEGER in minor units — divide by 10 ** decimal_places (e.g. select_ancillaries total_with_ancillaries). When there is no decimal_places field, amount is a decimal in MAJOR units, safe to display as-is (e.g. trip and checkout totals).","deprecated":true,"uniqueKey":"offers.items.[INDEX].non_refundable_amount.amount","typeLabel":"number"},"value":{"type":"integer","description":"Integer amount in MINOR units, always paired with decimal_places — divide by 10 ** decimal_places to display. Example: value 15977 with decimal_places 2 is 159.77 USD. Rendering this field directly shows prices 100x too high for 2-decimal currencies.","example":41250,"uniqueKey":"offers.items.[INDEX].non_refundable_amount.value","typeLabel":"integer"},"currency":{"type":"string","description":"ISO 4217 currency code.","example":"USD","uniqueKey":"offers.items.[INDEX].non_refundable_amount.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"Scale of the integer value/amount: display = integer / 10 ** decimal_places. Always sent alongside minor-unit amounts. Usually the ISO 4217 digits of the currency (2 for USD/EUR/GBP, 0 for JPY/KRW, 3 for BHD/JOD/KWD) but currency-converted prices can carry a different scale — ALWAYS use the decimal_places sent with the amount, never a hardcoded 2. Only if the field is genuinely absent on a value-shaped object, fall back to the ISO digits for the currency.","example":2,"uniqueKey":"offers.items.[INDEX].non_refundable_amount.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, 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":"USD 412.50","uniqueKey":"offers.items.[INDEX].non_refundable_amount.display","typeLabel":"string"}},"description":"A money figure in one of two scales. New integrations read the `*_money` field beside it (a `MoneyValue`) where there is one, and `value` on objects that carry it; the rule below applies only to the deprecated forms. When `decimal_places` is present, `value` (or the deprecated `amount`) is an INTEGER in minor units: divide by 10 ** decimal_places. When it is absent, the deprecated `amount` is already in MAJOR units. Branch on whether decimal_places is present in the response you received, never on the currency code or the field name. `display` is the same figure as a string to show.","uniqueKey":"offers.items.[INDEX].non_refundable_amount","typeLabel":"object"},"validating_carrier":{"type":"string","example":"AA","uniqueKey":"offers.items.[INDEX].validating_carrier","typeLabel":"string"},"fare_brand_code":{"type":"string","description":"The airline’s code for the fare brand this alternative sells. One itinerary can come back as several offers — one per brand — on the same flight and booking class, differing only in brand, fare basis and price; this and `fare_brand_name` are what tell them apart. Absent when the airline states no single brand for the offer.","example":"MAINSL","uniqueKey":"offers.items.[INDEX].fare_brand_code","typeLabel":"string"},"fare_brand_name":{"type":"string","description":"The fare brand’s display name, as the airline states it. Show this to the customer rather than `fare_brand_code`. Absent when the airline states no single brand.","example":"MAIN SELECT","uniqueKey":"offers.items.[INDEX].fare_brand_name","typeLabel":"string"},"legs":{"type":"array","items":{"type":"object","properties":{"stops":{"type":"integer","example":0,"uniqueKey":"offers.items.[INDEX].legs.items.[INDEX].stops","typeLabel":"integer"},"duration_minutes":{"type":"number","example":530,"uniqueKey":"offers.items.[INDEX].legs.items.[INDEX].duration_minutes","typeLabel":"number"},"segments":{"type":"array","items":{"type":"object","properties":{"airline":{"type":"string","description":"IATA code of the MARKETING carrier — whose flight number this is.","example":"AA","uniqueKey":"offers.items.[INDEX].legs.items.[INDEX].segments.items.[INDEX].airline","typeLabel":"string"},"operating_carrier":{"type":"string","description":"IATA code of the carrier that flies the aircraft. Differs from `airline` on a codeshare.","example":"BA","uniqueKey":"offers.items.[INDEX].legs.items.[INDEX].segments.items.[INDEX].operating_carrier","typeLabel":"string"},"flight_number":{"type":"string","description":"Provider flight number, forwarded unchanged. Depending on the upstream provider it may be a bare number such as `460` or a composed designator such as `AS460`; the carrier code is also carried separately when known.","example":"6957","uniqueKey":"offers.items.[INDEX].legs.items.[INDEX].segments.items.[INDEX].flight_number","typeLabel":"string"},"departure_airport":{"type":"string","example":"MIA","uniqueKey":"offers.items.[INDEX].legs.items.[INDEX].segments.items.[INDEX].departure_airport","typeLabel":"string"},"departure_time":{"type":"string","description":"Local wall-clock time at the airport, `YYYY-MM-DDTHH:MM:SS` with no UTC offset (e.g. `2026-11-24T19:35:00`). Do not read it as UTC.","example":"2026-11-24T19:35:00","uniqueKey":"offers.items.[INDEX].legs.items.[INDEX].segments.items.[INDEX].departure_time","typeLabel":"string"},"arrival_airport":{"type":"string","example":"LHR","uniqueKey":"offers.items.[INDEX].legs.items.[INDEX].segments.items.[INDEX].arrival_airport","typeLabel":"string"},"arrival_time":{"type":"string","description":"Local wall-clock time at the airport, `YYYY-MM-DDTHH:MM:SS` with no UTC offset (e.g. `2026-11-24T19:35:00`). Do not read it as UTC.","example":"2026-11-25T09:05:00","uniqueKey":"offers.items.[INDEX].legs.items.[INDEX].segments.items.[INDEX].arrival_time","typeLabel":"string"},"duration_minutes":{"type":"number","example":530,"uniqueKey":"offers.items.[INDEX].legs.items.[INDEX].segments.items.[INDEX].duration_minutes","typeLabel":"number"},"cabin_name":{"type":"string","description":"The cabin of the fare on this segment, as the airline names it.","example":"Economy","uniqueKey":"offers.items.[INDEX].legs.items.[INDEX].segments.items.[INDEX].cabin_name","typeLabel":"string"},"fare_brand_key":{"type":"string","description":"The fare brand on this segment, as the supplier keys it. The offer-level `fare_brand_code` / `fare_brand_name` are the ones to show.","example":"MAINSL","uniqueKey":"offers.items.[INDEX].legs.items.[INDEX].segments.items.[INDEX].fare_brand_key","typeLabel":"string"},"fare_basis_code":{"type":"string","description":"The fare basis code the airline prices this segment with.","example":"OVAIZNB3","uniqueKey":"offers.items.[INDEX].legs.items.[INDEX].segments.items.[INDEX].fare_basis_code","typeLabel":"string"},"rbd":{"type":"string","description":"The booking class (reservation booking designator) on this segment.","example":"O","uniqueKey":"offers.items.[INDEX].legs.items.[INDEX].segments.items.[INDEX].rbd","typeLabel":"string"}},"uniqueKey":"offers.items.[INDEX].legs.items.[INDEX].segments.items.[INDEX]","typeLabel":"object"},"description":"The flown segments of this journey, in travel order.","uniqueKey":"offers.items.[INDEX].legs.items.[INDEX].segments","typeLabel":"object[]"}},"uniqueKey":"offers.items.[INDEX].legs.items.[INDEX]","typeLabel":"object"},"description":"The itinerary this alternative puts the traveller on, one entry per journey in travel order. Absent when the supplier returned no itinerary for the offer; `description` is then all that is known.","uniqueKey":"offers.items.[INDEX].legs","typeLabel":"object[]"},"fare_basis_codes":{"type":"array","items":{"type":"string","uniqueKey":"offers.items.[INDEX].fare_basis_codes.items.[INDEX]","typeLabel":"string"},"description":"The fare basis codes of the alternative, in segment order.","example":["OVAIZNB3"],"uniqueKey":"offers.items.[INDEX].fare_basis_codes","typeLabel":"string[]"},"booking_classes":{"type":"array","items":{"type":"string","uniqueKey":"offers.items.[INDEX].booking_classes.items.[INDEX]","typeLabel":"string"},"description":"The booking classes of the alternative, in segment order.","example":["O"],"uniqueKey":"offers.items.[INDEX].booking_classes","typeLabel":"string[]"},"cabin":{"type":"string","example":"Economy","uniqueKey":"offers.items.[INDEX].cabin","typeLabel":"string"}},"uniqueKey":"offers.items.[INDEX]","typeLabel":"object"},"uniqueKey":"offers","typeLabel":"object[]"},"warnings":{"type":"array","items":{"type":"string","uniqueKey":"warnings.items.[INDEX]","typeLabel":"string"},"description":"Notes about the booking and its documents, each said once, in words the customer can be shown. A note the supplier sends as free text without a code is left out.","uniqueKey":"warnings","typeLabel":"string[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"support_level":"AUTO","reason_code":"NOT_EXCHANGEABLE","reason":"This booking cannot be exchanged online. Contact Jinko support.","offers":[{"offer_id":"exch_offer_3c1a9f","description":"AA100, 23 Sep, JFK-DFW-SJC","estimated_payment_outcome":"additional_payment_due","estimated_amount":{"amount":123,"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"non_refundable_amount":{"amount":123,"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"validating_carrier":"AA","fare_brand_code":"MAINSL","fare_brand_name":"MAIN SELECT","legs":[{"stops":0,"duration_minutes":530,"segments":[{"airline":"AA","operating_carrier":"BA","flight_number":"6957","departure_airport":"MIA","departure_time":"2026-11-24T19:35:00","arrival_airport":"LHR","arrival_time":"2026-11-25T09:05:00","duration_minutes":530,"cabin_name":"Economy","fare_brand_key":"MAINSL","fare_basis_code":"OVAIZNB3","rbd":"O"}]}],"fare_basis_codes":["OVAIZNB3"],"booking_classes":["O"],"cabin":"Economy"}],"warnings":["\u003cstring>"]}}},"exampleType":"generated"}},"exampleType":"generated"},"b8134c81-fd9b-4b9f-a753-ee5e45518a34":{"description":"A leg selection the booked itinerary or the supplier refuses. When the booked itinerary refuses it, the message lists the booked legs; when the supplier refuses it, the message is “This exchange cannot be processed as requested. Change the selected flights or contact Jinko support.” **`INVALID_SEGMENTS_TO_EXCHANGE`** — An exchange selection does not match a booked leg. Read the booking and select each leg by its booked origin and destination. **`PARTIAL_EXCHANGE_UNSUPPORTED`** — The supplier cannot keep unselected legs unchanged for this booking. Name every booked leg in segments_to_exchange to reshop the whole itinerary. **`LEG_ALREADY_DEPARTED`** — An exchange names a booked leg whose first flight has already departed. Change only legs that have not departed; the message lists the booked legs. **`DEPARTURE_DATE_IN_PAST`** — An exchange asks for a departure date before today at the departure airport. Choose a departure date from today onwards, in the departure airport’s local time. **`LEG_DATES_OUT_OF_ORDER`** — The new dates would put the legs of the itinerary out of order. Pick dates that keep each leg after the one before it, or change both legs in one request; the message lists the booked legs. **`INVALID_EXCHANGE_REQUEST`** — The supplier refused the exchange request itself. Change the selected flights, or contact Jinko support. The refusal does not say which part of the request was refused.","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"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"BAD_REQUEST","message":"\u003cstring>","doc_url":"\u003cstring>","field":"selections[1].quantity"}}}},"exampleType":"generated"}},"exampleType":"generated"},"c143fa8b-cd09-493b-b37a-8416128f0dbd":{"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"},"e0362a59-8e48-4709-a8fc-1b6679d07bbc":{"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"},"8c70e54e-b85f-48a4-8644-430a04b49df6":{"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"},"abe64667-0a6b-43b6-92db-0fe881c6cee0":{"description":"Choose booked_item_id when several booked items match (item_selection_required). Otherwise the booking cannot be exchanged as it stands. **`NOT_EXCHANGEABLE`** — The booking cannot be exchanged as it stands: no ticket or flight is left to change, or the fare does not permit the change. Do not retry the same exchange. Contact Jinko support if the customer still needs a change.","content":{"application/json":{"schema":{"oneOf":[{"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.0.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.0.error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"oneOf.0.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.0.error.field","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"oneOf.0.error","typeLabel":"object"}},"uniqueKey":"oneOf.0","typeLabel":"object"},{"type":"object","description":"Several items match the requested domain. Choose a booked_item_id from items (the same safe projection as get_booking) and repeat the request with booking_ref and booked_item_id.","required":["error","code","items"],"properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["CONFLICT"],"isRequired":true,"uniqueKey":"oneOf.1.error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"oneOf.1.error.message","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"oneOf.1.error","typeLabel":"object"},"code":{"type":"string","enum":["item_selection_required"],"isRequired":true,"uniqueKey":"oneOf.1.code","typeLabel":"enum\u003cstring>"},"items":{"type":"array","items":{"type":"object","properties":{"item_id":{"type":"integer","minimum":0,"exclusiveMinimum":true,"maximum":9007199254740991,"description":"Deprecated: use `booked_item_id` instead. The booked item as an integer.","example":42,"deprecated":true,"isRequired":true,"uniqueKey":"oneOf.1.\\items.items.[INDEX].item_id","typeLabel":"integer"},"domain":{"type":"string","isRequired":true,"uniqueKey":"oneOf.1.\\items.items.[INDEX].domain","typeLabel":"string"},"booked_item_id":{"type":"string","description":"The item to name with `booked_item_id` on the next request.","example":"itm_aaaaaaaaaaaaafhuxsdxpbzrbfz5hm3a","uniqueKey":"oneOf.1.\\items.items.[INDEX].booked_item_id","typeLabel":"string"},"summary":{"type":"string","uniqueKey":"oneOf.1.\\items.items.[INDEX].summary","typeLabel":"string"},"status":{"type":"string","description":"This item's state in Jinko's own booking and servicing flow. In progress: `pending`, `awaiting_payment`, `preparing`, `prepared`, `processing`, `confirming`. Final: `completed` (booked; for a flight, ticketed), `failed`, `cancelled` (nothing is booked any more: the checkout was never paid, or a cancellation succeeded), `expired_quote` (a quoted price, at checkout or for an exchange, expired before it was confirmed). Needing attention: `exchange_partial_failure`, `needs_review`. Treat the list as open: new values may be added. It changes only through Jinko's steps (payment, booking, ticketing, or a cancellation or exchange you request), never because an airline changed or cancelled a flight.","example":"completed","uniqueKey":"oneOf.1.\\items.items.[INDEX].status","typeLabel":"string"},"booking_ref":{"type":"string","description":"The Jinko booking reference of the booking this item belongs to, also after an exchange.","example":"JNK-A0AUR2","uniqueKey":"oneOf.1.\\items.items.[INDEX].booking_ref","typeLabel":"string"},"booking_reference":{"type":"string","description":"Deprecated: use `booking_ref` instead. The Jinko reference of the cart this item lives on: after an exchange, the exchange’s own reference.","deprecated":true,"uniqueKey":"oneOf.1.\\items.items.[INDEX].booking_reference","typeLabel":"string"},"servicing":{"type":"object","properties":{"can_refund":{"type":"boolean","isRequired":true,"uniqueKey":"oneOf.1.\\items.items.[INDEX].servicing.can_refund","typeLabel":"boolean"},"can_void":{"type":"boolean","isRequired":true,"uniqueKey":"oneOf.1.\\items.items.[INDEX].servicing.can_void","typeLabel":"boolean"},"can_exchange":{"type":"boolean","isRequired":true,"uniqueKey":"oneOf.1.\\items.items.[INDEX].servicing.can_exchange","typeLabel":"boolean"},"refund_support_level":{"type":"string","enum":["AUTO","MANUAL_REQUIRED","UNSUPPORTED"],"uniqueKey":"oneOf.1.\\items.items.[INDEX].servicing.refund_support_level","typeLabel":"enum\u003cstring>"},"exchange_support_level":{"type":"string","enum":["AUTO","MANUAL_REQUIRED","UNSUPPORTED"],"uniqueKey":"oneOf.1.\\items.items.[INDEX].servicing.exchange_support_level","typeLabel":"enum\u003cstring>"},"refund_unavailable_reason":{"type":"string","uniqueKey":"oneOf.1.\\items.items.[INDEX].servicing.refund_unavailable_reason","typeLabel":"string"},"exchange_unavailable_reason":{"type":"string","uniqueKey":"oneOf.1.\\items.items.[INDEX].servicing.exchange_unavailable_reason","typeLabel":"string"},"refund_reason_code":{"type":"string","uniqueKey":"oneOf.1.\\items.items.[INDEX].servicing.refund_reason_code","typeLabel":"string"},"exchange_reason_code":{"type":"string","uniqueKey":"oneOf.1.\\items.items.[INDEX].servicing.exchange_reason_code","typeLabel":"string"},"reason_code":{"type":"string","uniqueKey":"oneOf.1.\\items.items.[INDEX].servicing.reason_code","typeLabel":"string"},"support_level":{"type":"string","enum":["AUTO","MANUAL_REQUIRED","UNSUPPORTED"],"uniqueKey":"oneOf.1.\\items.items.[INDEX].servicing.support_level","typeLabel":"enum\u003cstring>"}},"required":["can_refund","can_void","can_exchange"],"description":"Eligibility of this booked item and its current product. Read the live refund or exchange check before committing; eligibility can change with time.","uniqueKey":"oneOf.1.\\items.items.[INDEX].servicing","typeLabel":"object"}},"required":["item_id","domain"],"uniqueKey":"oneOf.1.\\items.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.1.\\items","typeLabel":"object[]"}},"uniqueKey":"oneOf.1","typeLabel":"object"}],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"BAD_REQUEST","message":"\u003cstring>","doc_url":"\u003cstring>","field":"selections[1].quantity"}}}},"exampleType":"generated"}},"exampleType":"generated"},"1bf4f8a9-b91f-4905-b5e9-9fd6704a94d7":{"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"},"fec2026c-c63d-4657-a8d9-9739a2fa4a39":{"description":"Validation error","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":"A required field is missing or invalid.","doc_url":"https://docs.gojinko.com/concepts/errors"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"BAD_REQUEST","message":"A required field is missing or invalid.","doc_url":"https://docs.gojinko.com/concepts/errors"}}}},"exampleType":"examples"}},"exampleType":"examples"},"c882ab5b-29d1-4956-ba94-1d59bf4ac33e":{"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"},"1eaca8aa-0473-410e-9bde-af8b4fb10afc":{"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"},"9abf386a-66e6-4786-a31d-0ef5e82df8e6":{"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"},"fb82dfb8-c206-4891-8869-d4e3c8c63c8d":{"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":{"bb54bb3a-aaa4-48a3-bf6a-70df2182041f":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","scopes":[],"schemeName":"ApiKeyAuth"}},"f489f2b1-a2d2-44bc-8ff2-41008b7e9b92":{"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":"exchange shop - Jinko Platform","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-17T23:48:47.618Z","originalFileLocation":"api/exchange/shop.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=\"Shop for flight exchange alternatives\">\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=\"exchange shop - Jinko Platform\">\u003cmeta data-mint-head property=\"og:description\" content=\"Shop for flight exchange alternatives\">\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/exchange/shop\">\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=Manage\u0026amp;title=exchange+shop\u0026amp;description=Shop+for+flight+exchange+alternatives\u0026amp;theme=d8471b1916fc5bd660c4c758\u0026amp;signature=6337f42630039bce862703350b4c8fe5ec732048f431a424987c09a02bb1c0f0\">\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=\"exchange shop - Jinko Platform\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Shop for flight exchange alternatives\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://jinko-dev.mintlify.site/_mintlify/api/og/v2?division=Manage\u0026amp;title=exchange+shop\u0026amp;description=Shop+for+flight+exchange+alternatives\u0026amp;theme=d8471b1916fc5bd660c4c758\u0026amp;signature=6337f42630039bce862703350b4c8fe5ec732048f431a424987c09a02bb1c0f0\">\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/exchange/shop\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api/exchange/shop.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/exchange/shop#webpage\",\"url\":\"https://docs.dev.gojinko.com/api/exchange/shop\",\"name\":\"exchange shop\",\"description\":\"Shop for flight exchange alternatives\",\"dateModified\":\"2026-10-17T23:48:47.618Z\",\"isPartOf\":{\"@id\":\"https://docs.dev.gojinko.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.dev.gojinko.com/api/exchange/shop#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.dev.gojinko.com/api/exchange/shop#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Flights\",\"item\":\"https://docs.dev.gojinko.com/api/find-destination\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Manage\",\"item\":\"https://docs.dev.gojinko.com/api/refund/check\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"exchange shop\",\"item\":\"https://docs.dev.gojinko.com/api/exchange/shop\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.dev.gojinko.com/api/exchange/shop#apireference\",\"headline\":\"exchange shop\",\"name\":\"exchange shop\",\"description\":\"Shop for flight exchange alternatives\",\"url\":\"https://docs.dev.gojinko.com/api/exchange/shop\",\"mainEntityOfPage\":{\"@id\":\"https://docs.dev.gojinko.com/api/exchange/shop#webpage\"},\"dateModified\":\"2026-10-17T23:48:47.618Z\",\"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","description":"DEPRECATED, use /v1/flight_refund_status. Check the status of a refund","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","description":"Price a specific exchange offer","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","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}","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":"exchange shop - 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"]}