Skip to content

Registered profile · Protocol v1.0

Flight Offer Profile

Describe one priced air itinerary with its traveler composition, ordered legs, and marketed segments. A reference fare or complete itinerary total with ordered legs and scheduled segments.

Selector
flight
Offer type
offline_service
Consumer action
book
Profile status
protocol-v1.0.0-r38

Required Offer context

Complete the common Offer shell first

The profile adds domain facts; it does not replace the required Partner Offer fields.

Category
Any valid AON Taxonomy v1 category; choose it independently from profile.
Commercial
price.amount, price.currency, price.tax_status, and quote.observed_at
Identity and action
source_offer_id, version: "3.0", entity, booking action, and goals

Presentation

Title the priced itinerary; render details from structured facts

offer_info.title is the expected consumer-facing title, for example San Francisco to Tokyo economy fare. A chat or card can add route, date, carrier, flight number, cabin, traveler count, and price from the profile instead of parsing the title.

Field reference

Paths below are complete Offer paths. Requirement labels are computed in the context of the selected profile.

115 fields

Profile envelope

Closed supply-profile envelope. profile selects exactly one registered closed data shape.

Field pathTypeRequirementMeaning and constraints
offer_info.details.profilestringrequiredRegistered supply Offer profile identifier in the stable v1.0 registry.Const: "flight"
offer_info.details.dataobjectrequiredClosed public facts for one priced air itinerary and its traveller composition.Closed object: unknown properties are not allowed · travelers prohibited when price_basis is "reference" · travelers required when price_basis is not "reference" or price_basis is absent · fare_details prohibited when price_basis is "reference"

Trip Type

Declared itinerary topology; semantic validation binds it to the number of legs.

Field pathTypeRequirementMeaning and constraints
offer_info.details.data.trip_typestringrequiredDeclared itinerary topology; semantic validation binds it to the number of legs.Allowed: "one_way", "round_trip", "multi_city"

Travelers

Non-empty traveller counts grouped by traveller type. Each type may occur at most once under semantic validation.

Field pathTypeRequirementMeaning and constraints
offer_info.details.data.travelersarray<object>Required when price_basis is not "reference" or price_basis is absentNon-empty traveller counts grouped by traveller type. Each type may occur at most once under semantic validation.Minimum items: 1 · Maximum items: 3 · Prohibited when price_basis is "reference" · Required when price_basis is not "reference" or price_basis is absent · Item closed object: unknown properties are not allowed · Item infant_seat_required prohibited when type is not "infant"
offer_info.details.data.travelers[].typestringRequired when travelers is presentTraveller type used to state the priced traveller composition.Allowed: "adult", "child", "infant"
offer_info.details.data.travelers[].countintegerRequired when travelers is presentPositive number of travellers of this type included in the stated itinerary price.Minimum: 1
offer_info.details.data.travelers[].agesarray<integer>optionalCompleted years of age on the first local departure date, in traveler order.Item minimum: 0
offer_info.details.data.travelers[].infant_seat_requiredarray<boolean>optionalSeat requirement for each infant at the same index as ages.Prohibited when type is not "infant"

Legs

Ordered itinerary legs. Each leg contains one or more ordered flight segments.

