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 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, 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.

18 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

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>requiredNon-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[].typestringrequiredTraveller type used to state the priced traveller composition.Allowed: "adult", "child", "infant"
offer_info.details.data.travelers[].countintegerrequiredPositive 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 pathTypeRequirementMeaning and constraints
offer_info.details.data.legsarray<object>requiredOrdered itinerary legs. Each leg contains one or more ordered flight segments.Minimum items: 1
offer_info.details.data.legs[].segmentsarray<object>requiredOrdered segments for this leg. Semantic validation requires adjacent arrival and departure continuity.Minimum items: 1
offer_info.details.data.legs[].segments[].departureobjectrequiredScheduled departure airport and timestamp 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.atstringrequiredRFC 3339 scheduled timestamp including an explicit UTC offset.Format: date-time
offer_info.details.data.legs[].segments[].arrivalobjectrequiredScheduled arrival airport and timestamp 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.atstringrequiredRFC 3339 scheduled timestamp including an explicit UTC offset.Format: date-time
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[].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"

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",
                  "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