import {z} from 'zod' export type GetApiV1TripsTripIdBookingsArgs = {cursor?: (string | null) | undefined, limit?: (number | null) | undefined, load_custom_fields?: (boolean | null) | undefined, trip_id: string}; export type GetApiV1TripsTripIdBookingsOptions = {baseUrl?: string | undefined, OAuth2?: string | undefined, fetch?: typeof fetch | undefined}; export const bookingType = z.enum(["AIR", "CAR_RENTAL", "LODGING", "RAIL"]); export const bookingStatus = z.enum(["HOLD", "PENDING", "CONFIRMED", "COMPLETED", "CANCELED", "IN_PROGRESS", "REFUNDED", "VOIDED", "PROCESSING", "UNCONFIRMED", "AIRLINE_CONTROL", "PAYMENT_DECLINED", "SCHEDULE_CHANGE", "APPROVAL_REQUESTED", "APPROVAL_DENIED", "CANCELLATION_IN_PROGRESS"]); export const bookingSource = z.enum(["BREX_TRAVEL", "EXTERNAL"]); export const airBookingDataFlightEndpoint = z.object({airport_code: z.string(), terminal: z.string().nullable().optional(), gate: z.string().nullable().optional(), airport_location: z.object({country: z.string().nullable().optional(), administrative_area: z.string().nullable().optional(), city: z.string().nullable().optional(), postal_code: z.string().nullable().optional(), address_line_1: z.string().nullable().optional(), address_line_2: z.string().nullable().optional(), coordinates: z.object({latitude: z.number(), longitude: z.number()}).nullable().optional(), timezone: z.string().nullable().optional()}).nullable().optional()}); export const airBookingDataFlight = z.object({origin: airBookingDataFlightEndpoint, destination: airBookingDataFlightEndpoint, departure_time: z.object({local_time: z.string(), timestamp: z.string().nullable().optional()}), arrival_time: z.object({local_time: z.string(), timestamp: z.string().nullable().optional()}), duration: z.string().nullable().optional(), confirmation_code: z.string().nullable().optional(), cabin_class: z.enum(["ECONOMY", "PREMIUM_ECONOMY", "BUSINESS", "FIRST"]).nullable().optional(), marketing_flight: z.object({airline_code: z.string(), number: z.string(), airline_name: z.string().nullable().optional()}).nullable().optional(), operating_flight: z.object({airline_code: z.string(), number: z.string(), airline_name: z.string().nullable().optional()}).nullable().optional(), seat: z.object({number: z.string(), status: z.enum(["PENDING", "CONFIRMED", "CANCELED"]).nullable().optional()}).nullable().optional()}); export const airBookingDataJourney = z.object({flights: z.array(airBookingDataFlight), status: z.enum(["HOLD", "PENDING", "CONFIRMED", "COMPLETED", "CANCELED", "IN_PROGRESS", "REFUNDED", "VOIDED", "PROCESSING", "UNCONFIRMED", "AIRLINE_CONTROL", "PAYMENT_DECLINED", "SCHEDULE_CHANGE", "APPROVAL_REQUESTED", "APPROVAL_DENIED", "CANCELLATION_IN_PROGRESS"]), cabin_display_name: z.string().nullable().optional()}); export const airBookingDataFlightTicket = z.object({number: z.string(), issue_date: z.string().nullable().optional()}); export const carRentalBookingDataCarDetails = z.object({display_name: z.string(), car_class: z.enum(["ECONOMY", "COMPACT", "INTERMEDIATE", "PREMIUM", "LUXURY", "CONVERTIBLE", "COMPACT_SUV", "INTERMEDIATE_SUV", "PREMIUM_SUV", "LUXURY_SUV", "MINI_VAN", "PASSENGER_VAN", "PICKUP_TRUCK", "HYBRID", "ELECTRIC", "MINI", "STANDARD", "FULL_SIZE", "SUV", "SPORTS", "SPECIAL", "RECREATIONAL_VEHICLE", "OTHER"]).nullable().optional()}); export const carRentalBookingDataReservationDetails = z.object({confirmation_code: z.string().nullable().optional(), pickup: z.object({location: z.object({country: z.string().nullable().optional(), administrative_area: z.string().nullable().optional(), city: z.string().nullable().optional(), postal_code: z.string().nullable().optional(), address_line_1: z.string().nullable().optional(), address_line_2: z.string().nullable().optional(), coordinates: z.object({latitude: z.number(), longitude: z.number()}).nullable().optional(), timezone: z.string().nullable().optional()}), time: z.object({local_time: z.string(), timestamp: z.string().nullable().optional()})}), drop_off: z.object({location: z.object({country: z.string().nullable().optional(), administrative_area: z.string().nullable().optional(), city: z.string().nullable().optional(), postal_code: z.string().nullable().optional(), address_line_1: z.string().nullable().optional(), address_line_2: z.string().nullable().optional(), coordinates: z.object({latitude: z.number(), longitude: z.number()}).nullable().optional(), timezone: z.string().nullable().optional()}), time: z.object({local_time: z.string(), timestamp: z.string().nullable().optional()})}), rental_company: z.string().nullable().optional()}); export const lodgingBookingDataLodgingDetails = z.object({display_name: z.string(), contact_information: z.object({phone: z.string().nullable().optional(), fax: z.string().nullable().optional(), email: z.string().nullable().optional()}).nullable().optional(), star_rating: z.number().nullable().optional(), brand_name: z.string().nullable().optional(), chain_name: z.string().nullable().optional(), location: z.object({country: z.string().nullable().optional(), administrative_area: z.string().nullable().optional(), city: z.string().nullable().optional(), postal_code: z.string().nullable().optional(), address_line_1: z.string().nullable().optional(), address_line_2: z.string().nullable().optional(), coordinates: z.object({latitude: z.number(), longitude: z.number()}).nullable().optional(), timezone: z.string().nullable().optional()}).nullable().optional()}); export const lodgingBookingDataReservationDetails = z.object({confirmation_code: z.string().nullable().optional(), check_in_time: z.object({local_time: z.string(), timestamp: z.string().nullable().optional()}), checkout_time: z.object({local_time: z.string(), timestamp: z.string().nullable().optional()}), room: z.object({display_name: z.string().nullable().optional(), description: z.string().nullable().optional(), bed_type: z.string().nullable().optional(), bed_count: z.number().int().nullable().optional()}).nullable().optional()}); export const railBookingDataRailStation = z.object({name: z.string().nullable().optional(), location: z.object({country: z.string().nullable().optional(), administrative_area: z.string().nullable().optional(), city: z.string().nullable().optional(), postal_code: z.string().nullable().optional(), address_line_1: z.string().nullable().optional(), address_line_2: z.string().nullable().optional(), coordinates: z.object({latitude: z.number(), longitude: z.number()}).nullable().optional(), timezone: z.string().nullable().optional()}).nullable().optional(), type: z.enum(["INDIVIDUAL", "GROUP", "METRO", "BUS_STOP", "FERRY_TERMINAL"]).nullable().optional()}); export const railBookingDataRailLeg = z.object({origin: railBookingDataRailStation, destination: railBookingDataRailStation, departure_time: z.object({local_time: z.string(), timestamp: z.string().nullable().optional()}), arrival_time: z.object({local_time: z.string(), timestamp: z.string().nullable().optional()}), duration: z.string().nullable().optional(), vehicle: z.object({carrier: z.string().nullable().optional(), timetable_id: z.string().nullable().optional(), type: z.enum(["TRAIN", "BUS", "FERRY", "WALK", "TAXI", "TRAM", "METRO", "TUBE"]).nullable().optional()}).nullable().optional(), seat: z.object({coach_number: z.string().nullable().optional(), seat_number: z.string().nullable().optional()}).nullable().optional(), rail_class: z.enum(["FIRST", "STANDARD", "BUSINESS", "SLEEPER", "STANDARD_PREMIUM", "BUSINESS_PREMIUM", "COACH", "ROOM", "EXECUTIVE"]).nullable().optional()}); export const railBookingDataRailJourney = z.object({legs: z.array(railBookingDataRailLeg)}); export const bookingData = z.discriminatedUnion("type", [z.object({journeys: z.array(airBookingDataJourney), tickets: z.array(airBookingDataFlightTicket), redress_number: z.object({issuing_country: z.string(), document_number: z.string()}).nullable().optional(), known_traveler_number: z.object({issuing_country: z.string(), document_number: z.string()}).nullable().optional(), type: z.string().optional()}), z.object({car_details: carRentalBookingDataCarDetails, reservation_details: carRentalBookingDataReservationDetails, type: z.string().optional()}), z.object({lodging_details: lodgingBookingDataLodgingDetails, reservation_details: lodgingBookingDataReservationDetails, type: z.string().optional()}), z.object({journeys: z.array(railBookingDataRailJourney), type: z.string().optional()})]); export const bookingPolicyViolationCode = z.enum(["MIN_DAYS_IN_ADVANCE", "MAX_FARE_PER_TRAVELER", "TICKET_REFUNDABILITY", "TICKET_CHANGEABILITY", "AMOUNT_LIMIT_BY_FLIGHT_DURATION", "ALLOWED_CABIN_CLASSES_BY_DURATION", "ALLOWED_CABIN_CLASSES_BY_DURATION_DOMESTIC", "ALLOWED_CABIN_CLASSES_BY_DURATION_INTERNATIONAL", "MEDIAN_PRICE", "LOWEST_LOGICAL_FARE", "MAX_STARS", "DEFAULT_NIGHTLY_RATE", "NIGHTLY_RATE_FOR_LOCATION", "MAX_HOTEL_BOOKING_PRICE", "ALLOWED_CAR_CLASSES", "MAX_DAILY_RATE", "OTHER"]); export const bookingPolicyViolation = z.object({code: bookingPolicyViolationCode, description: z.string()}); export const bookingPolicy = z.object({out_of_policy: z.boolean(), violations: z.array(bookingPolicyViolation).optional()}); export const money = z.object({amount: z.number().int(), currency: z.string().nullable().optional()}); export const optionString = z.object({option_id: z.string().nullable().optional(), option_label: z.string().nullable().optional()}); export const customField = z.object({key: z.string(), value: z.union([z.object({value_type: z.enum(["SINGLE_VALUE", "LIST"]), data_type: z.enum(["STRING", "DECIMAL", "BOOLEAN", "ENUM", "TIMESTAMP", "DATE", "MONEY", "OPTION_STRING"]), data: z.string().nullable().optional()}), z.object({value_type: z.enum(["SINGLE_VALUE", "LIST"]), data_type: z.enum(["STRING", "DECIMAL", "BOOLEAN", "ENUM", "TIMESTAMP", "DATE", "MONEY", "OPTION_STRING"]), data: z.number().nullable().optional()}), z.object({value_type: z.enum(["SINGLE_VALUE", "LIST"]), data_type: z.enum(["STRING", "DECIMAL", "BOOLEAN", "ENUM", "TIMESTAMP", "DATE", "MONEY", "OPTION_STRING"]), data: z.boolean().nullable().optional()}), z.object({value_type: z.enum(["SINGLE_VALUE", "LIST"]), data_type: z.enum(["STRING", "DECIMAL", "BOOLEAN", "ENUM", "TIMESTAMP", "DATE", "MONEY", "OPTION_STRING"]), data: z.string().nullable().optional()}), z.object({value_type: z.enum(["SINGLE_VALUE", "LIST"]), data_type: z.enum(["STRING", "DECIMAL", "BOOLEAN", "ENUM", "TIMESTAMP", "DATE", "MONEY", "OPTION_STRING"]), data: z.string().nullable().optional()}), z.object({value_type: z.enum(["SINGLE_VALUE", "LIST"]), data_type: z.enum(["STRING", "DECIMAL", "BOOLEAN", "ENUM", "TIMESTAMP", "DATE", "MONEY", "OPTION_STRING"]), data: z.string().nullable().optional()}), z.object({value_type: z.enum(["SINGLE_VALUE", "LIST"]), data_type: z.enum(["STRING", "DECIMAL", "BOOLEAN", "ENUM", "TIMESTAMP", "DATE", "MONEY", "OPTION_STRING"]), data: z.object({amount: z.number().int(), currency: z.string().nullable().optional()}).nullable().optional()}), z.object({value_type: z.enum(["SINGLE_VALUE", "LIST"]), data_type: z.enum(["STRING", "DECIMAL", "BOOLEAN", "ENUM", "TIMESTAMP", "DATE", "MONEY", "OPTION_STRING"]), data: z.object({option_id: z.string().nullable().optional(), option_label: z.string().nullable().optional()}).nullable().optional()}), z.object({value_type: z.enum(["SINGLE_VALUE", "LIST"]), data_type: z.enum(["STRING", "DECIMAL", "BOOLEAN", "ENUM", "TIMESTAMP", "DATE", "MONEY", "OPTION_STRING"]), data: z.array(z.string()).nullable().optional()}), z.object({value_type: z.enum(["SINGLE_VALUE", "LIST"]), data_type: z.enum(["STRING", "DECIMAL", "BOOLEAN", "ENUM", "TIMESTAMP", "DATE", "MONEY", "OPTION_STRING"]), data: z.array(z.number()).nullable().optional()}), z.object({value_type: z.enum(["SINGLE_VALUE", "LIST"]), data_type: z.enum(["STRING", "DECIMAL", "BOOLEAN", "ENUM", "TIMESTAMP", "DATE", "MONEY", "OPTION_STRING"]), data: z.array(z.boolean()).nullable().optional()}), z.object({value_type: z.enum(["SINGLE_VALUE", "LIST"]), data_type: z.enum(["STRING", "DECIMAL", "BOOLEAN", "ENUM", "TIMESTAMP", "DATE", "MONEY", "OPTION_STRING"]), data: z.array(z.string()).nullable().optional()}), z.object({value_type: z.enum(["SINGLE_VALUE", "LIST"]), data_type: z.enum(["STRING", "DECIMAL", "BOOLEAN", "ENUM", "TIMESTAMP", "DATE", "MONEY", "OPTION_STRING"]), data: z.array(z.string()).nullable().optional()}), z.object({value_type: z.enum(["SINGLE_VALUE", "LIST"]), data_type: z.enum(["STRING", "DECIMAL", "BOOLEAN", "ENUM", "TIMESTAMP", "DATE", "MONEY", "OPTION_STRING"]), data: z.array(z.string()).nullable().optional()}), z.object({value_type: z.enum(["SINGLE_VALUE", "LIST"]), data_type: z.enum(["STRING", "DECIMAL", "BOOLEAN", "ENUM", "TIMESTAMP", "DATE", "MONEY", "OPTION_STRING"]), data: z.array(money).nullable().optional()}), z.object({value_type: z.enum(["SINGLE_VALUE", "LIST"]), data_type: z.enum(["STRING", "DECIMAL", "BOOLEAN", "ENUM", "TIMESTAMP", "DATE", "MONEY", "OPTION_STRING"]), data: z.array(optionString).nullable().optional()})])}); export const booking = z.object({id: z.string(), created_at: z.string(), updated_at: z.string(), trip_id: z.string(), version: z.number().int().gte(1), type: bookingType, status: bookingStatus, source: bookingSource, booking_data: bookingData, booking_reference: z.string().nullable().optional(), trip_reference: z.string().nullable().optional(), policy: bookingPolicy.nullable().optional(), custom_fields: z.array(customField).nullable().optional()}); export const pageBooking = z.object({next_cursor: z.string().nullable().optional(), items: z.array(booking)}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * List trip bookings * * GET /v1/trips/{trip_id}/bookings */ export const getApiV1TripsTripIdBookings = async (args: GetApiV1TripsTripIdBookingsArgs, options?: GetApiV1TripsTripIdBookingsOptions) => { const {baseUrl = "https://api.brex.com", fetch: fetchFn = fetch, OAuth2} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.cursor != null) query.append("cursor", String(args.cursor)) if (args.limit != null) query.append("limit", String(args.limit)) if (args.load_custom_fields != null) query.append("load_custom_fields", String(args.load_custom_fields)) if (OAuth2 !== undefined) headers.set('authorization', `Bearer ${OAuth2}`) const url = `${baseUrl.replace(/\/+$/, '')}/v1/trips/${encodeURIComponent(String(args.trip_id))}/bookings${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(pageBooking, await res.json()) };