---
title: "Create Flight Booking"
method: POST
path: "/bookings/flight"
tags: ["bookings"]
---

# Create Flight Booking

`POST /bookings/flight`

Create a flight booking from screenshot + form.

## Request body

- ManualFlightBookingRequest — Request body for creating a flight booking from screenshot + form.
  - `parsed_data` FlightBookingDataInput, required — Base schema containing all flight booking fields. This is the shared contract for flight booking data across services. The email parser cannot resolve user_id from email content, so user_id lives in FlightBookingCreate which inherits from this class.
    - `booking_channel` string, nullable — direct, ota, corporate, agent, other
    - `booking_provider` string, nullable — e.g., Priceline, Delta, Expedia, etc
    - `airline` string, nullable — Primary airline name for the booking, e.g., 'United Airlines', 'Delta Air Lines'
    - `airline_code` string, nullable — IATA airline code, e.g., 'UA', 'DL', 'AA'
    - `origin_airport` string, nullable — IATA airport code for first departure of the trip, e.g., 'JFK', 'LAX'
    - `destination_airport` string, nullable — IATA airport code for outbound destination (where you're going), e.g., 'JFK', 'LAX'
    - `departure_time` union — Departure time of first flight in ISO 8601 format with timezone, e.g., '2024-03-15T14:30:00-05:00'
      - string, date-time
      - string
    - `arrival_time` union — Arrival time of final flight in ISO 8601 format with timezone, e.g., '2024-03-15T18:45:00-08:00'
      - string, date-time
      - string
    - `cabin_class` string, nullable — economy, premium_economy, business, first
    - `fare_family` string, nullable — Fare family / fare brand for the booking when shown (e.g., 'Main Cabin', 'Delta One').
    - `fare_family_id` string, nullable — Canonical fare family ID for the booking when resolved.
    - `fare_family_label` string, nullable — Source/display fare family label for the booking.
    - `fare_family_source` string, nullable — How the booking fare family was captured.
    - `fare_family_resolved_at` string, date-time, nullable — When the fare family label was resolved to the canonical ID.
    - `fare_family_blocker_reason` string, nullable — Structured blocker reason when fare family cannot support direct repricing.
    - `fare_family_evidence` FareFamilyEvidence — Structured fare evidence persisted for booking/admin workflows.
      - `raw_label` string, nullable
      - `normalized_label` string, nullable
      - `fare_family_id` string, nullable
      - `fare_family_label` string, nullable
      - `fare_family_source` string, nullable
      - `base_fare_family_id` string, nullable
      - `base_fare_family_label` string, nullable
      - `variant_status` string, nullable
      - `candidate_fare_family_ids` string[]
      - `fare_confidence` 'exact' | 'likely_equivalent' | 'possible_downgrade' | 'unverified' — Operator-facing confidence for fare-family equivalence.
      - `fare_evidence_status` 'not_attempted' | 'parsed' | 'parse_failed' | 'source_unavailable' — Whether fare evidence parsing was attempted and why it may be absent.
      - `requires_operator_fare_verification` boolean
      - `blocker_reason` string, nullable
      - `matched_text` string, nullable
      - `body_source` string, nullable
      - `rule_id` string, nullable
      - `parser_version` string, nullable
      - `raw_google_option_title` string, nullable
      - `option_title_present` boolean, nullable
      - `option_title_missing` boolean, nullable
      - `fallback_label` string, nullable
      - `fallback_label_used` boolean, nullable
      - `fallback_label_source` string, nullable
      - `canonicalizer_status` string, nullable
      - `canonicalizer_reason` string, nullable
      - `selected_observation_id` string, nullable
      - `content_observation_id` string, nullable
      - `evidence_kind` 'fare_product' | 'seat_extra' | 'noise' — Type of evidence captured from parser or supplier data.
      - `seat_extras` SeatExtraEvidence[]
        - `label` string, required
        - `matched_text` string, nullable
        - `rule_id` string, nullable
        - `body_source` string, nullable
      - `possible_downgrade_reasons` string[]
      - `segments` SegmentFareEvidence[]
        - `airline_code` string, nullable
        - `flight_number` string, nullable
        - `fare_family_id` string, nullable
        - `fare_family_label` string, nullable
        - `fare_family_source` string, nullable
        - `fare_confidence` 'exact' | 'likely_equivalent' | 'possible_downgrade' | 'unverified' — Operator-facing confidence for fare-family equivalence.
        - `blocker_reason` string, nullable
        - `matched_text` string, nullable
      - `raw` object, nullable
    - `flight_parse_evidence` FlightParseEvidence — Durable parser evidence for the whole flight booking. This supersedes the narrow fare_family_evidence shape while preserving enough flat compatibility fields for older callers during rollout.
      - `parse_status` 'not_attempted' | 'parsed' | 'parse_failed' | 'source_unavailable' — Whether fare evidence parsing was attempted and why it may be absent.
      - `fare_evidence_status` 'not_attempted' | 'parsed' | 'parse_failed' | 'source_unavailable' — Whether fare evidence parsing was attempted and why it may be absent.
      - `parser_version` string, nullable
      - `body_source` string, nullable
      - `llm_model` string, nullable
      - `llm_api_surface` string, nullable
      - `llm_reasoning_effort` string, nullable
      - `llm_reasoning_summary` string, nullable
      - `llm_reasoning_summary_source` string, nullable
      - `llm_latency_ms` integer, nullable
      - `llm_input_tokens` integer, nullable
      - `llm_output_tokens` integer, nullable
      - `llm_claims` LLMParseClaim[]
        - `field` 'fare_product' | 'seat_extra' | 'cabin' | 'booking_class' | 'price', required — Parser claim category captured from the LLM output.
        - `label` string, nullable
        - `context` string, nullable
        - `evidence_text` string, nullable
        - `confidence` 'exact' | 'likely_equivalent' | 'possible_downgrade' | 'unverified' — Operator-facing confidence for fare-family equivalence.
        - `source` string, nullable
        - `is_purchased_fare` boolean, nullable
      - `parser_error_message` string, nullable
      - `verifier_decision` 'accepted_exact' | 'accepted_likely' | 'downgraded' | 'rejected' | 'ambiguous' | 'source_unavailable' — How deterministic verification handled an LLM claim.
      - `verifier_reasons` string[]
      - `llm_verifier_disagreement` boolean
      - `human_review_required` boolean
      - `fare_product` FareProductEvidence — Base fare product/fare-family evidence.
        - `raw_label` string, nullable
        - `normalized_label` string, nullable
        - `fare_family_id` string, nullable
        - `fare_family_label` string, nullable
        - `fare_family_source` string, nullable
        - `base_fare_family_id` string, nullable
        - `base_fare_family_label` string, nullable
        - `variant_status` string, nullable
        - `candidate_fare_family_ids` string[]
        - `fare_confidence` 'exact' | 'likely_equivalent' | 'possible_downgrade' | 'unverified' — Operator-facing confidence for fare-family equivalence.
        - `requires_operator_fare_verification` boolean
        - `blocker_reason` string, nullable
        - `matched_text` string, nullable
        - `source_text` string, nullable
        - `rule_id` string, nullable
        - `canonicalizer_rule_id` string, nullable
        - `raw_google_option_title` string, nullable
        - `option_title_present` boolean, nullable
        - `option_title_missing` boolean, nullable
        - `fallback_label` string, nullable
        - `fallback_label_used` boolean, nullable
        - `fallback_label_source` string, nullable
        - `canonicalizer_status` string, nullable
        - `canonicalizer_reason` string, nullable
        - `selected_observation_id` string, nullable
        - `content_observation_id` string, nullable
        - `llm_context` string, nullable
        - `llm_evidence_text` string, nullable
        - `verifier_decision` 'accepted_exact' | 'accepted_likely' | 'downgraded' | 'rejected' | 'ambiguous' | 'source_unavailable' — How deterministic verification handled an LLM claim.
        - `verifier_reason` string, nullable
        - `verifier_reasons` string[]
        - `human_review_required` boolean
        - `trusted_for_repricing` boolean, nullable
      - `cabin` CabinEvidence — Cabin evidence extracted from supplier/email content.
        - `cabin_class` string, nullable
        - `confidence` 'exact' | 'likely_equivalent' | 'possible_downgrade' | 'unverified' — Operator-facing confidence for fare-family equivalence.
        - `matched_text` string, nullable
        - `source` string, nullable
      - `booking_class` BookingClassEvidence — Booking-class/fare-basis evidence when shown.
        - `booking_class` string, nullable
        - `fare_basis_code` string, nullable
        - `confidence` 'exact' | 'likely_equivalent' | 'possible_downgrade' | 'unverified' — Operator-facing confidence for fare-family equivalence.
        - `matched_text` string, nullable
        - `source` string, nullable
      - `price` PriceEvidence — Price evidence extracted from source content.
        - `amount` string, nullable
        - `currency` string, nullable
        - `source` string, nullable
        - `confidence` 'exact' | 'likely_equivalent' | 'possible_downgrade' | 'unverified' — Operator-facing confidence for fare-family equivalence.
      - `source_quality` SourceQualityEvidence — Availability and quality of the source used for parsing.
        - `source_email_id` string, nullable
        - `body_source` string, nullable
        - `source_available` boolean, nullable
        - `source_unavailable_reason` string, nullable
      - `raw_evidence_candidates` RawFlightEvidenceCandidate[]
        - `evidence_type` string, required
        - `raw_value` string, required
        - `matched_text` string, required
        - `source` string, nullable
        - `trusted` boolean
        - `booking_class` string, nullable
        - `fare_product_hint` string, nullable
      - `seat_extras` SeatExtraEvidence[]
        - `label` string, required
        - `matched_text` string, nullable
        - `rule_id` string, nullable
        - `body_source` string, nullable
      - `possible_downgrade_reasons` string[]
      - `segments` SegmentFareEvidence[]
        - `airline_code` string, nullable
        - `flight_number` string, nullable
        - `fare_family_id` string, nullable
        - `fare_family_label` string, nullable
        - `fare_family_source` string, nullable
        - `fare_confidence` 'exact' | 'likely_equivalent' | 'possible_downgrade' | 'unverified' — Operator-facing confidence for fare-family equivalence.
        - `blocker_reason` string, nullable
        - `matched_text` string, nullable
      - `raw` object, nullable
    - `booking_class` string, nullable — Optional booking class / fare code if shown (e.g., 'Y', 'B', 'M', 'J').
    - `cash_paid` union — Cash amount paid as displayed in the email (e.g., 149.99 for $149.99, 15000 for ¥15000). For award bookings, this is taxes/fees only. For mixed bookings, this is the cash portion. No currency symbol, no thousands separator. Normalize locale formats: US '1,234.56' or European '1.234,56' → output 1234.56
      - number
      - string
    - `cash_currency` string, nullable — ISO 4217 currency code for cash_paid, e.g., 'USD', 'EUR', 'JPY', 'CLP'
    - `checked_bags_included` integer, nullable — Number of checked bags included in the fare. Null if not mentioned in the email.
    - `carry_on_bags_included` integer, nullable — Number of carry-on bags included in the fare. Baggage policy sections count (e.g., 'limited to one carry-on' = 1). Null if not mentioned.
    - `is_award_booking` boolean — True if flight was booked using miles/points (even partially). Look for phrases like 'Award booking', 'Redeemed miles', 'Points redemption', or mile/point amounts in the price breakdown.
    - `loyalty_program` string, nullable — Frequent flyer program name, e.g., 'Mileage Plan', 'MileagePlus', 'SkyMiles', 'AAdvantage'. Only set if the passenger has an account linked to this booking. Do not set based on promotional content or 'Join now' messaging.
    - `loyalty_number` string, nullable — Frequent flyer account number shown in the booking, if any.
    - `miles_paid` integer, nullable — Number of miles/points redeemed for the booking. Only set if is_award_booking is true. Integer value, no decimals.
    - `airline_credit_applied` union — Airline travel credit or voucher applied to the booking, as displayed (e.g., 194.20 for $194.20). Look for 'Travel credit', 'Voucher', 'Flight credit', 'My wallet' in payment breakdown.
      - number
      - string
    - `record_locator` string, nullable — PNR/confirmation code, e.g., 'ABC123'
    - `booked_at` union — Date/time when the booking was made, in ISO 8601 format
      - string, date-time
      - string
    - `cancelled_at` union — Date/time when the booking was cancelled, if applicable
      - string, date-time
      - string
    - `flights` FlightCreate[], nullable — Individual flight segments/legs
      - `marketing_carrier` string, nullable — Full airline name on the ticket, e.g., 'United Airlines', 'Delta Air Lines'
      - `marketing_carrier_code` string, nullable — IATA airline code for marketing carrier, e.g., 'UA', 'DL'
      - `operating_carrier` string, nullable — Airline actually operating the flight, if different from marketing carrier (codeshare)
      - `operating_carrier_code` string, nullable — IATA airline code for operating carrier, e.g., 'UA', 'DL'
      - `flight_number` string, nullable — Flight number without airline code, e.g., '123', '1234'
      - `cabin_class` 'economy' | 'premium_economy' | 'business' | 'first' — Aircraft cabin class.
      - `fare_family` string, nullable — Fare family / fare brand for this segment (e.g., 'Main Cabin', 'Basic Economy').
      - `fare_family_id` string, nullable — Canonical fare family ID for this segment, e.g. 'ua_basic_economy'.
      - `fare_family_source` string, nullable — Provenance for the segment fare family.
      - `booking_class` string, nullable — Optional booking class / fare code if shown (e.g., 'Y', 'B', 'M', 'J').
      - `origin` string, nullable — IATA airport code for departure, e.g., 'JFK', 'LAX'
      - `destination` string, nullable — IATA airport code for arrival, e.g., 'JFK', 'LAX'
      - `departure_date` string, date, nullable — Departure date (local to origin airport)
      - `departure_time` string, time, nullable — Departure time (local to origin airport)
      - `arrival_date` string, date, nullable — Arrival date (local to destination airport)
      - `arrival_time` string, time, nullable — Arrival time (local to destination airport)
      - `leg_index` integer, nullable — Which leg this segment belongs to (0=outbound, 1=return, etc.). Segments with same leg_index are grouped together.
    - `passengers` PassengerInput[], nullable — Passengers on this booking
      - `traveler_profile_id` string, uuid, nullable
      - `first_name` string, nullable — Passenger's first/given name
      - `middle_name` string, nullable — Passenger's middle name, if present
      - `last_name` string, nullable — Passenger's last/family name
      - `passenger_type` string, nullable — Passenger type: adult, child, infant_in_seat, or infant_on_lap
      - `seat_assignment` string, nullable — Assigned seat, e.g., '12A', '23F'
      - `ticket_number` string, nullable — E-ticket number, usually 13 digits
      - `boarding_group` string, nullable — Boarding group or zone, e.g., '1', 'A', 'Group 3'
      - `frequent_flyer_number` string, nullable — Frequent flyer/loyalty program number
  - `record_locator` string, required
  - `first_name` string, required
  - `last_name` string, required
  - `origin_airport` string, required
  - `destination_airport` string, required
  - `departure_date` string, date, required
  - `return_date` string, date, nullable — Return date for roundtrip flights (when parsed_data has leg_index=1 segments)
  - `cash_paid` union, required
    - number
    - string
  - `cash_currency` string, required
  - `conv_trip_id` string, uuid, nullable — Brain trip document UUID from conversation card

## Response `201`

Successful Response

- FlightBookingDetailResponse — Enriched flight booking detail for client.
  - `id` string, uuid, required
  - `user_id` string, uuid, required
  - `status` string, required
  - `confirmation_code` string, nullable, required
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required
  - `is_axel_booked` boolean — True if booked through Axel (booking_channel='axel')
  - `booking_channel` string, nullable
  - `booking_provider` string, nullable
  - `origin` string, nullable
  - `origin_city` string, nullable
  - `destination` string, nullable
  - `destination_city` string, nullable
  - `departure_date` string, date, nullable
  - `departure_time` string, date-time, nullable
  - `arrival_time` string, date-time, nullable
  - `is_round_trip` boolean
  - `cabin_class` string, nullable
  - `airline_code` string, nullable
  - `airline_name` string, nullable
  - `travelers` string[] — Traveler names
  - `total_price` Money — Immutable money value stored as integer minor units. Amount is always stored in the smallest currency unit (cents, yen, pesos, etc). This avoids floating-point precision issues and matches payment processor standards. Examples: $19.99 USD -> Money(amount=1999, currency="USD") ¥1000 JPY -> Money(amount=1000, currency="JPY") $1000.00 CLP -> Money(amount=1000, currency="CLP") Serializes to {"amount": 1999, "currency": "USD"}. IMPORTANT: Use Money.from_decimal() for user-facing amounts like "$19.99". The constructor expects integer minor units (cents).
    - `amount` integer, required
    - `currency` string, required
  - `is_award_booking` boolean
  - `reprice_capability` RepriceCapability — What Axel can do with a booking.
    - `can_reprice` boolean, required — Whether repricing is possible
    - `is_watching` boolean, required — Whether an active watch exists
    - `blocker` 'basic_economy' | 'award_booking' | 'already_departed' | 'departure_too_soon' | 'booking_cancelled' | 'booking_not_active' | 'supplier_not_supported' | 'insufficient_data' | 'non_refundable_hotel' — Reasons Axel can't reprice a booking.
  - `credit_secured` SavingsSecured — Savings captured from a completed reprice.
    - `savings_method` 'card_refund' | 'axel_credit' | 'airline_credit' | 'miles_returned' | 'reduced_payment', required — How customer receives savings from repricing.
    - `amount` Money — Immutable money value stored as integer minor units. Amount is always stored in the smallest currency unit (cents, yen, pesos, etc). This avoids floating-point precision issues and matches payment processor standards. Examples: $19.99 USD -> Money(amount=1999, currency="USD") ¥1000 JPY -> Money(amount=1000, currency="JPY") $1000.00 CLP -> Money(amount=1000, currency="CLP") Serializes to {"amount": 1999, "currency": "USD"}. IMPORTANT: Use Money.from_decimal() for user-facing amounts like "$19.99". The constructor expects integer minor units (cents).
      - `amount` integer, required
      - `currency` string, required
    - `miles_amount` integer, nullable — Miles returned
    - `airline_credit_id` string, uuid, nullable — Reference to airline credit record
    - `airline_code` string, nullable — IATA airline code
    - `airline_name` string, nullable — Airline display name
    - `expires_at` string, date, nullable — Credit expiration date
    - `loyalty_program` string, nullable — Loyalty program name
  - `airline_credit_offer` AirlineCreditOffer — Synthetic airline-credit offer shown after sparse flight import.
    - `available` boolean, required
    - `credit_cents` integer, nullable
    - `currency` string, nullable
    - `airline_name` string, nullable

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.dev/helloaxel/apis/client-api-gateway.md) · [All operations](https://skmtc.dev/helloaxel/apis/client-api-gateway/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/helloaxel/client-api-gateway/revisions/29c8d734d508/schema)
