{
"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": "INVALID_PHONE_NUMBER",
"message": "phone number must be in international format with a leading + and country code, for example +12025550147",
"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"
}
}
Trip & Payment
trip
Create and manage a trip: add or remove items and set travelers
POST
/
v1
/
trip
Create and manage a trip: add or remove items and set travelers
curl --request POST \ --url https://api.gojinko.com/v1/trip \ --header 'Content-Type: application/json' \ --header 'X-API-Key: <api-key>' \ --data '{ "trip_id": "trip_1048576", "add_item": { "trip_item_token": "htl_2d67a7441c60e5de", "special_requests": [ "Expected arrival around 11:30 PM.", "A quiet room on a high floor, if available." ] }}'
import requests
url = "https://api.gojinko.com/v1/trip"
payload = {
"trip_id": "trip_1048576",
"add_item": {
"trip_item_token": "htl_2d67a7441c60e5de",
"special_requests": ["Expected arrival around 11:30 PM.", "A quiet room on a high floor, if available."]
}
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)
const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
trip_id: 'trip_1048576',
add_item: {
trip_item_token: 'htl_2d67a7441c60e5de',
special_requests: [
'Expected arrival around 11:30 PM.',
'A quiet room on a high floor, if available.'
]
}
})
};
fetch('https://api.gojinko.com/v1/trip', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
{
"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": "INVALID_PHONE_NUMBER",
"message": "phone number must be in international format with a leading + and country code, for example +12025550147",
"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"
}
}
Assemble and edit a trip before sending it to checkout. Use it to add a flight, hotel, or car rental offer, set traveler details, swap one item for another, or attach ancillaries like bags and seats. Flights, hotels, and rental cars can sit side by side in the same trip and settle through a single checkout. A trip with a car item also needs contact.title (the honorific, for example mr or ms) before checkout.Unified trip management endpoint. In a single call you can add_item (by trip_item_token), remove_item (by item_id), and upsert_travelers (travelers + contact). Omit trip_id to create a new trip; include it to update an existing one. Returns the resulting trip state.Creating or editing a trip does not start pricing. A new item has no price until pricing succeeds. Call checkout to start pricing and wait for its result. Polling GET /v1/trip/{trip_id} after creation does not initiate a quote. A missing price means unpriced, never free.Ancillaries are selected on a separate endpoint. See select-ancillaries.A trip lapses after 24 hours with no activity, and the offers and quote inside it expire sooner. See Lifetimes and expiry.
Optional primary adult room-contact overrides keyed by the returned hotel item_id/product_id. Each product array is non-empty and occupancy_number values are unique positive room slots; omitted slots use persisted adult travelers in order with the trip contact email. The trip must already exist because the keys refer to its items.
Where the trip is in its lifecycle, as one value for the whole trip. The booking’s progress after payment is booking_state (GET /v1/trip/{trip_id}); the four booking values below (fulfilling, fulfilled, partially_fulfilled, failed) are deprecated in favour of it and still sent. draft: being built or priced, nothing paid. fulfilling: payment was submitted and booking started. Then exactly one outcome: fulfilled (booking_statecompleted), partially_fulfilled (partial) or failed (failed). cancelled: replaced by a new trip when it was re-shopped. expired: the trip lapsed under a limit that no longer applies. A trip left unpaid stays open, so no new trip reaches this state. On an expired trip, adding items, setting travelers and checkout are refused with TRIP_EXPIRED; any other state that refuses a write answers TRIP_STATE_CONFLICT and names the state here. Start a new trip — an expired one cannot be revived. quoting, quoted and fulfillment_prepared are reserved and not currently set; quote progress is in quote.status.
Optional primary adult room-contact overrides keyed by the returned hotel item_id/product_id. Each product array is non-empty and occupancy_number values are unique positive room slots; omitted slots use persisted adult travelers in order with the trip contact email. The trip must already exist because the keys refer to its items.
{"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/trip","slug":"/api/trip","pageMetadata":{"title":"trip","sidebarTitle":"/v1/trip","description":"Create and manage a trip: add or remove items and set travelers","openapi":"api-reference/public-api.yaml POST /v1/trip","href":"/api/trip"},"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: \"Create and manage a trip: add or remove items and set travelers\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,p:`p`,strong:`strong`,..._provideComponents(),...props.components};return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Assemble and edit a trip before sending it to checkout. Use it to add a flight, hotel, or car rental offer, set traveler details, swap one item for another, or attach ancillaries like bags and seats. Flights, hotels, and rental cars can sit side by side in the same trip and settle through a single checkout. A trip with a car item also needs `,_jsx(_components.code,{children:`contact.title`}),` (the honorific, for example `,_jsx(_components.code,{children:`mr`}),` or `,_jsx(_components.code,{children:`ms`}),`) before checkout.`]}),`\n`,_jsxs(_components.p,{children:[`Unified trip management endpoint. In a single call you can `,_jsx(_components.code,{children:`add_item`}),` (by `,_jsx(_components.code,{children:`trip_item_token`}),`), `,_jsx(_components.code,{children:`remove_item`}),` (by `,_jsx(_components.code,{children:`item_id`}),`), and `,_jsx(_components.code,{children:`upsert_travelers`}),` (travelers + contact). Omit `,_jsx(_components.code,{children:`trip_id`}),` to create a new trip; include it to update an existing one. Returns the resulting trip state.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Creating or editing a trip does not start pricing.`}),` A new item has no `,_jsx(_components.code,{children:`price`}),` until pricing succeeds. Call `,_jsx(_components.a,{href:`/api/checkout`,children:`checkout`}),` to start pricing and wait for its result. Polling `,_jsx(_components.code,{children:`GET /v1/trip/{trip_id}`}),` after creation does not initiate a quote. A missing price means unpriced, never free.`]}),`\n`,_jsxs(_components.p,{children:[`Ancillaries are selected on a separate endpoint. See `,_jsx(_components.a,{href:`/api/select-ancillaries`,children:`select-ancillaries`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`A trip lapses after 24 hours with no activity, and the offers and quote inside it expire sooner. See `,_jsx(_components.a,{href:`/concepts/overview#lifetimes-and-expiry`,children:`Lifetimes and expiry`}),`.`]})]})}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":"trip","sidebarTitle":"/v1/trip","description":"Create and manage a trip: add or remove items and set travelers","openapi":"api-reference/public-api.yaml POST /v1/trip","href":"/api/trip"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Pricing \u0026 booking"],"summary":"Create and manage a trip: add or remove items and set travelers","description":"Create and manage a trip: add or remove items and set travelers","security":["2d76e7ca-2f73-454f-9d0d-582ca51bc035","1f4e38b5-0948-44e0-a4ab-234124079618"],"requestBody":"f33e46ec-ad45-4dcf-8b42-3490d695715a","responses":{"200":"9e5518e8-7ed5-4eed-885b-1f71999c3755","400":"33b20be2-e282-4596-be0f-5e6a65b9c4a2","401":"c3e0c318-3dc9-461e-9fa2-6891374fc8ab","402":"2f7dc4e0-9503-4e2e-90e4-5451c9ddbde9","404":"45246397-f985-435c-8f31-9750d8a46575","409":"5fa3908b-03ae-414b-8513-a30eea48c5ab","410":"df4ae3f7-609b-4fff-80c9-05f29ddfeb42","422":"aa0d7bce-2db7-4397-b711-4dc1d8a60ee1","429":"52dbcc66-770a-41bb-b825-51dff5ae01b7","502":"a264e525-0b0b-4969-9b52-b5cf27b9101a","503":"5a001c7b-0523-4044-bc40-16503dfb0744","504":"d217e951-37df-4cfe-acce-4b024285bbf7"},"method":"post","type":"path","servers":["6c2e2c14-8667-4ef1-a6c7-d1e7fb982378","0b2c8592-7b6b-4acc-9351-2a69f3e0f42a"],"path":"/v1/trip","baseUrlOptions":["https://api.gojinko.com","https://api.sandbox.gojinko.com"],"title":"Create and manage a trip: add or remove items and set travelers","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"trip_id":{"type":"string","uniqueKey":"trip_id","typeLabel":"string"},"add_item":{"type":"object","properties":{"trip_item_token":{"type":"string","isRequired":true,"uniqueKey":"add_item.trip_item_token","typeLabel":"string"},"special_requests":{"type":"array","items":{"type":"string","maxLength":500,"uniqueKey":"add_item.special_requests.items.[INDEX]","typeLabel":"string"},"maxItems":10,"description":"HOTEL ITEMS ONLY. Free-text special requests for the property, one per entry — late arrival, quiet room, high floor, bedding preference, non-smoking room, baby cot, accessibility needs. They apply to the whole stay and are forwarded to the hotel supplier with the booking as REQUESTS ONLY: neither Jinko nor the supplier guarantees them, and a confirmed booking does not mean the hotel will honour them. At most 10 entries of 500 characters each and 1500 characters in total, counted after trimming; blank entries are dropped. Ignored on flight and ground items. Echoed back on the item as `special_requests`, trimmed and without the blank entries (JIN-2499).","example":["Expected arrival around 11:30 PM.","A quiet room on a high floor, if available."],"uniqueKey":"add_item.special_requests","typeLabel":"string[]"}},"required":["trip_item_token"],"uniqueKey":"add_item","typeLabel":"object"},"remove_item":{"type":"object","properties":{"item_id":{"type":"string","isRequired":true,"uniqueKey":"remove_item.item_id","typeLabel":"string"}},"required":["item_id"],"uniqueKey":"remove_item","typeLabel":"object"},"upsert_travelers":{"type":"object","properties":{"travelers":{"type":"array","items":{"type":"object","properties":{"first_name":{"type":"string","description":"For flights, the airline must be able to print the name on the ticket: Latin letters (accents allowed), spaces, hyphens and apostrophes only. The last name holds at most 29 characters (the airline cannot ticket a longer surname), and first, middle and last name together at most 63. Two travellers in one trip cannot share the same full name. A name that breaks these rules is refused at upsert_travelers or checkout with 400 BAD_REQUEST and `error.field` naming the traveller.","isRequired":true,"uniqueKey":"upsert_travelers.travelers.items.[INDEX].first_name","typeLabel":"string"},"last_name":{"type":"string","description":"For flights, the airline must be able to print the name on the ticket: Latin letters (accents allowed), spaces, hyphens and apostrophes only. The last name holds at most 29 characters (the airline cannot ticket a longer surname), and first, middle and last name together at most 63. Two travellers in one trip cannot share the same full name. A name that breaks these rules is refused at upsert_travelers or checkout with 400 BAD_REQUEST and `error.field` naming the traveller.","isRequired":true,"uniqueKey":"upsert_travelers.travelers.items.[INDEX].last_name","typeLabel":"string"},"traveler_type":{"type":"string","enum":["adult","child","infant"],"description":"Accepted in either case (`Adult` reads as `adult`). For flights, the traveller's age on the date the booking ages travellers on decides the type — the trip's first flight, or for some bookings the return flight of a round trip: `adult` 12 or older, `child` 2 to 11, `infant` under 2, and an `infant` must still be under 2 on the trip's last flight. A type the `date_of_birth` contradicts is refused at upsert_travelers (once the trip holds the flight) or at checkout with 400 BAD_REQUEST and `error.field` naming the traveller. A flight searched for another party is re-priced for these travellers at checkout, on the same flights and fare family; when that fare is not sold for them, checkout answers 409 `OFFER_UNAVAILABLE`. Each hotel in the trip is booked with these travellers (a `room_bundle` hotel whose rooms `hotel_room_guests` names is booked for those room guests instead), so they cannot name more adults or more children than its rooms were priced for (the hotel_search `occupancies`: `adults` and `children_ages`), and each child's age at check-in must be one of the priced `children_ages`. The hotel counts a traveller by age at check-in, 18 or older being an adult, and a traveller with no `date_of_birth` as an adult. upsert_travelers or checkout answers 400 BAD_REQUEST naming the first traveller over a count or with an age the room was not priced for; search the hotel again for the party.","isRequired":true,"uniqueKey":"upsert_travelers.travelers.items.[INDEX].traveler_type","typeLabel":"enum\u003cstring>"},"date_of_birth":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Date of birth (YYYY-MM-DD, nothing before or after it). Required for flights, and for a `child` or `infant` staying at a hotel; optional for an adult on a hotel-only trip. For flights it cannot be in the future and must agree with `traveler_type` on the trip's flight dates; otherwise upsert_travelers or checkout answers 400 BAD_REQUEST with `error.field` naming the traveller and field.","uniqueKey":"upsert_travelers.travelers.items.[INDEX].date_of_birth","typeLabel":"string"},"gender":{"type":"string","enum":["MALE","FEMALE"],"description":"Required for flights; optional for hotel-only trips. Accepted in either case (`male` reads as `MALE`).","uniqueKey":"upsert_travelers.travelers.items.[INDEX].gender","typeLabel":"enum\u003cstring>"},"nationality":{"type":"string","uniqueKey":"upsert_travelers.travelers.items.[INDEX].nationality","typeLabel":"string"},"passport_number":{"type":"string","uniqueKey":"upsert_travelers.travelers.items.[INDEX].passport_number","typeLabel":"string"},"passport_expiry":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Passport expiry (YYYY-MM-DD, nothing before or after it). For flights it cannot be before the trip's last flight; otherwise upsert_travelers or checkout answers 400 BAD_REQUEST with `error.field` naming the traveller.","uniqueKey":"upsert_travelers.travelers.items.[INDEX].passport_expiry","typeLabel":"string"},"passport_country":{"type":"string","uniqueKey":"upsert_travelers.travelers.items.[INDEX].passport_country","typeLabel":"string"},"frequent_flyer":{"type":"object","properties":{"airline":{"type":"string","description":"IATA code of the loyalty program issuer (e.g. `LH` for Lufthansa Miles \u0026 More), not necessarily the operating carrier — alliances credit miles on partner flights.","example":"LH","isRequired":true,"uniqueKey":"upsert_travelers.travelers.items.[INDEX].frequent_flyer.airline","typeLabel":"string"},"number":{"type":"string","description":"Membership / account number for that loyalty program.","example":"992100100","isRequired":true,"uniqueKey":"upsert_travelers.travelers.items.[INDEX].frequent_flyer.number","typeLabel":"string"}},"required":["airline","number"],"description":"Optional per-passenger frequent-flyer membership so airline miles are credited on the booking. Flights only; when present, both airline and number are required.","uniqueKey":"upsert_travelers.travelers.items.[INDEX].frequent_flyer","typeLabel":"object"},"known_traveler_number":{"type":"string","description":"US trusted-traveler Known Traveler Number (TSA PreCheck / Global Entry). Flights only; sent to the airline as Secure Flight data so PreCheck eligibility prints on the boarding pass.","example":"998765432","uniqueKey":"upsert_travelers.travelers.items.[INDEX].known_traveler_number","typeLabel":"string"},"known_traveler_issuing_country":{"type":"string","description":"ISO 3166-1 alpha-2 country that issued the Known Traveler Number. Defaults to `US` downstream; ignored without known_traveler_number.","example":"US","uniqueKey":"upsert_travelers.travelers.items.[INDEX].known_traveler_issuing_country","typeLabel":"string"},"redress_number":{"type":"string","description":"DHS redress control number (TRIP program). Flights only; sent to the airline as Secure Flight data.","example":"1234567","uniqueKey":"upsert_travelers.travelers.items.[INDEX].redress_number","typeLabel":"string"},"redress_issuing_country":{"type":"string","description":"ISO 3166-1 alpha-2 country that issued the redress number. Defaults to `US` downstream; ignored without redress_number.","example":"US","uniqueKey":"upsert_travelers.travelers.items.[INDEX].redress_issuing_country","typeLabel":"string"}},"required":["first_name","last_name","traveler_type"],"uniqueKey":"upsert_travelers.travelers.items.[INDEX]","typeLabel":"object"},"description":"Travelers on the trip (replaces all). Required to complete a booking; the first traveler also supplies the booking contact name.","isRequired":true,"uniqueKey":"upsert_travelers.travelers","typeLabel":"object[]"},"contact":{"type":"object","properties":{"email":{"type":"string","format":"email","description":"Contact email for booking confirmations. A trip with a flight needs it before payment: without a contact email, checkout answers 422 `MISSING_CUSTOMER_DETAILS` with `email` in `missing_fields`.","isRequired":true,"uniqueKey":"upsert_travelers.contact.email","typeLabel":"string\u003cemail>"},"phone":{"type":"string","description":"Contact phone in international format: a leading `+` and country code, e.g. `+12025550147`. Spaces, hyphens, dots and parentheses are accepted and removed. A number without the leading `+` is rejected with `INVALID_PHONE_NUMBER`. Required to complete a booking.","example":"+12025550147","isRequired":true,"uniqueKey":"upsert_travelers.contact.phone","typeLabel":"string"},"title":{"type":"string","description":"Honorific of the booking contact (e.g. \"mr\", \"ms\", \"mx\"). Free text, resolved downstream per provider. Required to book a car rental; optional otherwise.","example":"mr","uniqueKey":"upsert_travelers.contact.title","typeLabel":"string"},"flight_number":{"type":"string","description":"The driver's arriving flight for a CAR rental, as an IATA flight designator: a two- or three-character airline code then 1 to 4 digits and an optional letter (`BA472`, `AF1234`, `RUS1727`). Spaces and hyphens are accepted and removed; a value that is not a designator is rejected with `INVALID_FLIGHT_NUMBER`. Always optional — a car offer's `pick_up.requires_flight_number` says whether the rental desk asks for one, and a quote lists `flight_number` in that item's required details, but no branch policy blocks checkout without it. Supply it when you have it: the rental company can then hold the car for a delayed flight. Ignored by flights, hotels and ground.","example":"BA472","uniqueKey":"upsert_travelers.contact.flight_number","typeLabel":"string"}},"required":["email","phone"],"description":"Booking contact (email + phone, optionally title). Optional while building the trip, but required before booking.","uniqueKey":"upsert_travelers.contact","typeLabel":"object"}},"required":["travelers"],"uniqueKey":"upsert_travelers","typeLabel":"object"},"hotel_room_guests":{"type":"object","additionalProperties":{"type":"array","items":{"type":"object","properties":{"occupancy_number":{"type":"integer","minimum":1,"description":"Stable one-based room slot within the selected room bundle.","example":1,"isRequired":true,"uniqueKey":"hotel_room_guests.additionalProperties.items.[INDEX].occupancy_number","typeLabel":"integer"},"first_name":{"type":"string","isRequired":true,"uniqueKey":"hotel_room_guests.additionalProperties.items.[INDEX].first_name","typeLabel":"string"},"last_name":{"type":"string","isRequired":true,"uniqueKey":"hotel_room_guests.additionalProperties.items.[INDEX].last_name","typeLabel":"string"},"email":{"type":"string","format":"email","isRequired":true,"uniqueKey":"hotel_room_guests.additionalProperties.items.[INDEX].email","typeLabel":"string\u003cemail>"}},"required":["occupancy_number","first_name","last_name","email"],"additionalProperties":false,"uniqueKey":"hotel_room_guests.additionalProperties.items.[INDEX]","typeLabel":"object"},"minItems":1,"uniqueKey":"hotel_room_guests.additionalProperties","typeLabel":"object[]"},"description":"Optional primary adult room-contact overrides keyed by the returned hotel item_id/product_id. Each product array is non-empty and occupancy_number values are unique positive room slots; omitted slots use persisted adult travelers in order with the trip contact email. The trip must already exist because the keys refer to its items.","uniqueKey":"hotel_room_guests","typeLabel":"object"},"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":{"trip_id":"trip_1048576","add_item":{"trip_item_token":"htl_2d67a7441c60e5de","special_requests":["Expected arrival around 11:30 PM.","A quiet room on a high floor, if available."]}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"trip_id":"trip_1048576","add_item":{"trip_item_token":"htl_2d67a7441c60e5de","special_requests":["Expected arrival around 11:30 PM.","A quiet room on a high floor, if available."]}}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"9e5518e8-7ed5-4eed-885b-1f71999c3755":{"description":"The trip","content":{"application/json":{"schema":{"type":"object","properties":{"trip_id":{"type":"string","example":"trip_1048576","isRequired":true,"uniqueKey":"trip_id","typeLabel":"string"},"status":{"type":"string","enum":["draft","quoting","quoted","fulfillment_prepared","fulfilling","fulfilled","partially_fulfilled","failed","cancelled","expired"],"description":"Where the trip is in its lifecycle, as one value for the whole trip. The booking’s progress after payment is `booking_state` (GET /v1/trip/{trip_id}); the four booking values below (`fulfilling`, `fulfilled`, `partially_fulfilled`, `failed`) are deprecated in favour of it and still sent. `draft`: being built or priced, nothing paid. `fulfilling`: payment was submitted and booking started. Then exactly one outcome: `fulfilled` (`booking_state` `completed`), `partially_fulfilled` (`partial`) or `failed` (`failed`). `cancelled`: replaced by a new trip when it was re-shopped. `expired`: the trip lapsed under a limit that no longer applies. A trip left unpaid stays open, so no new trip reaches this state. On an expired trip, adding items, setting travelers and checkout are refused with `TRIP_EXPIRED`; any other state that refuses a write answers `TRIP_STATE_CONFLICT` and names the state here. Start a new trip — an expired one cannot be revived. `quoting`, `quoted` and `fulfillment_prepared` are reserved and not currently set; quote progress is in `quote.status`.","example":"draft","uniqueKey":"status","typeLabel":"enum\u003cstring>"},"actions_performed":{"type":"array","items":{"type":"string","uniqueKey":"actions_performed.items.[INDEX]","typeLabel":"string"},"example":["created","add_item"],"uniqueKey":"actions_performed","typeLabel":"string[]"},"items":{"type":"array","items":{"type":"object","properties":{"collector":{"type":"string","enum":["jinko","supplier"],"description":"Who charges the card: Jinko (merchant of record) or the supplier (channel mode).","uniqueKey":"\\items.items.[INDEX].collector","typeLabel":"enum\u003cstring>"},"item_id":{"type":"string","example":"itm_4b91c2","uniqueKey":"\\items.items.[INDEX].item_id","typeLabel":"string"},"kind":{"type":"string","description":"What the item is: \"flight\", \"hotel\", \"car\" or \"ground\". Same field name as on get_trip and checkout.","example":"flight","uniqueKey":"\\items.items.[INDEX].kind","typeLabel":"string"},"type":{"type":"string","description":"Deprecated: use `kind` (same value).","deprecated":true,"example":"flight","uniqueKey":"\\items.items.[INDEX].type","typeLabel":"string"},"description":{"type":"string","description":"A summary of the selected item.","uniqueKey":"\\items.items.[INDEX].description","typeLabel":"string"},"offer_id":{"type":"string","description":"Deprecated: use `trip_item_token` instead. The offer handle this item was created from, exactly as it was submitted to `trip(add_item)`. On a hotel item it is the `htl_…` rate token; on a flight item it is the `offer_id` of the search result the token came from. One caveat when reconciling: on a hotel whose occupancy the provider re-shopped, this stays the token you SUBMITTED even though the priced rate moved. A trip never holds two flights the same travellers cannot both take: adding a flight whose segments overlap a flight already in the trip, another fare of the same flights included, is refused with 409 naming the item already there.","example":"htl_2d67a7441c60e5de","deprecated":true,"uniqueKey":"\\items.items.[INDEX].offer_id","typeLabel":"string"},"trip_item_token":{"type":"string","description":"The handle `trip(add_item)` took, echoed verbatim. On a hotel or car item it is the offer’s `trip_item_token` from the search. On a flight item it is the itinerary id and the fare joined by a colon, absent when the fare half was never resolved (a caller-supplied snapshot skips the resolver); read that absence as \"the platform cannot name the fare\", never as a different fare.","example":"of_9c1d2e:FARE_ABC","uniqueKey":"\\items.items.[INDEX].trip_item_token","typeLabel":"string"},"hotel_id":{"type":"string","description":"The property this hotel item books — the same id `hotel_search` publishes, so an item joins straight back to the search result it came from. Hotel items only.","example":"lp1f2c3","uniqueKey":"\\items.items.[INDEX].hotel_id","typeLabel":"string"},"special_requests":{"type":"array","items":{"type":"string","uniqueKey":"\\items.items.[INDEX].special_requests.items.[INDEX]","typeLabel":"string"},"description":"The special requests submitted with `trip(add_item)` for this hotel item, as stored — trimmed, blank entries dropped — and forwarded to the hotel supplier at booking. Requests only — the hotel may not honour them, and a confirmed booking does not imply it will. Hotel items only; absent when none were given (JIN-2499).","uniqueKey":"\\items.items.[INDEX].special_requests","typeLabel":"string[]"},"booking_scope":{"type":"string","description":"`room_bundle` means the submitted hotel offer token covers every room in `rooms`. Absent on every other hotel item, a single room included: read `rooms` for the rooms an item covers, and `booking_scope` only to learn whether one token books them all.","example":"room_bundle","uniqueKey":"\\items.items.[INDEX].booking_scope","typeLabel":"string"},"num_rooms":{"type":"integer","minimum":1,"description":"Number of rooms this hotel item covers: 1 for a single room, the bundle size for a room bundle. Hotel items only; absent when the platform cannot state the party the item was priced for.","example":1,"uniqueKey":"\\items.items.[INDEX].num_rooms","typeLabel":"integer"},"rooms":{"type":"array","items":{"type":"object","properties":{"occupancy_number":{"type":"integer","minimum":1,"description":"Stable one-based room slot within this bundle.","example":1,"isRequired":true,"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].occupancy_number","typeLabel":"integer"},"occupancy":{"type":"object","properties":{"adults":{"type":"integer","minimum":1,"isRequired":true,"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].occupancy.adults","typeLabel":"integer"},"children_ages":{"type":"array","items":{"type":"integer","minimum":0,"maximum":17,"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].occupancy.children_ages.items.[INDEX]","typeLabel":"integer"},"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].occupancy.children_ages","typeLabel":"integer[]"}},"required":["adults"],"description":"The party one room is requested or priced for: the number of adults and the age of each child.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].occupancy","typeLabel":"object"},"room_id":{"type":"string","uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].room_id","typeLabel":"string"},"mapped_room_id":{"type":"integer","uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].mapped_room_id","typeLabel":"integer"},"room_name":{"type":"string","example":"Superior Double","uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].room_name","typeLabel":"string"},"rate_id":{"type":"string","uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].rate_id","typeLabel":"string"},"board_type":{"type":"string","example":"BB","uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].board_type","typeLabel":"string"},"board_name":{"type":"string","example":"Breakfast Included","uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].board_name","typeLabel":"string"},"max_occupancy":{"type":"integer","uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].max_occupancy","typeLabel":"integer"},"taxes_and_fees":{"type":"array","items":{"type":"object","properties":{"amount":{"type":"number","description":"Deprecated: use `amount_money` instead. The tax in MAJOR units of `currency`.","example":164.49,"deprecated":true,"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].amount","typeLabel":"number"},"currency":{"type":"string","description":"Deprecated: use `amount_money` instead. The currency of `amount`.","example":"EUR","deprecated":true,"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].currency","typeLabel":"string"},"amount_money":{"type":"object","description":"The tax. When the supplier named no currency for the line, it is the currency the rate is priced in.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].amount_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].amount_money.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].amount_money.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].amount_money.display","typeLabel":"string"}},"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].amount_money","typeLabel":"object"},"description":{"type":"string","description":"The provider’s own wording for the tax. Free text, not a code.","example":"19, VAT National taxes on accommodation","uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].description","typeLabel":"string"},"included":{"type":"boolean","description":"True when the amount is ALREADY inside `total_amount_money`; false when the guest pays it at the property on top. Getting this backwards misquotes the trip.","example":true,"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].included","typeLabel":"boolean"},"display":{"type":"string","description":"Deprecated: use `amount_money` instead. The same figure as a string ready to show: the ISO 4217 code, a space, then the amount, e.g. \"USD 159.77\". With decimal_places it is written at exactly that scale (value 1561500, JPY, decimal_places 2 is \"JPY 15615.00\"); without, at the ISO digits of the currency. Show this; compute with the number. Absent when the figure is not money (a cancellation step expressed as a percent or a number of nights) or could not be read unambiguously.","example":"EUR 164.49","deprecated":true,"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX].display","typeLabel":"string"}},"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].taxes_and_fees.items.[INDEX]","typeLabel":"object"},"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].taxes_and_fees","typeLabel":"object[]"},"policies":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX].type","typeLabel":"string"},"description":{"type":"string","uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX].description","typeLabel":"string"},"fee_amount":{"type":"number","description":"Deprecated: use `fee_amount_money` instead. Customer policy fee in MAJOR units of `fee_currency`.","deprecated":true,"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX].fee_amount","typeLabel":"number"},"fee_currency":{"type":"string","description":"Deprecated: use `fee_amount_money` instead. The currency of `fee_amount`.","deprecated":true,"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX].fee_currency","typeLabel":"string"},"fee_amount_money":{"type":"object","description":"Customer cancellation or policy fee, with exact minor units and currency precision.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX].fee_amount_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX].fee_amount_money.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX].fee_amount_money.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX].fee_amount_money.display","typeLabel":"string"}},"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX].fee_amount_money","typeLabel":"object"}},"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].policies.items.[INDEX]","typeLabel":"object"},"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].policies","typeLabel":"object[]"},"is_refundable":{"type":"boolean","uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].is_refundable","typeLabel":"boolean"},"cancellation_policy":{"type":"array","items":{"type":"object","properties":{"cancel_time":{"type":"string","description":"Deadline after which this tier applies. RFC 3339 with the supplier’s declared UTC offset. Steps whose deadline has no declared timezone are omitted from the ladder — the platform never invents an offset — so a schedule can be shorter than the supplier’s own. Tiers are chronological, earliest first, so the first entry is the deadline that matters.","example":"2026-08-18T10:00:00+02:00","uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].cancel_time","typeLabel":"string"},"amount":{"type":"number","description":"Deprecated: use `amount_money` instead. Read `amount_money`, `percent` or `nights`, whichever this step carries. What the guest is charged on or after `cancel_time`: a sum in MAJOR units of `currency`, a percentage or a number of nights, as `type` says.","example":606.13,"deprecated":true,"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].amount","typeLabel":"number"},"currency":{"type":"string","description":"Deprecated: use `amount_money` instead. The currency of `amount`.","example":"EUR","deprecated":true,"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].currency","typeLabel":"string"},"type":{"type":"string","description":"How the charge is expressed — a sum (\"amount\", \"flat_fee\"; read `amount_money`), a percentage (\"percent\", \"percentage\"; read `percent`) or a number of nights (\"nights\"; read `nights`).","example":"amount","uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].type","typeLabel":"string"},"display":{"type":"string","description":"Deprecated: use `amount_money` instead. The same figure as a string ready to show: the ISO 4217 code, a space, then the amount, e.g. \"USD 159.77\". With decimal_places it is written at exactly that scale (value 1561500, JPY, decimal_places 2 is \"JPY 15615.00\"); without, at the ISO digits of the currency. Show this; compute with the number. Absent when the figure is not money (a cancellation step expressed as a percent or a number of nights) or could not be read unambiguously.","example":"EUR 606.13","deprecated":true,"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].display","typeLabel":"string"},"amount_money":{"type":"object","description":"What the guest is charged on or after `cancel_time`, when this step is a sum. Absent on a percentage or nights step, and when the supplier named no currency.","required":["value","currency","decimal_places","display"],"properties":{"value":{"type":"integer","description":"Integer amount in MINOR units at the ISO 4217 digits of `currency`: divide by 10 ** decimal_places to get the amount. Signed where the field says so (a price change delta).","example":41250,"isRequired":true,"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].amount_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].amount_money.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"The ISO 4217 digits of `currency` (2 for USD/EUR, 0 for JPY/KRW, 3 for BHD/KWD), and the scale of `value`.","example":2,"isRequired":true,"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].amount_money.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount at `decimal_places`, e.g. \"USD 412.50\". Show this; compute with `value`.","example":"USD 412.50","isRequired":true,"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].amount_money.display","typeLabel":"string"}},"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].amount_money","typeLabel":"object"},"percent":{"type":"number","description":"The charge as a percentage of the stay price, when this step is a percentage, on the 0–100 scale the supplier states it in: 50 is half the stay price, 100 the whole of it. Never a 0–1 fraction. Absent otherwise.","example":50,"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].percent","typeLabel":"number"},"nights":{"type":"number","description":"The charge as a number of nights of the stay, when this step is expressed in nights. Absent otherwise.","example":1,"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX].nights","typeLabel":"number"}},"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].cancellation_policy.items.[INDEX]","typeLabel":"object"},"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].cancellation_policy","typeLabel":"object[]"},"free_cancellation_until":{"type":"string","uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].free_cancellation_until","typeLabel":"string"},"payment_types":{"type":"array","items":{"type":"string","enum":["pay_now","pay_at_property","deposit"],"description":"How the rate can be settled. `pay_now` — paid when the booking is made. `pay_at_property` — paid to the hotel at the property. `deposit` — a deposit is taken.","uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].payment_types.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"How the rate can be settled. Each value appears at most once.","example":["pay_now"],"uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].payment_types","typeLabel":"enum\u003cstring>[]"},"remarks":{"type":"string","uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX].remarks","typeLabel":"string"}},"required":["occupancy_number","occupancy"],"description":"One room of a hotel item — the single room a one-room item books, or one slot of a room-bundle rate — with the party it was priced for (`occupancy`) and its display and policy details. The containing item owns the customer-facing total; supplier net, suggested retail, commission and room-local supplier price figures are intentionally not part of this public shape.","uniqueKey":"\\items.items.[INDEX].rooms.items.[INDEX]","typeLabel":"object"},"description":"One entry per room this hotel item covers, single room or bundle (JIN-2565). Each entry states in `occupancy` the party that room was priced for — adults and children’s ages — so a checkout page can show the guest who the rate is for before payment, and a wrong child age, which changes the price and the room, is caught before the money moves. On a single room the entry’s room, board, refundability and tax lines are the item’s own, the same figures `hotel_terms` states; on a room bundle each entry carries that room’s details from the supplier. The item price remains the authoritative customer total for every room together. Absent when the platform holds no party for the item.","uniqueKey":"\\items.items.[INDEX].rooms","typeLabel":"object[]"},"price":{"type":"number","description":"Deprecated: use `price_money` instead. Item total as a number in major currency units, with currency in the separate `currency` field. Absent until pricing is available; absence does not mean free.","example":545.55,"deprecated":true,"uniqueKey":"\\items.items.[INDEX].price","typeLabel":"number"},"currency":{"type":"string","description":"Deprecated: use `price_money` instead. ISO currency code for the item price. Absent until pricing is available.","example":"EUR","deprecated":true,"uniqueKey":"\\items.items.[INDEX].currency","typeLabel":"string"},"price_display":{"type":"string","description":"Deprecated: use `price_money` instead. The item price as a string ready to show, when X-Money-Display: iso is requested.","example":"EUR 545.55","deprecated":true,"uniqueKey":"\\items.items.[INDEX].price_display","typeLabel":"string"},"price_money":{"type":"object","description":"Item total. Absent until pricing is available; absence does not mean free.","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":"\\items.items.[INDEX].price_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"\\items.items.[INDEX].price_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":"\\items.items.[INDEX].price_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":"\\items.items.[INDEX].price_money.display","typeLabel":"string"}},"uniqueKey":"\\items.items.[INDEX].price_money","typeLabel":"object"}},"uniqueKey":"\\items.items.[INDEX]","typeLabel":"object"},"uniqueKey":"\\items","typeLabel":"object[]"},"travelers":{"type":"array","items":{"type":"object","properties":{"traveler_ref":{"type":"string","description":"The reference to send as `traveler_ref` when selecting a per-traveler ancillary: `pax_\u003cN>`, the traveler's 1-based position in `travelers`.","example":"pax_1","uniqueKey":"travelers.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":"travelers.items.[INDEX].pax_ref_id","typeLabel":"string"},"first_name":{"type":"string","example":"John","uniqueKey":"travelers.items.[INDEX].first_name","typeLabel":"string"},"last_name":{"type":"string","example":"Doe","uniqueKey":"travelers.items.[INDEX].last_name","typeLabel":"string"},"date_of_birth":{"type":"string","example":"1990-01-15","uniqueKey":"travelers.items.[INDEX].date_of_birth","typeLabel":"string"},"gender":{"type":"string","example":"MALE","uniqueKey":"travelers.items.[INDEX].gender","typeLabel":"string"},"traveler_type":{"type":"string","enum":["adult","child","infant"],"example":"adult","uniqueKey":"travelers.items.[INDEX].traveler_type","typeLabel":"enum\u003cstring>"},"passenger_type":{"type":"string","description":"Deprecated: use `traveler_type` instead. The same type in uppercase.","example":"ADULT","deprecated":true,"uniqueKey":"travelers.items.[INDEX].passenger_type","typeLabel":"string"},"identity_documents":{"type":"object","properties":{"passport":{"type":"object","properties":{"status":{"type":"string","description":"`absent`: none of the document's fields were sent. `saved`: stored, and sent to the airline with the flight booking (this does not mean the airline accepted it). `invalid`: received, but it cannot be sent as is, so the booking goes ahead without it; `invalid_fields` names what to correct. More values may be added: treat one you do not know as not usable.","example":"saved","isRequired":true,"uniqueKey":"travelers.items.[INDEX].identity_documents.passport.status","typeLabel":"string"},"invalid_fields":{"type":"array","items":{"type":"string","uniqueKey":"travelers.items.[INDEX].identity_documents.passport.invalid_fields.items.[INDEX]","typeLabel":"string"},"description":"The missing or failing fields, by their `upsert_travelers` names. Sent only when `status` is `invalid`.","example":["passport_expiry"],"uniqueKey":"travelers.items.[INDEX].identity_documents.passport.invalid_fields","typeLabel":"string[]"}},"required":["status"],"isRequired":true,"uniqueKey":"travelers.items.[INDEX].identity_documents.passport","typeLabel":"object"},"known_traveler_number":{"type":"object","properties":{"status":{"type":"string","description":"`absent`: none of the document's fields were sent. `saved`: stored, and sent to the airline with the flight booking (this does not mean the airline accepted it). `invalid`: received, but it cannot be sent as is, so the booking goes ahead without it; `invalid_fields` names what to correct. More values may be added: treat one you do not know as not usable.","example":"saved","isRequired":true,"uniqueKey":"travelers.items.[INDEX].identity_documents.known_traveler_number.status","typeLabel":"string"},"invalid_fields":{"type":"array","items":{"type":"string","uniqueKey":"travelers.items.[INDEX].identity_documents.known_traveler_number.invalid_fields.items.[INDEX]","typeLabel":"string"},"description":"The missing or failing fields, by their `upsert_travelers` names. Sent only when `status` is `invalid`.","example":["passport_expiry"],"uniqueKey":"travelers.items.[INDEX].identity_documents.known_traveler_number.invalid_fields","typeLabel":"string[]"}},"required":["status"],"isRequired":true,"uniqueKey":"travelers.items.[INDEX].identity_documents.known_traveler_number","typeLabel":"object"},"redress_number":{"type":"object","properties":{"status":{"type":"string","description":"`absent`: none of the document's fields were sent. `saved`: stored, and sent to the airline with the flight booking (this does not mean the airline accepted it). `invalid`: received, but it cannot be sent as is, so the booking goes ahead without it; `invalid_fields` names what to correct. More values may be added: treat one you do not know as not usable.","example":"saved","isRequired":true,"uniqueKey":"travelers.items.[INDEX].identity_documents.redress_number.status","typeLabel":"string"},"invalid_fields":{"type":"array","items":{"type":"string","uniqueKey":"travelers.items.[INDEX].identity_documents.redress_number.invalid_fields.items.[INDEX]","typeLabel":"string"},"description":"The missing or failing fields, by their `upsert_travelers` names. Sent only when `status` is `invalid`.","example":["passport_expiry"],"uniqueKey":"travelers.items.[INDEX].identity_documents.redress_number.invalid_fields","typeLabel":"string[]"}},"required":["status"],"isRequired":true,"uniqueKey":"travelers.items.[INDEX].identity_documents.redress_number","typeLabel":"object"}},"required":["passport","known_traveler_number","redress_number"],"description":"Whether each travel document sent on `upsert_travelers` was saved and will be sent with a flight booking. The passport, Known Traveler and redress numbers themselves are not returned. `upsert_travelers` replaces the whole traveler list, so a document left out of a later upsert reads `absent`.","uniqueKey":"travelers.items.[INDEX].identity_documents","typeLabel":"object"}},"description":"A traveler stored on the trip. A `frequent_flyer` sent on write is echoed back alongside these when present; travel documents are reported in `identity_documents`, without their values.","uniqueKey":"travelers.items.[INDEX]","typeLabel":"object"},"uniqueKey":"travelers","typeLabel":"object[]"},"contact":{"type":"object","properties":{"email":{"type":"string","uniqueKey":"contact.email","typeLabel":"string"},"phone":{"type":"string","uniqueKey":"contact.phone","typeLabel":"string"},"title":{"type":"string","uniqueKey":"contact.title","typeLabel":"string"}},"uniqueKey":"contact","typeLabel":"object"},"hotel_room_guests":{"type":"object","additionalProperties":{"type":"array","items":{"type":"object","properties":{"occupancy_number":{"type":"integer","minimum":1,"description":"Stable one-based room slot within the selected room bundle.","example":1,"isRequired":true,"uniqueKey":"hotel_room_guests.additionalProperties.items.[INDEX].occupancy_number","typeLabel":"integer"},"first_name":{"type":"string","isRequired":true,"uniqueKey":"hotel_room_guests.additionalProperties.items.[INDEX].first_name","typeLabel":"string"},"last_name":{"type":"string","isRequired":true,"uniqueKey":"hotel_room_guests.additionalProperties.items.[INDEX].last_name","typeLabel":"string"},"email":{"type":"string","format":"email","isRequired":true,"uniqueKey":"hotel_room_guests.additionalProperties.items.[INDEX].email","typeLabel":"string\u003cemail>"}},"required":["occupancy_number","first_name","last_name","email"],"additionalProperties":false,"uniqueKey":"hotel_room_guests.additionalProperties.items.[INDEX]","typeLabel":"object"},"minItems":1,"uniqueKey":"hotel_room_guests.additionalProperties","typeLabel":"object[]"},"description":"Optional primary adult room-contact overrides keyed by the returned hotel item_id/product_id. Each product array is non-empty and occupancy_number values are unique positive room slots; omitted slots use persisted adult travelers in order with the trip contact email. The trip must already exist because the keys refer to its items.","uniqueKey":"hotel_room_guests","typeLabel":"object"},"totals":{"type":"object","properties":{"currency":{"type":"string","description":"Deprecated: use `total_money` instead. ISO currency code of `total`.","deprecated":true,"uniqueKey":"totals.currency","typeLabel":"string"},"total":{"type":"number","description":"Deprecated: use `total_money` instead. The trip total in major currency units. Absent on a mixed-currency trip.","deprecated":true,"uniqueKey":"totals.total","typeLabel":"number"},"total_display":{"type":"string","description":"Deprecated: use `total_money` instead. The trip total as a string ready to show, e.g. \"USD 318.40\". Absent with `total`.","example":"USD 318.40","deprecated":true,"uniqueKey":"totals.total_display","typeLabel":"string"},"total_money":{"type":"object","description":"The trip total. Absent when the trip holds items priced in more than one currency, and while nothing is priced.","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":"totals.total_money.value","typeLabel":"integer"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency code.","example":"USD","isRequired":true,"uniqueKey":"totals.total_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":"totals.total_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":"totals.total_money.display","typeLabel":"string"}},"uniqueKey":"totals.total_money","typeLabel":"object"}},"example":{"currency":"USD","total":318.4},"uniqueKey":"totals","typeLabel":"object"}},"required":["trip_id"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"trip_id":"trip_1048576","status":"draft","actions_performed":["created","add_item"],"items":[{"collector":"jinko","item_id":"itm_4b91c2","kind":"flight","type":"flight","description":"\u003cstring>","offer_id":"htl_2d67a7441c60e5de","trip_item_token":"of_9c1d2e:FARE_ABC","hotel_id":"lp1f2c3","special_requests":["\u003cstring>"],"booking_scope":"room_bundle","num_rooms":1,"rooms":[{"occupancy_number":1,"occupancy":{"adults":2,"children_ages":[8]},"room_id":"\u003cstring>","mapped_room_id":123,"room_name":"Superior Double","rate_id":"\u003cstring>","board_type":"BB","board_name":"Breakfast Included","max_occupancy":123,"taxes_and_fees":[{"amount":164.49,"currency":"EUR","amount_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"description":"19, VAT National taxes on accommodation","included":true,"display":"EUR 164.49"}],"policies":[{"type":"\u003cstring>","description":"\u003cstring>","fee_amount":123,"fee_currency":"\u003cstring>","fee_amount_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"}}],"is_refundable":true,"cancellation_policy":[{"cancel_time":"2026-08-18T10:00:00+02:00","amount":606.13,"currency":"EUR","type":"amount","display":"EUR 606.13","amount_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"percent":50,"nights":1}],"free_cancellation_until":"\u003cstring>","payment_types":["pay_now"],"remarks":"\u003cstring>"}],"price":545.55,"currency":"EUR","price_display":"EUR 545.55","price_money":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"}}],"travelers":[{"traveler_ref":"pax_1","pax_ref_id":"pax_1","first_name":"John","last_name":"Doe","date_of_birth":"1990-01-15","gender":"MALE","traveler_type":"adult","passenger_type":"ADULT","identity_documents":{"passport":{"status":"saved","invalid_fields":["passport_expiry"]},"known_traveler_number":{"status":"saved","invalid_fields":["passport_expiry"]},"redress_number":{"status":"saved","invalid_fields":["passport_expiry"]}}}],"contact":{"email":"\u003cstring>","phone":"\u003cstring>","title":"\u003cstring>"},"hotel_room_guests":{},"totals":{"currency":"USD","total":318.4}}}},"exampleType":"generated"}},"exampleType":"generated"},"33b20be2-e282-4596-be0f-5e6a65b9c4a2":{"description":"The request was refused. Invalid traveller names at `upsert_travelers` are refused with `BAD_REQUEST` and `error.field` naming the traveller. **`BAD_REQUEST`** — The request was malformed or failed validation. Fix the request as the message describes; retrying it unchanged cannot succeed.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["INVALID_SEGMENTS_TO_EXCHANGE","PARTIAL_EXCHANGE_UNSUPPORTED","LEG_ALREADY_DEPARTED","DEPARTURE_DATE_IN_PAST","LEG_DATES_OUT_OF_ORDER","INVALID_EXCHANGE_REQUEST","NOT_EXCHANGEABLE","CREDENTIAL_FORMAT_INVALID","PAYMENT_TYPE_NOT_ENABLED","PAYMENT_CREDENTIAL_INVALID","TRIP_OWNED_BY_OTHER_PAYMENT","IDEMPOTENCY_KEY_REUSED","ATTEMPT_IN_PROGRESS","ATTEMPT_TERMINAL","TEMPORARILY_UNAVAILABLE","AUTH_REQUIRED","PAYMENT_REQUIRED","RATE_LIMITED","BAD_REQUEST","FORBIDDEN","NOT_FOUND","CONFLICT","GONE","QUOTE_PENDING","QUOTE_EXPIRED","TRIP_EXPIRED","TRIP_STATE_CONFLICT","OFFER_EXPIRED","OFFER_UNAVAILABLE","MISSING_CUSTOMER_DETAILS","INVALID_PHONE_NUMBER","INVALID_FLIGHT_NUMBER","CURRENCY_UNSUPPORTED","HOTEL_NAME_LOW_CONFIDENCE","DESTINATION_LOW_CONFIDENCE","UPSTREAM_REJECTED","UPSTREAM_UNAVAILABLE","UPSTREAM_TIMEOUT","UPSTREAM_ERROR","INTERNAL"],"description":"What went wrong, as a stable machine-readable code. This is a closed set — branch on it rather than on `message`, which is prose and may change. New codes arrive in a minor version, so treat an unknown one as its HTTP status. A code can also stop being emitted: it leaves this set in a minor version, named in the changelog, and a branch you wrote for it goes unreached rather than wrong.","example":"BAD_REQUEST","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"What went wrong, in prose. These codes always carry the same message, and it never includes text from a supplier: `RATE_LIMITED` — \"Too many requests. Retry after the Retry-After delay.\"; `OFFER_EXPIRED` — \"This offer has expired. Search again.\"; `OFFER_UNAVAILABLE` — \"This offer is no longer available. Search again.\"; `UPSTREAM_REJECTED` — \"The request was declined for this offer. Try another offer.\"; `UPSTREAM_UNAVAILABLE` — \"The service is temporarily unavailable. Retry after the Retry-After delay.\"; `UPSTREAM_TIMEOUT` — \"The request timed out before a result was available. Retry the request.\"; `UPSTREAM_ERROR` — \"The request could not be completed.\".","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"error.doc_url","typeLabel":"string"},"field":{"type":"string","description":"On a 400 `BAD_REQUEST` that names one refused input: the path of that field in your request, e.g. `selections[1].quantity` for the second selection of a `select_ancillaries` call. Absent when the refusal names no single field.","example":"selections[1].quantity","uniqueKey":"error.field","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"BAD_REQUEST","message":"\u003cstring>","doc_url":"\u003cstring>","field":"selections[1].quantity"}}}},"exampleType":"generated"}},"exampleType":"generated"},"c3e0c318-3dc9-461e-9fa2-6891374fc8ab":{"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"},"2f7dc4e0-9503-4e2e-90e4-5451c9ddbde9":{"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"},"45246397-f985-435c-8f31-9750d8a46575":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["INVALID_SEGMENTS_TO_EXCHANGE","PARTIAL_EXCHANGE_UNSUPPORTED","LEG_ALREADY_DEPARTED","DEPARTURE_DATE_IN_PAST","LEG_DATES_OUT_OF_ORDER","INVALID_EXCHANGE_REQUEST","NOT_EXCHANGEABLE","CREDENTIAL_FORMAT_INVALID","PAYMENT_TYPE_NOT_ENABLED","PAYMENT_CREDENTIAL_INVALID","TRIP_OWNED_BY_OTHER_PAYMENT","IDEMPOTENCY_KEY_REUSED","ATTEMPT_IN_PROGRESS","ATTEMPT_TERMINAL","TEMPORARILY_UNAVAILABLE","AUTH_REQUIRED","PAYMENT_REQUIRED","RATE_LIMITED","BAD_REQUEST","FORBIDDEN","NOT_FOUND","CONFLICT","GONE","QUOTE_PENDING","QUOTE_EXPIRED","TRIP_EXPIRED","TRIP_STATE_CONFLICT","OFFER_EXPIRED","OFFER_UNAVAILABLE","MISSING_CUSTOMER_DETAILS","INVALID_PHONE_NUMBER","INVALID_FLIGHT_NUMBER","CURRENCY_UNSUPPORTED","HOTEL_NAME_LOW_CONFIDENCE","DESTINATION_LOW_CONFIDENCE","UPSTREAM_REJECTED","UPSTREAM_UNAVAILABLE","UPSTREAM_TIMEOUT","UPSTREAM_ERROR","INTERNAL"],"description":"What went wrong, as a stable machine-readable code. This is a closed set — branch on it rather than on `message`, which is prose and may change. New codes arrive in a minor version, so treat an unknown one as its HTTP status. A code can also stop being emitted: it leaves this set in a minor version, named in the changelog, and a branch you wrote for it goes unreached rather than wrong.","example":"BAD_REQUEST","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"What went wrong, in prose. These codes always carry the same message, and it never includes text from a supplier: `RATE_LIMITED` — \"Too many requests. Retry after the Retry-After delay.\"; `OFFER_EXPIRED` — \"This offer has expired. Search again.\"; `OFFER_UNAVAILABLE` — \"This offer is no longer available. Search again.\"; `UPSTREAM_REJECTED` — \"The request was declined for this offer. Try another offer.\"; `UPSTREAM_UNAVAILABLE` — \"The service is temporarily unavailable. Retry after the Retry-After delay.\"; `UPSTREAM_TIMEOUT` — \"The request timed out before a result was available. Retry the request.\"; `UPSTREAM_ERROR` — \"The request could not be completed.\".","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"error.doc_url","typeLabel":"string"},"field":{"type":"string","description":"On a 400 `BAD_REQUEST` that names one refused input: the path of that field in your request, e.g. `selections[1].quantity` for the second selection of a `select_ancillaries` call. Absent when the refusal names no single field.","example":"selections[1].quantity","uniqueKey":"error.field","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"NOT_FOUND","message":"Resource not found.","doc_url":"https://docs.gojinko.com/concepts/errors"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"NOT_FOUND","message":"Resource not found.","doc_url":"https://docs.gojinko.com/concepts/errors"}}}},"exampleType":"examples"}},"exampleType":"examples"},"5fa3908b-03ae-414b-8513-a30eea48c5ab":{"description":"The trip refused the write, and nothing was changed — `updated_at` is untouched. A flight whose segments overlap a flight already in the trip is refused with `CONFLICT`; the message names the item already there, which the traveller removes first to choose another fare or flight. **`TRIP_EXPIRED`** — The trip lapsed under a limit that no longer applies and accepts no more writes. Start a new trip and add the items again. A lapsed trip cannot be revived. **`TRIP_STATE_CONFLICT`** — The trip is in a state that refuses this operation: payment already started (`fulfilling`, `fulfilled`, `partially_fulfilled`), or it is `cancelled` or `failed`. Read `status` and act on it: read the trip to find the booking that already exists, or start a new trip. Nothing was written. **`CONFLICT`** — The resource's current state refuses the operation. Re-read the resource and act on what it says — never retry blindly.","content":{"application/json":{"schema":{"oneOf":[{"type":"object","required":["error"],"properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["TRIP_EXPIRED","TRIP_STATE_CONFLICT"],"isRequired":true,"uniqueKey":"oneOf.0.error.code","typeLabel":"enum\u003cstring>"},"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"},"status":{"type":"string","enum":["draft","quoting","quoted","fulfillment_prepared","fulfilling","fulfilled","partially_fulfilled","failed","cancelled","expired"],"description":"The trip state that refused the write. `expired` on TRIP_EXPIRED; on TRIP_STATE_CONFLICT it is whichever state the trip is actually in. Nothing was changed, so re-reading the trip returns this same state.","example":"expired","uniqueKey":"oneOf.0.status","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.0","typeLabel":"object"},{"type":"object","required":["error"],"properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["INVALID_SEGMENTS_TO_EXCHANGE","PARTIAL_EXCHANGE_UNSUPPORTED","LEG_ALREADY_DEPARTED","DEPARTURE_DATE_IN_PAST","LEG_DATES_OUT_OF_ORDER","INVALID_EXCHANGE_REQUEST","NOT_EXCHANGEABLE","CREDENTIAL_FORMAT_INVALID","PAYMENT_TYPE_NOT_ENABLED","PAYMENT_CREDENTIAL_INVALID","TRIP_OWNED_BY_OTHER_PAYMENT","IDEMPOTENCY_KEY_REUSED","ATTEMPT_IN_PROGRESS","ATTEMPT_TERMINAL","TEMPORARILY_UNAVAILABLE","AUTH_REQUIRED","PAYMENT_REQUIRED","RATE_LIMITED","BAD_REQUEST","FORBIDDEN","NOT_FOUND","CONFLICT","GONE","QUOTE_PENDING","QUOTE_EXPIRED","TRIP_EXPIRED","TRIP_STATE_CONFLICT","OFFER_EXPIRED","OFFER_UNAVAILABLE","MISSING_CUSTOMER_DETAILS","INVALID_PHONE_NUMBER","INVALID_FLIGHT_NUMBER","CURRENCY_UNSUPPORTED","HOTEL_NAME_LOW_CONFIDENCE","DESTINATION_LOW_CONFIDENCE","UPSTREAM_REJECTED","UPSTREAM_UNAVAILABLE","UPSTREAM_TIMEOUT","UPSTREAM_ERROR","INTERNAL"],"description":"What went wrong, as a stable machine-readable code. This is a closed set — branch on it rather than on `message`, which is prose and may change. New codes arrive in a minor version, so treat an unknown one as its HTTP status. A code can also stop being emitted: it leaves this set in a minor version, named in the changelog, and a branch you wrote for it goes unreached rather than wrong.","example":"BAD_REQUEST","isRequired":true,"uniqueKey":"oneOf.1.error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"What went wrong, in prose. These codes always carry the same message, and it never includes text from a supplier: `RATE_LIMITED` — \"Too many requests. Retry after the Retry-After delay.\"; `OFFER_EXPIRED` — \"This offer has expired. Search again.\"; `OFFER_UNAVAILABLE` — \"This offer is no longer available. Search again.\"; `UPSTREAM_REJECTED` — \"The request was declined for this offer. Try another offer.\"; `UPSTREAM_UNAVAILABLE` — \"The service is temporarily unavailable. Retry after the Retry-After delay.\"; `UPSTREAM_TIMEOUT` — \"The request timed out before a result was available. Retry the request.\"; `UPSTREAM_ERROR` — \"The request could not be completed.\".","isRequired":true,"uniqueKey":"oneOf.1.error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"oneOf.1.error.doc_url","typeLabel":"string"},"field":{"type":"string","description":"On a 400 `BAD_REQUEST` that names one refused input: the path of that field in your request, e.g. `selections[1].quantity` for the second selection of a `select_ancillaries` call. Absent when the refusal names no single field.","example":"selections[1].quantity","uniqueKey":"oneOf.1.error.field","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"oneOf.1.error","typeLabel":"object"}},"uniqueKey":"oneOf.1","typeLabel":"object"}],"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"TRIP_EXPIRED","message":"This trip has expired and cannot be modified.","doc_url":"https://docs.gojinko.com/concepts/errors"},"status":"expired"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"TRIP_EXPIRED","message":"This trip has expired and cannot be modified.","doc_url":"https://docs.gojinko.com/concepts/errors"},"status":"expired"}}},"exampleType":"examples"}},"exampleType":"examples"},"df4ae3f7-609b-4fff-80c9-05f29ddfeb42":{"description":"The offer named in the request is no longer available, or another resource the request names is gone. Tell the two apart by `error.code`. **`OFFER_EXPIRED`** — The search offer is no longer usable: its token expired, or the supplier rejected it as expired or missing during pricing and the same product could not be found again. No payable quote was established. Search again, replace the unavailable item using the latest search result, and check out promptly. Show that the flight offer is no longer available; do not describe this as an established quote expiring (QUOTE_EXPIRED). **`GONE`** — The resource this request names existed and no longer does. Re-acquire it — search again, or check out again to re-quote — then retry with the new identifier. Repeating this request with the same one cannot succeed.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["INVALID_SEGMENTS_TO_EXCHANGE","PARTIAL_EXCHANGE_UNSUPPORTED","LEG_ALREADY_DEPARTED","DEPARTURE_DATE_IN_PAST","LEG_DATES_OUT_OF_ORDER","INVALID_EXCHANGE_REQUEST","NOT_EXCHANGEABLE","CREDENTIAL_FORMAT_INVALID","PAYMENT_TYPE_NOT_ENABLED","PAYMENT_CREDENTIAL_INVALID","TRIP_OWNED_BY_OTHER_PAYMENT","IDEMPOTENCY_KEY_REUSED","ATTEMPT_IN_PROGRESS","ATTEMPT_TERMINAL","TEMPORARILY_UNAVAILABLE","AUTH_REQUIRED","PAYMENT_REQUIRED","RATE_LIMITED","BAD_REQUEST","FORBIDDEN","NOT_FOUND","CONFLICT","GONE","QUOTE_PENDING","QUOTE_EXPIRED","TRIP_EXPIRED","TRIP_STATE_CONFLICT","OFFER_EXPIRED","OFFER_UNAVAILABLE","MISSING_CUSTOMER_DETAILS","INVALID_PHONE_NUMBER","INVALID_FLIGHT_NUMBER","CURRENCY_UNSUPPORTED","HOTEL_NAME_LOW_CONFIDENCE","DESTINATION_LOW_CONFIDENCE","UPSTREAM_REJECTED","UPSTREAM_UNAVAILABLE","UPSTREAM_TIMEOUT","UPSTREAM_ERROR","INTERNAL"],"description":"What went wrong, as a stable machine-readable code. This is a closed set — branch on it rather than on `message`, which is prose and may change. New codes arrive in a minor version, so treat an unknown one as its HTTP status. A code can also stop being emitted: it leaves this set in a minor version, named in the changelog, and a branch you wrote for it goes unreached rather than wrong.","example":"BAD_REQUEST","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"What went wrong, in prose. These codes always carry the same message, and it never includes text from a supplier: `RATE_LIMITED` — \"Too many requests. Retry after the Retry-After delay.\"; `OFFER_EXPIRED` — \"This offer has expired. Search again.\"; `OFFER_UNAVAILABLE` — \"This offer is no longer available. Search again.\"; `UPSTREAM_REJECTED` — \"The request was declined for this offer. Try another offer.\"; `UPSTREAM_UNAVAILABLE` — \"The service is temporarily unavailable. Retry after the Retry-After delay.\"; `UPSTREAM_TIMEOUT` — \"The request timed out before a result was available. Retry the request.\"; `UPSTREAM_ERROR` — \"The request could not be completed.\".","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"error.doc_url","typeLabel":"string"},"field":{"type":"string","description":"On a 400 `BAD_REQUEST` that names one refused input: the path of that field in your request, e.g. `selections[1].quantity` for the second selection of a `select_ancillaries` call. Absent when the refusal names no single field.","example":"selections[1].quantity","uniqueKey":"error.field","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"BAD_REQUEST","message":"\u003cstring>","doc_url":"\u003cstring>","field":"selections[1].quantity"}}}},"exampleType":"generated"}},"exampleType":"generated"},"aa0d7bce-2db7-4397-b711-4dc1d8a60ee1":{"description":"The request failed validation. Tell the causes apart by `error.code`. **`BAD_REQUEST`** — The request was malformed or failed validation. Fix the request as the message describes; retrying it unchanged cannot succeed. **`INVALID_PHONE_NUMBER`** — A phone number is not in international format: it has no leading `+` and country code, is not a possible number, or carries an extension. Nothing was written. Resend the number with a leading `+` and country code, for example `+12025550147`. Spaces, hyphens, dots and parentheses are accepted and removed.","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":"INVALID_PHONE_NUMBER","message":"phone number must be in international format with a leading + and country code, for example +12025550147","doc_url":"https://docs.gojinko.com/concepts/errors"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"INVALID_PHONE_NUMBER","message":"phone number must be in international format with a leading + and country code, for example +12025550147","doc_url":"https://docs.gojinko.com/concepts/errors"}}}},"exampleType":"examples"}},"exampleType":"examples"},"52dbcc66-770a-41bb-b825-51dff5ae01b7":{"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"},"a264e525-0b0b-4969-9b52-b5cf27b9101a":{"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"},"5a001c7b-0523-4044-bc40-16503dfb0744":{"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"},"d217e951-37df-4cfe-acce-4b024285bbf7":{"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":{"2d76e7ca-2f73-454f-9d0d-582ca51bc035":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","scopes":[],"schemeName":"ApiKeyAuth"}},"1f4e38b5-0948-44e0-a4ab-234124079618":{"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":"trip - Jinko Platform","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-17T23:48:47.613Z","originalFileLocation":"api/trip.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=\"Create and manage a trip: add or remove items and set travelers\">\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=\"trip - Jinko Platform\">\u003cmeta data-mint-head property=\"og:description\" content=\"Create and manage a trip: add or remove items and set travelers\">\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/trip\">\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=Trip+%26+Payment\u0026amp;title=trip\u0026amp;description=Create+and+manage+a+trip%3A+add+or+remove+items+and+set+travelers\u0026amp;theme=d8471b1916fc5bd660c4c758\u0026amp;signature=f80b0da544e9e5204df65ed587cd41749f8de092bac1ddc0edbe391a17b43fa5\">\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=\"trip - Jinko Platform\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Create and manage a trip: add or remove items and set travelers\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://jinko-dev.mintlify.site/_mintlify/api/og/v2?division=Trip+%26+Payment\u0026amp;title=trip\u0026amp;description=Create+and+manage+a+trip%3A+add+or+remove+items+and+set+travelers\u0026amp;theme=d8471b1916fc5bd660c4c758\u0026amp;signature=f80b0da544e9e5204df65ed587cd41749f8de092bac1ddc0edbe391a17b43fa5\">\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/trip\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api/trip.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/trip#webpage\",\"url\":\"https://docs.dev.gojinko.com/api/trip\",\"name\":\"trip\",\"description\":\"Create and manage a trip: add or remove items and set travelers\",\"dateModified\":\"2026-10-17T23:48:47.613Z\",\"isPartOf\":{\"@id\":\"https://docs.dev.gojinko.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.dev.gojinko.com/api/trip#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.dev.gojinko.com/api/trip#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Jinko Platform\",\"item\":\"https://docs.dev.gojinko.com\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"trip\",\"item\":\"https://docs.dev.gojinko.com/api/trip\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.dev.gojinko.com/api/trip#apireference\",\"headline\":\"trip\",\"name\":\"trip\",\"description\":\"Create and manage a trip: add or remove items and set travelers\",\"url\":\"https://docs.dev.gojinko.com/api/trip\",\"mainEntityOfPage\":{\"@id\":\"https://docs.dev.gojinko.com/api/trip#webpage\"},\"dateModified\":\"2026-10-17T23:48:47.613Z\",\"publisher\":{\"@id\":\"https://docs.dev.gojinko.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.dev.gojinko.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Jinko Platform\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Jinko Platform","nav":{"global":null,"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":"/introduction"}]},{"tab":"MCP","pages":[{"title":"MCP","href":"/tools/overview"}]},{"tab":"CLI","pages":[{"title":"CLI","href":"/cli/overview"}]},{"tab":"API reference","groups":[{"group":"Introduction","pages":[{"title":"API reference","href":"/api-reference/introduction"}]},{"group":"Travel Demand","pages":[{"group":"Destination","pages":[{"title":"destination","sidebarTitle":"/v1/destination","openapi":"api-reference/public-api.yaml GET /v1/destination","href":"/api/destination"},{"title":"destination trend","sidebarTitle":"/v1/destination/trend","openapi":"api-reference/public-api.yaml GET /v1/destination/trend","href":"/api/destination/trend"}]},{"group":"Market","pages":[{"title":"market","sidebarTitle":"/v1/market","openapi":"api-reference/public-api.yaml GET /v1/market","href":"/api/market"},{"title":"market trend","sidebarTitle":"/v1/market/trend","openapi":"api-reference/public-api.yaml GET /v1/market/trend","href":"/api/market/trend"}]},{"group":"Audience","pages":[{"title":"audience","sidebarTitle":"/v1/audience","openapi":"api-reference/public-api.yaml GET /v1/audience","href":"/api/audience"},{"title":"audience trend","sidebarTitle":"/v1/audience/trend","openapi":"api-reference/public-api.yaml GET /v1/audience/trend","href":"/api/audience/trend"}]},{"group":"Trend","pages":[{"title":"trend","sidebarTitle":"/v1/trend","openapi":"api-reference/public-api.yaml GET /v1/trend","href":"/api/trend"}]}]},{"group":"Flights","pages":[{"group":"Discovery","pages":[{"title":"find-destination","sidebarTitle":"/v1/find_destination","openapi":"api-reference/public-api.yaml POST /v1/find_destination","href":"/api/find-destination"},{"title":"flight-calendar","sidebarTitle":"/v1/flight_calendar","openapi":"api-reference/public-api.yaml POST /v1/flight_calendar","href":"/api/flight-calendar"},{"title":"find-dates","sidebarTitle":"/v1/find_dates","openapi":"api-reference/public-api.yaml POST /v1/find_dates","href":"/api/find-dates"},{"title":"lowest-fare","sidebarTitle":"/v1/lowest_fare","openapi":"api-reference/public-api.yaml POST /v1/lowest_fare","href":"/api/lowest-fare"},{"title":"price-monitoring","sidebarTitle":"/v1/price_monitoring","openapi":"api-reference/public-api.yaml POST /v1/price_monitoring","href":"/api/price-monitoring"},{"title":"flight-price-advice","sidebarTitle":"/v1/flight_price_advice","openapi":"api-reference/public-api.yaml POST /v1/flight_price_advice","href":"/api/flight-price-advice"}]},{"group":"Search","pages":[{"title":"flight-search","sidebarTitle":"/v1/flight_search","openapi":"api-reference/public-api.yaml POST /v1/flight_search","href":"/api/flight-search"},{"title":"flight-award-search (preview)","sidebarTitle":"/v1/flight_award_search (preview)","openapi":"api-reference/public-api-dev.yaml POST /v1/flight_award_search","href":"/api/flight-award-search"}]},{"group":"Manage","pages":[{"title":"refund check","sidebarTitle":"/v1/refund_check","openapi":"api-reference/public-api.yaml POST /v1/refund_check","deprecated":true,"href":"/api/refund/check"},{"title":"refund commit","sidebarTitle":"/v1/refund_commit","openapi":"api-reference/public-api.yaml POST /v1/refund_commit","deprecated":true,"href":"/api/refund/commit"},{"title":"refund status","sidebarTitle":"/v1/refund_status","openapi":"api-reference/public-api.yaml POST /v1/refund_status","deprecated":true,"href":"/api/refund/status"},{"title":"exchange shop","sidebarTitle":"/v1/exchange_shop","openapi":"api-reference/public-api.yaml POST /v1/exchange_shop","href":"/api/exchange/shop"},{"title":"exchange price","sidebarTitle":"/v1/exchange_price","openapi":"api-reference/public-api.yaml POST /v1/exchange_price","href":"/api/exchange/price"},{"title":"exchange commit","sidebarTitle":"/v1/exchange_commit","openapi":"api-reference/public-api.yaml POST /v1/exchange_commit","href":"/api/exchange/commit"},{"title":"exchange status","sidebarTitle":"/v1/exchange_status","openapi":"api-reference/public-api.yaml POST /v1/exchange_status","href":"/api/exchange/status"},{"title":"flight-refund-preview","sidebarTitle":"/v1/flight_refund_preview","openapi":"api-reference/public-api.yaml POST /v1/flight_refund_preview","href":"/api/flight-refund-preview"},{"title":"flight-refund-commit","sidebarTitle":"/v1/flight_refund_commit","openapi":"api-reference/public-api.yaml POST /v1/flight_refund_commit","href":"/api/flight-refund-commit"},{"title":"flight-refund-status","sidebarTitle":"/v1/flight_refund_status","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","description":"Check the status of a car rental cancellation","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","description":"Select ancillaries (baggage, seats, meals) for a trip item","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":"trip - 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"]}