{
"error": {
"code": "BAD_REQUEST",
"message": "The request was declined for these inputs. Check the dates, places and travellers, then retry."
}
}
{
"error": {
"code": "AUTH_REQUIRED",
"message": "Invalid or expired API key.",
"doc_url": "https://docs.gojinko.com/authentication/api-keys"
}
}
{
"error": {
"code": "PAYMENT_REQUIRED",
"message": "Insufficient balance — this call costs $0.0150 and your organization has $0.0000 available. Top up at https://dashboard.gojinko.com/developers/billing/topup",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"error": {
"code": "CONFLICT",
"message": "The operation conflicts with the current state of the resource.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"error": {
"code": "GONE",
"message": "The resource no longer exists.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"error": {
"code": "BAD_REQUEST",
"message": "A required field is missing or invalid.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"error": {
"code": "RATE_LIMITED",
"message": "Too many requests. Retry after the Retry-After delay.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"error": {
"code": "UPSTREAM_REJECTED",
"message": "The request was declined for this offer. Try another offer.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"error": {
"code": "UPSTREAM_UNAVAILABLE",
"message": "The service is temporarily unavailable. Retry after the Retry-After delay.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"error": {
"code": "UPSTREAM_TIMEOUT",
"message": "The request timed out before a result was available. Retry the request.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
Search
flight-search
Get live flight pricing, search by route, or re-price a known offer
POST
/
v1
/
flight_search
Get live flight pricing — search by route, or re-price a known offer
{
"error": {
"code": "BAD_REQUEST",
"message": "The request was declined for these inputs. Check the dates, places and travellers, then retry."
}
}
{
"error": {
"code": "AUTH_REQUIRED",
"message": "Invalid or expired API key.",
"doc_url": "https://docs.gojinko.com/authentication/api-keys"
}
}
{
"error": {
"code": "PAYMENT_REQUIRED",
"message": "Insufficient balance — this call costs $0.0150 and your organization has $0.0000 available. Top up at https://dashboard.gojinko.com/developers/billing/topup",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"error": {
"code": "CONFLICT",
"message": "The operation conflicts with the current state of the resource.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"error": {
"code": "GONE",
"message": "The resource no longer exists.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"error": {
"code": "BAD_REQUEST",
"message": "A required field is missing or invalid.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"error": {
"code": "RATE_LIMITED",
"message": "Too many requests. Retry after the Retry-After delay.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"error": {
"code": "UPSTREAM_REJECTED",
"message": "The request was declined for this offer. Try another offer.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"error": {
"code": "UPSTREAM_UNAVAILABLE",
"message": "The service is temporarily unavailable. Retry after the Retry-After delay.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
{
"error": {
"code": "UPSTREAM_TIMEOUT",
"message": "The request timed out before a result was available. Retry the request.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}
Fetch live, bookable pricing for a specific route and date pair. Use it once the user has settled on exact travel dates, for example “Paris to New York departing June 1 returning June 8 in economy”. It also reprices an offer surfaced earlier by the calendar or destination tools so you can confirm availability before adding it to a trip.
Search mode: filter-based live search by origin, destination, departure_date, and passengers. Returns priced offers, each fare carrying a trip_item_token you can add to a trip.
Reprice mode: pass an offer_token from discovery (find_destination, flight_calendar) to re-price that specific offer before adding it to a trip. Route and filter fields are not allowed beside offer_token.
The CLI mirrors this: pass --offer-token for reprice mode, omit it for search mode.
Omit cabin_class or send null when the user has not requested a cabin. Providers search economy by default, and the response can include other recognized cabins they return.Send economy, premium_economy, business, or first only when the user explicitly chooses that cabin. Jinko filters returned fares to match the cabin on the itinerary’s longest segment. Shorter connections may use another cabin; check segment details when presenting a mixed-cabin itinerary.
When a live search finds no offers that match the current filters, the endpoint returns HTTP 200 with offers: [], result: "no_matches", and an instruction that asks the caller to explain that the search succeeded. When the request sent a filter that narrows the results, the instruction asks the user which filter to relax: every such filter is applied exactly as sent, so the empty result means the filter combination was too restrictive for this route and dates. Otherwise it asks whether to try other dates or airports; see Filters are always applied. The deprecated X-Jinko-Result and X-Jinko-Instruction headers carry the same outcome; read the body instead.The search answers no_matches whenever at least one airline source answered, even if another could not be searched. When some sources fail and others return offers, the response carries those offers and does not say which sources failed.A search where every source failed is an error: temporary unavailability or incomplete polling returns 503 (honor Retry-After when present and preserve the user’s filters), and a timeout returns 504. The error message is fixed per code; see Messages on supplier failures. These search rules apply to live search mode; reprice and cache-based discovery retain their existing behavior.
Each fare can carry searched_at and expires_at as RFC 3339 timestamps. searched_at is when the supplier search began. expires_at is the earlier of a known supplier deadline and Jinko’s 75-minute token lifetime. When the supplier gives no deadline, it bounds token retention only. Neither field guarantees availability or price; suppliers can withdraw an offer sooner. Missing timestamps mean unknown.Repeated searches can return the same trip_item_token. Use the timestamps and latest search result to assess freshness. Complete checkout promptly; if the user pauses, search again before checkout. After expires_at, search again and replace the item. There is no universal safe maximum age, and creating a trip does not extend the offer’s lifetime.
Prices are in minor units.value is an integer — divide by
10 ** decimal_places to display it. { "value": 15977, "decimal_places": 2 }
is $159.77, not $15,977. See Money & prices.
3-letter IATA city or airport code. See origin_type for how an untyped code is read. origin and destination must differ. A 3-letter code the platform’s location catalog does not recognise is not refused: it is searched as an airport, and if no provider sells it the search answers result: no_matches.
3-letter IATA city or airport code. See destination_type for how an untyped code is read: LAX alone is the Los Angeles CITY; send destination_type: "airport" for the airport only. origin and destination must differ. A 3-letter code the platform’s location catalog does not recognise is not refused: it is searched as an airport, and if no provider sells it the search answers result: no_matches.
How to read the code: city searches every airport of the city, airport only that one airport. Omit it and the platform applies one rule: a code that names a multi-airport city is searched as the city; every other code is searched as the airport. Untyped NYC, LON or PAR is the city; untyped JFK, LHR or CDG is the airport; and untyped LAX, MIA or LAS — codes a city shares with its main airport — is the CITY, so results can land at any airport of that city. If the user named the airport, send airport; if they named the city, omit the field. The provider decides which airports a city holds, so a city search can return airports the catalog does not list under that code: searched as a city, LAX returns Ontario (ONT) fares, often as the cheapest offers. Each offer’s legs carry the airports flown; the offer-level origin / destination carry the city.
How to read the code: city searches every airport of the city, airport only that one airport. Omit it and the platform applies one rule: a code that names a multi-airport city is searched as the city; every other code is searched as the airport. Untyped NYC, LON or PAR is the city; untyped JFK, LHR or CDG is the airport; and untyped LAX, MIA or LAS — codes a city shares with its main airport — is the CITY, so results can land at any airport of that city. If the user named the airport, send airport; if they named the city, omit the field. The provider decides which airports a city holds, so a city search can return airports the catalog does not list under that code: searched as a city, LAX returns Ontario (ONT) fares, often as the cheapest offers. Each offer’s legs carry the airports flown; the offer-level origin / destination carry the city.
Departure date, YYYY-MM-DD: the local date at origin. Required in search mode, with origin and destination; not allowed beside offer_token. A date that does not exist on the calendar (2026-02-30) is refused with 422 naming the field.
oneway or roundtrip. Omit it and return_date decides: present is a round trip, absent a one-way trip. roundtrip requires return_date, and oneway refuses it (422 naming return_date).
Omit this field or send null to let the provider default the search to economy without applying a cabin filter. Send an explicit enum value to require each fare’s representative cabin to equal it. The representative cabin is the cabin on the longest flight segment; shorter connecting segments may use another cabin. An omitted or null cabin applies no cabin filter.
DEPRECATED — send max_stops: 0 instead. Still accepted: direct_only is folded into max_stops (true becomes max_stops: 0) before the search runs, so only max_stops reaches the platform. Setting it beside a non-zero max_stops is rejected.
Branded fare ladder: several fares per itinerary (upsell options). Defaults to true when omitted; send false for a single fare per itinerary and a smaller response. An offer carries at most 10 fares, the cheapest fare of each cabin kept first; a provider that sells no fare ladder returns a single fare either way.
Drop fares whose total price (all passengers) exceeds this cap, in currency, major units. A fare priced in another currency is usually converted to currency with the platform’s FX rate before the comparison, but not always: a provider whose first priced offer is already in currency drops its offers in other currencies as unverifiable instead of converting them. A fare whose currency cannot be converted is not returned.
Keep only itineraries marketed by these IATA carriers. Matching means every segment is marketed by a listed carrier (codeshares count by marketing carrier). When nothing matches, the search returns no offers with result: no_matches; the platform never widens to other carriers.
Shortest acceptable layover, in minutes, applied to every connection of every leg. Must not exceed connection_time_max_minutes. Conservative, like refundable_only: an itinerary with a connection whose times are unknown cannot be checked and is dropped.
Longest acceptable layover, in minutes, applied to every connection of every leg. Conservative in the same way as connection_time_min_minutes: a connection whose times are unknown drops the itinerary.
Keep only fares that can be cancelled before departure (with or without a fee). Conservative: a fare whose rules the platform cannot verify is DROPPED, so carriers that publish no rule data disappear under this filter. The filter reads the before-departure cancellation rules only; is_refundable on a returned fare is a wider reading of the same rules (it is true on a fare whose only decided rule allows cancellation after departure), so the flag is not this filter.
Keep only fares that allow a voluntary change. Conservative in the same way as refundable_only: unverifiable fares are dropped. The filter reads the before-departure change rules only; is_changeable on a returned fare is the wider reading refundable_only describes.
Keep only fares whose price already includes a checked bag on EVERY segment. Conservative, like refundable_only: a segment that states no allowance makes the fare unverifiable and it is dropped. The response flag of the same name is read from the first segment that states an allowance, not from every segment, so without this filter a fare flagged checked_bag_included: true can still lack a free bag on a later segment.
Restrict connections to these airports: an itinerary qualifies only when EVERY connection is one of them. Non-stop itineraries have no connection to check and are kept. Some providers are asked for at most the first 9 listed airports per leg; the whole list is still applied to what they return.
Keep only itineraries whose every segment flies one of these IATA equipment codes. Conservative, like refundable_only: a segment whose equipment is unknown makes the itinerary unverifiable and it is dropped, so a provider that reports no equipment (see aircraft on the segment) disappears under this filter entirely.
ADDITIONAL departure airports searched alongside origin. Widening only — the anchor in origin is always searched, so this can add results but never remove any. THE ANCHOR DECIDES RANKING AND TRUNCATION, which makes the two airports NOT interchangeable: measured on one route, anchor JFK with alternate EWR returned 15 JFK / 35 EWR, while anchor EWR with alternate JFK returned 2 JFK / 48 EWR — 13 itineraries differed between the two. Put the airport that matters most in origin. Works with an airport or a city anchor: origin NYC with ["BOS"] searches New York's airports and Boston; an alternate inside the city is redundant and harmless. On a round trip the platform mirrors the list onto the return leg, so it also covers where the return lands. Some providers search only the anchor.
ADDITIONAL arrival airports searched alongside destination. Widening only — the anchor in destination is always searched, so this can add results but never remove any. THE ANCHOR DECIDES RANKING AND TRUNCATION, which makes the two airports NOT interchangeable the same way origin_alternate_airports describes: put the airport that matters most in destination. Works with an airport or a city anchor, as origin_alternate_airports describes. On a round trip the platform mirrors the list onto the return leg, so it also covers where the return departs from. Some providers search only the anchor.
Keep only round trips whose return departs from the airport the outbound arrived at. Round trip only: on a one-way search it is accepted and has no effect.
TOTAL number of flights to return (1–300), not a per-page size: limit: 5 returns at most five flights. Search mode only. Omit to let the platform choose: the cheapest flight plus up to 100 alternatives, so up to 101 flights. Applied after the cross-provider merge and sort, so it only trims the returned set — the providers still bound the real count.
ISO 4217 currency code, case-insensitive (eur is EUR): prices come back with the upper-case code and a display. Defaults to USD. A currency the platform cannot price in is refused with 400.
Price-check mode: re-price one known offer instead of searching a route. Route and filter fields are not allowed beside it (422); the passenger counts and currency are. Two kinds of token behave differently. A cached-itinerary offer_token from flight_calendar, find_dates, lowest_fare, find_destination or a price monitor is re-shopped LIVE on its route and dates with no cabin, stop or carrier constraint: offers[0] is the cheapest live offer with the same flights and cabin when one exists, exact_match_found says whether it did, and up to 100 alternatives follow. An offer_id from an earlier flight_search is answered from the cache of that search without re-pricing (exact_match_found: true), unless the passenger counts or currency differ, in which case it is re-shopped; once every fare of the cached offer has passed its expires_at it answers 410 OFFER_EXPIRED: search again.
Priced offers. Every filter that narrows the results (cabin, stops, price, carriers, times, connections, fare conditions, aircraft) is applied exactly as sent: no returned offer breaks one. Options that widen a search (alternate or nearby airports) are searched where available. A search that completes and matches nothing is also a 200: offers is empty, result is no_matches and the body carries a recovery instruction. A search that could not be completed answers an error (UPSTREAM_REJECTED, UPSTREAM_ERROR, UPSTREAM_UNAVAILABLE or UPSTREAM_TIMEOUT) rather than an empty list. Offers that were found are returned even when part of the search could not be completed.
Search mode only. no_matches means the search completed and no offer matched: relay instruction, which asks which filter to relax only when the request sent a filter that narrows the results. offers is empty. Absent when offers were found. A search that could not be completed at all answers an error instead (UPSTREAM_REJECTED, UPSTREAM_ERROR, UPSTREAM_UNAVAILABLE or UPSTREAM_TIMEOUT), never an empty list.
Present with result: no_matches: what to tell the user or do next. It attributes the empty result to the filters only when the request sent a filter that narrows the results; otherwise it reads "Search completed successfully, but no flights were found for this route and dates. Ask the user whether to try other dates or airports before searching again."
Example:
"Search completed successfully, but no offers satisfied every filter sent: the filter combination is too restrictive for this route and dates. Ask the user which filter to relax before searching again."
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Jinko Platform","description":"Connect your AI agent to flights, hotels, car rentals, and bookings through MCP, REST API, TypeScript SDK, or CLI.","colors":{"primary":"#FF6363","light":"#FF807C","dark":"#BA4B4A"},"logo":{"light":"https://mintcdn.com/jinko-dev/k6P2DyAYQF0FPJQi/logo/jinko-logo.png?fit=max\u0026auto=format\u0026n=k6P2DyAYQF0FPJQi\u0026q=85\u0026s=785a20dc553a2698bfffad325d1198d0","dark":"https://mintcdn.com/jinko-dev/k6P2DyAYQF0FPJQi/logo/jinko-logo.png?fit=max\u0026auto=format\u0026n=k6P2DyAYQF0FPJQi\u0026q=85\u0026s=785a20dc553a2698bfffad325d1198d0"},"favicon":"https://mintcdn.com/jinko-dev/k6P2DyAYQF0FPJQi/favicon.png?fit=max\u0026auto=format\u0026n=k6P2DyAYQF0FPJQi\u0026q=85\u0026s=770e72a193924011a067dcacdcb654cf","navbar":{"links":[{"href":"https://dashboard.gojinko.com","label":"Dashboard"}],"primary":{"type":"button","label":"Get API Key","href":"https://dashboard.gojinko.com/developers/keys"}},"footer":{"socials":{"website":"https://gojinko.com"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"jinko-dev","hasAudioNarration":false,"actualSubdomain":"jinko-dev","customDomains":["docs.dev.gojinko.com"],"gitSource":{"type":"github","owner":"jinkoso","repo":"jinko-dev-platform","deployBranch":"main","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":""},"entitlements":{},"buildId":"6aeece39c11f500273ffd5ec","clientVersion":"0.0.4076","searchFilterCounts":[{"language":"default","tag":"API reference","count":63},{"language":"default","tag":"CLI","count":49},{"language":"default","tag":"Flights","count":43},{"language":"default","tag":"Documentation","count":42},{"language":"default","tag":"MCP","count":23},{"language":"default","tag":"Manage","count":20},{"language":"default","tag":"Trip \u0026 Payment","count":19},{"language":"default","tag":"Discovery","count":17},{"language":"default","tag":"Hotels","count":16},{"language":"default","tag":"Travel Demand","count":14}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api/flight-search","slug":"/api/flight-search","pageMetadata":{"title":"flight-search","sidebarTitle":"/v1/flight_search","description":"Get live flight pricing, search by route, or re-price a known offer","openapi":"api-reference/public-api.yaml POST /v1/flight_search","href":"/api/flight-search"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Get live flight pricing, search by route, or re-price a known offer\"\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`,li:`li`,p:`p`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{Heading,Note}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Fetch live, bookable pricing for a specific route and date pair. Use it once the user has settled on exact travel dates, for example “Paris to New York departing June 1 returning June 8 in economy”. It also reprices an offer surfaced earlier by the calendar or destination tools so you can confirm availability before adding it to a trip.`}),`\n`,_jsx(Heading,{level:`2`,id:`two-modes-one-endpoint`,children:`Two modes, one endpoint`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`POST /v1/flight_search`}),` serves both modes:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Search mode`}),`: filter-based live search by `,_jsx(_components.code,{children:`origin`}),`, `,_jsx(_components.code,{children:`destination`}),`, `,_jsx(_components.code,{children:`departure_date`}),`, and passengers. Returns priced offers, each fare carrying a `,_jsx(_components.code,{children:`trip_item_token`}),` you can add to a `,_jsx(_components.a,{href:`/api/trip`,children:`trip`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Reprice mode`}),`: pass an `,_jsx(_components.code,{children:`offer_token`}),` from discovery (`,_jsx(_components.code,{children:`find_destination`}),`, `,_jsx(_components.code,{children:`flight_calendar`}),`) to re-price that specific offer before adding it to a trip. Route and filter fields are not allowed beside `,_jsx(_components.code,{children:`offer_token`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`The CLI mirrors this: pass `,_jsx(_components.code,{children:`--offer-token`}),` for reprice mode, omit it for search mode.`]}),`\n`,_jsx(Heading,{level:`2`,id:`cabin-class-in-live-search`,children:`Cabin class in live search`}),`\n`,_jsxs(_components.p,{children:[`Omit `,_jsx(_components.code,{children:`cabin_class`}),` or send `,_jsx(_components.code,{children:`null`}),` when the user has not requested a cabin. Providers search economy by default, and the response can include other recognized cabins they return.`]}),`\n`,_jsxs(_components.p,{children:[`Send `,_jsx(_components.code,{children:`economy`}),`, `,_jsx(_components.code,{children:`premium_economy`}),`, `,_jsx(_components.code,{children:`business`}),`, or `,_jsx(_components.code,{children:`first`}),` only when the user explicitly chooses that cabin. Jinko filters returned fares to match the cabin on the itinerary’s longest segment. Shorter connections may use another cabin; check segment details when presenting a mixed-cabin itinerary.`]}),`\n`,_jsx(Heading,{level:`2`,id:`a-successful-search-with-no-matches`,children:`A successful search with no matches`}),`\n`,_jsxs(_components.p,{children:[`When a live search finds no offers that match the current filters, the endpoint returns `,_jsx(_components.strong,{children:`HTTP 200`}),` with `,_jsx(_components.code,{children:`offers: []`}),`, `,_jsx(_components.code,{children:`result: \"no_matches\"`}),`, and an `,_jsx(_components.code,{children:`instruction`}),` that asks the caller to explain that the search succeeded. When the request sent a filter that narrows the results, the instruction asks the user which filter to relax: every such filter is applied exactly as sent, so the empty result means the filter combination was too restrictive for this route and dates. Otherwise it asks whether to try other dates or airports; see `,_jsx(_components.a,{href:`/guides/flight-booking#filters-are-always-applied`,children:`Filters are always applied`}),`. The deprecated `,_jsx(_components.code,{children:`X-Jinko-Result`}),` and `,_jsx(_components.code,{children:`X-Jinko-Instruction`}),` headers carry the same outcome; read the body instead.`]}),`\n`,_jsxs(_components.p,{children:[`The search answers `,_jsx(_components.code,{children:`no_matches`}),` whenever at least one airline source answered, even if another could not be searched. When some sources fail and others return offers, the response carries those offers and does not say which sources failed.`]}),`\n`,_jsxs(_components.p,{children:[`A search where every source failed is an error: temporary unavailability or incomplete polling returns `,_jsx(_components.strong,{children:`503`}),` (honor `,_jsx(_components.code,{children:`Retry-After`}),` when present and preserve the user’s filters), and a timeout returns `,_jsx(_components.strong,{children:`504`}),`. The error message is fixed per code; see `,_jsx(_components.a,{href:`/concepts/errors#messages-on-supplier-failures`,children:`Messages on supplier failures`}),`. These search rules apply to live search mode; reprice and cache-based discovery retain their existing behavior.`]}),`\n`,_jsx(Heading,{level:`2`,id:`offer-freshness`,children:`Offer freshness`}),`\n`,_jsxs(_components.p,{children:[`Each fare can carry `,_jsx(_components.code,{children:`searched_at`}),` and `,_jsx(_components.code,{children:`expires_at`}),` as RFC 3339 timestamps. `,_jsx(_components.code,{children:`searched_at`}),` is when the supplier search began. `,_jsx(_components.code,{children:`expires_at`}),` is the earlier of a known supplier deadline and Jinko’s 75-minute token lifetime. When the supplier gives no deadline, it bounds token retention only. Neither field guarantees availability or price; suppliers can withdraw an offer sooner. Missing timestamps mean unknown.`]}),`\n`,_jsxs(_components.p,{children:[`Repeated searches can return the same `,_jsx(_components.code,{children:`trip_item_token`}),`. Use the timestamps and latest search result to assess freshness. Complete checkout promptly; if the user pauses, search again before checkout. After `,_jsx(_components.code,{children:`expires_at`}),`, search again and replace the item. There is no universal safe maximum age, and creating a trip does not extend the offer’s lifetime.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Prices are in minor units.`}),` `,_jsx(_components.code,{children:`value`}),` is an integer — divide by\n`,_jsx(_components.code,{children:`10 ** decimal_places`}),` to display it. `,_jsx(_components.code,{children:`{ \"value\": 15977, \"decimal_places\": 2 }`}),`\nis `,_jsx(_components.strong,{children:`$159.77`}),`, not $15,977. See `,_jsx(_components.a,{href:`/concepts/money`,children:`Money \u0026 prices`}),`.`]})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"flight-search","sidebarTitle":"/v1/flight_search","description":"Get live flight pricing, search by route, or re-price a known offer","openapi":"api-reference/public-api.yaml POST /v1/flight_search","href":"/api/flight-search"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Two modes, one endpoint","slug":"two-modes-one-endpoint","depth":2,"children":[]},{"title":"Cabin class in live search","slug":"cabin-class-in-live-search","depth":2,"children":[]},{"title":"A successful search with no matches","slug":"a-successful-search-with-no-matches","depth":2,"children":[]},{"title":"Offer freshness","slug":"offer-freshness","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Pricing \u0026 booking"],"summary":"Get live flight pricing — search by route, or re-price a known offer","description":"Get live flight pricing, search by route, or re-price a known offer","security":["ba73bdf0-f551-48e7-9429-459e951b2035","37c2344a-5689-4c02-aa68-773fa9459c08"],"requestBody":"2389fdd9-e7e8-4b0a-9ddc-5f1107f59349","responses":{"200":"f821d87b-1a4d-45d1-9692-e287edbe90ec","400":"d5c5dfd4-951f-419b-8508-f7691851c192","401":"fbdc54e2-f674-498a-a499-70b518d5ead7","402":"a0542b0d-bf29-4697-a200-2ef135674f4e","404":"60215920-bb9b-49a7-a669-ce86272a24fc","409":"b5b73761-7393-4d86-af65-cae4a0fce07a","410":"90a6f2a7-393a-4869-ae74-89e75c60e575","422":"aac1515f-1015-404d-bb09-f3ca59257052","429":"51231f3a-7d6a-4692-a43f-bb71a395ab42","502":"765f6960-c8d7-47db-b9e1-8dc67c17d009","503":"255b4f6d-d3d7-4986-ae3e-1bc561937be4","504":"60317d66-b921-46bc-9f7b-a3974300f239"},"method":"post","type":"path","servers":["6c2e2c14-8667-4ef1-a6c7-d1e7fb982378","0b2c8592-7b6b-4acc-9351-2a69f3e0f42a"],"path":"/v1/flight_search","baseUrlOptions":["https://api.gojinko.com","https://api.sandbox.gojinko.com"],"title":"Get live flight pricing — search by route, or re-price a known offer","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"origin":{"type":"string","description":"3-letter IATA city or airport code. See `origin_type` for how an untyped code is read. `origin` and `destination` must differ. A 3-letter code the platform’s location catalog does not recognise is not refused: it is searched as an airport, and if no provider sells it the search answers `result: no_matches`.","example":"JFK","uniqueKey":"origin","typeLabel":"string"},"destination":{"type":"string","description":"3-letter IATA city or airport code. See `destination_type` for how an untyped code is read: LAX alone is the Los Angeles CITY; send `destination_type: \"airport\"` for the airport only. `origin` and `destination` must differ. A 3-letter code the platform’s location catalog does not recognise is not refused: it is searched as an airport, and if no provider sells it the search answers `result: no_matches`.","example":"LAX","uniqueKey":"destination","typeLabel":"string"},"origin_type":{"type":"string","enum":["city","airport"],"description":"How to read the code: `city` searches every airport of the city, `airport` only that one airport. Omit it and the platform applies one rule: a code that names a multi-airport city is searched as the city; every other code is searched as the airport. Untyped NYC, LON or PAR is the city; untyped JFK, LHR or CDG is the airport; and untyped LAX, MIA or LAS — codes a city shares with its main airport — is the CITY, so results can land at any airport of that city. If the user named the airport, send `airport`; if they named the city, omit the field. The provider decides which airports a city holds, so a city search can return airports the catalog does not list under that code: searched as a city, LAX returns Ontario (ONT) fares, often as the cheapest offers. Each offer’s legs carry the airports flown; the offer-level `origin` / `destination` carry the city.","example":"airport","uniqueKey":"origin_type","typeLabel":"enum\u003cstring>"},"destination_type":{"type":"string","enum":["city","airport"],"description":"How to read the code: `city` searches every airport of the city, `airport` only that one airport. Omit it and the platform applies one rule: a code that names a multi-airport city is searched as the city; every other code is searched as the airport. Untyped NYC, LON or PAR is the city; untyped JFK, LHR or CDG is the airport; and untyped LAX, MIA or LAS — codes a city shares with its main airport — is the CITY, so results can land at any airport of that city. If the user named the airport, send `airport`; if they named the city, omit the field. The provider decides which airports a city holds, so a city search can return airports the catalog does not list under that code: searched as a city, LAX returns Ontario (ONT) fares, often as the cheapest offers. Each offer’s legs carry the airports flown; the offer-level `origin` / `destination` carry the city.","example":"airport","uniqueKey":"destination_type","typeLabel":"enum\u003cstring>"},"departure_date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Departure date, `YYYY-MM-DD`: the local date at `origin`. Required in search mode, with `origin` and `destination`; not allowed beside `offer_token`. A date that does not exist on the calendar (`2026-02-30`) is refused with 422 naming the field.","example":"2026-09-01","uniqueKey":"departure_date","typeLabel":"string"},"return_date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Return date, `YYYY-MM-DD`, on or after `departure_date` (a same-day return is valid). Sending it makes the search a round trip; see `trip_type`.","uniqueKey":"return_date","typeLabel":"string"},"trip_type":{"type":"string","enum":["oneway","roundtrip"],"description":"`oneway` or `roundtrip`. Omit it and `return_date` decides: present is a round trip, absent a one-way trip. `roundtrip` requires `return_date`, and `oneway` refuses it (422 naming `return_date`).","uniqueKey":"trip_type","typeLabel":"enum\u003cstring>"},"cabin_class":{"oneOf":[{"type":"string","enum":["economy","premium_economy","business","first"],"description":"Omit this field or send `null` to let the provider default the search to economy without applying a cabin filter. Send an explicit enum value to require each fare’s representative cabin to equal it. The representative cabin is the cabin on the longest flight segment; shorter connecting segments may use another cabin. An omitted or `null` cabin applies no cabin filter.","example":"economy","uniqueKey":"cabin_class.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["economy","premium_economy","business","first"],"description":"Omit this field or send `null` to let the provider default the search to economy without applying a cabin filter. Send an explicit enum value to require each fare’s representative cabin to equal it. The representative cabin is the cabin on the longest flight segment; shorter connecting segments may use another cabin. An omitted or `null` cabin applies no cabin filter.","example":"economy","uniqueKey":"cabin_class.oneOf.1","typeLabel":"null"}],"uniqueKey":"cabin_class","typeLabel":"enum\u003cstring> | null"},"direct_only":{"type":"boolean","description":"DEPRECATED — send `max_stops: 0` instead. Still accepted: `direct_only` is folded into `max_stops` (`true` becomes `max_stops: 0`) before the search runs, so only `max_stops` reaches the platform. Setting it beside a non-zero `max_stops` is rejected.","deprecated":true,"example":false,"uniqueKey":"direct_only","typeLabel":"boolean"},"max_stops":{"type":"integer","minimum":0,"maximum":2,"description":"Maximum stops per leg: `0` non-stop (the way to ask for direct flights), `1` one connection, `2` two. Applies to every leg of the trip.","example":1,"uniqueKey":"max_stops","typeLabel":"integer"},"multi_fare":{"type":"boolean","description":"Branded fare ladder: several fares per itinerary (upsell options). Defaults to `true` when omitted; send `false` for a single fare per itinerary and a smaller response. An offer carries at most 10 fares, the cheapest fare of each cabin kept first; a provider that sells no fare ladder returns a single fare either way.","example":true,"uniqueKey":"multi_fare","typeLabel":"boolean"},"max_total":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"Drop fares whose total price (all passengers) exceeds this cap, in `currency`, major units. A fare priced in another currency is usually converted to `currency` with the platform’s FX rate before the comparison, but not always: a provider whose first priced offer is already in `currency` drops its offers in other currencies as unverifiable instead of converting them. A fare whose currency cannot be converted is not returned.","example":800,"uniqueKey":"max_total","typeLabel":"number"},"include_carriers":{"type":"array","items":{"type":"string","pattern":"^[A-Za-z0-9]{2}$","uniqueKey":"include_carriers.items.[INDEX]","typeLabel":"string"},"description":"Keep only itineraries marketed by these IATA carriers. Matching means every segment is marketed by a listed carrier (codeshares count by marketing carrier). When nothing matches, the search returns no offers with `result: no_matches`; the platform never widens to other carriers.","example":["AF","DL"],"uniqueKey":"include_carriers","typeLabel":"string[]"},"exclude_carriers":{"type":"array","items":{"type":"string","pattern":"^[A-Za-z0-9]{2}$","uniqueKey":"exclude_carriers.items.[INDEX]","typeLabel":"string"},"description":"Drop itineraries marketed by these IATA carriers. Must not overlap `include_carriers`.","example":["NK"],"uniqueKey":"exclude_carriers","typeLabel":"string[]"},"departure_time_range":{"type":"object","description":"Filter the OUTBOUND leg by local departure time-of-day.","properties":{"earliest":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","example":"08:00","uniqueKey":"departure_time_range.earliest","typeLabel":"string"},"latest":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","example":"12:00","uniqueKey":"departure_time_range.latest","typeLabel":"string"}},"uniqueKey":"departure_time_range","typeLabel":"object"},"arrival_time_range":{"type":"object","description":"Filter the OUTBOUND leg by local arrival time-of-day.","properties":{"earliest":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","example":"08:00","uniqueKey":"arrival_time_range.earliest","typeLabel":"string"},"latest":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","example":"12:00","uniqueKey":"arrival_time_range.latest","typeLabel":"string"}},"uniqueKey":"arrival_time_range","typeLabel":"object"},"return_departure_time_range":{"type":"object","description":"Filter the RETURN leg by local departure time-of-day (round-trip only).","properties":{"earliest":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","example":"08:00","uniqueKey":"return_departure_time_range.earliest","typeLabel":"string"},"latest":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","example":"12:00","uniqueKey":"return_departure_time_range.latest","typeLabel":"string"}},"uniqueKey":"return_departure_time_range","typeLabel":"object"},"return_arrival_time_range":{"type":"object","description":"Filter the RETURN leg by local arrival time-of-day (round-trip only).","properties":{"earliest":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","example":"08:00","uniqueKey":"return_arrival_time_range.earliest","typeLabel":"string"},"latest":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","example":"12:00","uniqueKey":"return_arrival_time_range.latest","typeLabel":"string"}},"uniqueKey":"return_arrival_time_range","typeLabel":"object"},"connection_time_min_minutes":{"type":"integer","minimum":0,"description":"Shortest acceptable layover, in minutes, applied to every connection of every leg. Must not exceed `connection_time_max_minutes`. Conservative, like `refundable_only`: an itinerary with a connection whose times are unknown cannot be checked and is dropped.","example":60,"uniqueKey":"connection_time_min_minutes","typeLabel":"integer"},"connection_time_max_minutes":{"type":"integer","minimum":0,"description":"Longest acceptable layover, in minutes, applied to every connection of every leg. Conservative in the same way as `connection_time_min_minutes`: a connection whose times are unknown drops the itinerary.","example":240,"uniqueKey":"connection_time_max_minutes","typeLabel":"integer"},"max_total_duration_minutes":{"type":"integer","minimum":0,"exclusiveMinimum":true,"description":"Cap each leg’s door-to-door elapsed travel time, in minutes.","example":900,"uniqueKey":"max_total_duration_minutes","typeLabel":"integer"},"refundable_only":{"type":"boolean","description":"Keep only fares that can be cancelled before departure (with or without a fee). Conservative: a fare whose rules the platform cannot verify is DROPPED, so carriers that publish no rule data disappear under this filter. The filter reads the before-departure cancellation rules only; `is_refundable` on a returned fare is a wider reading of the same rules (it is `true` on a fare whose only decided rule allows cancellation after departure), so the flag is not this filter.","example":true,"uniqueKey":"refundable_only","typeLabel":"boolean"},"changeable_only":{"type":"boolean","description":"Keep only fares that allow a voluntary change. Conservative in the same way as `refundable_only`: unverifiable fares are dropped. The filter reads the before-departure change rules only; `is_changeable` on a returned fare is the wider reading `refundable_only` describes.","example":true,"uniqueKey":"changeable_only","typeLabel":"boolean"},"checked_bag_included":{"type":"boolean","description":"Keep only fares whose price already includes a checked bag on EVERY segment. Conservative, like `refundable_only`: a segment that states no allowance makes the fare unverifiable and it is dropped. The response flag of the same name is read from the first segment that states an allowance, not from every segment, so without this filter a fare flagged `checked_bag_included: true` can still lack a free bag on a later segment.","example":true,"uniqueKey":"checked_bag_included","typeLabel":"boolean"},"single_carrier_only":{"type":"boolean","description":"Keep only itineraries marketed end-to-end by one carrier.","example":true,"uniqueKey":"single_carrier_only","typeLabel":"boolean"},"via_airports":{"type":"array","items":{"type":"string","pattern":"^[A-Za-z]{3}$","uniqueKey":"via_airports.items.[INDEX]","typeLabel":"string"},"description":"Restrict connections to these airports: an itinerary qualifies only when EVERY connection is one of them. Non-stop itineraries have no connection to check and are kept. Some providers are asked for at most the first 9 listed airports per leg; the whole list is still applied to what they return.","example":["AMS"],"uniqueKey":"via_airports","typeLabel":"string[]"},"exclude_via_airports":{"type":"array","items":{"type":"string","pattern":"^[A-Za-z]{3}$","uniqueKey":"exclude_via_airports.items.[INDEX]","typeLabel":"string"},"description":"Ban connections at these airports. Must not overlap `via_airports`.","example":["LHR"],"uniqueKey":"exclude_via_airports","typeLabel":"string[]"},"aircraft_types":{"type":"array","items":{"type":"string","pattern":"^[A-Za-z0-9]{3}$","uniqueKey":"aircraft_types.items.[INDEX]","typeLabel":"string"},"description":"Keep only itineraries whose every segment flies one of these IATA equipment codes. Conservative, like `refundable_only`: a segment whose equipment is unknown makes the itinerary unverifiable and it is dropped, so a provider that reports no equipment (see `aircraft` on the segment) disappears under this filter entirely.","example":["320","77W"],"uniqueKey":"aircraft_types","typeLabel":"string[]"},"origin_alternate_airports":{"type":"array","items":{"type":"string","pattern":"^[A-Za-z]{3}$","uniqueKey":"origin_alternate_airports.items.[INDEX]","typeLabel":"string"},"description":"ADDITIONAL departure airports searched alongside `origin`. Widening only — the anchor in `origin` is always searched, so this can add results but never remove any. THE ANCHOR DECIDES RANKING AND TRUNCATION, which makes the two airports NOT interchangeable: measured on one route, anchor `JFK` with alternate `EWR` returned 15 JFK / 35 EWR, while anchor `EWR` with alternate `JFK` returned 2 JFK / 48 EWR — 13 itineraries differed between the two. Put the airport that matters most in `origin`. Works with an airport or a city anchor: `origin` NYC with `[\"BOS\"]` searches New York's airports and Boston; an alternate inside the city is redundant and harmless. On a round trip the platform mirrors the list onto the return leg, so it also covers where the return lands. Some providers search only the anchor.","example":["EWR","LGA"],"uniqueKey":"origin_alternate_airports","typeLabel":"string[]"},"destination_alternate_airports":{"type":"array","items":{"type":"string","pattern":"^[A-Za-z]{3}$","uniqueKey":"destination_alternate_airports.items.[INDEX]","typeLabel":"string"},"description":"ADDITIONAL arrival airports searched alongside `destination`. Widening only — the anchor in `destination` is always searched, so this can add results but never remove any. THE ANCHOR DECIDES RANKING AND TRUNCATION, which makes the two airports NOT interchangeable the same way `origin_alternate_airports` describes: put the airport that matters most in `destination`. Works with an airport or a city anchor, as `origin_alternate_airports` describes. On a round trip the platform mirrors the list onto the return leg, so it also covers where the return departs from. Some providers search only the anchor.","example":["ORY"],"uniqueKey":"destination_alternate_airports","typeLabel":"string[]"},"nearby_airports":{"type":"boolean","description":"Also search the alternate airports around each leg’s origin and destination. Widening: more results, not fewer.","example":true,"uniqueKey":"nearby_airports","typeLabel":"boolean"},"same_connection_airport_only":{"type":"boolean","description":"Keep only itineraries whose connections leave from the same airport they arrived at (no cross-town transfer).","example":true,"uniqueKey":"same_connection_airport_only","typeLabel":"boolean"},"same_origin_airport_only":{"type":"boolean","description":"Keep only round trips that return to the airport the trip departed from. Round trip only: on a one-way search it is accepted and has no effect.","example":true,"uniqueKey":"same_origin_airport_only","typeLabel":"boolean"},"same_turnaround_airport_only":{"type":"boolean","description":"Keep only round trips whose return departs from the airport the outbound arrived at. Round trip only: on a one-way search it is accepted and has no effect.","example":true,"uniqueKey":"same_turnaround_airport_only","typeLabel":"boolean"},"limit":{"type":"integer","minimum":1,"maximum":300,"description":"TOTAL number of flights to return (1–300), not a per-page size: `limit: 5` returns at most five flights. Search mode only. Omit to let the platform choose: the cheapest flight plus up to 100 alternatives, so up to 101 flights. Applied after the cross-provider merge and sort, so it only trims the returned set — the providers still bound the real count.","example":20,"uniqueKey":"limit","typeLabel":"integer"},"adults":{"type":"integer","minimum":1,"default":1,"description":"Adult travelers (12+). At most 9 travellers who need a seat: `adults + children` ≤ 9. Lap infants are not counted.","uniqueKey":"adults","typeLabel":"integer"},"children":{"type":"integer","minimum":0,"description":"Child travelers (2–11). At most 9 travellers who need a seat: `adults + children` ≤ 9. Lap infants are not counted.","uniqueKey":"children","typeLabel":"integer"},"infants":{"type":"integer","minimum":0,"description":"Infant travelers (under 2), traveling on an adult’s lap. Seated infants (own seat) are not supported.","uniqueKey":"infants","typeLabel":"integer"},"currency":{"type":"string","description":"ISO 4217 currency code, case-insensitive (`eur` is `EUR`): prices come back with the upper-case code and a `display`. Defaults to USD. A currency the platform cannot price in is refused with 400.","uniqueKey":"currency","typeLabel":"string"},"locale":{"type":"string","uniqueKey":"locale","typeLabel":"string"},"offer_token":{"type":"string","description":"Price-check mode: re-price one known offer instead of searching a route. Route and filter fields are not allowed beside it (422); the passenger counts and `currency` are. Two kinds of token behave differently. A cached-itinerary `offer_token` from `flight_calendar`, `find_dates`, `lowest_fare`, `find_destination` or a price monitor is re-shopped LIVE on its route and dates with no cabin, stop or carrier constraint: `offers[0]` is the cheapest live offer with the same flights and cabin when one exists, `exact_match_found` says whether it did, and up to 100 alternatives follow. An `offer_id` from an earlier `flight_search` is answered from the cache of that search without re-pricing (`exact_match_found: true`), unless the passenger counts or `currency` differ, in which case it is re-shopped; once every fare of the cached offer has passed its `expires_at` it answers `410 OFFER_EXPIRED`: search again.","example":"offer__3a9f1b27","uniqueKey":"offer_token","typeLabel":"string"},"intent":{"type":"object","properties":{"user_intent":{"oneOf":[{"type":"string","description":"The user's natural-language intent: the Alpic PII-stripped paraphrase when available, else a best-effort fallback to the client-provided NL query.","example":"find a cheap flight to Tokyo","uniqueKey":"intent.user_intent.oneOf.0","typeLabel":"string"},{"type":"null","description":"The user's natural-language intent: the Alpic PII-stripped paraphrase when available, else a best-effort fallback to the client-provided NL query.","example":"find a cheap flight to Tokyo","uniqueKey":"intent.user_intent.oneOf.1","typeLabel":"null"}],"uniqueKey":"intent.user_intent","typeLabel":"string | null"}},"uniqueKey":"intent","typeLabel":"object"}},"example":{"origin":"JFK","destination":"CDG","departure_date":"2026-09-01","return_date":"2026-09-08","trip_type":"roundtrip","cabin_class":"economy","adults":1,"max_stops":1,"checked_bag_included":true,"currency":"USD"},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"origin":"JFK","destination":"CDG","departure_date":"2026-09-01","return_date":"2026-09-08","trip_type":"roundtrip","cabin_class":"economy","adults":1,"max_stops":1,"checked_bag_included":true,"currency":"USD"}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"f821d87b-1a4d-45d1-9692-e287edbe90ec":{"description":"Priced offers. Every filter that narrows the results (cabin, stops, price, carriers, times, connections, fare conditions, aircraft) is applied exactly as sent: no returned offer breaks one. Options that widen a search (alternate or nearby airports) are searched where available. A search that completes and matches nothing is also a 200: `offers` is empty, `result` is `no_matches` and the body carries a recovery `instruction`. A search that could not be completed answers an error (`UPSTREAM_REJECTED`, `UPSTREAM_ERROR`, `UPSTREAM_UNAVAILABLE` or `UPSTREAM_TIMEOUT`) rather than an empty list. Offers that were found are returned even when part of the search could not be completed.","headers":{"X-Jinko-Result":{"deprecated":true,"required":false,"description":"Deprecated: read `result` in the body. Sent for empty searches with result no_matches.","schema":{"type":"string","example":"no_matches"}},"X-Jinko-Instruction":{"deprecated":true,"required":false,"description":"Deprecated: read `instruction` in the body. Sent for empty searches with result no_matches.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"offers":{"type":"array","items":{"type":"object","properties":{"offer_id":{"type":"string","description":"Identifier of this offer: `offer__` followed by 8 hex characters. Send it as `offer_token` to re-price the offer; it is also the prefix of each fare’s `trip_item_token`.","example":"offer__3a9f1b27","isRequired":true,"uniqueKey":"offers.items.[INDEX].offer_id","typeLabel":"string"},"origin":{"type":"object","properties":{"code":{"type":"string","description":"City code of the requested origin: the code sent as `origin` when it was typed `city`, otherwise the city of that airport (`NYC` for JFK). Not the airport flown; read `outbound.origin` for that. An empty string when the platform cannot map the requested code to a city.","uniqueKey":"offers.items.[INDEX].origin.code","typeLabel":"string"},"name":{"type":"string","uniqueKey":"offers.items.[INDEX].origin.name","typeLabel":"string"}},"example":{"code":"NYC","name":"New York"},"isRequired":true,"uniqueKey":"offers.items.[INDEX].origin","typeLabel":"object"},"destination":{"type":"object","properties":{"code":{"type":"string","description":"City code of the requested destination, resolved as `origin.code` is. Not the airport flown; read `outbound.destination` for that. An empty string when the platform cannot map the requested code to a city.","uniqueKey":"offers.items.[INDEX].destination.code","typeLabel":"string"},"name":{"type":"string","uniqueKey":"offers.items.[INDEX].destination.name","typeLabel":"string"}},"example":{"code":"LAX","name":"Los Angeles"},"isRequired":true,"uniqueKey":"offers.items.[INDEX].destination","typeLabel":"object"},"additional_legs":{"type":"array","items":{"type":"object","properties":{"origin":{"type":"string","example":"JFK","uniqueKey":"offers.items.[INDEX].additional_legs.items.[INDEX].origin","typeLabel":"string"},"destination":{"type":"string","example":"LAX","uniqueKey":"offers.items.[INDEX].additional_legs.items.[INDEX].destination","typeLabel":"string"},"departure_datetime":{"type":"string","description":"Local time at the airport, RFC 3339 with that airport’s UTC offset (e.g. `2026-09-23T11:55:00-04:00`). Parse it as an instant; do not assume UTC and do not compare two of these as strings. The offset is a property of this leg/segment shape wherever it appears — a flight search, and an itinerary echoed back on a quote or trip read — not of the search response alone. On the rare airport whose timezone the platform does not know, the offset is omitted and the value is local wall-clock time. The `*_local` fields of a booked or exchanged itinerary are NOT this: those carry wall-clock time with no offset, by design.","example":"2026-07-15T08:30:00-04:00","uniqueKey":"offers.items.[INDEX].additional_legs.items.[INDEX].departure_datetime","typeLabel":"string"},"arrival_datetime":{"type":"string","description":"Local time at the airport, RFC 3339 with that airport’s UTC offset (e.g. `2026-09-23T11:55:00-04:00`). Parse it as an instant; do not assume UTC and do not compare two of these as strings. The offset is a property of this leg/segment shape wherever it appears — a flight search, and an itinerary echoed back on a quote or trip read — not of the search response alone. On the rare airport whose timezone the platform does not know, the offset is omitted and the value is local wall-clock time. The `*_local` fields of a booked or exchanged itinerary are NOT this: those carry wall-clock time with no offset, by design.","example":"2026-07-15T11:55:00-07:00","uniqueKey":"offers.items.[INDEX].additional_legs.items.[INDEX].arrival_datetime","typeLabel":"string"},"duration_minutes":{"type":"number","example":385,"uniqueKey":"offers.items.[INDEX].additional_legs.items.[INDEX].duration_minutes","typeLabel":"number"},"airline":{"type":"string","example":"AA","uniqueKey":"offers.items.[INDEX].additional_legs.items.[INDEX].airline","typeLabel":"string"},"airline_name":{"type":"string","example":"American Airlines","uniqueKey":"offers.items.[INDEX].additional_legs.items.[INDEX].airline_name","typeLabel":"string"},"stops":{"type":"number","example":0,"uniqueKey":"offers.items.[INDEX].additional_legs.items.[INDEX].stops","typeLabel":"number"},"stop_infos":{"type":"array","items":{"type":"object","properties":{"airport_code":{"type":"string","description":"IATA code of the airport where the leg stops.","example":"DFW","uniqueKey":"offers.items.[INDEX].additional_legs.items.[INDEX].stop_infos.items.[INDEX].airport_code","typeLabel":"string"},"duration_minutes":{"type":"number","description":"Layover length in minutes (arrival of the inbound segment to departure of the next). Omitted when the upstream times cannot be resolved.","example":95,"uniqueKey":"offers.items.[INDEX].additional_legs.items.[INDEX].stop_infos.items.[INDEX].duration_minutes","typeLabel":"number"}},"uniqueKey":"offers.items.[INDEX].additional_legs.items.[INDEX].stop_infos.items.[INDEX]","typeLabel":"object"},"description":"Layover detail, one entry per stop, in travel order. Absent when the leg is non-stop (`stops: 0`) or when upstream detail is incomplete for any stop; `stops` still reports the connection count in that case.","example":[{"airport_code":"DFW","duration_minutes":95}],"uniqueKey":"offers.items.[INDEX].additional_legs.items.[INDEX].stop_infos","typeLabel":"object[]"},"segments":{"type":"array","items":{"type":"object","properties":{"airline":{"type":"string","description":"IATA code of the MARKETING carrier — whose flight number you booked.","example":"AA","uniqueKey":"offers.items.[INDEX].additional_legs.items.[INDEX].segments.items.[INDEX].airline","typeLabel":"string"},"airline_name":{"type":"string","example":"American Airlines","uniqueKey":"offers.items.[INDEX].additional_legs.items.[INDEX].segments.items.[INDEX].airline_name","typeLabel":"string"},"flight_number":{"type":"string","description":"Marketing flight number as the provider sends it on a live offer: a bare number such as `460`, without the carrier code, which `airline` carries.","example":"460","uniqueKey":"offers.items.[INDEX].additional_legs.items.[INDEX].segments.items.[INDEX].flight_number","typeLabel":"string"},"aircraft":{"type":"string","description":"IATA aircraft type code for the equipment scheduled on this segment. Absent when the provider reports no equipment; some providers never do, so their itineraries carry no `aircraft` at all (and are dropped by the `aircraft_types` filter).","example":"32Q","uniqueKey":"offers.items.[INDEX].additional_legs.items.[INDEX].segments.items.[INDEX].aircraft","typeLabel":"string"},"departure_airport":{"type":"string","example":"JFK","uniqueKey":"offers.items.[INDEX].additional_legs.items.[INDEX].segments.items.[INDEX].departure_airport","typeLabel":"string"},"departure_city":{"type":"string","description":"IATA city code of the departure airport (`NYC` for JFK), from the platform’s airport catalog: a code, not a name. Absent when the airport is not in the catalog.","example":"NYC","uniqueKey":"offers.items.[INDEX].additional_legs.items.[INDEX].segments.items.[INDEX].departure_city","typeLabel":"string"},"departure_time":{"type":"string","description":"Local time at the airport, RFC 3339 with that airport’s UTC offset (e.g. `2026-09-23T11:55:00-04:00`). Parse it as an instant; do not assume UTC and do not compare two of these as strings. The offset is a property of this leg/segment shape wherever it appears — a flight search, and an itinerary echoed back on a quote or trip read — not of the search response alone. On the rare airport whose timezone the platform does not know, the offset is omitted and the value is local wall-clock time. The `*_local` fields of a booked or exchanged itinerary are NOT this: those carry wall-clock time with no offset, by design.","example":"2026-09-23T11:55:00-04:00","uniqueKey":"offers.items.[INDEX].additional_legs.items.[INDEX].segments.items.[INDEX].departure_time","typeLabel":"string"},"arrival_airport":{"type":"string","example":"DFW","uniqueKey":"offers.items.[INDEX].additional_legs.items.[INDEX].segments.items.[INDEX].arrival_airport","typeLabel":"string"},"arrival_city":{"type":"string","description":"IATA city code of the arrival airport (`CHI` for ORD), from the platform’s airport catalog: a code, not a name. Absent when the airport is not in the catalog.","example":"DFW","uniqueKey":"offers.items.[INDEX].additional_legs.items.[INDEX].segments.items.[INDEX].arrival_city","typeLabel":"string"},"arrival_time":{"type":"string","description":"Local time at the airport, RFC 3339 with that airport’s UTC offset (e.g. `2026-09-23T11:55:00-04:00`). Parse it as an instant; do not assume UTC and do not compare two of these as strings. The offset is a property of this leg/segment shape wherever it appears — a flight search, and an itinerary echoed back on a quote or trip read — not of the search response alone. On the rare airport whose timezone the platform does not know, the offset is omitted and the value is local wall-clock time. The `*_local` fields of a booked or exchanged itinerary are NOT this: those carry wall-clock time with no offset, by design.","example":"2026-09-23T15:10:00-05:00","uniqueKey":"offers.items.[INDEX].additional_legs.items.[INDEX].segments.items.[INDEX].arrival_time","typeLabel":"string"},"duration_minutes":{"type":"number","example":255,"uniqueKey":"offers.items.[INDEX].additional_legs.items.[INDEX].segments.items.[INDEX].duration_minutes","typeLabel":"number"},"layover_minutes":{"type":"number","description":"Wait between this segment’s arrival and the next departure. Absent on the last segment of a leg, and whenever the upstream times could not be resolved.","example":95,"uniqueKey":"offers.items.[INDEX].additional_legs.items.[INDEX].segments.items.[INDEX].layover_minutes","typeLabel":"number"},"operating_carrier":{"type":"string","description":"IATA code of the carrier that actually OPERATES the segment. A value differing from `airline` is a codeshare the passenger must be told about. Whether equality is stated depends on the provider: some always send it, including when it equals `airline`; others send it only when they disclose an operating carrier, so an absent value says nothing about who operates the flight.","example":"MQ","uniqueKey":"offers.items.[INDEX].additional_legs.items.[INDEX].segments.items.[INDEX].operating_carrier","typeLabel":"string"}},"uniqueKey":"offers.items.[INDEX].additional_legs.items.[INDEX].segments.items.[INDEX]","typeLabel":"object"},"description":"The flown segments of this leg, in travel order — one per aircraft. A non-stop leg has one. Read `operating_carrier` here to disclose codeshares. Absent when the provider returned no segment breakdown, in which case `stops` and `stop_infos` are all that is known about the leg.","uniqueKey":"offers.items.[INDEX].additional_legs.items.[INDEX].segments","typeLabel":"object[]"}},"uniqueKey":"offers.items.[INDEX].additional_legs.items.[INDEX]","typeLabel":"object"},"description":"Third and later legs of a multi-city itinerary, in travel order. Empty for one-way and round-trip offers.","example":[],"isRequired":true,"uniqueKey":"offers.items.[INDEX].additional_legs","typeLabel":"object[]"},"fares":{"type":"array","items":{"type":"object","properties":{"trip_item_token":{"type":"string","description":"The token that adds this fare to a trip: pass it to `POST /v1/trip` as `add_item.trip_item_token`. Opaque: the offer’s `offer_id`, a colon, then the provider’s reference for the fare. Usable until `expires_at`; after that, search again and use the fresh token.","example":"offer__3a9f1b27:0-1-0","uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].trip_item_token","typeLabel":"string"},"searched_at":{"type":"string","format":"date-time","description":"When the supplier search for this fare began, in RFC 3339 format. Repeated searches can return the same trip_item_token; use this timestamp to assess freshness. Absent when the search time is unknown.","example":"2026-09-23T15:43:40Z","uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].searched_at","typeLabel":"string\u003cdate-time>"},"expires_at":{"type":"string","format":"date-time","description":"Latest known time to use this fare, in RFC 3339 format: the earlier of the supplier deadline, when supplied, and Jinko’s 75-minute token lifetime measured from searched_at. Without a supplier deadline this bounds token retention only. Availability and price can change sooner. Complete checkout promptly; after this time, search again and use the latest result. Absent means unknown, not unlimited validity. This is not a quote or payment deadline.","example":"2026-09-23T16:58:40Z","uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].expires_at","typeLabel":"string\u003cdate-time>"},"cabin_class":{"type":"string","description":"The cabin this fare sells: `economy`, `premium_economy`, `business` or `first`. For a fare over several flight segments it is the cabin of the main segment — the longest flight — since a short connecting segment can sit in another cabin.","example":"economy","uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].cabin_class","typeLabel":"string"},"brand_name":{"type":"string","description":"The fare brand as the airline names it, read from the first segment that carries a fare component; when the provider names no brand, the cabin name it sent instead. Absent when neither is known.","example":"Main Cabin","uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].brand_name","typeLabel":"string"},"total_price":{"type":"object","properties":{"amount":{"type":"number","description":"Deprecated: use `value` instead (the same integer) where this object carries decimal_places. Where it does not, the figure is in MAJOR units and the field holding this object is itself deprecated: read its `*_money` sibling. The two-scale rule applies only to deprecated fields. Alternative to `value` on some endpoints (the two never appear together); its scale depends on decimal_places. When this object carries decimal_places, amount is an INTEGER in minor units — divide by 10 ** decimal_places (e.g. select_ancillaries total_with_ancillaries). When there is no decimal_places field, amount is a decimal in MAJOR units, safe to display as-is (e.g. trip and checkout totals).","deprecated":true,"uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].total_price.amount","typeLabel":"number"},"value":{"type":"integer","description":"Integer amount in MINOR units, always paired with decimal_places — divide by 10 ** decimal_places to display. Example: value 15977 with decimal_places 2 is 159.77 USD. Rendering this field directly shows prices 100x too high for 2-decimal currencies.","example":41250,"uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].total_price.value","typeLabel":"integer"},"currency":{"type":"string","description":"ISO 4217 currency code.","example":"USD","uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].total_price.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"Scale of the integer value/amount: display = integer / 10 ** decimal_places. Always sent alongside minor-unit amounts. Usually the ISO 4217 digits of the currency (2 for USD/EUR/GBP, 0 for JPY/KRW, 3 for BHD/JOD/KWD) but currency-converted prices can carry a different scale — ALWAYS use the decimal_places sent with the amount, never a hardcoded 2. Only if the field is genuinely absent on a value-shaped object, fall back to the ISO digits for the currency.","example":2,"uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].total_price.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount, e.g. \"USD 159.77\". With decimal_places it is written at exactly that scale (value 1561500, JPY, decimal_places 2 is \"JPY 15615.00\"); without, at the ISO digits of the currency. Show this; compute with the number. Absent when the figure is not money (a cancellation step expressed as a percent or a number of nights) or could not be read unambiguously.","example":"USD 412.50","uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].total_price.display","typeLabel":"string"}},"description":"A money figure in one of two scales. New integrations read the `*_money` field beside it (a `MoneyValue`) where there is one, and `value` on objects that carry it; the rule below applies only to the deprecated forms. When `decimal_places` is present, `value` (or the deprecated `amount`) is an INTEGER in minor units: divide by 10 ** decimal_places. When it is absent, the deprecated `amount` is already in MAJOR units. Branch on whether decimal_places is present in the response you received, never on the currency code or the field name. `display` is the same figure as a string to show.","uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].total_price","typeLabel":"object"},"price_per_person":{"type":"object","properties":{"value":{"type":"integer","description":"Integer amount in MINOR units, always paired with decimal_places — divide by 10 ** decimal_places to display. Example: value 15977 with decimal_places 2 is 159.77 USD. Rendering this field directly shows prices 100x too high for 2-decimal currencies.","example":41250,"uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].price_per_person.value","typeLabel":"integer"},"currency":{"type":"string","description":"ISO 4217 currency code.","example":"USD","uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].price_per_person.currency","typeLabel":"string"},"decimal_places":{"type":"integer","description":"Scale of the integer value/amount: display = integer / 10 ** decimal_places. Always sent alongside minor-unit amounts. Usually the ISO 4217 digits of the currency (2 for USD/EUR/GBP, 0 for JPY/KRW, 3 for BHD/JOD/KWD) but currency-converted prices can carry a different scale — ALWAYS use the decimal_places sent with the amount, never a hardcoded 2. Only if the field is genuinely absent on a value-shaped object, fall back to the ISO digits for the currency.","example":2,"uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].price_per_person.decimal_places","typeLabel":"integer"},"display":{"type":"string","description":"The same figure as a string ready to show: the ISO 4217 code, a space, then the amount, e.g. \"USD 159.77\". With decimal_places it is written at exactly that scale (value 1561500, JPY, decimal_places 2 is \"JPY 15615.00\"); without, at the ISO digits of the currency. Show this; compute with the number. Absent when the figure is not money (a cancellation step expressed as a percent or a number of nights) or could not be read unambiguously.","example":"USD 412.50","uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].price_per_person.display","typeLabel":"string"}},"description":"A money figure: `value` is an INTEGER in minor units (divide by 10 ** `decimal_places` to get the amount), `currency` is its ISO 4217 code and `display` is the same figure as a string ready to show. The `Money` shape without its deprecated `amount` member, for a figure that never carried one.","uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].price_per_person","typeLabel":"object"},"included_baggage":{"type":"object","description":"Checked-bag allowance of this fare, read from the first segment that states one (it is not reported per leg). Absent when no segment states a checked-bag allowance; a stated zero is sent as `pieces: 0`.","properties":{"pieces":{"type":"integer","description":"Number of bags included at this allowance.","example":1,"uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].included_baggage.pieces","typeLabel":"integer"},"weight":{"type":"number","description":"Weight allowance per bag, in `weight_unit`.","example":23,"uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].included_baggage.weight","typeLabel":"number"},"weight_unit":{"type":"string","description":"`KG` or `LB`. Absent when the provider states no recognised unit.","example":"KG","uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].included_baggage.weight_unit","typeLabel":"string"},"dimensions":{"type":"string","description":"Size limit as the carrier states it. Free text, not a parseable measurement.","example":"158 cm linear","uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].included_baggage.dimensions","typeLabel":"string"},"description":{"type":"string","description":"Text the platform writes from the allowance, not the carrier’s own prose: for checked bags `1 bag, 23KG each`, `2 checked bags included` or `No checked bags included`; for cabin bags `1 carry-on bag` or `2 cabin bags`, with ` and 1 personal item` when one is included. Present on fares with NO free allowance too (`No checked bags included`), so its presence is not evidence a bag is included.","example":"1 bag, 23KG each","uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].included_baggage.description","typeLabel":"string"}},"uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].included_baggage","typeLabel":"object"},"carry_on_baggage":{"type":"object","description":"Cabin-bag allowance of this fare, read from the first segment that states a carry-on bag or a personal item (it is not reported per leg). Absent when no segment states one.","properties":{"pieces":{"type":"integer","description":"Number of bags included at this allowance.","example":1,"uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].carry_on_baggage.pieces","typeLabel":"integer"},"weight":{"type":"number","description":"Weight allowance per bag, in `weight_unit`.","example":23,"uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].carry_on_baggage.weight","typeLabel":"number"},"weight_unit":{"type":"string","description":"`KG` or `LB`. Absent when the provider states no recognised unit.","example":"KG","uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].carry_on_baggage.weight_unit","typeLabel":"string"},"dimensions":{"type":"string","description":"Size limit as the carrier states it. Free text, not a parseable measurement.","example":"158 cm linear","uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].carry_on_baggage.dimensions","typeLabel":"string"},"description":{"type":"string","description":"Text the platform writes from the allowance, not the carrier’s own prose: for checked bags `1 bag, 23KG each`, `2 checked bags included` or `No checked bags included`; for cabin bags `1 carry-on bag` or `2 cabin bags`, with ` and 1 personal item` when one is included. Present on fares with NO free allowance too (`No checked bags included`), so its presence is not evidence a bag is included.","example":"1 bag, 23KG each","uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].carry_on_baggage.description","typeLabel":"string"}},"uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].carry_on_baggage","typeLabel":"object"},"is_changeable":{"type":"boolean","description":"Whether the fare allows a voluntary change, folded from every change rule of the itinerary (the most restrictive wins). Not the same reading as the `changeable_only` filter: the filter checks the before-departure rules only, while this flag is `true` on a fare whose only decided rule allows a change after departure (`change_policy` then ends in `after departure`). `false` is an answer: the fare rules did not confirm a change is allowed.","example":true,"uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].is_changeable","typeLabel":"boolean"},"is_refundable":{"type":"boolean","description":"Whether the fare can be cancelled, with or without a fee, folded from every cancellation rule of the itinerary (the most restrictive wins). Not the same reading as the `refundable_only` filter: the filter checks the before-departure rules only, while this flag is `true` on a fare whose only decided rule allows cancellation after departure (`refund_policy` then ends in `after departure`). `false` is an answer: the fare rules did not confirm a refund is allowed.","example":false,"uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].is_refundable","typeLabel":"boolean"},"refund_policy":{"type":"string","description":"The refund terms in words, before booking: `Free cancellation`, `Refundable` (fee not stated), `Refundable with fee` or `Non-refundable`; when the only decided rule applies after departure, the same four with ` after departure` appended, e.g. `Refundable with fee after departure`. A cancellation rule with an unspecified penalty reads `Non-refundable`. Absent when the fare carries no cancellation rule. Read it beside `is_refundable`, which says only whether a refund is possible at all.","example":"Refundable with fee","uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].refund_policy","typeLabel":"string"},"change_policy":{"type":"string","description":"The change terms in words, before booking: `Free changes`, `Changes allowed` (fee not stated), `Changes allowed with fee` or `No changes allowed`; when the only decided rule applies after departure, the same four with ` after departure` appended, e.g. `Changes allowed with fee after departure`. Absent when the fare carries no change rule, or only one with an unspecified penalty. Read it beside `is_changeable`, which says only whether a change is possible at all.","example":"Changes allowed with fee","uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].change_policy","typeLabel":"string"},"checked_bag_included":{"type":"boolean","description":"Whether the price already includes at least one free checked bag, read from `included_baggage`: `pieces` is 1 or more. `included_baggage` comes from the first segment that states an allowance, so this is not the same reading as the `checked_bag_included` filter, which needs a free bag on every segment. `weight` is the per-bag limit that applies when a bag IS included, so it carries no allowance on its own; prose in `included_baggage` does not count either.","example":true,"uniqueKey":"offers.items.[INDEX].fares.items.[INDEX].checked_bag_included","typeLabel":"boolean"}},"uniqueKey":"offers.items.[INDEX].fares.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"offers.items.[INDEX].fares","typeLabel":"object[]"},"is_round_trip":{"type":"boolean","example":false,"uniqueKey":"offers.items.[INDEX].is_round_trip","typeLabel":"boolean"},"total_duration_minutes":{"type":"number","example":385,"uniqueKey":"offers.items.[INDEX].total_duration_minutes","typeLabel":"number"},"outbound":{"type":"object","properties":{"origin":{"type":"string","example":"JFK","uniqueKey":"offers.items.[INDEX].outbound.origin","typeLabel":"string"},"destination":{"type":"string","example":"LAX","uniqueKey":"offers.items.[INDEX].outbound.destination","typeLabel":"string"},"departure_datetime":{"type":"string","description":"Local time at the airport, RFC 3339 with that airport’s UTC offset (e.g. `2026-09-23T11:55:00-04:00`). Parse it as an instant; do not assume UTC and do not compare two of these as strings. The offset is a property of this leg/segment shape wherever it appears — a flight search, and an itinerary echoed back on a quote or trip read — not of the search response alone. On the rare airport whose timezone the platform does not know, the offset is omitted and the value is local wall-clock time. The `*_local` fields of a booked or exchanged itinerary are NOT this: those carry wall-clock time with no offset, by design.","example":"2026-07-15T08:30:00-04:00","uniqueKey":"offers.items.[INDEX].outbound.departure_datetime","typeLabel":"string"},"arrival_datetime":{"type":"string","description":"Local time at the airport, RFC 3339 with that airport’s UTC offset (e.g. `2026-09-23T11:55:00-04:00`). Parse it as an instant; do not assume UTC and do not compare two of these as strings. The offset is a property of this leg/segment shape wherever it appears — a flight search, and an itinerary echoed back on a quote or trip read — not of the search response alone. On the rare airport whose timezone the platform does not know, the offset is omitted and the value is local wall-clock time. The `*_local` fields of a booked or exchanged itinerary are NOT this: those carry wall-clock time with no offset, by design.","example":"2026-07-15T11:55:00-07:00","uniqueKey":"offers.items.[INDEX].outbound.arrival_datetime","typeLabel":"string"},"duration_minutes":{"type":"number","example":385,"uniqueKey":"offers.items.[INDEX].outbound.duration_minutes","typeLabel":"number"},"airline":{"type":"string","example":"AA","uniqueKey":"offers.items.[INDEX].outbound.airline","typeLabel":"string"},"airline_name":{"type":"string","example":"American Airlines","uniqueKey":"offers.items.[INDEX].outbound.airline_name","typeLabel":"string"},"stops":{"type":"number","example":0,"uniqueKey":"offers.items.[INDEX].outbound.stops","typeLabel":"number"},"stop_infos":{"type":"array","items":{"type":"object","properties":{"airport_code":{"type":"string","description":"IATA code of the airport where the leg stops.","example":"DFW","uniqueKey":"offers.items.[INDEX].outbound.stop_infos.items.[INDEX].airport_code","typeLabel":"string"},"duration_minutes":{"type":"number","description":"Layover length in minutes (arrival of the inbound segment to departure of the next). Omitted when the upstream times cannot be resolved.","example":95,"uniqueKey":"offers.items.[INDEX].outbound.stop_infos.items.[INDEX].duration_minutes","typeLabel":"number"}},"uniqueKey":"offers.items.[INDEX].outbound.stop_infos.items.[INDEX]","typeLabel":"object"},"description":"Layover detail, one entry per stop, in travel order. Absent when the leg is non-stop (`stops: 0`) or when upstream detail is incomplete for any stop; `stops` still reports the connection count in that case.","example":[{"airport_code":"DFW","duration_minutes":95}],"uniqueKey":"offers.items.[INDEX].outbound.stop_infos","typeLabel":"object[]"},"segments":{"type":"array","items":{"type":"object","properties":{"airline":{"type":"string","description":"IATA code of the MARKETING carrier — whose flight number you booked.","example":"AA","uniqueKey":"offers.items.[INDEX].outbound.segments.items.[INDEX].airline","typeLabel":"string"},"airline_name":{"type":"string","example":"American Airlines","uniqueKey":"offers.items.[INDEX].outbound.segments.items.[INDEX].airline_name","typeLabel":"string"},"flight_number":{"type":"string","description":"Marketing flight number as the provider sends it on a live offer: a bare number such as `460`, without the carrier code, which `airline` carries.","example":"460","uniqueKey":"offers.items.[INDEX].outbound.segments.items.[INDEX].flight_number","typeLabel":"string"},"aircraft":{"type":"string","description":"IATA aircraft type code for the equipment scheduled on this segment. Absent when the provider reports no equipment; some providers never do, so their itineraries carry no `aircraft` at all (and are dropped by the `aircraft_types` filter).","example":"32Q","uniqueKey":"offers.items.[INDEX].outbound.segments.items.[INDEX].aircraft","typeLabel":"string"},"departure_airport":{"type":"string","example":"JFK","uniqueKey":"offers.items.[INDEX].outbound.segments.items.[INDEX].departure_airport","typeLabel":"string"},"departure_city":{"type":"string","description":"IATA city code of the departure airport (`NYC` for JFK), from the platform’s airport catalog: a code, not a name. Absent when the airport is not in the catalog.","example":"NYC","uniqueKey":"offers.items.[INDEX].outbound.segments.items.[INDEX].departure_city","typeLabel":"string"},"departure_time":{"type":"string","description":"Local time at the airport, RFC 3339 with that airport’s UTC offset (e.g. `2026-09-23T11:55:00-04:00`). Parse it as an instant; do not assume UTC and do not compare two of these as strings. The offset is a property of this leg/segment shape wherever it appears — a flight search, and an itinerary echoed back on a quote or trip read — not of the search response alone. On the rare airport whose timezone the platform does not know, the offset is omitted and the value is local wall-clock time. The `*_local` fields of a booked or exchanged itinerary are NOT this: those carry wall-clock time with no offset, by design.","example":"2026-09-23T11:55:00-04:00","uniqueKey":"offers.items.[INDEX].outbound.segments.items.[INDEX].departure_time","typeLabel":"string"},"arrival_airport":{"type":"string","example":"DFW","uniqueKey":"offers.items.[INDEX].outbound.segments.items.[INDEX].arrival_airport","typeLabel":"string"},"arrival_city":{"type":"string","description":"IATA city code of the arrival airport (`CHI` for ORD), from the platform’s airport catalog: a code, not a name. Absent when the airport is not in the catalog.","example":"DFW","uniqueKey":"offers.items.[INDEX].outbound.segments.items.[INDEX].arrival_city","typeLabel":"string"},"arrival_time":{"type":"string","description":"Local time at the airport, RFC 3339 with that airport’s UTC offset (e.g. `2026-09-23T11:55:00-04:00`). Parse it as an instant; do not assume UTC and do not compare two of these as strings. The offset is a property of this leg/segment shape wherever it appears — a flight search, and an itinerary echoed back on a quote or trip read — not of the search response alone. On the rare airport whose timezone the platform does not know, the offset is omitted and the value is local wall-clock time. The `*_local` fields of a booked or exchanged itinerary are NOT this: those carry wall-clock time with no offset, by design.","example":"2026-09-23T15:10:00-05:00","uniqueKey":"offers.items.[INDEX].outbound.segments.items.[INDEX].arrival_time","typeLabel":"string"},"duration_minutes":{"type":"number","example":255,"uniqueKey":"offers.items.[INDEX].outbound.segments.items.[INDEX].duration_minutes","typeLabel":"number"},"layover_minutes":{"type":"number","description":"Wait between this segment’s arrival and the next departure. Absent on the last segment of a leg, and whenever the upstream times could not be resolved.","example":95,"uniqueKey":"offers.items.[INDEX].outbound.segments.items.[INDEX].layover_minutes","typeLabel":"number"},"operating_carrier":{"type":"string","description":"IATA code of the carrier that actually OPERATES the segment. A value differing from `airline` is a codeshare the passenger must be told about. Whether equality is stated depends on the provider: some always send it, including when it equals `airline`; others send it only when they disclose an operating carrier, so an absent value says nothing about who operates the flight.","example":"MQ","uniqueKey":"offers.items.[INDEX].outbound.segments.items.[INDEX].operating_carrier","typeLabel":"string"}},"uniqueKey":"offers.items.[INDEX].outbound.segments.items.[INDEX]","typeLabel":"object"},"description":"The flown segments of this leg, in travel order — one per aircraft. A non-stop leg has one. Read `operating_carrier` here to disclose codeshares. Absent when the provider returned no segment breakdown, in which case `stops` and `stop_infos` are all that is known about the leg.","uniqueKey":"offers.items.[INDEX].outbound.segments","typeLabel":"object[]"}},"uniqueKey":"offers.items.[INDEX].outbound","typeLabel":"object"},"inbound":{"type":"object","properties":{"origin":{"type":"string","example":"JFK","uniqueKey":"offers.items.[INDEX].inbound.origin","typeLabel":"string"},"destination":{"type":"string","example":"LAX","uniqueKey":"offers.items.[INDEX].inbound.destination","typeLabel":"string"},"departure_datetime":{"type":"string","description":"Local time at the airport, RFC 3339 with that airport’s UTC offset (e.g. `2026-09-23T11:55:00-04:00`). Parse it as an instant; do not assume UTC and do not compare two of these as strings. The offset is a property of this leg/segment shape wherever it appears — a flight search, and an itinerary echoed back on a quote or trip read — not of the search response alone. On the rare airport whose timezone the platform does not know, the offset is omitted and the value is local wall-clock time. The `*_local` fields of a booked or exchanged itinerary are NOT this: those carry wall-clock time with no offset, by design.","example":"2026-07-15T08:30:00-04:00","uniqueKey":"offers.items.[INDEX].inbound.departure_datetime","typeLabel":"string"},"arrival_datetime":{"type":"string","description":"Local time at the airport, RFC 3339 with that airport’s UTC offset (e.g. `2026-09-23T11:55:00-04:00`). Parse it as an instant; do not assume UTC and do not compare two of these as strings. The offset is a property of this leg/segment shape wherever it appears — a flight search, and an itinerary echoed back on a quote or trip read — not of the search response alone. On the rare airport whose timezone the platform does not know, the offset is omitted and the value is local wall-clock time. The `*_local` fields of a booked or exchanged itinerary are NOT this: those carry wall-clock time with no offset, by design.","example":"2026-07-15T11:55:00-07:00","uniqueKey":"offers.items.[INDEX].inbound.arrival_datetime","typeLabel":"string"},"duration_minutes":{"type":"number","example":385,"uniqueKey":"offers.items.[INDEX].inbound.duration_minutes","typeLabel":"number"},"airline":{"type":"string","example":"AA","uniqueKey":"offers.items.[INDEX].inbound.airline","typeLabel":"string"},"airline_name":{"type":"string","example":"American Airlines","uniqueKey":"offers.items.[INDEX].inbound.airline_name","typeLabel":"string"},"stops":{"type":"number","example":0,"uniqueKey":"offers.items.[INDEX].inbound.stops","typeLabel":"number"},"stop_infos":{"type":"array","items":{"type":"object","properties":{"airport_code":{"type":"string","description":"IATA code of the airport where the leg stops.","example":"DFW","uniqueKey":"offers.items.[INDEX].inbound.stop_infos.items.[INDEX].airport_code","typeLabel":"string"},"duration_minutes":{"type":"number","description":"Layover length in minutes (arrival of the inbound segment to departure of the next). Omitted when the upstream times cannot be resolved.","example":95,"uniqueKey":"offers.items.[INDEX].inbound.stop_infos.items.[INDEX].duration_minutes","typeLabel":"number"}},"uniqueKey":"offers.items.[INDEX].inbound.stop_infos.items.[INDEX]","typeLabel":"object"},"description":"Layover detail, one entry per stop, in travel order. Absent when the leg is non-stop (`stops: 0`) or when upstream detail is incomplete for any stop; `stops` still reports the connection count in that case.","example":[{"airport_code":"DFW","duration_minutes":95}],"uniqueKey":"offers.items.[INDEX].inbound.stop_infos","typeLabel":"object[]"},"segments":{"type":"array","items":{"type":"object","properties":{"airline":{"type":"string","description":"IATA code of the MARKETING carrier — whose flight number you booked.","example":"AA","uniqueKey":"offers.items.[INDEX].inbound.segments.items.[INDEX].airline","typeLabel":"string"},"airline_name":{"type":"string","example":"American Airlines","uniqueKey":"offers.items.[INDEX].inbound.segments.items.[INDEX].airline_name","typeLabel":"string"},"flight_number":{"type":"string","description":"Marketing flight number as the provider sends it on a live offer: a bare number such as `460`, without the carrier code, which `airline` carries.","example":"460","uniqueKey":"offers.items.[INDEX].inbound.segments.items.[INDEX].flight_number","typeLabel":"string"},"aircraft":{"type":"string","description":"IATA aircraft type code for the equipment scheduled on this segment. Absent when the provider reports no equipment; some providers never do, so their itineraries carry no `aircraft` at all (and are dropped by the `aircraft_types` filter).","example":"32Q","uniqueKey":"offers.items.[INDEX].inbound.segments.items.[INDEX].aircraft","typeLabel":"string"},"departure_airport":{"type":"string","example":"JFK","uniqueKey":"offers.items.[INDEX].inbound.segments.items.[INDEX].departure_airport","typeLabel":"string"},"departure_city":{"type":"string","description":"IATA city code of the departure airport (`NYC` for JFK), from the platform’s airport catalog: a code, not a name. Absent when the airport is not in the catalog.","example":"NYC","uniqueKey":"offers.items.[INDEX].inbound.segments.items.[INDEX].departure_city","typeLabel":"string"},"departure_time":{"type":"string","description":"Local time at the airport, RFC 3339 with that airport’s UTC offset (e.g. `2026-09-23T11:55:00-04:00`). Parse it as an instant; do not assume UTC and do not compare two of these as strings. The offset is a property of this leg/segment shape wherever it appears — a flight search, and an itinerary echoed back on a quote or trip read — not of the search response alone. On the rare airport whose timezone the platform does not know, the offset is omitted and the value is local wall-clock time. The `*_local` fields of a booked or exchanged itinerary are NOT this: those carry wall-clock time with no offset, by design.","example":"2026-09-23T11:55:00-04:00","uniqueKey":"offers.items.[INDEX].inbound.segments.items.[INDEX].departure_time","typeLabel":"string"},"arrival_airport":{"type":"string","example":"DFW","uniqueKey":"offers.items.[INDEX].inbound.segments.items.[INDEX].arrival_airport","typeLabel":"string"},"arrival_city":{"type":"string","description":"IATA city code of the arrival airport (`CHI` for ORD), from the platform’s airport catalog: a code, not a name. Absent when the airport is not in the catalog.","example":"DFW","uniqueKey":"offers.items.[INDEX].inbound.segments.items.[INDEX].arrival_city","typeLabel":"string"},"arrival_time":{"type":"string","description":"Local time at the airport, RFC 3339 with that airport’s UTC offset (e.g. `2026-09-23T11:55:00-04:00`). Parse it as an instant; do not assume UTC and do not compare two of these as strings. The offset is a property of this leg/segment shape wherever it appears — a flight search, and an itinerary echoed back on a quote or trip read — not of the search response alone. On the rare airport whose timezone the platform does not know, the offset is omitted and the value is local wall-clock time. The `*_local` fields of a booked or exchanged itinerary are NOT this: those carry wall-clock time with no offset, by design.","example":"2026-09-23T15:10:00-05:00","uniqueKey":"offers.items.[INDEX].inbound.segments.items.[INDEX].arrival_time","typeLabel":"string"},"duration_minutes":{"type":"number","example":255,"uniqueKey":"offers.items.[INDEX].inbound.segments.items.[INDEX].duration_minutes","typeLabel":"number"},"layover_minutes":{"type":"number","description":"Wait between this segment’s arrival and the next departure. Absent on the last segment of a leg, and whenever the upstream times could not be resolved.","example":95,"uniqueKey":"offers.items.[INDEX].inbound.segments.items.[INDEX].layover_minutes","typeLabel":"number"},"operating_carrier":{"type":"string","description":"IATA code of the carrier that actually OPERATES the segment. A value differing from `airline` is a codeshare the passenger must be told about. Whether equality is stated depends on the provider: some always send it, including when it equals `airline`; others send it only when they disclose an operating carrier, so an absent value says nothing about who operates the flight.","example":"MQ","uniqueKey":"offers.items.[INDEX].inbound.segments.items.[INDEX].operating_carrier","typeLabel":"string"}},"uniqueKey":"offers.items.[INDEX].inbound.segments.items.[INDEX]","typeLabel":"object"},"description":"The flown segments of this leg, in travel order — one per aircraft. A non-stop leg has one. Read `operating_carrier` here to disclose codeshares. Absent when the provider returned no segment breakdown, in which case `stops` and `stop_infos` are all that is known about the leg.","uniqueKey":"offers.items.[INDEX].inbound.segments","typeLabel":"object[]"}},"uniqueKey":"offers.items.[INDEX].inbound","typeLabel":"object"}},"required":["offer_id","origin","destination","additional_legs","fares"],"uniqueKey":"offers.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"offers","typeLabel":"object[]"},"exact_match_found":{"type":"boolean","description":"Price-check mode only (request carried `offer_token`): true when the live offer has the same flights as the cached one. Absent in search mode.","example":true,"uniqueKey":"exact_match_found","typeLabel":"boolean"},"result":{"type":"string","enum":["no_matches"],"description":"Search mode only. `no_matches` means the search completed and no offer matched: relay `instruction`, which asks which filter to relax only when the request sent a filter that narrows the results. `offers` is empty. Absent when offers were found. A search that could not be completed at all answers an error instead (`UPSTREAM_REJECTED`, `UPSTREAM_ERROR`, `UPSTREAM_UNAVAILABLE` or `UPSTREAM_TIMEOUT`), never an empty list.","uniqueKey":"result","typeLabel":"enum\u003cstring>"},"instruction":{"type":"string","description":"Present with `result: no_matches`: what to tell the user or do next. It attributes the empty result to the filters only when the request sent a filter that narrows the results; otherwise it reads \"Search completed successfully, but no flights were found for this route and dates. Ask the user whether to try other dates or airports before searching again.\"","example":"Search completed successfully, but no offers satisfied every filter sent: the filter combination is too restrictive for this route and dates. Ask the user which filter to relax before searching again.","uniqueKey":"instruction","typeLabel":"string"}},"required":["offers"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"offers":[{"offer_id":"offer__3a9f1b27","origin":{"code":"NYC","name":"New York"},"destination":{"code":"LAX","name":"Los Angeles"},"additional_legs":[],"fares":[{"trip_item_token":"offer__3a9f1b27:0-1-0","searched_at":"2026-09-23T15:43:40Z","expires_at":"2026-09-23T16:58:40Z","cabin_class":"economy","brand_name":"Main Cabin","total_price":{"amount":123,"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"price_per_person":{"value":41250,"currency":"USD","decimal_places":2,"display":"USD 412.50"},"included_baggage":{"pieces":1,"weight":23,"weight_unit":"KG","dimensions":"158 cm linear","description":"1 bag, 23KG each"},"carry_on_baggage":{"pieces":1,"weight":23,"weight_unit":"KG","dimensions":"158 cm linear","description":"1 bag, 23KG each"},"is_changeable":true,"is_refundable":false,"refund_policy":"Refundable with fee","change_policy":"Changes allowed with fee","checked_bag_included":true}],"is_round_trip":false,"total_duration_minutes":385,"outbound":{"origin":"JFK","destination":"LAX","departure_datetime":"2026-07-15T08:30:00-04:00","arrival_datetime":"2026-07-15T11:55:00-07:00","duration_minutes":385,"airline":"AA","airline_name":"American Airlines","stops":0,"stop_infos":[{"airport_code":"DFW","duration_minutes":95}],"segments":[{"airline":"AA","airline_name":"American Airlines","flight_number":"460","aircraft":"32Q","departure_airport":"JFK","departure_city":"NYC","departure_time":"2026-09-23T11:55:00-04:00","arrival_airport":"DFW","arrival_city":"DFW","arrival_time":"2026-09-23T15:10:00-05:00","duration_minutes":255,"layover_minutes":95,"operating_carrier":"MQ"}]},"inbound":{"origin":"JFK","destination":"LAX","departure_datetime":"2026-07-15T08:30:00-04:00","arrival_datetime":"2026-07-15T11:55:00-07:00","duration_minutes":385,"airline":"AA","airline_name":"American Airlines","stops":0,"stop_infos":[{"airport_code":"DFW","duration_minutes":95}],"segments":[{"airline":"AA","airline_name":"American Airlines","flight_number":"460","aircraft":"32Q","departure_airport":"JFK","departure_city":"NYC","departure_time":"2026-09-23T11:55:00-04:00","arrival_airport":"DFW","arrival_city":"DFW","arrival_time":"2026-09-23T15:10:00-05:00","duration_minutes":255,"layover_minutes":95,"operating_carrier":"MQ"}]}}],"exact_match_found":true,"result":"no_matches","instruction":"Search completed successfully, but no offers satisfied every filter sent: the filter combination is too restrictive for this route and dates. Ask the user which filter to relax before searching again."}}},"exampleType":"generated"}},"exampleType":"generated"},"d5c5dfd4-951f-419b-8508-f7691851c192":{"description":"The request was malformed or failed validation (search and price check alike). When a supplier declined the request, `error.message` is “The request was declined for these inputs. Check the dates, places and travellers, then retry.” **`BAD_REQUEST`** — The request was malformed or failed validation. Fix the request as the message describes; retrying it unchanged cannot succeed.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["INVALID_SEGMENTS_TO_EXCHANGE","PARTIAL_EXCHANGE_UNSUPPORTED","LEG_ALREADY_DEPARTED","DEPARTURE_DATE_IN_PAST","LEG_DATES_OUT_OF_ORDER","INVALID_EXCHANGE_REQUEST","NOT_EXCHANGEABLE","CREDENTIAL_FORMAT_INVALID","PAYMENT_TYPE_NOT_ENABLED","PAYMENT_CREDENTIAL_INVALID","TRIP_OWNED_BY_OTHER_PAYMENT","IDEMPOTENCY_KEY_REUSED","ATTEMPT_IN_PROGRESS","ATTEMPT_TERMINAL","TEMPORARILY_UNAVAILABLE","AUTH_REQUIRED","PAYMENT_REQUIRED","RATE_LIMITED","BAD_REQUEST","FORBIDDEN","NOT_FOUND","CONFLICT","GONE","QUOTE_PENDING","QUOTE_EXPIRED","TRIP_EXPIRED","TRIP_STATE_CONFLICT","OFFER_EXPIRED","OFFER_UNAVAILABLE","MISSING_CUSTOMER_DETAILS","INVALID_PHONE_NUMBER","INVALID_FLIGHT_NUMBER","CURRENCY_UNSUPPORTED","HOTEL_NAME_LOW_CONFIDENCE","DESTINATION_LOW_CONFIDENCE","UPSTREAM_REJECTED","UPSTREAM_UNAVAILABLE","UPSTREAM_TIMEOUT","UPSTREAM_ERROR","INTERNAL"],"description":"What went wrong, as a stable machine-readable code. This is a closed set — branch on it rather than on `message`, which is prose and may change. New codes arrive in a minor version, so treat an unknown one as its HTTP status. A code can also stop being emitted: it leaves this set in a minor version, named in the changelog, and a branch you wrote for it goes unreached rather than wrong.","example":"BAD_REQUEST","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"What went wrong, in prose. These codes always carry the same message, and it never includes text from a supplier: `RATE_LIMITED` — \"Too many requests. Retry after the Retry-After delay.\"; `OFFER_EXPIRED` — \"This offer has expired. Search again.\"; `OFFER_UNAVAILABLE` — \"This offer is no longer available. Search again.\"; `UPSTREAM_REJECTED` — \"The request was declined for this offer. Try another offer.\"; `UPSTREAM_UNAVAILABLE` — \"The service is temporarily unavailable. Retry after the Retry-After delay.\"; `UPSTREAM_TIMEOUT` — \"The request timed out before a result was available. Retry the request.\"; `UPSTREAM_ERROR` — \"The request could not be completed.\".","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"error.doc_url","typeLabel":"string"},"field":{"type":"string","description":"On a 400 `BAD_REQUEST` that names one refused input: the path of that field in your request, e.g. `selections[1].quantity` for the second selection of a `select_ancillaries` call. Absent when the refusal names no single field.","example":"selections[1].quantity","uniqueKey":"error.field","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"BAD_REQUEST","message":"The request was declined for these inputs. Check the dates, places and travellers, then retry."}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"BAD_REQUEST","message":"The request was declined for these inputs. Check the dates, places and travellers, then retry."}}}},"exampleType":"examples"}},"exampleType":"examples"},"fbdc54e2-f674-498a-a499-70b518d5ead7":{"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"},"a0542b0d-bf29-4697-a200-2ef135674f4e":{"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"},"60215920-bb9b-49a7-a669-ce86272a24fc":{"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"},"b5b73761-7393-4d86-af65-cae4a0fce07a":{"description":"The operation conflicts with the current state of the resource","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["INVALID_SEGMENTS_TO_EXCHANGE","PARTIAL_EXCHANGE_UNSUPPORTED","LEG_ALREADY_DEPARTED","DEPARTURE_DATE_IN_PAST","LEG_DATES_OUT_OF_ORDER","INVALID_EXCHANGE_REQUEST","NOT_EXCHANGEABLE","CREDENTIAL_FORMAT_INVALID","PAYMENT_TYPE_NOT_ENABLED","PAYMENT_CREDENTIAL_INVALID","TRIP_OWNED_BY_OTHER_PAYMENT","IDEMPOTENCY_KEY_REUSED","ATTEMPT_IN_PROGRESS","ATTEMPT_TERMINAL","TEMPORARILY_UNAVAILABLE","AUTH_REQUIRED","PAYMENT_REQUIRED","RATE_LIMITED","BAD_REQUEST","FORBIDDEN","NOT_FOUND","CONFLICT","GONE","QUOTE_PENDING","QUOTE_EXPIRED","TRIP_EXPIRED","TRIP_STATE_CONFLICT","OFFER_EXPIRED","OFFER_UNAVAILABLE","MISSING_CUSTOMER_DETAILS","INVALID_PHONE_NUMBER","INVALID_FLIGHT_NUMBER","CURRENCY_UNSUPPORTED","HOTEL_NAME_LOW_CONFIDENCE","DESTINATION_LOW_CONFIDENCE","UPSTREAM_REJECTED","UPSTREAM_UNAVAILABLE","UPSTREAM_TIMEOUT","UPSTREAM_ERROR","INTERNAL"],"description":"What went wrong, as a stable machine-readable code. This is a closed set — branch on it rather than on `message`, which is prose and may change. New codes arrive in a minor version, so treat an unknown one as its HTTP status. A code can also stop being emitted: it leaves this set in a minor version, named in the changelog, and a branch you wrote for it goes unreached rather than wrong.","example":"BAD_REQUEST","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"What went wrong, in prose. These codes always carry the same message, and it never includes text from a supplier: `RATE_LIMITED` — \"Too many requests. Retry after the Retry-After delay.\"; `OFFER_EXPIRED` — \"This offer has expired. Search again.\"; `OFFER_UNAVAILABLE` — \"This offer is no longer available. Search again.\"; `UPSTREAM_REJECTED` — \"The request was declined for this offer. Try another offer.\"; `UPSTREAM_UNAVAILABLE` — \"The service is temporarily unavailable. Retry after the Retry-After delay.\"; `UPSTREAM_TIMEOUT` — \"The request timed out before a result was available. Retry the request.\"; `UPSTREAM_ERROR` — \"The request could not be completed.\".","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"error.doc_url","typeLabel":"string"},"field":{"type":"string","description":"On a 400 `BAD_REQUEST` that names one refused input: the path of that field in your request, e.g. `selections[1].quantity` for the second selection of a `select_ancillaries` call. Absent when the refusal names no single field.","example":"selections[1].quantity","uniqueKey":"error.field","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"CONFLICT","message":"The operation conflicts with the current state of the resource.","doc_url":"https://docs.gojinko.com/concepts/errors"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"CONFLICT","message":"The operation conflicts with the current state of the resource.","doc_url":"https://docs.gojinko.com/concepts/errors"}}}},"exampleType":"examples"}},"exampleType":"examples"},"90a6f2a7-393a-4869-ae74-89e75c60e575":{"description":"The resource this request names no longer exists","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["INVALID_SEGMENTS_TO_EXCHANGE","PARTIAL_EXCHANGE_UNSUPPORTED","LEG_ALREADY_DEPARTED","DEPARTURE_DATE_IN_PAST","LEG_DATES_OUT_OF_ORDER","INVALID_EXCHANGE_REQUEST","NOT_EXCHANGEABLE","CREDENTIAL_FORMAT_INVALID","PAYMENT_TYPE_NOT_ENABLED","PAYMENT_CREDENTIAL_INVALID","TRIP_OWNED_BY_OTHER_PAYMENT","IDEMPOTENCY_KEY_REUSED","ATTEMPT_IN_PROGRESS","ATTEMPT_TERMINAL","TEMPORARILY_UNAVAILABLE","AUTH_REQUIRED","PAYMENT_REQUIRED","RATE_LIMITED","BAD_REQUEST","FORBIDDEN","NOT_FOUND","CONFLICT","GONE","QUOTE_PENDING","QUOTE_EXPIRED","TRIP_EXPIRED","TRIP_STATE_CONFLICT","OFFER_EXPIRED","OFFER_UNAVAILABLE","MISSING_CUSTOMER_DETAILS","INVALID_PHONE_NUMBER","INVALID_FLIGHT_NUMBER","CURRENCY_UNSUPPORTED","HOTEL_NAME_LOW_CONFIDENCE","DESTINATION_LOW_CONFIDENCE","UPSTREAM_REJECTED","UPSTREAM_UNAVAILABLE","UPSTREAM_TIMEOUT","UPSTREAM_ERROR","INTERNAL"],"description":"What went wrong, as a stable machine-readable code. This is a closed set — branch on it rather than on `message`, which is prose and may change. New codes arrive in a minor version, so treat an unknown one as its HTTP status. A code can also stop being emitted: it leaves this set in a minor version, named in the changelog, and a branch you wrote for it goes unreached rather than wrong.","example":"BAD_REQUEST","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"What went wrong, in prose. These codes always carry the same message, and it never includes text from a supplier: `RATE_LIMITED` — \"Too many requests. Retry after the Retry-After delay.\"; `OFFER_EXPIRED` — \"This offer has expired. Search again.\"; `OFFER_UNAVAILABLE` — \"This offer is no longer available. Search again.\"; `UPSTREAM_REJECTED` — \"The request was declined for this offer. Try another offer.\"; `UPSTREAM_UNAVAILABLE` — \"The service is temporarily unavailable. Retry after the Retry-After delay.\"; `UPSTREAM_TIMEOUT` — \"The request timed out before a result was available. Retry the request.\"; `UPSTREAM_ERROR` — \"The request could not be completed.\".","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"error.doc_url","typeLabel":"string"},"field":{"type":"string","description":"On a 400 `BAD_REQUEST` that names one refused input: the path of that field in your request, e.g. `selections[1].quantity` for the second selection of a `select_ancillaries` call. Absent when the refusal names no single field.","example":"selections[1].quantity","uniqueKey":"error.field","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"GONE","message":"The resource no longer exists.","doc_url":"https://docs.gojinko.com/concepts/errors"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"GONE","message":"The resource no longer exists.","doc_url":"https://docs.gojinko.com/concepts/errors"}}}},"exampleType":"examples"}},"exampleType":"examples"},"aac1515f-1015-404d-bb09-f3ca59257052":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["INVALID_SEGMENTS_TO_EXCHANGE","PARTIAL_EXCHANGE_UNSUPPORTED","LEG_ALREADY_DEPARTED","DEPARTURE_DATE_IN_PAST","LEG_DATES_OUT_OF_ORDER","INVALID_EXCHANGE_REQUEST","NOT_EXCHANGEABLE","CREDENTIAL_FORMAT_INVALID","PAYMENT_TYPE_NOT_ENABLED","PAYMENT_CREDENTIAL_INVALID","TRIP_OWNED_BY_OTHER_PAYMENT","IDEMPOTENCY_KEY_REUSED","ATTEMPT_IN_PROGRESS","ATTEMPT_TERMINAL","TEMPORARILY_UNAVAILABLE","AUTH_REQUIRED","PAYMENT_REQUIRED","RATE_LIMITED","BAD_REQUEST","FORBIDDEN","NOT_FOUND","CONFLICT","GONE","QUOTE_PENDING","QUOTE_EXPIRED","TRIP_EXPIRED","TRIP_STATE_CONFLICT","OFFER_EXPIRED","OFFER_UNAVAILABLE","MISSING_CUSTOMER_DETAILS","INVALID_PHONE_NUMBER","INVALID_FLIGHT_NUMBER","CURRENCY_UNSUPPORTED","HOTEL_NAME_LOW_CONFIDENCE","DESTINATION_LOW_CONFIDENCE","UPSTREAM_REJECTED","UPSTREAM_UNAVAILABLE","UPSTREAM_TIMEOUT","UPSTREAM_ERROR","INTERNAL"],"description":"What went wrong, as a stable machine-readable code. This is a closed set — branch on it rather than on `message`, which is prose and may change. New codes arrive in a minor version, so treat an unknown one as its HTTP status. A code can also stop being emitted: it leaves this set in a minor version, named in the changelog, and a branch you wrote for it goes unreached rather than wrong.","example":"BAD_REQUEST","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"What went wrong, in prose. These codes always carry the same message, and it never includes text from a supplier: `RATE_LIMITED` — \"Too many requests. Retry after the Retry-After delay.\"; `OFFER_EXPIRED` — \"This offer has expired. Search again.\"; `OFFER_UNAVAILABLE` — \"This offer is no longer available. Search again.\"; `UPSTREAM_REJECTED` — \"The request was declined for this offer. Try another offer.\"; `UPSTREAM_UNAVAILABLE` — \"The service is temporarily unavailable. Retry after the Retry-After delay.\"; `UPSTREAM_TIMEOUT` — \"The request timed out before a result was available. Retry the request.\"; `UPSTREAM_ERROR` — \"The request could not be completed.\".","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"error.doc_url","typeLabel":"string"},"field":{"type":"string","description":"On a 400 `BAD_REQUEST` that names one refused input: the path of that field in your request, e.g. `selections[1].quantity` for the second selection of a `select_ancillaries` call. Absent when the refusal names no single field.","example":"selections[1].quantity","uniqueKey":"error.field","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"BAD_REQUEST","message":"A required field is missing or invalid.","doc_url":"https://docs.gojinko.com/concepts/errors"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"BAD_REQUEST","message":"A required field is missing or invalid.","doc_url":"https://docs.gojinko.com/concepts/errors"}}}},"exampleType":"examples"}},"exampleType":"examples"},"51231f3a-7d6a-4692-a43f-bb71a395ab42":{"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"},"765f6960-c8d7-47db-b9e1-8dc67c17d009":{"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"},"255b4f6d-d3d7-4986-ae3e-1bc561937be4":{"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"},"60317d66-b921-46bc-9f7b-a3974300f239":{"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":{"ba73bdf0-f551-48e7-9429-459e951b2035":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","scopes":[],"schemeName":"ApiKeyAuth"}},"37c2344a-5689-4c02-aa68-773fa9459c08":{"BearerAuth":{"type":"http","scheme":"bearer","scopes":[],"schemeName":"BearerAuth"}}},"servers":{"6c2e2c14-8667-4ef1-a6c7-d1e7fb982378":{"url":"https://api.gojinko.com","description":"Production"},"0b2c8592-7b6b-4acc-9351-2a69f3e0f42a":{"url":"https://api.sandbox.gojinko.com","description":"Sandbox"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"X-API-Key","scopes":[],"schemeName":"ApiKeyAuth"},"schema":{"title":"X-API-Key","type":"string","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"ApiKeyAuth","name":"X-API-Key"}],"title":"ApiKeyAuth"},{"schemes":[{"scheme":{"type":"http","scheme":"bearer","scopes":[],"schemeName":"BearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Bearer authentication header of the form `Bearer \u003ctoken>`, where `\u003ctoken>` is your auth token.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"BearerAuth","name":"Authorization"}],"title":"BearerAuth"}]},"originalFileLocation":"api-reference/public-api.yaml"},"subdomain":"jinko-dev","siteName":"Jinko Platform","title":"flight-search - Jinko Platform","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-14T02:50:54.449Z","originalFileLocation":"api/flight-search.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Get live flight pricing, search by route, or re-price a known offer\">\u003cmeta data-mint-head name=\"application-name\" content=\"Jinko Platform\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/jinko-dev/jotmHl7NmaCERw_m/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/jinko-dev/jotmHl7NmaCERw_m/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/jinko-dev/jotmHl7NmaCERw_m/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/jinko-dev/jotmHl7NmaCERw_m/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/jinko-dev/jotmHl7NmaCERw_m/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/jinko-dev/jotmHl7NmaCERw_m/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/jinko-dev/jotmHl7NmaCERw_m/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/jinko-dev/jotmHl7NmaCERw_m/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/jinko-dev/jotmHl7NmaCERw_m/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"flight-search - Jinko Platform\">\u003cmeta data-mint-head property=\"og:description\" content=\"Get live flight pricing, search by route, or re-price a known offer\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Jinko Platform\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.dev.gojinko.com/api/flight-search\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://jinko-dev.mintlify.site/_mintlify/api/og/v2?division=Search\u0026amp;title=flight-search\u0026amp;description=Get+live+flight+pricing%2C+search+by+route%2C+or+re-price+a+known+offer\u0026amp;theme=d8471b1916fc5bd660c4c758\u0026amp;signature=8c8db045b57bf860be47d9b8886a381f90d9b267432a07a88e9d1410f8984365\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"flight-search - Jinko Platform\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Get live flight pricing, search by route, or re-price a known offer\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://jinko-dev.mintlify.site/_mintlify/api/og/v2?division=Search\u0026amp;title=flight-search\u0026amp;description=Get+live+flight+pricing%2C+search+by+route%2C+or+re-price+a+known+offer\u0026amp;theme=d8471b1916fc5bd660c4c758\u0026amp;signature=8c8db045b57bf860be47d9b8886a381f90d9b267432a07a88e9d1410f8984365\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/jinko-dev/jotmHl7NmaCERw_m/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Jinko Platform\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#FF6363\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.dev.gojinko.com/api/flight-search\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api/flight-search.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.dev.gojinko.com/#organization\",\"name\":\"Jinko Platform\",\"url\":\"https://docs.dev.gojinko.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/jinko-dev/k6P2DyAYQF0FPJQi/logo/jinko-logo.png?fit=max\u0026auto=format\u0026n=k6P2DyAYQF0FPJQi\u0026q=85\u0026s=785a20dc553a2698bfffad325d1198d0\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.dev.gojinko.com#website\",\"name\":\"Jinko Platform\",\"url\":\"https://docs.dev.gojinko.com\",\"publisher\":{\"@id\":\"https://docs.dev.gojinko.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.dev.gojinko.com/api/flight-search#webpage\",\"url\":\"https://docs.dev.gojinko.com/api/flight-search\",\"name\":\"flight-search\",\"description\":\"Get live flight pricing, search by route, or re-price a known offer\",\"dateModified\":\"2026-10-14T02:50:54.449Z\",\"isPartOf\":{\"@id\":\"https://docs.dev.gojinko.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.dev.gojinko.com/api/flight-search#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.dev.gojinko.com/api/flight-search#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Flights\",\"item\":\"https://docs.dev.gojinko.com/api/find-destination\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"flight-search\",\"item\":\"https://docs.dev.gojinko.com/api/flight-search\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.dev.gojinko.com/api/flight-search#apireference\",\"headline\":\"flight-search\",\"name\":\"flight-search\",\"description\":\"Get live flight pricing, search by route, or re-price a known offer\",\"url\":\"https://docs.dev.gojinko.com/api/flight-search\",\"mainEntityOfPage\":{\"@id\":\"https://docs.dev.gojinko.com/api/flight-search#webpage\"},\"dateModified\":\"2026-10-14T02:50:54.449Z\",\"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","description":"Accept a flight with its current price for 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)","description":"Search award (miles) availability across airline loyalty programs","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","openapi":"api-reference/public-api.yaml POST /v1/car_cancel_status","href":"/api/car-cancel-status"}]},{"group":"Trip \u0026 Payment","pages":[{"title":"trip","sidebarTitle":"/v1/trip","openapi":"api-reference/public-api.yaml POST /v1/trip","href":"/api/trip"},{"group":"Ancillaries","pages":[{"title":"select-ancillaries","sidebarTitle":"/v1/select_ancillaries","openapi":"api-reference/public-api.yaml POST /v1/select_ancillaries","href":"/api/select-ancillaries"},{"title":"trip ancillaries","sidebarTitle":"/v1/trip/{trip_id}/ancillaries","openapi":"api-reference/public-api.yaml GET /v1/trip/{trip_id}/ancillaries","href":"/api/trip/ancillaries"}]},{"title":"checkout","sidebarTitle":"/v1/checkout","openapi":"api-reference/public-api.yaml POST /v1/checkout","href":"/api/checkout"},{"title":"agent-payment submit","sidebarTitle":"/v1/agent_payment/submit","openapi":"api-reference/public-api.yaml POST /v1/agent_payment/submit","href":"/api/agent-payment/submit"},{"title":"trip-status","sidebarTitle":"/v1/trip/{trip_id}","openapi":"api-reference/public-api.yaml GET /v1/trip/{trip_id}","href":"/api/trip-status"},{"title":"get-booking","sidebarTitle":"/v1/get_booking","openapi":"api-reference/public-api.yaml POST /v1/get_booking","href":"/api/get-booking"}]},{"group":"Marketing claim","tag":"Preview","pages":[{"title":"best-price-guarantee","sidebarTitle":"/v1/best_price_guarantee","openapi":"api-reference/public-api.yaml POST /v1/best_price_guarantee","href":"/api/best-price-guarantee"},{"title":"best-price-guarantee-status","sidebarTitle":"/v1/best_price_guarantee/{id}","openapi":"api-reference/public-api.yaml GET /v1/best_price_guarantee/{id}","href":"/api/best-price-guarantee-status"}]},{"group":"Webhooks","pages":[{"title":"webhooks register","sidebarTitle":"/v1/webhooks","openapi":"api-reference/public-api.yaml POST /v1/webhooks","href":"/api/webhooks/register"},{"title":"webhooks list","sidebarTitle":"/v1/webhooks","openapi":"api-reference/public-api.yaml GET /v1/webhooks","href":"/api/webhooks/list"},{"title":"webhooks get","sidebarTitle":"/v1/webhooks/{id}","openapi":"api-reference/public-api.yaml GET /v1/webhooks/{id}","href":"/api/webhooks/get"},{"title":"webhooks delete","sidebarTitle":"/v1/webhooks/{id}","openapi":"api-reference/public-api.yaml DELETE /v1/webhooks/{id}","href":"/api/webhooks/delete"},{"title":"webhooks test","sidebarTitle":"/v1/webhooks/{id}/test","openapi":"api-reference/public-api.yaml POST /v1/webhooks/{id}/test","href":"/api/webhooks/test"},{"title":"webhooks deliveries","sidebarTitle":"/v1/webhooks/{id}/deliveries","openapi":"api-reference/public-api.yaml GET /v1/webhooks/{id}/deliveries","href":"/api/webhooks/deliveries"},{"title":"webhooks replay","sidebarTitle":"/v1/webhooks/{id}/deliveries/{delivery_id}/replay","openapi":"api-reference/public-api.yaml POST /v1/webhooks/{id}/deliveries/{delivery_id}/replay","href":"/api/webhooks/replay"}]},{"group":"Other endpoints","pages":[{"title":"flight-ai-search","sidebarTitle":"/v1/flight_ai_search","openapi":"api-reference/public-api.yaml POST /v1/flight_ai_search","href":"/api/flight-ai-search"},{"title":"flight-ai-search-cancel","sidebarTitle":"/v1/flight_ai_search/tasks/{task_id}:cancel","openapi":"api-reference/public-api.yaml POST /v1/flight_ai_search/tasks/{task_id}:cancel","href":"/api/flight-ai-search-cancel"},{"title":"flight-ai-search-events","sidebarTitle":"/v1/flight_ai_search/tasks/{task_id}/events","openapi":"api-reference/public-api.yaml GET /v1/flight_ai_search/tasks/{task_id}/events","href":"/api/flight-ai-search-events"},{"title":"flight-ai-search-task","sidebarTitle":"/v1/flight_ai_search/tasks/{task_id}","openapi":"api-reference/public-api.yaml GET /v1/flight_ai_search/tasks/{task_id}","href":"/api/flight-ai-search-task"},{"title":"flight-schedule","sidebarTitle":"/v1/flight_schedule","openapi":"api-reference/public-api.yaml POST /v1/flight_schedule","href":"/api/flight-schedule"},{"title":"trip payment-attempts","sidebarTitle":"/v1/trip/{trip_id}/payment_attempts/{payment_attempt_id}","openapi":"api-reference/public-api.yaml GET /v1/trip/{trip_id}/payment_attempts/{payment_attempt_id}","href":"/api/trip/payment-attempts"}]}]}]},"basePath":"","title":"flight-search - Jinko Platform","buildId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","deploymentId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-i2a3QZ8E.js","utils-ChLwp8m0.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-DRktVTDc.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-CA2pEs4T.js","snippetPresets-ClQ6XrKD.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-Ct_Lv36y.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-Cn2PYw9e.js","shallow-rkyymjXQ.js","getApiPlaygroundDisplay-BB9vkXtE.js","CodeSnippet-Bm5RU7m1.js","CodeSnippets-BgU9Deuz.js","Page-BUDYNlhG.js","getPastedJson-BD-6NNum.js","icon-8Z6tud2e.js","MethodPill-Tuzr4g3V.js","DuplicateIcon-0ceWFYhN.js","createIcon-FBXow_ST.js","DynamicMarkdown-CD8713Yy.js","SectionHeading-7zgzQbH-.js","axios-vUo_bRtp.js","Markdown-D7Ofw1oz.js","clsx-eKJ4rcii.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CwjSCXIK.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-9EK5IAXV.js"]}