---
title: "Parse Screenshot"
method: POST
path: "/bookings/parse-screenshot"
tags: ["bookings"]
---

# Parse Screenshot

`POST /bookings/parse-screenshot`

Parse a booking screenshot and return extracted fields for form autofill.

Automatically detects whether the screenshot is a flight or hotel booking.

## Response `200`

Successful Response

- union
  - FlightScreenshotParseResponse — Response from flight screenshot parsing.
    - `booking_type` 'flight'
    - `has_return_leg` boolean, required
    - `parsed_fields` FlightBookingDataOutput, 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` string, nullable — 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
      - `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` string, nullable — 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.
      - `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
    - `form_fields` FlightFormFields, required — Pre-computed form fields for the FE flight booking form. Extracted from the parsed blob so the FE doesn't need segment iteration logic.
      - `record_locator` string, nullable
      - `first_name` string, nullable
      - `last_name` string, nullable
      - `origin_airport` string, nullable
      - `destination_airport` string, nullable
      - `departure_date` string, date, nullable
      - `return_date` string, date, nullable
      - `cash_paid` string, nullable
      - `cash_currency` string, nullable
  - HotelScreenshotParseResponse — Response from hotel screenshot parsing.
    - `booking_type` 'hotel'
    - `parsed_fields` HotelBookingDataOutput, required — Actual data fields for hotel bookings -- separated out from api create schema so this can be used as a structured output response format for the LLM.
      - `hotel_name` string, nullable — Full hotel property name, e.g., 'The Ritz-Carlton San Francisco', 'Hampton Inn LAX'
      - `hotel_chain` string, nullable — Hotel chain or brand, e.g., 'Marriott', 'Hilton', 'IHG', 'Hyatt'
      - `address` string, nullable — Street address where the hotel is located, e.g., '600 Stockton Street'
      - `city` string, nullable — City where the hotel is located, e.g., 'San Francisco', 'New York'
      - `state` string, nullable — State or province where the hotel is located, e.g., 'California', 'CA', 'Ontario'
      - `country` string, nullable — ISO 3166-1 alpha-2 country code where the hotel is located, e.g., 'US', 'GB', 'JP'
      - `postal_code` string, nullable — Postal or ZIP code where the hotel is located, e.g., '94108', 'SW1A 1AA'
      - `check_in_date` union — Check-in date in ISO 8601 format (YYYY-MM-DD), e.g., '2024-03-15'
        - string, date
        - string
      - `check_out_date` union — Check-out date in ISO 8601 format (YYYY-MM-DD), e.g., '2024-03-18'
        - string, date
        - string
      - `room_type` string, nullable — Room category or type, e.g., 'Deluxe King', 'Standard Double', 'Junior Suite'
      - `number_of_rooms` integer, nullable — Number of rooms booked, defaults to 1 if not specified
      - `cash_paid` string, nullable — Cash amount paid. For award bookings, this may be $0 or just resort fees. For mixed bookings (points + cash), this is the cash portion.
      - `cash_per_night` string, nullable — Cash per night. For award bookings, this may be $0.
      - `cash_currency` string, nullable — ISO 4217 currency code for cash amounts, e.g., 'USD', 'EUR'
      - `special_requests` string, nullable — Guest special requests, comma-separated, e.g., 'late check-out, high floor, quiet room'
      - `cancellation_policy` string, nullable — Full cancellation policy text as shown in the email
      - `free_cancellation_until` union — Deadline for free cancellation in ISO 8601 format with timezone, e.g., '2024-03-14T18:00:00-05:00'
        - string, date-time
        - string
      - `booked_at` union — Date/time when the booking was made, in ISO 8601 format, e.g., '2024-02-01T10:30:00Z'
        - string, date-time
        - string
      - `cancelled_at` union — Date/time when the booking was cancelled, if applicable, in ISO 8601 format
        - string, date-time
        - string
      - `hotels` HotelCreate[], nullable — Hotel entries (currently unused stub)
      - `guests` GuestInput[], nullable — List of guests for this booking with name details
        - `traveler_profile_id` string, uuid, nullable
        - `first_name` string, nullable — Guest's first/given name
        - `middle_name` string, nullable — Guest's middle name, if present
        - `last_name` string, nullable — Guest's last/family name
        - `is_primary_guest` boolean — True if this is the primary guest (person who made the booking)
      - `refundable` boolean, nullable — Whether the booking is refundable. true if cancellation with full or partial refund is available, false if explicitly non-refundable, null if unknown.
      - `confirmation_number` string, nullable — Hotel confirmation code or reservation number, e.g., '12345678', 'CONF-ABC123'
      - `booking_provider` string, nullable — Where booking was made: 'direct' (hotel site), or OTA name like 'Expedia', 'Booking.com', 'Hotels.com'
      - `is_award_booking` boolean — True if this is a points redemption booking
      - `loyalty_program` string, nullable — Loyalty program name, e.g., 'Marriott Bonvoy', 'Hilton Honors'
      - `loyalty_number` string, nullable — Loyalty program account number
      - `points_paid` integer, nullable — Points paid for award booking
    - `form_fields` HotelFormFields, required — Pre-computed form fields for the FE hotel booking form.
      - `first_name` string, nullable
      - `last_name` string, nullable
      - `hotel_name` string, nullable
      - `confirmation_number` string, nullable
      - `check_in_date` string, date, nullable
      - `check_out_date` string, date, nullable
      - `cash_paid` string, nullable
      - `cash_currency` 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/d3c4c29fede7/schema)