Field pathTypeRequirementMeaning and constraints
offer_info.details.data.legsarray<object>requiredOrdered itinerary legs. Each leg contains one or more ordered flight segments.Minimum items: 1 · Item closed object: unknown properties are not allowed
offer_info.details.data.legs[].segmentsarray<object>requiredOrdered segments for this leg. Semantic validation requires adjacent arrival and departure continuity.Minimum items: 1 · Item closed object: unknown properties are not allowed · Item operating_carrier required when operating_flight_number is present
offer_info.details.data.legs[].segments[].departureobjectrequiredScheduled departure airport and airport-local date-time for this segment.Closed object: unknown properties are not allowed
offer_info.details.data.legs[].segments[].departure.airport_codestringrequiredThree-letter uppercase airport code; airport-registry membership is outside this profile.Pattern: ^[A-Z]{3}$
offer_info.details.data.legs[].segments[].departure.local_atstringrequiredScheduled local date-time at this airport in YYYY-MM-DDTHH:mm:ss form, without a UTC offset or timezone. Producers normalize a source space separator to T and must not infer missing timezone data.Pattern: ^[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])T(?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$
offer_info.details.data.legs[].segments[].departure.city_codestringoptionalOptional city code, distinct from airport_code. Does not establish trusted airport-to-city membership.Pattern: ^[A-Z]{3}$ · Maximum length: 3
offer_info.details.data.legs[].segments[].departure.city_namestringoptionalSource-provided display name in the Offer content language; must contain a character outside Unicode White_Space plus U+FEFF. Omit when unavailable; never infer from codes. City name, not airport name.Pattern: [^\u0009-\u000D\u0020\u0085\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]
offer_info.details.data.legs[].segments[].departure.airport_full_nameobjectoptionalSource-reported full airport name at this endpoint, independent of the Offer content language.Closed object: unknown properties are not allowed
offer_info.details.data.legs[].segments[].departure.airport_full_name.textstringRequired when airport_full_name is presentNonblank source-reported display text, preserved without translation or normalization into the Offer content language.Pattern: [^\u0009-\u000D\u0020\u0085\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]
offer_info.details.data.legs[].segments[].departure.airport_full_name.languagestringRequired when airport_full_name is presentBCP 47 language tag for the source text; und indicates that the source language is unverified.Pattern: ^[A-Za-z]{2,3}(?:-[A-Za-z]{3}){0,3}(?:-[A-Za-z]{4})?(?:-(?:[A-Za-z]{2}|[0-9]{3}))?(?:-(?:[A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3}))*(?:-[0-9A-WY-Za-wy-z](?:-[A-Za-z0-9]{2,8})+)*(?:-[Xx](?:-[A-Za-z0-9]{1,8})+)?$ · Minimum length: 2 · Maximum length: 64
offer_info.details.data.legs[].segments[].departure.terminalstringoptionalSource-reported terminal at this endpoint; omit when absent or blank.Pattern: [^\u0009-\u000D\u0020\u0085\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]
offer_info.details.data.legs[].segments[].departure.timezonestringoptionalVerified IANA time zone identifier for this airport. Local_at remains an offset-free source schedule.Pattern: ^[A-Za-z0-9_+./-]+$ · Minimum length: 3 · Maximum length: 64
offer_info.details.data.legs[].segments[].arrivalobjectrequiredScheduled arrival airport and airport-local date-time for this segment.Closed object: unknown properties are not allowed
offer_info.details.data.legs[].segments[].arrival.airport_codestringrequiredThree-letter uppercase airport code; airport-registry membership is outside this profile.Pattern: ^[A-Z]{3}$
offer_info.details.data.legs[].segments[].arrival.local_atstringrequiredScheduled local date-time at this airport in YYYY-MM-DDTHH:mm:ss form, without a UTC offset or timezone. Producers normalize a source space separator to T and must not infer missing timezone data.Pattern: ^[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])T(?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$
offer_info.details.data.legs[].segments[].arrival.city_codestringoptionalOptional city code, distinct from airport_code. Does not establish trusted airport-to-city membership.Pattern: ^[A-Z]{3}$ · Maximum length: 3
offer_info.details.data.legs[].segments[].arrival.city_namestringoptionalSource-provided display name in the Offer content language; must contain a character outside Unicode White_Space plus U+FEFF. Omit when unavailable; never infer from codes. City name, not airport name.Pattern: [^\u0009-\u000D\u0020\u0085\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]
offer_info.details.data.legs[].segments[].arrival.airport_full_nameobjectoptionalSource-reported full airport name at this endpoint, independent of the Offer content language.Closed object: unknown properties are not allowed
offer_info.details.data.legs[].segments[].arrival.airport_full_name.textstringRequired when airport_full_name is presentNonblank source-reported display text, preserved without translation or normalization into the Offer content language.Pattern: [^\u0009-\u000D\u0020\u0085\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]
offer_info.details.data.legs[].segments[].arrival.airport_full_name.languagestringRequired when airport_full_name is presentBCP 47 language tag for the source text; und indicates that the source language is unverified.Pattern: ^[A-Za-z]{2,3}(?:-[A-Za-z]{3}){0,3}(?:-[A-Za-z]{4})?(?:-(?:[A-Za-z]{2}|[0-9]{3}))?(?:-(?:[A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3}))*(?:-[0-9A-WY-Za-wy-z](?:-[A-Za-z0-9]{2,8})+)*(?:-[Xx](?:-[A-Za-z0-9]{1,8})+)?$ · Minimum length: 2 · Maximum length: 64
offer_info.details.data.legs[].segments[].arrival.terminalstringoptionalSource-reported terminal at this endpoint; omit when absent or blank.Pattern: [^\u0009-\u000D\u0020\u0085\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]
offer_info.details.data.legs[].segments[].arrival.timezonestringoptionalVerified IANA time zone identifier for this airport. Local_at remains an offset-free source schedule.Pattern: ^[A-Za-z0-9_+./-]+$ · Minimum length: 3 · Maximum length: 64
offer_info.details.data.legs[].segments[].duration_minutesintegerrequiredPositive source-provided scheduled elapsed duration of this segment in minutes. It is authoritative for duration; producers must not infer a timezone to derive it from local_at values.Minimum: 1
offer_info.details.data.legs[].segments[].marketing_carrierobjectrequiredCarrier marketing this flight under the displayed flight number.Closed object: unknown properties are not allowed
offer_info.details.data.legs[].segments[].marketing_carrier.codestringrequiredTwo-character uppercase marketing carrier code; registry membership is not asserted by this profile.Pattern: ^[A-Z0-9]{2}$
offer_info.details.data.legs[].segments[].marketing_carrier.namestringoptionalSource-provided display name in the Offer content language; must contain a character outside Unicode White_Space plus U+FEFF. Omit when unavailable; never infer from codes. Name of the marketing carrier, not operating carrier or booking platform.Pattern: [^\u0009-\u000D\u0020\u0085\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]
offer_info.details.data.legs[].segments[].marketing_carrier.logo_urlstringoptionalAbsolute HTTPS carrier-logo URL without userinfo; omit when display rights or a stable asset URL are unavailable.Format: uri · Pattern: ^[Hh][Tt][Tt][Pp][Ss]:// · Maximum length: 2048
offer_info.details.data.legs[].segments[].flight_numberstringrequiredCarrier-local flight number without the marketing-carrier prefix.Pattern: ^[0-9]{1,4}[A-Z]?$
offer_info.details.data.legs[].segments[].cabin_classstringrequiredPublic cabin class for this segment.Allowed: "economy", "premium_economy", "business", "first"
offer_info.details.data.legs[].segments[].stopsarray<object>optionalSource-reported stops within this segment. Omission means unknown; an empty array explicitly means no stops.Item closed object: unknown properties are not allowed · Item name required when name_language is present · Item at least one required field set: name OR airport_code · Item name required when no alternative field set is complete (airport_code) · Item airport_code required when no alternative field set is complete (name)
offer_info.details.data.legs[].segments[].stops[].namestringRequired when name_language is present; Required when no alternative field set is complete (airport_code)Source-provided nonblank location label, which may identify a city rather than an airport.Pattern: \S · Minimum length: 1 · Required when name_language is present · Required when no alternative field set is complete (airport_code)
offer_info.details.data.legs[].segments[].stops[].name_languagestringoptionalLanguage of the source-provided stop name; und means unverified. Requires name.Pattern: ^[A-Za-z]{2,3}(?:-[A-Za-z]{3}){0,3}(?:-[A-Za-z]{4})?(?:-(?:[A-Za-z]{2}|[0-9]{3}))?(?:-(?:[A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3}))*(?:-[0-9A-WY-Za-wy-z](?:-[A-Za-z0-9]{2,8})+)*(?:-[Xx](?:-[A-Za-z0-9]{1,8})+)?$ · Minimum length: 2 · Maximum length: 64
offer_info.details.data.legs[].segments[].stops[].airport_codestringRequired when no alternative field set is complete (name)Source-provided uppercase airport code; do not infer it from a location name.Pattern: ^[A-Z]{3}$ · Required when no alternative field set is complete (name)
offer_info.details.data.legs[].segments[].stops[].duration_minutesintegeroptionalPositive source-provided stop duration in minutes.Minimum: 1
offer_info.details.data.legs[].segments[].planned_aircraftobjectoptionalSupplier-reported planned aircraft name, not a standardized aircraft type or actual operating equipment.Closed object: unknown properties are not allowed
offer_info.details.data.legs[].segments[].planned_aircraft.nameobjectRequired when planned_aircraft is presentSource-reported aircraft model label with the source language recorded.Closed object: unknown properties are not allowed
offer_info.details.data.legs[].segments[].planned_aircraft.name.textstringRequired when planned_aircraft is presentNonblank source-reported display text, preserved without translation or normalization into the Offer content language.Pattern: [^\u0009-\u000D\u0020\u0085\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]
offer_info.details.data.legs[].segments[].planned_aircraft.name.languagestringRequired when planned_aircraft is presentBCP 47 language tag for the source text; und indicates that the source language is unverified.Pattern: ^[A-Za-z]{2,3}(?:-[A-Za-z]{3}){0,3}(?:-[A-Za-z]{4})?(?:-(?:[A-Za-z]{2}|[0-9]{3}))?(?:-(?:[A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3}))*(?:-[0-9A-WY-Za-wy-z](?:-[A-Za-z0-9]{2,8})+)*(?:-[Xx](?:-[A-Za-z0-9]{1,8})+)?$ · Minimum length: 2 · Maximum length: 64
offer_info.details.data.legs[].segments[].planned_aircraft.sourcestringRequired when planned_aircraft is presentIdentifies the supplier as the source of this planned aircraft label.Const: "supplier_reported"
offer_info.details.data.legs[].segments[].operating_carrierobjectRequired when operating_flight_number is presentVerified operating carrier for this scheduled segment; omit when operating identity is unknown.Closed object: unknown properties are not allowed · Required when operating_flight_number is present
offer_info.details.data.legs[].segments[].operating_carrier.codestringRequired when operating_carrier is presentTwo-character uppercase operating carrier code.Pattern: ^[A-Z0-9]{2}$
offer_info.details.data.legs[].segments[].operating_carrier.nameobjectoptionalOptional source-reported operating carrier name with explicit language.Closed object: unknown properties are not allowed
offer_info.details.data.legs[].segments[].operating_carrier.name.textstringRequired when name is presentNonblank source-reported display text, preserved without translation or normalization into the Offer content language.Pattern: [^\u0009-\u000D\u0020\u0085\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]
offer_info.details.data.legs[].segments[].operating_carrier.name.languagestringRequired when name is presentBCP 47 language tag for the source text; und indicates that the source language is unverified.Pattern: ^[A-Za-z]{2,3}(?:-[A-Za-z]{3}){0,3}(?:-[A-Za-z]{4})?(?:-(?:[A-Za-z]{2}|[0-9]{3}))?(?:-(?:[A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3}))*(?:-[0-9A-WY-Za-wy-z](?:-[A-Za-z0-9]{2,8})+)*(?:-[Xx](?:-[A-Za-z0-9]{1,8})+)?$ · Minimum length: 2 · Maximum length: 64
offer_info.details.data.legs[].segments[].operating_carrier.logo_urlstringoptionalAbsolute HTTPS carrier-logo URL without userinfo; omit when display rights or a stable asset URL are unavailable.Format: uri · Pattern: ^[Hh][Tt][Tt][Pp][Ss]:// · Maximum length: 2048
offer_info.details.data.legs[].segments[].operating_flight_numberstringoptionalVerified operating-carrier-local flight number; requires operating_carrier. Omit if only a marketing or codeshare number is known.Pattern: ^[0-9]{1,4}[A-Z]?$
offer_info.details.data.legs[].segments[].standard_aircraft_typeobjectoptionalVerified standardized scheduled aircraft type; distinct from source-reported planned_aircraft and subject to equipment changes.Closed object: unknown properties are not allowed · At least one required field set: iata_code OR icao_code · iata_code required when no alternative field set is complete (icao_code) · icao_code required when no alternative field set is complete (iata_code)
offer_info.details.data.legs[].segments[].standard_aircraft_type.iata_codestringRequired when no alternative field set is complete (icao_code)Verified three-character IATA equipment code.Pattern: ^[A-Z0-9]{3}$ · Required when no alternative field set is complete (icao_code)
offer_info.details.data.legs[].segments[].standard_aircraft_type.icao_codestringRequired when no alternative field set is complete (iata_code)Verified four-character ICAO equipment code.Pattern: ^[A-Z0-9]{4}$ · Required when no alternative field set is complete (iata_code)
offer_info.details.data.legs[].segments[].cabin_amenitiesobjectoptionalVerified amenities for this scheduled segment and cabin class; omission means unknown. Availability can change with equipment.Closed object: unknown properties are not allowed
offer_info.details.data.legs[].segments[].cabin_amenities.wifibooleanoptionalConfirmed Wi-Fi availability in this segment and cabin.
offer_info.details.data.legs[].segments[].cabin_amenities.power_outletbooleanoptionalConfirmed in-seat power availability in this segment and cabin.
offer_info.details.data.legs[].segments[].cabin_amenities.inflight_entertainmentbooleanoptionalConfirmed in-flight entertainment availability in this segment and cabin.
offer_info.details.data.legs[].segments[].cabin_amenities.meal_includedbooleanoptionalWhether a meal is included for this segment and cabin.
offer_info.details.data.legs[].segments[].cabin_amenities.seat_pitch_inchesnumberoptionalVerified seat pitch in inches for this cabin configuration.
offer_info.details.data.legs[].duration_minutesintegeroptionalSource-provided total leg duration including connection waiting, at least the sum of segment durations.Minimum: 1
offer_info.details.data.legs[].connectionsarray<object>optionalOptional ordered details of each boundary between adjacent segments; if present, one item per boundary. An airport change requires this array and an explicit matching airport_change=true.Item closed object: unknown properties are not allowed
offer_info.details.data.legs[].connections[].after_segment_indexintegerRequired when connections is presentZero-based index of the segment before this connection.Minimum: 0
offer_info.details.data.legs[].connections[].airport_changebooleanRequired when connections is presentTrue exactly when arrival and following departure airport codes differ.
offer_info.details.data.legs[].connections[].duration_minutesintegeroptionalVerified elapsed time from first arrival to next departure, including a known airport transfer when applicable.Minimum: 1

Price Basis

Price nature: a reference amount without traveler composition or a complete itinerary total.

Field pathTypeRequirementMeaning and constraints
offer_info.details.data.price_basisstringoptionalPrice nature: a reference amount without traveler composition or a complete itinerary total.Allowed: "reference", "itinerary_total"

Fare Details

Optional facts tied to this exact traveler-composed itinerary quote; invalid for a reference price.

Field pathTypeRequirementMeaning and constraints
offer_info.details.data.fare_detailsobjectoptionalOptional facts tied to this exact traveler-composed itinerary quote; invalid for a reference price.Closed object: unknown properties are not allowed · Prohibited when price_basis is "reference"
offer_info.details.data.fare_details.componentsarray<object>optionalFare rights by quoted traveler type and itinerary segment.Minimum items: 1 · Item closed object: unknown properties are not allowed
offer_info.details.data.fare_details.components[].leg_indexintegerRequired when components is presentZero-based leg index for this quoted fare component.Minimum: 0
offer_info.details.data.fare_details.components[].segment_indexintegerRequired when components is presentZero-based segment index within the referenced leg.Minimum: 0
offer_info.details.data.fare_details.components[].traveler_typestringRequired when components is presentQuoted traveler type to which these fare rights apply.Allowed: "adult", "child", "infant"
offer_info.details.data.fare_details.components[].brand_nameobjectoptionalUntranslated source text with an explicit source-language state.Closed object: unknown properties are not allowed
offer_info.details.data.fare_details.components[].brand_name.textstringRequired when brand_name is presentNonblank source-reported display text, preserved without translation or normalization into the Offer content language.Pattern: [^\u0009-\u000D\u0020\u0085\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]
offer_info.details.data.fare_details.components[].brand_name.languagestringRequired when brand_name is presentBCP 47 language tag for the source text; und indicates that the source language is unverified.Pattern: ^[A-Za-z]{2,3}(?:-[A-Za-z]{3}){0,3}(?:-[A-Za-z]{4})?(?:-(?:[A-Za-z]{2}|[0-9]{3}))?(?:-(?:[A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3}))*(?:-[0-9A-WY-Za-wy-z](?:-[A-Za-z0-9]{2,8})+)*(?:-[Xx](?:-[A-Za-z0-9]{1,8})+)?$ · Minimum length: 2 · Maximum length: 64
offer_info.details.data.fare_details.components[].booking_classstringoptionalSource-confirmed reservation booking class for this segment and traveler type.Pattern: ^[A-Z0-9]{1,3}$
offer_info.details.data.fare_details.components[].carry_on_baggageobjectoptionalIncluded allowance from the same fare quote; zero pieces explicitly means none.Closed object: unknown properties are not allowed · At least one required field set: pieces OR total_weight_kg · pieces required when no alternative field set is complete (total_weight_kg) · total_weight_kg required when no alternative field set is complete (pieces)
offer_info.details.data.fare_details.components[].carry_on_baggage.piecesintegerRequired when no alternative field set is complete (total_weight_kg)Number of baggage pieces included in this fare component; zero means none.Minimum: 0 · Required when no alternative field set is complete (total_weight_kg)
offer_info.details.data.fare_details.components[].carry_on_baggage.total_weight_kgnumberRequired when no alternative field set is complete (pieces)Total included baggage weight in kilograms.Required when no alternative field set is complete (pieces)
offer_info.details.data.fare_details.components[].carry_on_baggage.max_weight_kg_per_piecenumberoptionalMaximum included weight in kilograms for each piece.
offer_info.details.data.fare_details.components[].checked_baggageobjectoptionalIncluded allowance from the same fare quote; zero pieces explicitly means none.Closed object: unknown properties are not allowed · At least one required field set: pieces OR total_weight_kg · pieces required when no alternative field set is complete (total_weight_kg) · total_weight_kg required when no alternative field set is complete (pieces)
offer_info.details.data.fare_details.components[].checked_baggage.piecesintegerRequired when no alternative field set is complete (total_weight_kg)Number of baggage pieces included in this fare component; zero means none.Minimum: 0 · Required when no alternative field set is complete (total_weight_kg)
offer_info.details.data.fare_details.components[].checked_baggage.total_weight_kgnumberRequired when no alternative field set is complete (pieces)Total included baggage weight in kilograms.Required when no alternative field set is complete (pieces)
offer_info.details.data.fare_details.components[].checked_baggage.max_weight_kg_per_piecenumberoptionalMaximum included weight in kilograms for each piece.
offer_info.details.data.fare_details.components[].change_policyobjectoptionalFare-specific conditions from the quoted seller; exact applicability remains in the summary.Closed object: unknown properties are not allowed
offer_info.details.data.fare_details.components[].change_policy.summaryobjectRequired when change_policy is presentUntranslated source text with an explicit source-language state.Closed object: unknown properties are not allowed
offer_info.details.data.fare_details.components[].change_policy.summary.textstringRequired when change_policy is presentNonblank source-reported display text, preserved without translation or normalization into the Offer content language.Pattern: [^\u0009-\u000D\u0020\u0085\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]
offer_info.details.data.fare_details.components[].change_policy.summary.languagestringRequired when change_policy is presentBCP 47 language tag for the source text; und indicates that the source language is unverified.Pattern: ^[A-Za-z]{2,3}(?:-[A-Za-z]{3}){0,3}(?:-[A-Za-z]{4})?(?:-(?:[A-Za-z]{2}|[0-9]{3}))?(?:-(?:[A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3}))*(?:-[0-9A-WY-Za-wy-z](?:-[A-Za-z0-9]{2,8})+)*(?:-[Xx](?:-[A-Za-z0-9]{1,8})+)?$ · Minimum length: 2 · Maximum length: 64
offer_info.details.data.fare_details.components[].change_policy.permittedbooleanoptionalWhether the quoted fare permits this change or refund under the stated conditions.
offer_info.details.data.fare_details.components[].change_policy.feeobjectoptionalExact quoted fee only when the summary states its applicable conditions.Closed object: unknown properties are not allowed
offer_info.details.data.fare_details.components[].change_policy.fee.amountstringRequired when fee is presentNon-negative quoted monetary amount in the stated currency.Pattern: ^(?:0|[1-9][0-9]*)(?:\.[0-9]+)?$
offer_info.details.data.fare_details.components[].change_policy.fee.currencystringRequired when fee is presentUppercase three-letter currency code for the quoted amount.Pattern: ^[A-Z]{3}$
offer_info.details.data.fare_details.components[].refund_policyobjectoptionalFare-specific conditions from the quoted seller; exact applicability remains in the summary.Closed object: unknown properties are not allowed
offer_info.details.data.fare_details.components[].refund_policy.summaryobjectRequired when refund_policy is presentUntranslated source text with an explicit source-language state.Closed object: unknown properties are not allowed
offer_info.details.data.fare_details.components[].refund_policy.summary.textstringRequired when refund_policy is presentNonblank source-reported display text, preserved without translation or normalization into the Offer content language.Pattern: [^\u0009-\u000D\u0020\u0085\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]
offer_info.details.data.fare_details.components[].refund_policy.summary.languagestringRequired when refund_policy is presentBCP 47 language tag for the source text; und indicates that the source language is unverified.Pattern: ^[A-Za-z]{2,3}(?:-[A-Za-z]{3}){0,3}(?:-[A-Za-z]{4})?(?:-(?:[A-Za-z]{2}|[0-9]{3}))?(?:-(?:[A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3}))*(?:-[0-9A-WY-Za-wy-z](?:-[A-Za-z0-9]{2,8})+)*(?:-[Xx](?:-[A-Za-z0-9]{1,8})+)?$ · Minimum length: 2 · Maximum length: 64
offer_info.details.data.fare_details.components[].refund_policy.permittedbooleanoptionalWhether the quoted fare permits this change or refund under the stated conditions.
offer_info.details.data.fare_details.components[].refund_policy.feeobjectoptionalExact quoted fee only when the summary states its applicable conditions.Closed object: unknown properties are not allowed
offer_info.details.data.fare_details.components[].refund_policy.fee.amountstringRequired when fee is presentNon-negative quoted monetary amount in the stated currency.Pattern: ^(?:0|[1-9][0-9]*)(?:\.[0-9]+)?$
offer_info.details.data.fare_details.components[].refund_policy.fee.currencystringRequired when fee is presentUppercase three-letter currency code for the quoted amount.Pattern: ^[A-Z]{3}$
offer_info.details.data.fare_details.components[].seat_selectionobjectoptionalSeat selection terms for this fare component, not generic aircraft seat availability.Closed object: unknown properties are not allowed
offer_info.details.data.fare_details.components[].seat_selection.includedbooleanoptionalWhether seat selection is included in this fare component.
offer_info.details.data.fare_details.components[].seat_selection.starting_feeobjectoptionalSource-quoted starting seat-selection fee, not a selected seat or final charge.Closed object: unknown properties are not allowed
offer_info.details.data.fare_details.components[].seat_selection.starting_fee.amountstringRequired when starting_fee is presentNon-negative quoted monetary amount in the stated currency.Pattern: ^(?:0|[1-9][0-9]*)(?:\.[0-9]+)?$
offer_info.details.data.fare_details.components[].seat_selection.starting_fee.currencystringRequired when starting_fee is presentUppercase three-letter currency code for the quoted amount.Pattern: ^[A-Z]{3}$
offer_info.details.data.fare_details.self_transferbooleanoptionalSeller-confirmed self-transfer status of this quoted itinerary.
offer_info.details.data.fare_details.separate_ticketsbooleanoptionalSeller-confirmed separate-ticket status of this quoted itinerary.
offer_info.details.data.fare_details.baggage_recheck_requiredbooleanoptionalSeller-confirmed baggage recheck requirement for this quoted itinerary.

Emissions

Optional estimated total itinerary emissions with model provenance, never an operationally measured amount.

Field pathTypeRequirementMeaning and constraints
offer_info.details.data.emissionsobjectoptionalOptional estimated total itinerary emissions with model provenance, never an operationally measured amount.Closed object: unknown properties are not allowed
offer_info.details.data.emissions.estimated_kg_co2enumberRequired when emissions is presentEstimated whole-itinerary carbon dioxide equivalent in kilograms.Minimum: 0
offer_info.details.data.emissions.relative_to_typical_percentnumberoptionalSigned comparison with a comparable-route typical flight: negative means lower estimated emissions.Minimum: -100
offer_info.details.data.emissions.methodologystringRequired when emissions is presentName or version of the method used to estimate emissions.Minimum length: 1 · Maximum length: 200
offer_info.details.data.emissions.calculated_atstringRequired when emissions is presentTimestamp at which the emissions estimate was calculated.Format: date-time

Canonical Partner Offer example

This fixture-derived example shows the complete Partner-authored Offer shell and one priced itinerary.

JSON · flight Partner Offer
{
  "source_offer_id": "flight-sfo-nrt-ua837-20261012",
  "version": "3.0",
  "offer_info": {
    "title": "San Francisco to Tokyo economy fare",
    "offer_type": "offline_service",
    "category": {
      "id": "travel_tourism.air_travel.airline_tickets_fares_flights"
    },
    "description": "One adult economy itinerary from San Francisco to Tokyo.",
    "commercial": {
      "price": {
        "amount": "912.40",
        "currency": "USD",
        "tax_status": "included"
      },
      "quote": {
        "observed_at": "2026-09-04T09:00:00Z",
        "valid_until": "2026-09-04T10:00:00Z"
      }
    },
    "details": {
      "profile": "flight",
      "data": {
        "trip_type": "one_way",
        "travelers": [
          {
            "type": "adult",
            "count": 1
          }
        ],
        "legs": [
          {
            "segments": [
              {
                "departure": {
                  "airport_code": "SFO",
                  "local_at": "2026-10-12T12:30:00",
                  "airport_full_name": {
                    "text": "旧金山国际机场",
                    "language": "und"
                  },
                  "terminal": "3"
                },
                "arrival": {
                  "airport_code": "NRT",
                  "local_at": "2026-10-13T16:25:00",
                  "airport_full_name": {
                    "text": "成田国際空港",
                    "language": "und"
                  },
                  "terminal": "1"
                },
                "duration_minutes": 715,
                "marketing_carrier": {
                  "code": "UA"
                },
                "flight_number": "837",
                "cabin_class": "economy",
                "planned_aircraft": {
                  "name": {
                    "text": "Boeing 787-9",
                    "language": "und"
                  },
                  "source": "supplier_reported"
                }
              }
            ]
          }
        ]
      }
    }
  },
  "entity": {
    "id": "carrier-ua",
    "name": "Example Air"
  },
  "action": {
    "type": "open_url",
    "consumer_action": "book",
    "payload": {
      "url": "https://example.com/flights/sfo-nrt"
    }
  },
  "goals": [
    {
      "event": "booking",
      "pricing": {
        "model": "cpa",
        "amount": "10",
        "currency": "USD"
      }
    }
  ]
}

Semantic validation

  • Use a source-provided itinerary title: Short user-facing name used to identify the Offer in a result, card, or other presentation.
  • Trip type and leg count must agree: flight describes one priced itinerary: its declared trip topology, traveller composition (when applicable), and ordered segments must agree.
  • Distinguish reference fares from itinerary totals: Omission preserves the existing traveler-composed itinerary quote semantics; it never defaults to reference. Reference forbids travelers. Every other Flight requires travelers; existing supply age/seat extensions are optional, while typed traveler quotes require the request's sufficient age/seat facts.
  • Traveller types are unique: each flight traveler type may occur at most once
  • Segments preserve airport continuity and comparable local chronology: Scheduled local date-time at this airport in YYYY-MM-DDTHH:mm:ss form, without a UTC offset or timezone. Producers normalize a source space separator to T and must not infer missing timezone data. Positive source-provided scheduled elapsed duration of this segment in minutes. It is authoritative for duration; producers must not infer a timezone to derive it from local_at values. Consequently an arrival local_at may be lexically earlier than its departure local_at on a westbound or date-line-crossing flight. each flight segment departure airport must equal the preceding segment arrival airport at a connecting airport, each flight segment departure.local_at must not be earlier than the preceding segment arrival.local_at
  • Supply details do not imply live retrieval: These facts may appear on Public Offer, Partner Offer, Provider success and ordinary Query/MCP results, including non-real-time requests. Their presence does not imply live retrieval.