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, andquote.observed_at- Identity and action
source_offer_id,version: "3.0",entity, bookingaction, andgoals
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.
Profile envelope
Closed supply-profile envelope. profile selects exactly one registered closed data shape.
| Field path | Type | Requirement | Meaning and constraints |
|---|---|---|---|
offer_info.details.profile | string | required | Registered supply Offer profile identifier in the stable v1.0 registry.Const: "flight" |
offer_info.details.data | object | required | Closed 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 path | Type | Requirement | Meaning and constraints |
|---|---|---|---|
offer_info.details.data.trip_type | string | required | Declared 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 path | Type | Requirement | Meaning and constraints |
|---|---|---|---|
offer_info.details.data.travelers | array<object> | Required when price_basis is not "reference" or price_basis is absent | Non-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[].type | string | Required when travelers is present | Traveller type used to state the priced traveller composition.Allowed: "adult", "child", "infant" |
offer_info.details.data.travelers[].count | integer | Required when travelers is present | Positive number of travellers of this type included in the stated itinerary price.Minimum: 1 |
offer_info.details.data.travelers[].ages | array<integer> | optional | Completed years of age on the first local departure date, in traveler order.Item minimum: 0 |
offer_info.details.data.travelers[].infant_seat_required | array<boolean> | optional | Seat 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 path | Type | Requirement | Meaning and constraints |
|---|---|---|---|
offer_info.details.data.legs | array<object> | required | Ordered 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[].segments | array<object> | required | Ordered 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[].departure | object | required | Scheduled 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_code | string | required | Three-letter uppercase airport code; airport-registry membership is outside this profile.Pattern: ^[A-Z]{3}$ |
offer_info.details.data.legs[].segments[].departure.local_at | string | required | 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.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_code | string | optional | Optional 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_name | string | optional | Source-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_name | object | optional | Source-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.text | string | Required when airport_full_name is present | Nonblank 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.language | string | Required when airport_full_name is present | BCP 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.terminal | string | optional | Source-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.timezone | string | optional | Verified 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[].arrival | object | required | Scheduled 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_code | string | required | Three-letter uppercase airport code; airport-registry membership is outside this profile.Pattern: ^[A-Z]{3}$ |
offer_info.details.data.legs[].segments[].arrival.local_at | string | required | 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.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_code | string | optional | Optional 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_name | string | optional | Source-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_name | object | optional | Source-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.text | string | Required when airport_full_name is present | Nonblank 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.language | string | Required when airport_full_name is present | BCP 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.terminal | string | optional | Source-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.timezone | string | optional | Verified 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_minutes | integer | required | 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.Minimum: 1 |
offer_info.details.data.legs[].segments[].marketing_carrier | object | required | Carrier marketing this flight under the displayed flight number.Closed object: unknown properties are not allowed |
offer_info.details.data.legs[].segments[].marketing_carrier.code | string | required | Two-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.name | string | optional | Source-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_url | string | optional | Absolute 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_number | string | required | Carrier-local flight number without the marketing-carrier prefix.Pattern: ^[0-9]{1,4}[A-Z]?$ |
offer_info.details.data.legs[].segments[].cabin_class | string | required | Public cabin class for this segment.Allowed: "economy", "premium_economy", "business", "first" |
offer_info.details.data.legs[].segments[].stops | array<object> | optional | Source-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[].name | string | Required 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_language | string | optional | Language 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_code | string | Required 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_minutes | integer | optional | Positive source-provided stop duration in minutes.Minimum: 1 |
offer_info.details.data.legs[].segments[].planned_aircraft | object | optional | Supplier-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.name | object | Required when planned_aircraft is present | Source-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.text | string | Required when planned_aircraft is present | Nonblank 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.language | string | Required when planned_aircraft is present | BCP 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.source | string | Required when planned_aircraft is present | Identifies the supplier as the source of this planned aircraft label.Const: "supplier_reported" |
offer_info.details.data.legs[].segments[].operating_carrier | object | Required when operating_flight_number is present | Verified 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.code | string | Required when operating_carrier is present | Two-character uppercase operating carrier code.Pattern: ^[A-Z0-9]{2}$ |
offer_info.details.data.legs[].segments[].operating_carrier.name | object | optional | Optional source-reported operating carrier name with explicit language.Closed object: unknown properties are not allowed |
offer_info.details.data.legs[].segments[].operating_carrier.name.text | string | Required when name is present | Nonblank 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.language | string | Required when name is present | BCP 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_url | string | optional | Absolute 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_number | string | optional | Verified 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_type | object | optional | Verified 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_code | string | Required 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_code | string | Required 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_amenities | object | optional | Verified 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.wifi | boolean | optional | Confirmed Wi-Fi availability in this segment and cabin. |
offer_info.details.data.legs[].segments[].cabin_amenities.power_outlet | boolean | optional | Confirmed in-seat power availability in this segment and cabin. |
offer_info.details.data.legs[].segments[].cabin_amenities.inflight_entertainment | boolean | optional | Confirmed in-flight entertainment availability in this segment and cabin. |
offer_info.details.data.legs[].segments[].cabin_amenities.meal_included | boolean | optional | Whether a meal is included for this segment and cabin. |
offer_info.details.data.legs[].segments[].cabin_amenities.seat_pitch_inches | number | optional | Verified seat pitch in inches for this cabin configuration. |
offer_info.details.data.legs[].duration_minutes | integer | optional | Source-provided total leg duration including connection waiting, at least the sum of segment durations.Minimum: 1 |
offer_info.details.data.legs[].connections | array<object> | optional | Optional 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_index | integer | Required when connections is present | Zero-based index of the segment before this connection.Minimum: 0 |
offer_info.details.data.legs[].connections[].airport_change | boolean | Required when connections is present | True exactly when arrival and following departure airport codes differ. |
offer_info.details.data.legs[].connections[].duration_minutes | integer | optional | Verified 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 path | Type | Requirement | Meaning and constraints |
|---|---|---|---|
offer_info.details.data.price_basis | string | optional | Price 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 path | Type | Requirement | Meaning and constraints |
|---|---|---|---|
offer_info.details.data.fare_details | object | optional | Optional 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.components | array<object> | optional | Fare 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_index | integer | Required when components is present | Zero-based leg index for this quoted fare component.Minimum: 0 |
offer_info.details.data.fare_details.components[].segment_index | integer | Required when components is present | Zero-based segment index within the referenced leg.Minimum: 0 |
offer_info.details.data.fare_details.components[].traveler_type | string | Required when components is present | Quoted traveler type to which these fare rights apply.Allowed: "adult", "child", "infant" |
offer_info.details.data.fare_details.components[].brand_name | object | optional | Untranslated source text with an explicit source-language state.Closed object: unknown properties are not allowed |
offer_info.details.data.fare_details.components[].brand_name.text | string | Required when brand_name is present | Nonblank 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.language | string | Required when brand_name is present | BCP 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_class | string | optional | Source-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_baggage | object | optional | Included 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.pieces | integer | Required 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_kg | number | Required 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_piece | number | optional | Maximum included weight in kilograms for each piece. |
offer_info.details.data.fare_details.components[].checked_baggage | object | optional | Included 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.pieces | integer | Required 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_kg | number | Required 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_piece | number | optional | Maximum included weight in kilograms for each piece. |
offer_info.details.data.fare_details.components[].change_policy | object | optional | Fare-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.summary | object | Required when change_policy is present | Untranslated 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.text | string | Required when change_policy is present | Nonblank 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.language | string | Required when change_policy is present | BCP 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.permitted | boolean | optional | Whether the quoted fare permits this change or refund under the stated conditions. |
offer_info.details.data.fare_details.components[].change_policy.fee | object | optional | Exact 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.amount | string | Required when fee is present | Non-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.currency | string | Required when fee is present | Uppercase three-letter currency code for the quoted amount.Pattern: ^[A-Z]{3}$ |
offer_info.details.data.fare_details.components[].refund_policy | object | optional | Fare-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.summary | object | Required when refund_policy is present | Untranslated 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.text | string | Required when refund_policy is present | Nonblank 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.language | string | Required when refund_policy is present | BCP 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.permitted | boolean | optional | Whether the quoted fare permits this change or refund under the stated conditions. |
offer_info.details.data.fare_details.components[].refund_policy.fee | object | optional | Exact 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.amount | string | Required when fee is present | Non-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.currency | string | Required when fee is present | Uppercase three-letter currency code for the quoted amount.Pattern: ^[A-Z]{3}$ |
offer_info.details.data.fare_details.components[].seat_selection | object | optional | Seat 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.included | boolean | optional | Whether seat selection is included in this fare component. |
offer_info.details.data.fare_details.components[].seat_selection.starting_fee | object | optional | Source-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.amount | string | Required when starting_fee is present | Non-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.currency | string | Required when starting_fee is present | Uppercase three-letter currency code for the quoted amount.Pattern: ^[A-Z]{3}$ |
offer_info.details.data.fare_details.self_transfer | boolean | optional | Seller-confirmed self-transfer status of this quoted itinerary. |
offer_info.details.data.fare_details.separate_tickets | boolean | optional | Seller-confirmed separate-ticket status of this quoted itinerary. |
offer_info.details.data.fare_details.baggage_recheck_required | boolean | optional | Seller-confirmed baggage recheck requirement for this quoted itinerary. |
Emissions
Optional estimated total itinerary emissions with model provenance, never an operationally measured amount.
| Field path | Type | Requirement | Meaning and constraints |
|---|---|---|---|
offer_info.details.data.emissions | object | optional | Optional 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_co2e | number | Required when emissions is present | Estimated whole-itinerary carbon dioxide equivalent in kilograms.Minimum: 0 |
offer_info.details.data.emissions.relative_to_typical_percent | number | optional | Signed comparison with a comparable-route typical flight: negative means lower estimated emissions.Minimum: -100 |
offer_info.details.data.emissions.methodology | string | Required when emissions is present | Name or version of the method used to estimate emissions.Minimum length: 1 · Maximum length: 200 |
offer_info.details.data.emissions.calculated_at | string | Required when emissions is present | Timestamp 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.
{
"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.