> For the complete documentation index, see [llms.txt](https://resources.atriptech.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://resources.atriptech.com/api-wen-dang/api-reference/booking-apis/price-compare-search.md).

# 比价搜索

{% hint style="info" %}
💬 **需要帮助？** 如果遇到问题，请在帮助中心咨询 Eva，快速获取诊断建议。

<a href="https://www.atriptech.com/" class="button primary" data-icon="comments">咨询 Eva</a>
{% endhint %}

使用此 API 进行售前航线覆盖和原始价格发现。

这不是标准的预订步骤。

{% hint style="warning" %}
`priceCompareSearch.do` 仅对售前客户可用。

默认使用配额为每天 1,000 次调用。

不要将返回的价格视为生产预订价格。
{% endhint %}

### 此 API 的功能

* 以最大航线覆盖范围返回原始价格
* 跳过预订规则过滤
* 忽略供应商运营开关
* 先检查 Atlas 缓存，然后回退到航司实时定价

### 请求兼容性

请求体与 `search.do` 完全兼容。

无需额外请求字段。

使用相同的核心字段：

* `tripType`、`adultNum`、`childNum`、`infantNum`
* `fromCity`、`toCity`、`fromDate`、`retDate`
* `airlines`、`currency`、`includeMultipleFareFamily`

### 如何读取响应

#### 当存在结果时

API 返回 `status: 0`、`msg: "success"` 和非空的 `routings` 数组。

`routings` 结构匹配 `search.do`。

#### 当不存在结果时

没有结果仍然返回 `status: 0`。

这是正常的业务结果。

检查以下两者：

* `routings.length`
* `noResultReason.code`

不要仅依赖 `status`。

### `noResultReason`

当 `routings` 为空时，响应可能包含 `noResultReason`。

它包含：

* `code` — 机器可读的原因
* `message` — 人类可读的详情
* `recentFlightDates` — 可选的实际航班计划附近日期

#### 原因代码

**`ROUTE_NOT_SUPPORTED`**

该航线不在 Atlas 覆盖范围内。

不要重试同一航线。

**`AIRLINE_NO_FLIGHT`**

航司未返回该航线和日期的航班信息。

检查 `recentFlightDates` 并使用其他支持的日期重试。

**`FLIGHT_SOLD_OUT`**

航班存在，但无可用座位。

检查 `recentFlightDates` 并使用其他日期重试。

**`PRICE_FETCH_FAILED`**

Atlas 无法从航司获取价格。

将此视为临时技术故障。

稍后重试。

### `recentFlightDates` 如何工作

`recentFlightDates` 返回搜索日期前后最多 7 个实际计划日期。

窗口目标为前后 3 天。

如果较早日期不可用，较晚日期将填补空缺。

列表仅包含有实际航班计划的日期。

### API 级别错误

`status != 0` 表示请求在 API 级别失败。

常见值包括：

* `100`、`101`、`102` — 请求数据缺失或无效
* `109` — 超出搜索限制
* `110` — 超出 QPS 限制
* `112` — 请求超时
* `900` — 未授权
* `9999` — 内部错误

### 集成指导

当你想在生产集成前评估 Atlas 航线覆盖范围时使用此 API。

当需要可预订的路径时，使用标准预订流程。

有关从搜索到出票的正常流程，请参见[预订概述](/api-wen-dang/product-guides/booking/booking-overview.md)。

## Price Compare Search

> \*\*Purpose:\*\*\
> Search comparable fares for a route/date/airline filter. The endpoint performs synchronous smart search and is intended for fare comparison scenarios.\
> \
> \*\*Dependency:\*\*\
> No preceding function needs to be called before this API.\
> \
> \*\*Important notes:\*\*\
> \- The returned settlement currency is determined by client configuration or the optional \`currency\` request field.\
> \- Total payable amount for one adult passenger is normally \`adultPrice + adultTax + transactionFeePerPax\`.\
> \- When \`supportCreditTransPayment = 1\`, \`vendorFare\` contains the airline/vendor-side fare. When pass-through payment is not supported, \`supportCreditTransPayment = 0\` and \`vendorFare\` may be null or omitted.\
> \- \`ancillaryProductElements\` depends on client configuration and airline support.\
> \- \`links\` may include airline terms and conditions.\
> \- When \`status = 0\` but \`routings\` is empty, check \`noResultReason\` for the business reason and possible recent available flight dates.\
> \- Display-currency values are for display only and should not be used for settlement, fare comparison, or accounting.

```json
{"openapi":"3.0.1","info":{"title":"Default module","version":"1.0.0"},"security":[],"paths":{"/priceCompareSearch.do":{"post":{"summary":"Price Compare Search","deprecated":false,"description":"**Purpose:**\nSearch comparable fares for a route/date/airline filter. The endpoint performs synchronous smart search and is intended for fare comparison scenarios.\n\n**Dependency:**\nNo preceding function needs to be called before this API.\n\n**Important notes:**\n- The returned settlement currency is determined by client configuration or the optional `currency` request field.\n- Total payable amount for one adult passenger is normally `adultPrice + adultTax + transactionFeePerPax`.\n- When `supportCreditTransPayment = 1`, `vendorFare` contains the airline/vendor-side fare. When pass-through payment is not supported, `supportCreditTransPayment = 0` and `vendorFare` may be null or omitted.\n- `ancillaryProductElements` depends on client configuration and airline support.\n- `links` may include airline terms and conditions.\n- When `status = 0` but `routings` is empty, check `noResultReason` for the business reason and possible recent available flight dates.\n- Display-currency values are for display only and should not be used for settlement, fare comparison, or accounting.","tags":[],"parameters":[{"name":"Accept","in":"header","description":"Expected response media type. Use `application/json`.","required":true,"schema":{"type":"string"}},{"name":"Content-Type","in":"header","description":"Request body media type. Use `application/json`.","required":true,"schema":{"type":"string"}},{"name":"Accept-Encoding","in":"header","description":"Enable gzip response compression when supported.","required":true,"schema":{"type":"string"}},{"name":"x-atlas-client-id","in":"header","description":"Atlas client ID. The server uses this value as the request customer identifier.","required":true,"schema":{"type":"string"}},{"name":"x-atlas-client-secret","in":"header","description":"Atlas client secret for authentication. Use the secret assigned to the client ID.","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"tripType":{"type":"string","enum":["1","2"],"description":"Trip type. `1` = one-way, `2` = round trip. `retDate` is required when `tripType = 2`."},"requestId":{"type":"string","description":"Client-side request identifier for tracing and troubleshooting. Optional but recommended.","nullable":true},"adultNum":{"type":"integer","description":"Adult passenger count. Must be at least 1. `adultNum + childNum` cannot exceed 9.","minimum":1,"maximum":9,"default":0},"childNum":{"type":"integer","description":"Child passenger count. `adultNum + childNum` cannot exceed 9.","minimum":0,"maximum":8,"default":0},"infantNum":{"type":"integer","description":"Infant passenger count. Cannot exceed the adult passenger count.","minimum":0,"maximum":9,"default":0},"fromCity":{"type":"string","description":"Departure city or airport IATA code in uppercase. If an airport code is supplied here, results are filtered by that airport."},"fromAirport":{"type":"string","description":"Optional departure airport IATA code. Leave empty when `fromCity` already represents the desired city/airport filter.","nullable":true},"toCity":{"type":"string","description":"Arrival city or airport IATA code in uppercase. If an airport code is supplied here, results are filtered by that airport."},"toAirport":{"type":"string","description":"Optional arrival airport IATA code. Leave empty when `toCity` already represents the desired city/airport filter.","nullable":true},"fromDate":{"type":"string","description":"Departure date in `YYYYMMDD` format.","pattern":"^\\d{8}$"},"retDate":{"type":"string","description":"Return date in `YYYYMMDD` format. Required for round-trip searches; use null or omit for one-way searches.","pattern":"^\\d{8}$","nullable":true},"airlines":{"type":"array","items":{"type":"string"},"minItems":0,"description":"Airline IATA code filter in uppercase. The response only contains flights operated/marketed by the specified airlines when supplied.","nullable":true},"fromFlightNumbers":{"type":"array","items":{"type":"string"},"description":"Optional outbound flight-number filter. Use one string per candidate itinerary. For connecting flights, join segment flight numbers with a comma, e.g. `OD1001,OD1002`.","nullable":true},"retFlightNumbers":{"type":"array","items":{"type":"string"},"description":"Optional return flight-number filter. For connecting flights, join segment flight numbers with a comma.","nullable":true},"includeMultipleFareFamily":{"type":"boolean","description":"Whether to return multiple fare families for the same flight. `false` returns the lowest fare per flight by default.","default":false,"nullable":true},"currency":{"type":"string","description":"Optional settlement currency in ISO 4217 format. Use only when the client has multiple settlement currencies configured with Atlas.","nullable":true},"displayCurrency":{"type":"string","description":"Optional display currency in ISO 4217 format. Display-currency amounts are for presentation only and should not be used for settlement or accounting.","nullable":true},"maxResponseTime":{"type":"integer","description":"Optional client-side expected maximum response time in milliseconds. Actual timeout is also controlled by Atlas configuration.","nullable":true},"baggagePiece":{"type":"integer","description":"Optional requested checked baggage pieces used for filtering or pricing when supported.","nullable":true},"baggageWeight":{"type":"integer","description":"Optional requested checked baggage weight in kilograms used for filtering or pricing when supported.","nullable":true},"requestSource":{"type":"string","description":"Traffic source label, e.g. `Google Flights`, `Organic Search`, or `SkyScanner`. Used for analytics and traffic governance.","nullable":true},"channel":{"type":"string","description":"Optional client channel label used for reporting and traffic segmentation.","nullable":true},"mainChannel":{"type":"string","description":"Optional primary channel label used for reporting and traffic segmentation.","nullable":true},"subChannelID":{"type":"string","description":"Optional secondary channel identifier used for reporting and traffic segmentation.","nullable":true},"residentCode":{"type":"string","description":"Optional resident discount code when an airline or market supports resident fares.","nullable":true}},"required":["tripType","adultNum","childNum","infantNum","fromCity","toCity","fromDate"]}}}},"responses":{"200":{"description":"Successful HTTP response. Business success or failure is indicated by the `status` field in the response body.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"integer","description":"Business status code. `0` means success. Common non-zero values:\n- `100`: Missing required request data.\n- `101`: Illegal request data or invalid format.\n- `102`: Illegal request parameter.\n- `105`: OD is not in the client's round-trip whitelist.\n- `106`: Search is not allowed for this client.\n- `107`: Insufficient balance.\n- `108`: Route is restricted or blocked by system limitations.\n- `109`: Search limit exceeded. For price compare, this may also mean daily quota exceeded.\n- `110`: Too many concurrent requests.\n- `111`: Real-time search is not allowed.\n- `112`: Search timed out.\n- `113`: Airline is under maintenance in Atlas.\n- `114`: No flights present.\n- `116`: Search data was not captured.\n- `123`: Too many requests but too few paid orders.\n- `124`: Unsupported settlement currency.\n- `126`: `requestId` does not exist or request is already ended.\n- `900`: Unauthorized access.\n- `9999`: Internal system error."},"msg":{"type":"string","description":"Business message. Usually `success` or null for successful responses; contains the error message when `status` is non-zero.","nullable":true},"requestId":{"type":"string","description":"Atlas request identifier returned for tracing. May be absent when the request fails before request initialization.","nullable":true},"clientRequestId":{"type":"string","description":"Echo of the client request identifier when provided.","nullable":true},"smartEnd":{"type":"boolean","description":"Whether the smart-search process has completed for this synchronous response.","nullable":true},"routings":{"type":"array","items":{"type":"object","properties":{"routingIdentifier":{"type":"string","description":"Opaque routing token. Pass this value to downstream pricing/booking APIs exactly as returned."},"supportCreditTransPayment":{"type":"string","description":"Whether pass-through credit-card transaction payment is supported. `1` = supported, `0` = not supported."},"supportPaymentMethods":{"type":"array","items":{"type":"integer"},"description":"Supported payment method codes for this routing. Values are configured by Atlas and may vary by client/airline."},"currency":{"type":"string","description":"Settlement currency for price fields in this routing."},"adultPrice":{"type":"number","description":"Adult base fare per passenger, excluding tax and transaction fee."},"adultTax":{"type":"integer","description":"Adult tax per passenger."},"adultDetails":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Price component code, e.g. `farePrice` or `tax`."},"type":{"type":"string","description":"Price component type, e.g. `base` or `tax`."},"amount":{"type":"integer","description":"Component amount in routing currency."},"description":{"type":"string","description":"Human-readable component description when available."}},"required":["code","type","amount","description"]},"description":"Adult fare breakdown items such as base fare and tax."},"childPrice":{"type":"number","description":"Child base fare per passenger, excluding tax and transaction fee."},"childTax":{"type":"integer","description":"Child tax per passenger."},"childDetails":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Price component code, e.g. `farePrice` or `tax`."},"type":{"type":"string","description":"Price component type, e.g. `base` or `tax`."},"amount":{"type":"integer","description":"Component amount in routing currency."},"description":{"type":"string","description":"Human-readable component description when available."}},"required":["code","type","amount","description"]},"description":"Child fare breakdown items such as base fare and tax."},"infantPrice":{"type":"number","description":"Infant base fare per passenger, excluding tax and transaction fee."},"infantTax":{"type":"integer","description":"Infant tax per passenger."},"infantDetails":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Price component code, e.g. `farePrice` or `tax`."},"type":{"type":"string","description":"Price component type, e.g. `base` or `tax`."},"amount":{"type":"integer","description":"Component amount in routing currency."},"description":{"type":"string","description":"Human-readable component description when available."}},"required":["code","type","amount","description"]},"description":"Infant fare breakdown items such as base fare and tax."},"infantAllowed":{"type":"boolean","description":"Whether infants are allowed for this routing/fare."},"childMandatorySeatingFee":{"type":"number","description":"Mandatory child seating fee when applicable; otherwise null.","nullable":true},"transactionFeePerPax":{"type":"integer","description":"Atlas transaction fee per passenger."},"transactionFee":{"type":"integer","description":"Total or configured transaction fee amount for this routing. Interpret together with `transactionFeeMode`."},"transactionFeeMode":{"type":"string","description":"Transaction fee charging mode, e.g. `PER_PAX`."},"fromSegments":{"type":"array","items":{"type":"object","properties":{"aircraftCode":{"type":"string","description":"Aircraft type/code when supplied by the airline or vendor."},"arrAirport":{"type":"string","description":"Arrival airport IATA code."},"arrTerminal":{"type":"string","description":"Arrival terminal when available. Empty string means not supplied."},"arrTime":{"type":"string","description":"Local arrival time in `YYYYMMDDHHmm` format."},"cabin":{"type":"string","description":"Cabin booking code or raw cabin label when available."},"cabinClass":{"type":"integer","description":"Cabin class code. Commonly `1` means economy; actual mapping follows Atlas configuration."},"carrier":{"type":"string","description":"Marketing carrier IATA code."},"codeShare":{"type":"boolean","description":"Whether the segment is code-share."},"depAirport":{"type":"string","description":"Departure airport IATA code."},"depTerminal":{"type":"string","description":"Departure terminal when available. Empty string means not supplied."},"depTime":{"type":"string","description":"Local departure time in `YYYYMMDDHHmm` format."},"duration":{"type":"integer","description":"Segment duration in minutes."},"fareFamily":{"type":"string","description":"Fare family or branded fare name."},"flightNumber":{"type":"string","description":"Marketing flight number."},"operatingCarrier":{"type":"string","description":"Operating carrier IATA code when different from marketing carrier."},"operatingFlightnumber":{"type":"string","description":"Operating flight number when supplied."},"seatCount":{"type":"integer","description":"Available seat count returned by Atlas/vendor for this fare."},"segmentIndex":{"type":"integer","description":"Segment sequence number in the whole itinerary."},"stopCities":{"type":"string","description":"Technical stop city/airport codes when supplied. Empty string means no stop or not supplied."}}},"description":"Outbound flight segments. Multiple items represent a connecting itinerary."},"retSegments":{"type":"array","items":{"type":"object","properties":{"aircraftCode":{"type":"string","description":"Aircraft type/code when supplied by the airline or vendor."},"arrAirport":{"type":"string","description":"Arrival airport IATA code."},"arrTerminal":{"type":"string","description":"Arrival terminal when available. Empty string means not supplied."},"arrTime":{"type":"string","description":"Local arrival time in `YYYYMMDDHHmm` format."},"cabin":{"type":"string","description":"Cabin booking code or raw cabin label when available."},"cabinClass":{"type":"integer","description":"Cabin class code. Commonly `1` means economy; actual mapping follows Atlas configuration."},"carrier":{"type":"string","description":"Marketing carrier IATA code."},"codeShare":{"type":"boolean","description":"Whether the segment is code-share."},"depAirport":{"type":"string","description":"Departure airport IATA code."},"depTerminal":{"type":"string","description":"Departure terminal when available. Empty string means not supplied."},"depTime":{"type":"string","description":"Local departure time in `YYYYMMDDHHmm` format."},"duration":{"type":"integer","description":"Segment duration in minutes."},"fareFamily":{"type":"string","description":"Fare family or branded fare name."},"flightNumber":{"type":"string","description":"Marketing flight number."},"operatingCarrier":{"type":"string","description":"Operating carrier IATA code when different from marketing carrier."},"operatingFlightnumber":{"type":"string","description":"Operating flight number when supplied."},"seatCount":{"type":"integer","description":"Available seat count returned by Atlas/vendor for this fare."},"segmentIndex":{"type":"integer","description":"Segment sequence number in the whole itinerary."},"stopCities":{"type":"string","description":"Technical stop city/airport codes when supplied. Empty string means no stop or not supplied."}}},"description":"Return flight segments. Empty or omitted for one-way searches."},"rule":{"type":"object","properties":{"hasBaggage":{"type":"integer","description":"Whether free baggage allowance exists. `1` = yes, `0` = no."},"baggageElements":{"type":"array","items":{"type":"object","properties":{"segmentNo":{"type":"integer","description":"Segment number this baggage allowance applies to."},"baggageType":{"type":"string","description":"Baggage type/category, e.g. `CabinBaggageUnderSeat` or `StandardCheckInBaggage`."},"passengerType":{"type":"integer","description":"Passenger type code. Commonly `0` adult, `1` child, `2` infant."},"baggagePiece":{"type":"integer","description":"Allowed baggage pieces."},"baggageWeight":{"type":"integer","description":"Allowed baggage weight in kilograms."},"baggageSize":{"type":"string","description":"Allowed baggage dimensions when available."}},"required":["segmentNo","baggageType","passengerType","baggagePiece","baggageWeight","baggageSize"]},"description":"Free baggage allowance by segment and passenger type."},"refundRules":{"type":"array","items":{"type":"object","properties":{"refundType":{"type":"integer","description":"Refund rule type code configured by Atlas."},"refundStatus":{"type":"string","description":"Refund availability status code."},"refundMethod":{"type":"string","description":"Refund method when refund is allowed."},"refundFee":{"type":"number","description":"Refund fee amount."},"currency":{"type":"string","description":"Currency of refund fee."},"refNoshow":{"type":"string","description":"No-show refund status code."},"refNoShowCondition":{"type":"integer","description":"No-show refund condition code."},"refNoshowFee":{"type":"number","description":"No-show refund fee amount."},"ruleDetailList":{"type":"array","items":{"type":"object","properties":{"status":{"type":"string","description":"Rule status code for the time window."},"refundMethod":{"type":"string","description":"Refund method for the time window."},"startMinute":{"type":"integer","description":"Start of the time window in minutes relative to departure."},"endMinute":{"type":"integer","description":"End of the time window in minutes relative to departure."},"amount":{"type":"number","description":"Fee amount for this time window."},"currency":{"type":"string","description":"Currency of the fee amount."},"ruleId":{"type":"integer","description":"Atlas rule identifier when available."}},"required":["status","refundMethod","startMinute","endMinute","amount","currency","ruleId"]},"description":"Detailed refund rule time windows. `startMinute` and `endMinute` are relative to scheduled departure time."}},"required":["refundType","refundStatus","refundMethod","refundFee","currency","refNoshow","refNoShowCondition","refNoshowFee","ruleDetailList"]},"description":"Refund policy rules. Interpret together with status, fee, no-show condition, and rule details."},"changesRules":{"type":"array","items":{"type":"object","properties":{"changesType":{"type":"integer","description":"Change rule type code configured by Atlas."},"changesStatus":{"type":"string","description":"Change availability status code."},"changesFee":{"type":"number","description":"Change fee amount."},"currency":{"type":"string","description":"Currency of change fee."},"revNoshow":{"type":"string","description":"No-show change/reissue status code."},"revNoShowCondition":{"type":"integer","description":"No-show change/reissue condition code."},"revNoshowFee":{"type":"number","description":"No-show change/reissue fee amount."},"ruleDetailList":{"type":"array","items":{"type":"object","properties":{"status":{"type":"string","description":"Rule status code for the time window."},"refundMethod":{"type":"string","description":"Refund/change method for the time window when supplied; otherwise null.","nullable":true},"startMinute":{"type":"integer","description":"Start of the time window in minutes relative to departure."},"endMinute":{"type":"integer","description":"End of the time window in minutes relative to departure."},"amount":{"type":"number","description":"Fee amount for this time window."},"currency":{"type":"string","description":"Currency of the fee amount."},"ruleId":{"type":"integer","description":"Atlas rule identifier when available."}},"required":["status","refundMethod","startMinute","endMinute","amount","currency","ruleId"]},"description":"Detailed change rule time windows. `startMinute` and `endMinute` are relative to scheduled departure time."}},"required":["changesType","changesStatus","changesFee","currency","revNoshow","revNoShowCondition","revNoshowFee","ruleDetailList"]},"description":"Change/reissue policy rules. Interpret together with status, fee, no-show condition, and rule details."},"serviceElements":{"type":"array","items":{"type":"object","properties":{"hasFreeSeat":{"type":"integer","description":"Whether free seat selection is included. `1` = yes, `0` = no."},"hasFreeMeal":{"type":"integer","description":"Whether a free meal is included. `1` = yes, `0` = no."}},"required":["hasFreeSeat","hasFreeMeal"]},"description":"Included service indicators by segment/fare, such as free seat or meal."}},"required":["hasBaggage","baggageElements","refundRules","changesRules","serviceElements"],"description":"Fare rules, baggage allowance, refund/change policy, and included service information."},"ancillaryProductElements":{"type":"array","items":{"type":"object","properties":{"ancillaryCode":{"type":"string","description":"Airline/vendor ancillary code."},"auxBaggageElement":{"type":"object","properties":{"piece":{"type":"integer","description":"Baggage pieces included in this ancillary product."},"weight":{"type":"integer","description":"Baggage weight in kilograms."},"isAllWeight":{"type":"boolean","description":"Whether `weight` is the total combined weight for all pieces."},"size":{"type":"string","description":"Baggage size limit when available."}},"required":["piece","weight","isAllWeight","size"],"description":"Baggage details when the ancillary product is baggage."},"canPurchaseWithTicket":{"type":"integer","description":"Whether this ancillary can be purchased together with ticketing. `1` = yes, `0` = no."},"canPurchasePostTicket":{"type":"integer","description":"Whether this ancillary can be purchased after ticketing. `1` = yes, `0` = no."},"categoryCode":{"type":"string","description":"Ancillary category code, e.g. `StandardCheckInBaggage`."},"clientTechnicalServiceFee":{"type":"integer","description":"Client technical service fee amount for this ancillary product."},"currency":{"type":"string","description":"Currency of `price`."},"maxQty":{"type":"integer","description":"Maximum purchasable quantity."},"minQty":{"type":"integer","description":"Minimum purchasable quantity."},"price":{"type":"number","description":"Client-facing ancillary price."},"productCode":{"type":"string","description":"Atlas/vendor product code for the ancillary product."},"segmentIndex":{"type":"integer","description":"Segment index this ancillary applies to."},"vendorPrice":{"type":"number","description":"Vendor-side ancillary price."},"vendorCurrency":{"type":"string","description":"Currency of `vendorPrice`."},"clientTechnicalServiceFeeMode":{"type":"string","description":"Technical service fee charging mode when supplied; otherwise null.","nullable":true}},"required":["segmentIndex","productCode","canPurchaseWithTicket","canPurchasePostTicket","price","currency","vendorPrice","vendorCurrency","clientTechnicalServiceFee","auxBaggageElement","maxQty","minQty","categoryCode","ancillaryCode","clientTechnicalServiceFeeMode"]},"description":"Optional paid ancillary products such as cabin or checked baggage. Availability depends on airline and client configuration."},"links":{"type":"array","items":{"type":"object","properties":{"carrier":{"type":"string","description":"Airline IATA code associated with this link."},"kind":{"type":"string","description":"Link type, e.g. `terms`."},"link":{"type":"string","description":"URL."},"description":{"type":"string","description":"Optional link description.","nullable":true}}},"description":"Related airline links, usually terms and conditions."},"separateBookings":{"type":"boolean","description":"Whether outbound and return parts are booked separately."},"refreshTime":{"type":"string","description":"UTC timestamp when this routing/fare was refreshed."},"expireTime":{"type":"string","description":"UTC timestamp after which this routing/fare should no longer be treated as fresh."},"ancillarySupported":{"type":"boolean","description":"Whether ancillary purchase is supported for this routing when the value is known; otherwise null.","nullable":true},"cardChargeList":{"type":"array","items":{"type":"object","properties":{"cardType":{"type":"string","description":"Card type, e.g. `Visa` or `MasterCard`."},"percentage":{"type":"number","description":"Percentage surcharge for this card type."},"charge":{"type":"number","description":"Fixed surcharge amount when applicable; otherwise null.","nullable":true},"currency":{"type":"string","description":"Currency of fixed surcharge amount when applicable."}},"required":["cardType","percentage","charge","currency"]},"description":"Card surcharge information by card type when available."},"vendorFare":{"type":"object","properties":{"vendorAdultPrice":{"type":"number","description":"Vendor adult base fare."},"vendorAdultTax":{"type":"integer","description":"Vendor adult tax."},"vendorChildPrice":{"type":"number","description":"Vendor child base fare."},"vendorChildTax":{"type":"integer","description":"Vendor child tax."},"vendorInfantPrice":{"type":"number","description":"Vendor infant base fare."},"vendorInfantTax":{"type":"integer","description":"Vendor infant tax."},"vendorCurrency":{"type":"string","description":"Vendor fare currency."}},"required":["vendorAdultPrice","vendorAdultTax","vendorChildPrice","vendorChildTax","vendorInfantPrice","vendorInfantTax","vendorCurrency"],"description":"Vendor-side fare information. Usually present when pass-through payment is supported or vendor fare disclosure is enabled."}}},"description":"Available routing and fare options. Empty array means no bookable fare was found; check `noResultReason` when present."},"noResultReason":{"type":"object","properties":{"code":{"type":"string","description":"No-result reason code. `ROUTE_NOT_SUPPORTED` means Atlas does not support the city pair. `AIRLINE_NO_FLIGHT` means no flight information was found for the route/date. `FLIGHT_SOLD_OUT` means flights exist but are sold out. `PRICE_FETCH_FAILED` means Atlas could not fetch price for the route/date.","enum":["ROUTE_NOT_SUPPORTED","AIRLINE_NO_FLIGHT","FLIGHT_SOLD_OUT","PRICE_FETCH_FAILED"]},"message":{"type":"string","description":"Human-readable explanation of the no-result reason."},"recentFlightDates":{"type":"array","items":{"type":"string"},"description":"Recent dates with available flight information in `YYYYMMDD` format when Atlas can provide suggestions; otherwise null or empty.","nullable":true}},"required":["code","message","recentFlightDates"],"description":"Structured no-result reason. Present when `status = 0` and `routings` is empty, or null/absent when routings are returned.","nullable":true}},"required":["status","msg","routings"]}}},"headers":{}}}}}}}
```
