{
"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"
}
}
Manage
flight-refund-preview
Preview what cancelling a booked flight (every ticket on the item) would return to the customer
POST
/
v1
/
flight_refund_preview
Preview what cancelling a booked flight (every ticket on the item) would return to the customer
{
"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"
}
}
Quote what the customer would get back for this flight item, every ticket on it, right now: the refund, the penalty in force, and every document the operation would cover. NOTHING is sent to the airline. refund is what the customer paid less the penalty. All amounts are customer-facing only. The platform decides WHICH operation this is and reports it as operation_kind: a ticket still inside its void window is void, the entire charge is reversed, penalty-free, and anything else is cancel, a refund under the fare rules. You cannot ask for one; read what you are given, because the void window closes with time. commitable: false with support_level: MANUAL_REQUIRED is not a dead end: the commit takes manual_ok: true and hands the operation to a Jinko agent. The handle this returns is named quote: it is what POST /v1/flight_refund_commit consumes, and it stops binding at expires_at. Every call here needs API authentication; this is about which mode identifies the booking. Call get_booking first, then send booking_ref and the selected booked_item_id. Guests must send last_name; owning credentials may omit it. The deprecated provider, order_id, provider_reference and provider_booking_id are accepted until 2027-04-30 where the request declares them; a request that sends one is answered with Deprecation and Sunset headers.
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 and last_name, 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.
Separate refunds for carrier-settled paid seats. A paid seat is refunded once the airline refunds Jinko; these amounts are not part of the quoted fare refund.
Whether a commit against this quote would be accepted as it stands. A MANUAL_REQUIRED quote is never commitable and is still SUBMITTABLE: send the commit with manual_ok: true to hand it to a Jinko agent. Otherwise, when false, not_commitable_reason says why and committing is pointless.
How this refund would be carried out. AUTO — the platform refunds the ticket end to end under the fare rules. AUTO_VOID — the ticket is still inside the airline's void window, so the platform voids it and the ENTIRE charge is reversed, penalty-free; there is no supplier figure to report on a void. MANUAL_REQUIRED — it is possible, but a Jinko agent has to act (manual_reason says why): the commit is refused unless you send manual_ok: true, which hands it to that agent. Do not treat MANUAL_REQUIRED as a failure. Time-sensitive: a void window closes, so read the level from a live preview.
Why a person has to act, in words the customer can be shown. Present with support_level: MANUAL_REQUIRED. Where the reason would be the supplier’s own words, it reads “This request needs manual handling by Jinko support.”
What this quote would do — refund the ticket under the fare rules (cancel) or void it (void). On a void the whole charge comes back and the penalty is zero. The status read reports the operation that actually ran under this same name, so the two compare directly. The handle that binds this quote is quote; operation is the "svc_…" handle the COMMIT answers, and it never appears on a quote.
How the refund is settled. sell_minus_penalty — what the customer paid for this ticket, less the penalty (a cancellation). original_charge — the whole charge is reversed, penalty-free (a void). It follows operation_kind, which the platform derives; the caller cannot ask for one.
When this quote stops binding. Committing after it answers 409 QUOTE_EXPIRED; take a fresh quote and show the customer the new figure before committing again.
The booked item this quote covers — the booked_item_id get_booking returns. A booking holding several items is quoted and refunded one item at a time; within an item, every ticket issued for it is covered together.
THE CUSTOMER FIGURE: what would go back to the payment method, on the basis named in basis — what they paid less the penalty, or the entire charge on a void. Show this one. Absent is not zero: a quote whose penalty is unknown carries no refund figure at all.
What the customer would forfeit, in the currency they were charged. Zero on a void. May be omitted when unknown; absent is not zero. Read fee_known before showing it — false means UNKNOWN, not free.
Whether the ancillaries bought with this ticket come back with it. false when any document is an EMD — the platform cannot refund or void one, so that value has to be recovered by a person, and the quote is MANUAL_REQUIRED. Tell the customer before they commit, not after.
Why commitable is false. Today: manual_required (a Jinko agent has to act — resubmit with manual_ok: true; manual_reason says why), penalty_exceeds_sell (the penalty is at least what the customer paid), multi_currency_basis (the airline prices the refund in a currency the customer was not charged in, so no single figure exists). Two refusals are never values here: a fare the airline will not refund is 409 not_cancellable from this preview itself, and an airline with no refund route is 422 provider_unsupported. The contract reserves further values (provider_unsupported, funds_unavailable, insufficient_time_to_converge) and new reasons may be added, so treat an unrecognised value as "not right now".
Example:
"manual_required"
{"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/flight-refund-preview","slug":"/api/flight-refund-preview","pageMetadata":{"title":"flight-refund-preview","sidebarTitle":"/v1/flight_refund_preview","description":"Preview what cancelling a booked flight (every ticket on the item) would return to the customer","openapi":"api-reference/public-api.yaml POST /v1/flight_refund_preview","href":"/api/flight-refund-preview"},"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: \"Preview what cancelling a booked flight (every ticket on the item) would return to the customer\"\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{jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,p:`p`,..._provideComponents(),...props.components};return _jsxs(_components.p,{children:[`Quote what the customer would get back for this flight item, every ticket on it, right now: the refund, the penalty in force, and every document the operation would cover. NOTHING is sent to the airline. `,_jsx(_components.code,{children:`refund`}),` is what the customer paid less the penalty. All amounts are customer-facing only. The platform decides WHICH operation this is and reports it as `,_jsx(_components.code,{children:`operation_kind`}),`: a ticket still inside its void window is `,_jsx(_components.code,{children:`void`}),`, the entire charge is reversed, penalty-free, and anything else is `,_jsx(_components.code,{children:`cancel`}),`, a refund under the fare rules. You cannot ask for one; read what you are given, because the void window closes with time. `,_jsx(_components.code,{children:`commitable: false`}),` with `,_jsx(_components.code,{children:`support_level: MANUAL_REQUIRED`}),` is not a dead end: the commit takes `,_jsx(_components.code,{children:`manual_ok: true`}),` and hands the operation to a Jinko agent. The handle this returns is named `,_jsx(_components.code,{children:`quote`}),`: it is what POST /v1/flight_refund_commit consumes, and it stops binding at `,_jsx(_components.code,{children:`expires_at`}),`. Every call here needs API authentication; this is about which mode identifies the booking. Call get_booking first, then send booking_ref and the selected booked_item_id. Guests must send last_name; owning credentials may omit it. The deprecated `,_jsx(_components.code,{children:`provider`}),`, `,_jsx(_components.code,{children:`order_id`}),`, `,_jsx(_components.code,{children:`provider_reference`}),` and `,_jsx(_components.code,{children:`provider_booking_id`}),` are accepted until 2027-04-30 where the request declares them; a request that sends one is answered with `,_jsx(_components.code,{children:`Deprecation`}),` and `,_jsx(_components.code,{children:`Sunset`}),` headers.`]})}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":"flight-refund-preview","sidebarTitle":"/v1/flight_refund_preview","description":"Preview what cancelling a booked flight (every ticket on the item) would return to the customer","openapi":"api-reference/public-api.yaml POST /v1/flight_refund_preview","href":"/api/flight-refund-preview"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Post-booking"],"summary":"Preview what cancelling a booked flight (every ticket on the item) would return to the customer","description":"Preview what cancelling a booked flight (every ticket on the item) would return to the customer","security":["16d90efc-607a-44c5-be15-e15360b8c369","cd5e003d-b4ed-4c84-8927-74e01cce3b7b"],"requestBody":"521f1cb6-7173-422b-9ca6-24c1f544fbc8","responses":{"200":"47079b13-2a43-4f1d-8664-65dbaff0e977","400":"36970825-8875-4c26-9a22-a1a615708b51","401":"9e572a5e-24ed-45ac-9236-7594b43db5d5","402":"83cd54fa-22f4-4c34-86d0-be8b9c1e6b3a","404":"6c4d5900-4815-4672-b087-819be9a05fc0","409":"33dce4bd-426f-40a0-a2e8-f49997152096","410":"35b39f92-b4e2-421a-8f86-30ee0f463bbf","422":"7c983e9e-3ec1-4288-a0c9-978f7da96b71","429":"fd1caa01-f132-4fe3-a78b-936d37cd5092","502":"bedbc03e-092a-4e52-836e-b64effeb035f","503":"0b835ccc-67ad-4f37-b1dd-e5f6948b20cd","504":"9fa6a3a2-2f4f-458a-89c1-caf0e3a5beab"},"method":"post","type":"path","servers":["6c2e2c14-8667-4ef1-a6c7-d1e7fb982378","0b2c8592-7b6b-4acc-9351-2a69f3e0f42a"],"path":"/v1/flight_refund_preview","baseUrlOptions":["https://api.gojinko.com","https://api.sandbox.gojinko.com"],"title":"Preview what cancelling a booked flight (every ticket on the item) would return to the customer","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"},"provider_reference":{"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 and last_name, 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":"provider_reference","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"}},"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":{"47079b13-2a43-4f1d-8664-65dbaff0e977":{"description":"What cancelling the flight item would return","content":{"application/json":{"schema":{"type":"object","properties":{"seat_refunds":{"type":"array","items":{"type":"object","properties":{"offer_id":{"type":"string","isRequired":true,"uniqueKey":"seat_refunds.items.[INDEX].offer_id","typeLabel":"string"},"seat_number":{"type":"string","example":"12B","isRequired":true,"uniqueKey":"seat_refunds.items.[INDEX].seat_number","typeLabel":"string"},"status":{"type":"string","enum":["pending_airline_refund","refunded","not_refunded"],"isRequired":true,"uniqueKey":"seat_refunds.items.[INDEX].status","typeLabel":"enum\u003cstring>"},"amount":{"type":"object","description":"The seat price while pending, then the actual customer refund amount (zero when not refunded). Not part of the separate quoted fare refund.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"seat_refunds.items.[INDEX].amount.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"seat_refunds.items.[INDEX].amount.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"seat_refunds.items.[INDEX].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 at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"seat_refunds.items.[INDEX].amount.display","typeLabel":"string"}},"isRequired":true,"uniqueKey":"seat_refunds.items.[INDEX].amount","typeLabel":"object"},"carrier":{"type":"string","description":"Airline display name.","example":"United","isRequired":true,"uniqueKey":"seat_refunds.items.[INDEX].carrier","typeLabel":"string"},"message":{"type":"string","description":"Customer-facing sentence explaining the seat refund.","example":"Your paid seat will be refunded once United refunds Jinko.","isRequired":true,"uniqueKey":"seat_refunds.items.[INDEX].message","typeLabel":"string"},"airline_refund_registered":{"type":"boolean","description":"Whether the airline refund has been registered with the payment provider.","isRequired":true,"uniqueKey":"seat_refunds.items.[INDEX].airline_refund_registered","typeLabel":"boolean"},"traveler_ref":{"type":"string","example":"pax_1","uniqueKey":"seat_refunds.items.[INDEX].traveler_ref","typeLabel":"string"},"pax_ref_id":{"type":"string","description":"Deprecated: use `traveler_ref` instead. Same value.","example":"pax_1","deprecated":true,"uniqueKey":"seat_refunds.items.[INDEX].pax_ref_id","typeLabel":"string"}},"required":["offer_id","seat_number","status","amount","carrier","message","airline_refund_registered"],"description":"A carrier-settled paid seat is refunded once the airline refunds Jinko. It is not part of the quoted fare refund; track its separate status here.","uniqueKey":"seat_refunds.items.[INDEX]","typeLabel":"object"},"description":"Separate refunds for carrier-settled paid seats. A paid seat is refunded once the airline refunds Jinko; these amounts are not part of the quoted fare refund.","uniqueKey":"seat_refunds","typeLabel":"object[]"},"quote_id":{"type":"string","description":"This quote. Pass it as `quote_id` to POST /v1/flight_refund_commit — it binds the commit to the figures below. Opaque; the format may evolve.","example":"svq_01J7ZR3M8FKX2P9C","uniqueKey":"quote_id","typeLabel":"string"},"quote":{"type":"string","description":"Deprecated: use `quote_id` instead. Same value.","example":"svq_01J7ZR3M8FKX2P9C","deprecated":true,"uniqueKey":"quote","typeLabel":"string"},"state":{"type":"string","description":"Lifecycle of the QUOTE, not of a refund — nothing has been refunded or voided by this call. `completed` means the figures are final until `expires_at`.","example":"completed","uniqueKey":"state","typeLabel":"string"},"commitable":{"type":"boolean","description":"Whether a commit against this quote would be accepted as it stands. A MANUAL_REQUIRED quote is never commitable and is still SUBMITTABLE: send the commit with `manual_ok: true` to hand it to a Jinko agent. Otherwise, when false, `not_commitable_reason` says why and committing is pointless.","example":true,"uniqueKey":"commitable","typeLabel":"boolean"},"support_level":{"type":"string","enum":["AUTO","AUTO_VOID","MANUAL_REQUIRED"],"description":"How this refund would be carried out. `AUTO` — the platform refunds the ticket end to end under the fare rules. `AUTO_VOID` — the ticket is still inside the airline's void window, so the platform voids it and the ENTIRE charge is reversed, penalty-free; there is no supplier figure to report on a void. `MANUAL_REQUIRED` — it is possible, but a Jinko agent has to act (`manual_reason` says why): the commit is refused unless you send `manual_ok: true`, which hands it to that agent. Do not treat MANUAL_REQUIRED as a failure. Time-sensitive: a void window closes, so read the level from a live preview.","uniqueKey":"support_level","typeLabel":"enum\u003cstring>"},"manual_reason":{"type":"string","description":"Why a person has to act, in words the customer can be shown. Present with `support_level: MANUAL_REQUIRED`. Where the reason would be the supplier’s own words, it reads “This request needs manual handling by Jinko support.”","example":"fare rules require agent review","uniqueKey":"manual_reason","typeLabel":"string"},"operation_kind":{"type":"string","description":"What this quote would do — refund the ticket under the fare rules (`cancel`) or void it (`void`). On a void the whole charge comes back and the penalty is zero. The status read reports the operation that actually ran under this same name, so the two compare directly. The handle that binds this quote is `quote`; `operation` is the \"svc_…\" handle the COMMIT answers, and it never appears on a quote.","enum":["cancel","void"],"uniqueKey":"operation_kind","typeLabel":"enum\u003cstring>"},"settlement_basis":{"type":"string","description":"How the refund is settled. `sell_minus_penalty` — what the customer paid for this ticket, less the penalty (a cancellation). `original_charge` — the whole charge is reversed, penalty-free (a void). It follows `operation_kind`, which the platform derives; the caller cannot ask for one.","example":"sell_minus_penalty","uniqueKey":"settlement_basis","typeLabel":"string"},"expires_at":{"type":"string","description":"When this quote stops binding. Committing after it answers 409 `QUOTE_EXPIRED`; take a fresh quote and show the customer the new figure before committing again.","example":"2026-09-03T12:15:00Z","uniqueKey":"expires_at","typeLabel":"string"},"booked_item_id":{"type":"string","description":"The booked item this quote covers — the `booked_item_id` get_booking returns. A booking holding several items is quoted and refunded one item at a time; within an item, every ticket issued for it is covered together.","example":"itm_7f2c9a4e8b1d","uniqueKey":"booked_item_id","typeLabel":"string"},"item":{"type":"string","description":"Deprecated: use `booked_item_id` instead. Same value.","example":"itm_7f2c9a4e8b1d","deprecated":true,"uniqueKey":"item","typeLabel":"string"},"refund":{"type":"object","properties":{"amount":{"type":"number","description":"Deprecated: use `amount_money` instead. 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":"refund.amount","typeLabel":"number"},"value":{"type":"integer","description":"Deprecated: use `amount_money` instead. 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,"deprecated":true,"uniqueKey":"refund.value","typeLabel":"integer"},"currency":{"type":"string","description":"Deprecated: use `amount_money` instead. ISO 4217 currency code.","example":"USD","deprecated":true,"uniqueKey":"refund.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"Deprecated: use `amount_money` instead. 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,"deprecated":true,"uniqueKey":"refund.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"Deprecated: use `amount_money` instead. The same figure as a string ready to show: the ISO 4217 code, a space, then the amount, e.g. \"USD 159.77\". With decimal_places it is written at exactly that scale (value 1561500, JPY, decimal_places 2 is \"JPY 15615.00\"); without, at the ISO digits of the currency. Show this; compute with the number. Absent when the figure is not money (a cancellation step expressed as a percent or a number of nights) or could not be read unambiguously.","example":"USD 412.50","deprecated":true,"uniqueKey":"refund.display","typeLabel":"string"},"amount_money":{"type":"object","description":"The refund figure. Absent when the figure is not known.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"refund.amount_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"refund.amount_money.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"refund.amount_money.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"refund.amount_money.display","typeLabel":"string"}},"uniqueKey":"refund.amount_money","typeLabel":"object"},"basis":{"type":"string","description":"How the figure was computed. `sell_minus_penalty` — what the customer paid for this item, less the penalty. `original_charge` — the entire charge is reversed, penalty-free (a void). The platform chooses; the caller cannot ask for one.","example":"sell_minus_penalty","uniqueKey":"refund.basis","typeLabel":"string"}},"description":"THE CUSTOMER FIGURE: what would go back to the payment method, on the basis named in `basis` — what they paid less the penalty, or the entire charge on a void. Show this one. Absent is not zero: a quote whose penalty is unknown carries no refund figure at all.","uniqueKey":"refund","typeLabel":"object"},"penalty":{"type":"object","properties":{"amount":{"type":"number","description":"Deprecated: use `amount_money` instead. 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":"penalty.amount","typeLabel":"number"},"value":{"type":"integer","description":"Deprecated: use `amount_money` instead. 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,"deprecated":true,"uniqueKey":"penalty.value","typeLabel":"integer"},"currency":{"type":"string","description":"Deprecated: use `amount_money` instead. ISO 4217 currency code.","example":"USD","deprecated":true,"uniqueKey":"penalty.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"Deprecated: use `amount_money` instead. 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,"deprecated":true,"uniqueKey":"penalty.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"Deprecated: use `amount_money` instead. The same figure as a string ready to show: the ISO 4217 code, a space, then the amount, e.g. \"USD 159.77\". With decimal_places it is written at exactly that scale (value 1561500, JPY, decimal_places 2 is \"JPY 15615.00\"); without, at the ISO digits of the currency. Show this; compute with the number. Absent when the figure is not money (a cancellation step expressed as a percent or a number of nights) or could not be read unambiguously.","example":"USD 412.50","deprecated":true,"uniqueKey":"penalty.display","typeLabel":"string"},"amount_money":{"type":"object","description":"The penalty figure. Present only when `fee_known` is true; absent when the fee is unknown, which is not zero.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"penalty.amount_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"penalty.amount_money.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"penalty.amount_money.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"penalty.amount_money.display","typeLabel":"string"}},"uniqueKey":"penalty.amount_money","typeLabel":"object"},"fee_known":{"type":"boolean","description":"false means the penalty could not be established — UNKNOWN, not zero. Render it as \"we will confirm the fee\", never as free cancellation, and expect the final figure on the operation status.","example":true,"uniqueKey":"penalty.fee_known","typeLabel":"boolean"},"breakdown":{"type":"object","properties":{"airline_fee":{"type":"object","description":"The airline’s cancellation fee, taxes on the fee included. This is the figure a fare rule advertises.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"penalty.breakdown.airline_fee.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"penalty.breakdown.airline_fee.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"penalty.breakdown.airline_fee.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"penalty.breakdown.airline_fee.display","typeLabel":"string"}},"uniqueKey":"penalty.breakdown.airline_fee","typeLabel":"object"},"non_refundable_taxes":{"type":"object","description":"The taxes and carrier surcharges the airline does not give back, summed. On a ticket refunded after part of it was used, this includes the taxes of the flights already flown.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"penalty.breakdown.non_refundable_taxes.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"penalty.breakdown.non_refundable_taxes.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"penalty.breakdown.non_refundable_taxes.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"penalty.breakdown.non_refundable_taxes.display","typeLabel":"string"}},"uniqueKey":"penalty.breakdown.non_refundable_taxes","typeLabel":"object"},"used_fare":{"type":"object","description":"The fare of the flights already flown, on a ticket that is refunded after part of it was used.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"penalty.breakdown.used_fare.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"penalty.breakdown.used_fare.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"penalty.breakdown.used_fare.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"penalty.breakdown.used_fare.display","typeLabel":"string"}},"uniqueKey":"penalty.breakdown.used_fare","typeLabel":"object"}},"description":"How the supplier itemises the penalty, in the same currency: the airline’s cancellation fee, the taxes it does not give back, and the fare of flights already flown. Present when the supplier states at least one of them; a member the supplier does not state is absent, and a stated zero is a zero. The penalty figure is what is withheld; the members explain it and may not add up to it exactly (each is converted and rounded on its own, and a supplier may withhold something it does not itemise).","uniqueKey":"penalty.breakdown","typeLabel":"object"}},"description":"What the customer would forfeit, in the currency they were charged. Zero on a void. May be omitted when unknown; absent is not zero. Read `fee_known` before showing it — false means UNKNOWN, not free.","uniqueKey":"penalty","typeLabel":"object"},"documents":{"type":"array","items":{"type":"object","properties":{"number":{"type":"string","description":"The 13-digit ticket or EMD number.","example":"0012345678901","uniqueKey":"documents.items.[INDEX].number","typeLabel":"string"},"type":{"type":"string","enum":["TKT","EMD"],"description":"What the document is. `TKT` — the flight ticket itself. `EMD` — an electronic miscellaneous document, which is how an ancillary (a bag, a seat) is issued.","uniqueKey":"documents.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"state":{"type":"string","enum":["ACTIVE","REFUNDED","VOIDED","INACTIVE","PENDING","UNKNOWN"],"description":"Where the document itself has got to. Every document on a preview is `ACTIVE` — that is what makes the quote possible. On a status read the values are the outcome per document: `REFUNDED`, `VOIDED`, `INACTIVE` (the airline dropped it), `PENDING` (the airline has not settled it) or `UNKNOWN` (not yet observed).","example":"ACTIVE","uniqueKey":"documents.items.[INDEX].state","typeLabel":"enum\u003cstring>"},"recoverable":{"type":"boolean","description":"Whether this document’s value can be recovered through this path. `false` on every EMD: the platform has no EMD refund or void operation, so an ancillary issued as one is not returned by this operation and a person has to recover it.","example":false,"uniqueKey":"documents.items.[INDEX].recoverable","typeLabel":"boolean"}},"uniqueKey":"documents.items.[INDEX]","typeLabel":"object"},"description":"Every document this operation covers, each of them active right now. Ticket subsets are not offered: the operation takes the whole item.","uniqueKey":"documents","typeLabel":"object[]"},"ancillary_recoverable":{"type":"boolean","description":"Whether the ancillaries bought with this ticket come back with it. `false` when any document is an EMD — the platform cannot refund or void one, so that value has to be recovered by a person, and the quote is MANUAL_REQUIRED. Tell the customer before they commit, not after.","example":true,"uniqueKey":"ancillary_recoverable","typeLabel":"boolean"},"not_commitable_reason":{"type":"string","description":"Why `commitable` is false. Today: `manual_required` (a Jinko agent has to act — resubmit with `manual_ok: true`; `manual_reason` says why), `penalty_exceeds_sell` (the penalty is at least what the customer paid), `multi_currency_basis` (the airline prices the refund in a currency the customer was not charged in, so no single figure exists). Two refusals are never values here: a fare the airline will not refund is 409 `not_cancellable` from this preview itself, and an airline with no refund route is 422 `provider_unsupported`. The contract reserves further values (`provider_unsupported`, `funds_unavailable`, `insufficient_time_to_converge`) and new reasons may be added, so treat an unrecognised value as \"not right now\".","example":"manual_required","uniqueKey":"not_commitable_reason","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"seat_refunds":[{"offer_id":"\u003cstring>","seat_number":"12B","status":"pending_airline_refund","amount":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"carrier":"United","message":"Your paid seat will be refunded once United refunds Jinko.","airline_refund_registered":true,"traveler_ref":"pax_1","pax_ref_id":"pax_1"}],"quote_id":"svq_01J7ZR3M8FKX2P9C","quote":"svq_01J7ZR3M8FKX2P9C","state":"completed","commitable":true,"support_level":"AUTO","manual_reason":"fare rules require agent review","operation_kind":"cancel","settlement_basis":"sell_minus_penalty","expires_at":"2026-09-03T12:15:00Z","booked_item_id":"itm_7f2c9a4e8b1d","item":"itm_7f2c9a4e8b1d","refund":{"amount":123,"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50","amount_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"basis":"sell_minus_penalty"},"penalty":{"amount":123,"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50","amount_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"fee_known":true,"breakdown":{"airline_fee":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"non_refundable_taxes":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"used_fare":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"}}},"documents":[{"number":"0012345678901","type":"TKT","state":"ACTIVE","recoverable":false}],"ancillary_recoverable":true,"not_commitable_reason":"manual_required"}}},"exampleType":"generated"}},"exampleType":"generated"},"36970825-8875-4c26-9a22-a1a615708b51":{"description":"Bad request","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":"Malformed JSON in request body.","doc_url":"https://docs.gojinko.com/concepts/errors"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"BAD_REQUEST","message":"Malformed JSON in request body.","doc_url":"https://docs.gojinko.com/concepts/errors"}}}},"exampleType":"examples"}},"exampleType":"examples"},"9e572a5e-24ed-45ac-9236-7594b43db5d5":{"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"},"83cd54fa-22f4-4c34-86d0-be8b9c1e6b3a":{"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"},"6c4d5900-4815-4672-b087-819be9a05fc0":{"description":"Unknown booking, or one this credential may not read.","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":"booking not found"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"NOT_FOUND","message":"booking not found"}}}},"exampleType":"examples"}},"exampleType":"examples"},"33dce4bd-426f-40a0-a2e8-f49997152096":{"description":"The airline will not refund this item as it stands — a non-refundable fare, or every document already voided or refunded. A booking that is no longer active is also refused with `reason_code: booking_not_active` when the caller may service it (any other caller gets the same 404 as for an unknown booking). `code` is `not_cancellable`, as a sibling of `error`. `error.message` is “This booking cannot be cancelled online. Contact Jinko support.” when the airline refused, or the platform’s sentence when the booking is no longer active. There is no quote to show, nothing to commit, and `manual_ok` does not apply. Another operation already in flight on the item (an exchange, a refund or a cancellation) is refused the same way, with `code: active_operation_exists` and `active_operation` naming it: follow it with the status route and preview again once it has finished. A manual request no Jinko agent has picked up yet does not block a preview. A 409 with no `code` beside `error` is not this case — the reference matched more than one booking, or the booking holds several flights and `item_id` named none.","content":{"application/json":{"schema":{"oneOf":[{"type":"object","required":["error","code"],"properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"CONFLICT","isRequired":true,"uniqueKey":"oneOf.0.error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"oneOf.0.error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"oneOf.0.error.doc_url","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"oneOf.0.error","typeLabel":"object"},"code":{"type":"string","enum":["quote_drift","QUOTE_EXPIRED","active_operation_exists","not_cancellable","funds_unavailable","superseded","manual_required","penalty_exceeds_sell","multi_currency_basis"],"description":"Which refusal this is. `manual_required` — the quote needs a Jinko agent and you did not send `manual_ok: true`; resend the same commit with it to hand the operation over. It can also mean the supplier’s totals use inconsistent currencies or decimal places, or the cancellation’s booking fee cannot be established or the booking has already had a completed exchange. These cases require a Jinko operator to complete the cancellation; contact Jinko support with the booking reference. `quote_drift` — your acknowledged figure differs from the still-live quote’s refund. `retry_quote_id` is that same quote’s handle and `current.refund` its figure. Show it to the customer, then commit again with that handle and figure. `QUOTE_EXPIRED` — the quote stopped binding; take a fresh one. `active_operation_exists` — an operation is already running on this booking; poll `active_operation` when present instead of starting a second. `not_cancellable` — usually the airline refuses to refund this ticket as it stands (a non-refundable fare, or every document already voided or refunded), with its reason in `error.message`. When `reason_code` is `already_cancelled`, Jinko already recorded a successful cancellation for this booking; this is not a supplier answer. The preview answers it too, so it is not a commit-only case. `booking_not_active` means the booking is no longer active; `error.message` is the platform’s sentence. `funds_unavailable` — the original payment cannot cover the refund yet; `shortfall` is how much is missing and `blocking` names the refunds that have to settle first. `superseded` — the item this quote named is no longer the live one with the airline (an exchange moved it); preview again; there is no `retry_quote_id`. The last two arrive only on a commit against a quote that already answered `commitable: false`, and repeat that quote’s own `not_commitable_reason`: `penalty_exceeds_sell` — the penalty is at least what the customer paid, so there is nothing to refund; `multi_currency_basis` — the airline prices the refund in a currency the customer was not charged in, so no single figure exists and a Jinko agent has to settle it. In every case NOTHING was sent to the airline.","isRequired":true,"uniqueKey":"oneOf.0.code","typeLabel":"enum\u003cstring>"},"reason_code":{"type":"string","pattern":"^[A-Za-z_]{1,64}$","description":"Machine-readable reason for the servicing refusal. `already_cancelled` means this booking already has a successful cancellation recorded by Jinko; it is not a supplier answer. `booking_not_active` means get_booking returns a booking whose status is failed (for example, after payment), expired_quote, pending or exchange_partial_failure. Refund and hotel servicing routes refuse it with `code: not_cancellable` and a platform sentence in `error.message`, to a caller who may service the booking; any other caller gets the same 404 as for an unknown booking.","example":"already_cancelled","uniqueKey":"oneOf.0.reason_code","typeLabel":"string"},"retry_quote_id":{"type":"string","description":"The quote to commit against when your acknowledged figure differs from a still-live quote’s refund (`quote_drift`). This is the same `quote_id`, not a new one. Show the customer `current.refund`, then commit again with this `quote_id` and that figure. Absent on `QUOTE_EXPIRED`, `superseded`, or a hotel `quote_drift` because the supplier’s policy moved since the quote. Preview again in those cases.","example":"svq_01J8AB4N7GLY3Q0D","uniqueKey":"oneOf.0.retry_quote_id","typeLabel":"string"},"requote":{"type":"string","description":"Deprecated: use `retry_quote_id` instead. Same value.","example":"svq_01J8AB4N7GLY3Q0D","deprecated":true,"uniqueKey":"oneOf.0.requote","typeLabel":"string"},"current":{"type":"object","properties":{"refund":{"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":"oneOf.0.current.refund.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":"oneOf.0.current.refund.value","typeLabel":"integer"},"currency":{"type":"string","description":"ISO 4217 currency code.","example":"USD","uniqueKey":"oneOf.0.current.refund.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":"oneOf.0.current.refund.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":"oneOf.0.current.refund.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":"oneOf.0.current.refund","typeLabel":"object"}},"description":"The quote’s refund, on `quote_drift`. When `retry_quote_id` is present, show this figure to the customer, then commit again with that handle and this figure.","uniqueKey":"oneOf.0.current","typeLabel":"object"},"active_operation":{"type":"string","description":"The operation already running on this booking, on `active_operation_exists`. Present when the running operation belongs to this booking and can be polled with the status route; it may be absent otherwise. Poll it with the status route for its domain — POST /v1/hotel_cancel_status or POST /v1/flight_refund_status.","example":"svc_01J7ZR5Q2KME8V4T","uniqueKey":"oneOf.0.active_operation","typeLabel":"string"},"shortfall":{"type":"object","description":"How much of the refund could not be reserved, on `funds_unavailable`. The refusal is about money still moving on the original payment, not about this booking, so this is the figure that says how much has to clear before a commit can succeed.","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":"oneOf.0.shortfall.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":"oneOf.0.shortfall.value","typeLabel":"integer"},"currency":{"type":"string","description":"ISO 4217 currency code.","example":"USD","uniqueKey":"oneOf.0.shortfall.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":"oneOf.0.shortfall.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":"oneOf.0.shortfall.display","typeLabel":"string"}},"uniqueKey":"oneOf.0.shortfall","typeLabel":"object"},"blocking":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.blocking.items.[INDEX]","typeLabel":"string"},"description":"What is holding that money, on `funds_unavailable`: the refunds already in flight against the same payment, which have to settle before this one can be reserved. Opaque handles — read them as identity, do not parse them. This is what to wait on; without it, \"retry later\" has nothing behind it.","example":["re_3UBIxK2eZvKYlo2C"],"uniqueKey":"oneOf.0.blocking","typeLabel":"string[]"}},"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"},"example":{"error":{"code":"CONFLICT","message":"This booking cannot be cancelled online. Contact Jinko support."},"code":"not_cancellable"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"CONFLICT","message":"This booking cannot be cancelled online. Contact Jinko support."},"code":"not_cancellable"}}},"exampleType":"examples"}},"exampleType":"examples"},"35b39f92-b4e2-421a-8f86-30ee0f463bbf":{"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"},"7c983e9e-3ec1-4288-a0c9-978f7da96b71":{"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"},"fd1caa01-f132-4fe3-a78b-936d37cd5092":{"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"},"bedbc03e-092a-4e52-836e-b64effeb035f":{"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"},"0b835ccc-67ad-4f37-b1dd-e5f6948b20cd":{"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"},"9fa6a3a2-2f4f-458a-89c1-caf0e3a5beab":{"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":{"16d90efc-607a-44c5-be15-e15360b8c369":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","scopes":[],"schemeName":"ApiKeyAuth"}},"cd5e003d-b4ed-4c84-8927-74e01cce3b7b":{"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":"flight-refund-preview - Jinko Platform","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-18T20:06:12.142Z","originalFileLocation":"api/flight-refund-preview.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=\"Preview what cancelling a booked flight (every ticket on the item) would return to the customer\">\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=\"flight-refund-preview - Jinko Platform\">\u003cmeta data-mint-head property=\"og:description\" content=\"Preview what cancelling a booked flight (every ticket on the item) would return to the customer\">\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/flight-refund-preview\">\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=flight-refund-preview\u0026amp;description=Preview+what+cancelling+a+booked+flight+%28every+ticket+on+the+item%29+would+return+to+the+customer\u0026amp;theme=d8471b1916fc5bd660c4c758\u0026amp;signature=ebea83883e916806de592ff7411979f2c333172d4140a8bfe7eee40b44b2081b\">\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=\"flight-refund-preview - Jinko Platform\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Preview what cancelling a booked flight (every ticket on the item) would return to the customer\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://jinko-dev.mintlify.site/_mintlify/api/og/v2?division=Manage\u0026amp;title=flight-refund-preview\u0026amp;description=Preview+what+cancelling+a+booked+flight+%28every+ticket+on+the+item%29+would+return+to+the+customer\u0026amp;theme=d8471b1916fc5bd660c4c758\u0026amp;signature=ebea83883e916806de592ff7411979f2c333172d4140a8bfe7eee40b44b2081b\">\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/flight-refund-preview\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api/flight-refund-preview.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/flight-refund-preview#webpage\",\"url\":\"https://docs.dev.gojinko.com/api/flight-refund-preview\",\"name\":\"flight-refund-preview\",\"description\":\"Preview what cancelling a booked flight (every ticket on the item) would return to the customer\",\"dateModified\":\"2026-10-18T20:06:12.142Z\",\"isPartOf\":{\"@id\":\"https://docs.dev.gojinko.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.dev.gojinko.com/api/flight-refund-preview#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.dev.gojinko.com/api/flight-refund-preview#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\":\"flight-refund-preview\",\"item\":\"https://docs.dev.gojinko.com/api/flight-refund-preview\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.dev.gojinko.com/api/flight-refund-preview#apireference\",\"headline\":\"flight-refund-preview\",\"name\":\"flight-refund-preview\",\"description\":\"Preview what cancelling a booked flight (every ticket on the item) would return to the customer\",\"url\":\"https://docs.dev.gojinko.com/api/flight-refund-preview\",\"mainEntityOfPage\":{\"@id\":\"https://docs.dev.gojinko.com/api/flight-refund-preview#webpage\"},\"dateModified\":\"2026-10-18T20:06:12.142Z\",\"publisher\":{\"@id\":\"https://docs.dev.gojinko.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.dev.gojinko.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Jinko Platform\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Jinko Platform","nav":{"global":null,"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":"/introduction"}]},{"tab":"MCP","pages":[{"title":"MCP","href":"/tools/overview"}]},{"tab":"CLI","pages":[{"title":"CLI","href":"/cli/overview"}]},{"tab":"API reference","groups":[{"group":"Introduction","pages":[{"title":"API reference","href":"/api-reference/introduction"}]},{"group":"Travel Demand","pages":[{"group":"Destination","pages":[{"title":"destination","sidebarTitle":"/v1/destination","openapi":"api-reference/public-api.yaml GET /v1/destination","href":"/api/destination"},{"title":"destination trend","sidebarTitle":"/v1/destination/trend","openapi":"api-reference/public-api.yaml GET /v1/destination/trend","href":"/api/destination/trend"}]},{"group":"Market","pages":[{"title":"market","sidebarTitle":"/v1/market","openapi":"api-reference/public-api.yaml GET /v1/market","href":"/api/market"},{"title":"market trend","sidebarTitle":"/v1/market/trend","openapi":"api-reference/public-api.yaml GET /v1/market/trend","href":"/api/market/trend"}]},{"group":"Audience","pages":[{"title":"audience","sidebarTitle":"/v1/audience","openapi":"api-reference/public-api.yaml GET /v1/audience","href":"/api/audience"},{"title":"audience trend","sidebarTitle":"/v1/audience/trend","openapi":"api-reference/public-api.yaml GET /v1/audience/trend","href":"/api/audience/trend"}]},{"group":"Trend","pages":[{"title":"trend","sidebarTitle":"/v1/trend","openapi":"api-reference/public-api.yaml GET /v1/trend","href":"/api/trend"}]}]},{"group":"Flights","pages":[{"group":"Discovery","pages":[{"title":"find-destination","sidebarTitle":"/v1/find_destination","openapi":"api-reference/public-api.yaml POST /v1/find_destination","href":"/api/find-destination"},{"title":"flight-calendar","sidebarTitle":"/v1/flight_calendar","openapi":"api-reference/public-api.yaml POST /v1/flight_calendar","href":"/api/flight-calendar"},{"title":"find-dates","sidebarTitle":"/v1/find_dates","openapi":"api-reference/public-api.yaml POST /v1/find_dates","href":"/api/find-dates"},{"title":"lowest-fare","sidebarTitle":"/v1/lowest_fare","openapi":"api-reference/public-api.yaml POST /v1/lowest_fare","href":"/api/lowest-fare"},{"title":"price-monitoring","sidebarTitle":"/v1/price_monitoring","openapi":"api-reference/public-api.yaml POST /v1/price_monitoring","href":"/api/price-monitoring"},{"title":"flight-price-advice","sidebarTitle":"/v1/flight_price_advice","openapi":"api-reference/public-api.yaml POST /v1/flight_price_advice","href":"/api/flight-price-advice"}]},{"group":"Search","pages":[{"title":"flight-search","sidebarTitle":"/v1/flight_search","openapi":"api-reference/public-api.yaml POST /v1/flight_search","href":"/api/flight-search"},{"title":"flight-award-search (preview)","sidebarTitle":"/v1/flight_award_search (preview)","openapi":"api-reference/public-api-dev.yaml POST /v1/flight_award_search","href":"/api/flight-award-search"}]},{"group":"Manage","pages":[{"title":"refund check","sidebarTitle":"/v1/refund_check","openapi":"api-reference/public-api.yaml POST /v1/refund_check","deprecated":true,"href":"/api/refund/check"},{"title":"refund commit","sidebarTitle":"/v1/refund_commit","openapi":"api-reference/public-api.yaml POST /v1/refund_commit","deprecated":true,"href":"/api/refund/commit"},{"title":"refund status","sidebarTitle":"/v1/refund_status","openapi":"api-reference/public-api.yaml POST /v1/refund_status","deprecated":true,"href":"/api/refund/status"},{"title":"exchange shop","sidebarTitle":"/v1/exchange_shop","openapi":"api-reference/public-api.yaml POST /v1/exchange_shop","href":"/api/exchange/shop"},{"title":"exchange price","sidebarTitle":"/v1/exchange_price","openapi":"api-reference/public-api.yaml POST /v1/exchange_price","href":"/api/exchange/price"},{"title":"exchange commit","sidebarTitle":"/v1/exchange_commit","openapi":"api-reference/public-api.yaml POST /v1/exchange_commit","href":"/api/exchange/commit"},{"title":"exchange status","sidebarTitle":"/v1/exchange_status","description":"Check the status of an exchange","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","description":"Refund or void a booked flight (every ticket on the item) against a quote the customer accepted","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":"flight-refund-preview - 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"]}