Registered profile · Protocol v1.0
Flight Offer Profile
Describe one priced air itinerary with its traveler composition, ordered legs, and marketed segments. A priced air itinerary with traveller composition, ordered legs, and scheduled segments.
- Selector
flight- Offer type
offline_service- Consumer action
book- Profile status
- protocol-v1.0.0-r15
Required Offer context
Complete the common Offer shell first
The profile adds domain facts; it does not replace the required Partner Offer fields.
- Category
travel_tourism.air_travel.airline_tickets_fares_flights- 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 |
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 | Non-empty traveller counts grouped by traveller type. Each type may occur at most once under semantic validation.Minimum items: 1 · Maximum items: 3 |
offer_info.details.data.travelers[].type | string | required | Traveller type used to state the priced traveller composition.Allowed: "adult", "child", "infant" |
offer_info.details.data.travelers[].count | integer | required | Positive number of travellers of this type included in the stated itinerary price.Minimum: 1 |
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 |
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 |
offer_info.details.data.legs[].segments[].departure | object | required | Scheduled departure airport and timestamp 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.at | string | required | RFC 3339 scheduled timestamp including an explicit UTC offset.Format: date-time |
offer_info.details.data.legs[].segments[].arrival | object | required | Scheduled arrival airport and timestamp 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.at | string | required | RFC 3339 scheduled timestamp including an explicit UTC offset.Format: date-time |
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[].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" |
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",
"at": "2026-10-12T12:30:00-07:00"
},
"arrival": {
"airport_code": "NRT",
"at": "2026-10-13T16:25:00+09:00"
},
"marketing_carrier": {
"code": "UA"
},
"flight_number": "837",
"cabin_class": "economy"
}
]
}
]
}
}
},
"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, and ordered segments must agree.
- Traveller types are unique: each flight traveler type may occur at most once
- Segments remain ordered and contiguous: flight segment arrival.at must be later than departure.at each flight segment departure airport must equal the preceding segment arrival airport each flight segment departure.at must not be earlier than the preceding segment arrival.at
- Supply details are Partner input facts: current Query Generic projection must not include offer_info.details