openapi: 3.0.0
info:
  title: OCTO API Specification
  version: 0.0.0
tags:
  - name: Supplier
  - name: Products
  - name: Availability
  - name: Bookings
  - name: Capabilities
paths:
  /availability/:
    post:
      operationId: Availabilities_AvailabilityCheck
      summary: Availability Check
      description: |-
        This endpoint is slightly slower as it will return an object for each individual departure time (or day). You have to perform this step to retrieve an `availabilityId` in order to confirm a sale, so if you just want to use this endpoint and skip the calendar endpoint then that's perfectly ok.

        You must pass in one of the following combinations of parameters for this endpoint:
        - `localDate`
        - `localeDateStart` and `localDateEnd`
        - `availabilityIds`
      parameters:
        - $ref: "#/components/parameters/RequestHeaders.octoCapabilities"
        - $ref: "#/components/parameters/RequestHeadersContent"
      responses:
        "200":
          description: The request has succeeded.
          headers:
            Octo-Capabilities:
              required: true
              description: A list of the Capabilities (their IDs) initialized with your request.
              schema:
                type: string
            Content-Language:
              required: false
              description: "This response header indicates the language of the content being returned in the response. The OCTO specification allows only one language to be returned per response. This code must conform to the BCP 47 standard, following RFC 5646 and RFC 4647 specifications for language tags. Examples include en-US for American English, fr-FR for French (France), and es-ES for Spanish (Spain).  To obtain content in multiple languages, separate requests must be made for each desired language. This header is defined in the HTTP/1.1 specification (RFC 7231). For more information, see MDN Web Docs: Content-Language - HTTP | MDN. This response header is required when using Content capability."
              schema:
                type: string
                x-capability-data:
                  capability: octo/content
                  required: true
              x-capability-data:
                capability: octo/content
                required: true
            Available-Languages:
              required: false
              description: This response header is used to inform of the languages in which content is available, helping understand the language options without needing additional requests. This code must conform to the BCP 47 standard, following RFC 5646 and RFC 4647 specifications for language tags. Examples include en-US for American English, fr-FR for French (France), and es-ES for Spanish (Spain).  Although not a standard HTTP header, it is commonly used in APIs to list available languages, such as en-US, fr-CA, es-ES, indicating that content can be requested in U.S. English, Canadian French, or Spanish. This response header is required when using Content capability.
              schema:
                type: string
                x-capability-data:
                  capability: octo/content
                  required: true
              x-capability-data:
                capability: octo/content
                required: true
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Availability"
              examples:
                Opening Hours Example:
                  summary: Opening Hours Example
                  description: Opening Hours Example
                  value:
                    - id: "2022-06-30T00:00:00+01:00"
                      localDateTimeStart: "2022-06-30T00:00:00+01:00"
                      localDateTimeEnd: "2022-07-01T00:00:00+01:00"
                      allDay: true
                      available: true
                      status: FREESALE
                      vacancies: null
                      capacity: null
                      maxUnits: null
                      utcCutoffAt: "2022-06-29T22:00:00Z"
                      openingHours:
                        - from: "08:00"
                          to: "16:00"
                Start Times Example:
                  summary: Start Times Example
                  description: Start Times Example
                  value:
                    - id: "2022-06-30T12:00:00+01:00"
                      localDateTimeStart: "2022-06-30T12:00:00+01:00"
                      localDateTimeEnd: "2022-06-30T14:00:00+01:00"
                      allDay: false
                      available: true
                      status: AVAILABLE
                      vacancies: 10
                      capacity: 10
                      maxUnits: null
                      utcCutoffAt: "2022-06-29T22:00:00Z"
                      openingHours: []
                    - id: "2022-06-30T14:00:00+01:00"
                      localDateTimeStart: "2022-06-30T14:00:00+01:00"
                      localDateTimeEnd: "2022-06-30T16:00:00+01:00"
                      allDay: false
                      available: true
                      status: AVAILABLE
                      vacancies: 10
                      capacity: 10
                      maxUnits: null
                      utcCutoffAt: "2022-06-29T22:00:00Z"
                      openingHours: []
                Availability Check with octo/content:
                  summary: Availability Check with octo/content
                  description: Availability Check with octo/content
                  value:
                    - id: "2022-06-30T00:00:00+01:00"
                      localDateTimeStart: "2022-06-30T00:00:00+01:00"
                      localDateTimeEnd: "2022-07-01T00:00:00+01:00"
                      allDay: true
                      available: true
                      status: FREESALE
                      vacancies: null
                      capacity: null
                      maxUnits: null
                      utcCutoffAt: "2022-06-29T22:00:00Z"
                      openingHours:
                        - from: "08:00"
                          to: "16:00"
                      title: ""
                      shortDescription: ""
        "400":
          description: The server could not understand the request due to invalid syntax.
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: "#/components/schemas/ErrorInvalidProductID"
                  - $ref: "#/components/schemas/ErrorInvalidOptionID"
                  - $ref: "#/components/schemas/ErrorBadRequest"
                  - $ref: "#/components/schemas/ErrorUnauthorized"
                  - $ref: "#/components/schemas/ErrorInternalServerError"
                  - $ref: "#/components/schemas/ErrorForbidden"
              examples:
                Forbidden Response:
                  summary: Forbidden Response
                  description: Forbidden Response
                  value:
                    error: FORBIDDEN
                    errorMessage: You sent an API Key that was invalid or has been revoked by the backend system. Or you're trying to access an endpoint/resource that you do not have access to
                Internal Server Error Response:
                  summary: Internal Server Error Response
                  description: Internal Server Error Response
                  value:
                    error: INTERNAL_SERVER_ERROR
                    errorMessage: There was an un-recoverable error, please try again
                Unauthorized Response:
                  summary: Unauthorized Response
                  description: Unauthorized Response
                  value:
                    error: UNAUTHORIZED
                    errorMessage: You didn't send the API Key in the Authorization header to an endpoint that requires authentication
                Bad request response:
                  summary: Bad request response
                  description: Bad request response
                  value:
                    error: BAD_REQUEST
                    errorMessage: either localDate, localDateStart/localDateEnd or availabilityIds is required
                Invalid Option Id Response:
                  summary: Invalid Option Id Response
                  description: Invalid Option Id Response
                  value:
                    error: INVALID_OPTION_ID
                    errorMessage: The optionId was missing or invalid
                    optionId: 681fea0f-196e-45da-bec7-467bfacb1d87
                Invalid Product Id Response:
                  summary: Invalid Product Id Response
                  description: Invalid Product Id Response
                  value:
                    error: INVALID_PRODUCT_ID
                    errorMessage: The productId was missing or invalid
                    productId: cc2a6d56-6efe-426f-99c9-6eb10e341565
      tags:
        - Availability
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/AvailabilityCheckBody"
  /availability/calendar:
    post:
      operationId: Availabilities_AvailabilityCalendar
      summary: Availability Calendar
      description: |-
        This endpoint is highly optimised and will return a single object per day. It's designed to be queried for large date ranges and the result is used to populate an availability calendar.

        When the end user selects an open date you can call on `/availability` endpoint to get the `availabilityId` to create the booking
      parameters:
        - $ref: "#/components/parameters/RequestHeaders.octoCapabilities"
        - $ref: "#/components/parameters/RequestHeadersContent"
      responses:
        "200":
          description: The request has succeeded.
          headers:
            Octo-Capabilities:
              required: true
              description: A list of the Capabilities (their IDs) initialized with your request.
              schema:
                type: string
            Content-Language:
              required: false
              description: "This response header indicates the language of the content being returned in the response. The OCTO specification allows only one language to be returned per response. This code must conform to the BCP 47 standard, following RFC 5646 and RFC 4647 specifications for language tags. Examples include en-US for American English, fr-FR for French (France), and es-ES for Spanish (Spain).  To obtain content in multiple languages, separate requests must be made for each desired language. This header is defined in the HTTP/1.1 specification (RFC 7231). For more information, see MDN Web Docs: Content-Language - HTTP | MDN. This response header is required when using Content capability."
              schema:
                type: string
                x-capability-data:
                  capability: octo/content
                  required: true
              x-capability-data:
                capability: octo/content
                required: true
            Available-Languages:
              required: false
              description: This response header is used to inform of the languages in which content is available, helping understand the language options without needing additional requests. This code must conform to the BCP 47 standard, following RFC 5646 and RFC 4647 specifications for language tags. Examples include en-US for American English, fr-FR for French (France), and es-ES for Spanish (Spain).  Although not a standard HTTP header, it is commonly used in APIs to list available languages, such as en-US, fr-CA, es-ES, indicating that content can be requested in U.S. English, Canadian French, or Spanish. This response header is required when using Content capability.
              schema:
                type: string
                x-capability-data:
                  capability: octo/content
                  required: true
              x-capability-data:
                capability: octo/content
                required: true
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/AvailabilityCalendar"
              examples:
                Opening Hours Example:
                  summary: Opening Hours Example
                  description: Opening Hours Example
                  value:
                    - localDate: "2022-06-14"
                      available: true
                      status: FREESALE
                      vacancies: null
                      capacity: null
                      openingHours:
                        - from: "08:00"
                          to: "16:00"
                    - localDate: "2022-06-15"
                      available: true
                      status: FREESALE
                      vacancies: null
                      capacity: null
                      openingHours:
                        - from: "08:00"
                          to: "16:00"
                    - localDate: "2022-06-16"
                      available: true
                      status: FREESALE
                      vacancies: null
                      capacity: null
                      openingHours:
                        - from: "08:00"
                          to: "16:00"
                Start Times Example:
                  summary: Start Times Example
                  description: Start Times Example
                  value:
                    - localDate: "2022-06-14"
                      available: true
                      status: AVAILABLE
                      vacancies: 10
                      capacity: 10
                      openingHours: []
                    - localDate: "2022-06-15"
                      available: true
                      status: AVAILABLE
                      vacancies: 10
                      capacity: 10
                      openingHours: []
                    - localDate: "2022-06-16"
                      available: true
                      status: AVAILABLE
                      vacancies: 10
                      capacity: 10
                      openingHours: []
        "400":
          description: The server could not understand the request due to invalid syntax.
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: "#/components/schemas/ErrorInvalidProductID"
                  - $ref: "#/components/schemas/ErrorInvalidOptionID"
                  - $ref: "#/components/schemas/ErrorBadRequest"
                  - $ref: "#/components/schemas/ErrorUnauthorized"
                  - $ref: "#/components/schemas/ErrorInternalServerError"
                  - $ref: "#/components/schemas/ErrorForbidden"
              examples:
                Forbidden Response:
                  summary: Forbidden Response
                  description: Forbidden Response
                  value:
                    error: FORBIDDEN
                    errorMessage: You sent an API Key that was invalid or has been revoked by the backend system. Or you're trying to access an endpoint/resource that you do not have access to
                Internal Server Error Response:
                  summary: Internal Server Error Response
                  description: Internal Server Error Response
                  value:
                    error: INTERNAL_SERVER_ERROR
                    errorMessage: There was an un-recoverable error, please try again
                Unauthorized Response:
                  summary: Unauthorized Response
                  description: Unauthorized Response
                  value:
                    error: UNAUTHORIZED
                    errorMessage: You didn't send the API Key in the Authorization header to an endpoint that requires authentication
                Bad request response:
                  summary: Bad request response
                  description: Bad request response
                  value:
                    error: BAD_REQUEST
                    errorMessage: cannot request more than 1 year of availability
                Invalid Option Id Response:
                  summary: Invalid Option Id Response
                  description: Invalid Option Id Response
                  value:
                    error: INVALID_OPTION_ID
                    errorMessage: The optionId was missing or invalid
                    optionId: 681fea0f-196e-45da-bec7-467bfacb1d87
                Invalid Product Id Response:
                  summary: Invalid Product Id Response
                  description: Invalid Product Id Response
                  value:
                    error: INVALID_PRODUCT_ID
                    errorMessage: The productId was missing or invalid
                    productId: cc2a6d56-6efe-426f-99c9-6eb10e341565
      tags:
        - Availability
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/AvailabilityCalendarBody"
  /bookings/:
    post:
      operationId: Bookings_BookingReservation
      summary: Booking Reservation
      description: |
        Reserving availability when making a booking. The steps to make a reservation are:

        1. **Check Availability**: Check the availability on the [/availability](docs/octo/branches/main/5b08f5f75e75d-availability-check) endpoint to retrieve an `availabilityId`
        2. **Booking Reservation** (this step): Create a booking that reserves the availability while you collect payment and contact information from the customer. The booking will remain with status `ON_HOLD` until the booking is confirmed or the reservation hold expires.

        The availability for the booking is held for the amount of time equal to the`expirationMinutes` parameter (if provided), up to an internal limit set by either the supplier or the OCTo provider. The `utc_expires_at` parameter in the response object will indicate when a reservtion will expire. A reservation can be extended by calling the [/bookings/{uuid}/extend](docs/octo/branches/main/2c7924ab9128f-extend-reservation) endpoint.

        A reserved booking can be confirmed after the customer finalizes their choice on the [/bookings/{uuid}/confirm](docs/octo/branches/main/614d1613b2d70-booking-confirmation) endpoint provided the reservation had not expired.
      parameters:
        - $ref: "#/components/parameters/RequestHeaders.octoCapabilities"
        - $ref: "#/components/parameters/RequestHeadersContent"
      responses:
        "200":
          description: The request has succeeded.
          headers:
            Octo-Capabilities:
              required: true
              description: A list of the Capabilities (their IDs) initialized with your request.
              schema:
                type: string
            Content-Language:
              required: false
              description: "This response header indicates the language of the content being returned in the response. The OCTO specification allows only one language to be returned per response. This code must conform to the BCP 47 standard, following RFC 5646 and RFC 4647 specifications for language tags. Examples include en-US for American English, fr-FR for French (France), and es-ES for Spanish (Spain).  To obtain content in multiple languages, separate requests must be made for each desired language. This header is defined in the HTTP/1.1 specification (RFC 7231). For more information, see MDN Web Docs: Content-Language - HTTP | MDN. This response header is required when using Content capability."
              schema:
                type: string
                x-capability-data:
                  capability: octo/content
                  required: true
              x-capability-data:
                capability: octo/content
                required: true
            Available-Languages:
              required: false
              description: This response header is used to inform of the languages in which content is available, helping understand the language options without needing additional requests. This code must conform to the BCP 47 standard, following RFC 5646 and RFC 4647 specifications for language tags. Examples include en-US for American English, fr-FR for French (France), and es-ES for Spanish (Spain).  Although not a standard HTTP header, it is commonly used in APIs to list available languages, such as en-US, fr-CA, es-ES, indicating that content can be requested in U.S. English, Canadian French, or Spanish. This response header is required when using Content capability.
              schema:
                type: string
                x-capability-data:
                  capability: octo/content
                  required: true
              x-capability-data:
                capability: octo/content
                required: true
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Booking"
              examples:
                ON_HOLD Booking example:
                  summary: ON_HOLD Booking example
                  description: ON_HOLD Booking example
                  value:
                    id: bbbb6227-54fc-4c32-9ed7-dc3eb99966ea
                    uuid: 559aed3d-6d5b-4fe0-bfca-99f5e7218a56
                    testMode: false
                    resellerReference: null
                    supplierReference: XOPSUT
                    status: ON_HOLD
                    utcCreatedAt: "2022-05-25T10:34:22Z"
                    utcUpdatedAt: "2022-05-25T10:34:22Z"
                    utcExpiresAt: "2022-05-25T11:04:22Z"
                    utcRedeemedAt: null
                    utcConfirmedAt: null
                    productId: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
                    product:
                      id: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
                      internalName: London Eye General Admission
                      reference: LEYE-GA
                      locale: en-GB
                      timeZone: Europe/London
                      allowFreesale: true
                      instantConfirmation: true
                      instantDelivery: true
                      availabilityRequired: true
                      availabilityType: START_TIME
                      deliveryFormats:
                        - QRCODE
                      deliveryMethods:
                        - TICKET
                      redemptionMethod: DIGITAL
                      options:
                        - id: DEFAULT
                          default: true
                          internalName: DEFAULT
                          reference: null
                          availabilityLocalStartTimes:
                            - "00:00"
                          cancellationCutoff: 1 hour
                          cancellationCutoffAmount: 1
                          cancellationCutoffUnit: hour
                          requiredContactFields:
                            - firstName
                          restrictions:
                            minUnits: 0
                            maxUnits: 9
                          units:
                            - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                              internalName: Adult
                              reference: null
                              type: ADULT
                              restrictions:
                                minAge: 18
                                maxAge: 99
                                idRequired: false
                                minQuantity: 1
                                maxQuantity: 10
                                paxCount: 1
                                accompaniedBy: []
                              requiredContactFields:
                                - firstName
                            - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                              internalName: Child
                              reference: null
                              type: CHILD
                              restrictions:
                                minAge: 3
                                maxAge: 12
                                idRequired: false
                                minQuantity: 1
                                maxQuantity: 10
                                paxCount: 1
                                accompaniedBy: []
                              requiredContactFields:
                                - firstName
                            - id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                              internalName: Infant
                              reference: null
                              type: INFANT
                              restrictions:
                                minAge: 0
                                maxAge: 3
                                idRequired: false
                                minQuantity: 1
                                maxQuantity: 10
                                paxCount: 1
                                accompaniedBy:
                                  - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                              requiredContactFields:
                                - firstName
                    optionId: DEFAULT
                    option:
                      id: DEFAULT
                      default: true
                      internalName: DEFAULT
                      reference: null
                      availabilityLocalStartTimes:
                        - "00:00"
                      cancellationCutoff: 1 hour
                      cancellationCutoffAmount: 1
                      cancellationCutoffUnit: hour
                      requiredContactFields:
                        - firstName
                      restrictions:
                        minUnits: 0
                        maxUnits: 9
                      units:
                        - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                          internalName: Adult
                          reference: null
                          type: ADULT
                          restrictions:
                            minAge: 18
                            maxAge: 99
                            idRequired: false
                            minQuantity: 1
                            maxQuantity: 10
                            paxCount: 1
                            accompaniedBy: []
                          requiredContactFields:
                            - firstName
                        - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                          internalName: Child
                          reference: null
                          type: CHILD
                          restrictions:
                            minAge: 3
                            maxAge: 12
                            idRequired: false
                            minQuantity: 1
                            maxQuantity: 10
                            paxCount: 1
                            accompaniedBy: []
                          requiredContactFields:
                            - firstName
                        - id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                          internalName: Infant
                          reference: null
                          type: INFANT
                          restrictions:
                            minAge: 0
                            maxAge: 3
                            idRequired: false
                            minQuantity: 1
                            maxQuantity: 10
                            paxCount: 1
                            accompaniedBy:
                              - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                          requiredContactFields:
                            - firstName
                    cancellable: true
                    cancellation: null
                    freesale: false
                    availabilityId: ""
                    availability:
                      id: "2022-05-23T00:00:00+01:00"
                      localDateTimeStart: "2022-05-23T00:00:00+01:00"
                      localDateTimeEnd: "2022-05-24T00:00:00+01:00"
                      utcCutoffAt: "2022-05-22T23:00:00Z"
                      allDay: false
                      available: true
                      status: AVAILABLE
                      vacancies: 10
                      capacity: 10
                      maxUnits: null
                      openingHours:
                        - from: "08:00"
                          to: "16:00"
                    contact:
                      fullName: John Doe
                      firstName: John
                      lastName: Doe
                      emailAddress: johndoe@email.com
                      phoneNumber: ""
                      locales:
                        - en
                      postalCode: ""
                      country: ""
                      notes: ""
                    notes: Optional notes for the booking
                    deliveryMethods:
                      - TICKET
                      - VOUCHER
                    voucher: null
                    unitItems:
                      - uuid: 3b1bc2ee-3155-4738-9471-f49842a07327
                        resellerReference: 4ec08a62-892c-48c1-a608-dc946531a33a
                        supplierReference: K9T7R4
                        unitId: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                        unit:
                          id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                          internalName: Adult
                          reference: null
                          type: ADULT
                          restrictions:
                            minAge: 18
                            maxAge: 99
                            idRequired: false
                            minQuantity: 1
                            maxQuantity: 10
                            paxCount: 1
                            accompaniedBy: []
                          requiredContactFields:
                            - firstName
                        status: ON_HOLD
                        utcRedeemedAt: null
                        contact:
                          fullName: John Doe
                          firstName: John
                          lastName: Doe
                          emailAddress: johndoe@email.com
                          phoneNumber: ""
                          locales:
                            - en
                          postalCode: ""
                          country: ""
                          notes: ""
                        ticket: null
                      - uuid: 3b1bc2ee-3155-4738-9471-f49842a07327
                        resellerReference: 4ec08a62-892c-48c1-a608-dc946531a33b
                        supplierReference: K9T7R5
                        unitId: child_797e3ce8-1860-4cbf-80ad-95857df1f640
                        unit:
                          id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                          internalName: Child
                          reference: null
                          type: CHILD
                          restrictions:
                            minAge: 3
                            maxAge: 12
                            idRequired: false
                            minQuantity: 1
                            maxQuantity: 10
                            paxCount: 1
                            accompaniedBy: []
                          requiredContactFields:
                            - firstName
                        status: ON_HOLD
                        utcRedeemedAt: null
                        contact:
                          fullName: John Doe
                          firstName: John
                          lastName: Doe
                          emailAddress: johndoe@email.com
                          phoneNumber: ""
                          locales:
                            - en
                          postalCode: ""
                          country: ""
                          notes: ""
                        ticket: null
                      - uuid: 3b1bc2ee-3155-4738-9471-f49842a07327
                        resellerReference: 4ec08a62-892c-48c1-a608-dc946531a33c
                        supplierReference: K9T7R6
                        unitId: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                        unit:
                          id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                          internalName: Infant
                          reference: null
                          type: INFANT
                          restrictions:
                            minAge: 0
                            maxAge: 3
                            idRequired: false
                            minQuantity: 1
                            maxQuantity: 10
                            paxCount: 1
                            accompaniedBy:
                              - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                          requiredContactFields:
                            - firstName
                        status: ON_HOLD
                        utcRedeemedAt: null
                        contact:
                          fullName: John Doe
                          firstName: John
                          lastName: Doe
                          emailAddress: johndoe@email.com
                          phoneNumber: ""
                          locales:
                            - en
                          postalCode: ""
                          country: ""
                          notes: ""
                        ticket: null
        "400":
          description: The server could not understand the request due to invalid syntax.
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: "#/components/schemas/ErrorInvalidProductID"
                  - $ref: "#/components/schemas/ErrorInvalidOptionID"
                  - $ref: "#/components/schemas/ErrorInvalidUnitID"
                  - $ref: "#/components/schemas/ErrorInvalidAvailabilityID"
                  - $ref: "#/components/schemas/ErrorUnprocessableEntity"
                  - $ref: "#/components/schemas/ErrorUnauthorized"
                  - $ref: "#/components/schemas/ErrorInternalServerError"
                  - $ref: "#/components/schemas/ErrorForbidden"
              examples:
                Forbidden Response:
                  summary: Forbidden Response
                  description: Forbidden Response
                  value:
                    error: FORBIDDEN
                    errorMessage: You sent an API Key that was invalid or has been revoked by the backend system. Or you're trying to access an endpoint/resource that you do not have access to
                Internal Server Error Response:
                  summary: Internal Server Error Response
                  description: Internal Server Error Response
                  value:
                    error: INTERNAL_SERVER_ERROR
                    errorMessage: There was an un-recoverable error, please try again
                Unauthorized Response:
                  summary: Unauthorized Response
                  description: Unauthorized Response
                  value:
                    error: UNAUTHORIZED
                    errorMessage: You didn't send the API Key in the Authorization header to an endpoint that requires authentication
                Unprocessable Entity Response:
                  summary: Unprocessable Entity Response
                  description: Unprocessable Entity Response
                  value:
                    error: UNPROCESSABLE_ENTITY
                    errorMessage: "Validation failed: Minimum tickets is 2"
                Invalid Availability Id Response:
                  summary: Invalid Availability Id Response
                  description: Invalid Availability Id Response
                  value:
                    error: INVALID_AVAILABILITY_ID
                    errorMessage: The availabilityId was missing or invalid
                    availabilityId: "2022-03-12T00:00:00+00:00"
                Invalid Unit Id Response:
                  summary: Invalid Unit Id Response
                  description: Invalid Unit Id Response
                  value:
                    error: INVALID_UNIT_ID
                    errorMessage: The unitId was missing or invalid
                    unitId: senior
                Invalid Option Id Response:
                  summary: Invalid Option Id Response
                  description: Invalid Option Id Response
                  value:
                    error: INVALID_OPTION_ID
                    errorMessage: The optionId was missing or invalid
                    optionId: 681fea0f-196e-45da-bec7-467bfacb1d87
                Invalid Product Id Response:
                  summary: Invalid Product Id Response
                  description: Invalid Product Id Response
                  value:
                    error: INVALID_PRODUCT_ID
                    errorMessage: The productId was missing or invalid
                    productId: cc2a6d56-6efe-426f-99c9-6eb10e341565
      tags:
        - Bookings
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/BookingReservationBody"
    get:
      operationId: Bookings_GetBookings
      summary: Get Bookings
      description: |-
        This endpoint will fetch the bookings you have made for the given filters.

        When using this endpoint you must include one of the following query parameters:

        - `resellerReference`
        - `supplierReference`
        - `localDate`
        - `localDateStart` and `localDateEnd`
      parameters:
        - $ref: "#/components/parameters/GetBookingsQuery.resellerReference"
        - $ref: "#/components/parameters/GetBookingsQuery.supplierReference"
        - $ref: "#/components/parameters/RequestHeaders.octoCapabilities"
        - $ref: "#/components/parameters/RequestHeadersContent"
      responses:
        "200":
          description: The request has succeeded.
          headers:
            Octo-Capabilities:
              required: true
              description: A list of the Capabilities (their IDs) initialized with your request.
              schema:
                type: string
            Content-Language:
              required: false
              description: "This response header indicates the language of the content being returned in the response. The OCTO specification allows only one language to be returned per response. This code must conform to the BCP 47 standard, following RFC 5646 and RFC 4647 specifications for language tags. Examples include en-US for American English, fr-FR for French (France), and es-ES for Spanish (Spain).  To obtain content in multiple languages, separate requests must be made for each desired language. This header is defined in the HTTP/1.1 specification (RFC 7231). For more information, see MDN Web Docs: Content-Language - HTTP | MDN. This response header is required when using Content capability."
              schema:
                type: string
                x-capability-data:
                  capability: octo/content
                  required: true
              x-capability-data:
                capability: octo/content
                required: true
            Available-Languages:
              required: false
              description: This response header is used to inform of the languages in which content is available, helping understand the language options without needing additional requests. This code must conform to the BCP 47 standard, following RFC 5646 and RFC 4647 specifications for language tags. Examples include en-US for American English, fr-FR for French (France), and es-ES for Spanish (Spain).  Although not a standard HTTP header, it is commonly used in APIs to list available languages, such as en-US, fr-CA, es-ES, indicating that content can be requested in U.S. English, Canadian French, or Spanish. This response header is required when using Content capability.
              schema:
                type: string
                x-capability-data:
                  capability: octo/content
                  required: true
              x-capability-data:
                capability: octo/content
                required: true
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Booking"
              examples:
                Bad Request Response:
                  summary: Bad Request Response
                  description: Bad Request Response
                  value:
                    - id: bbbb6227-54fc-4c32-9ed7-dc3eb99966ea
                      uuid: 559aed3d-6d5b-4fe0-bfca-99f5e7218a56
                      testMode: false
                      resellerReference: null
                      supplierReference: XOPSUT
                      status: CONFIRMED
                      utcCreatedAt: "2022-05-25T10:34:22Z"
                      utcUpdatedAt: "2022-05-25T10:34:22Z"
                      utcExpiresAt: null
                      utcRedeemedAt: null
                      utcConfirmedAt: "2022-05-25T11:00:22Z"
                      productId: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
                      product:
                        id: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
                        internalName: London Eye General Admission
                        reference: LEYE-GA
                        locale: en-GB
                        timeZone: Europe/London
                        allowFreesale: true
                        instantConfirmation: true
                        instantDelivery: true
                        availabilityRequired: true
                        availabilityType: START_TIME
                        deliveryFormats:
                          - QRCODE
                        deliveryMethods:
                          - TICKET
                        redemptionMethod: DIGITAL
                        options:
                          - id: DEFAULT
                            default: true
                            internalName: DEFAULT
                            reference: null
                            availabilityLocalStartTimes:
                              - "00:00"
                            cancellationCutoff: 1 hour
                            cancellationCutoffAmount: 1
                            cancellationCutoffUnit: hour
                            requiredContactFields:
                              - firstName
                            restrictions:
                              minUnits: 0
                              maxUnits: 9
                            units:
                              - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                                internalName: Adult
                                reference: null
                                type: ADULT
                                restrictions:
                                  minAge: 18
                                  maxAge: 99
                                  idRequired: false
                                  minQuantity: 1
                                  maxQuantity: 10
                                  paxCount: 1
                                  accompaniedBy: []
                                requiredContactFields:
                                  - firstName
                              - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                                internalName: Child
                                reference: null
                                type: CHILD
                                restrictions:
                                  minAge: 3
                                  maxAge: 12
                                  idRequired: false
                                  minQuantity: 1
                                  maxQuantity: 10
                                  paxCount: 1
                                  accompaniedBy: []
                                requiredContactFields:
                                  - firstName
                              - id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                                internalName: Infant
                                reference: null
                                type: INFANT
                                restrictions:
                                  minAge: 0
                                  maxAge: 3
                                  idRequired: false
                                  minQuantity: 1
                                  maxQuantity: 10
                                  paxCount: 1
                                  accompaniedBy:
                                    - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                                requiredContactFields:
                                  - firstName
                      optionId: DEFAULT
                      option:
                        id: DEFAULT
                        default: true
                        internalName: DEFAULT
                        reference: null
                        availabilityLocalStartTimes:
                          - "00:00"
                        cancellationCutoff: 1 hour
                        cancellationCutoffAmount: 1
                        cancellationCutoffUnit: hour
                        requiredContactFields:
                          - firstName
                        restrictions:
                          minUnits: 0
                          maxUnits: 9
                        units:
                          - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                            internalName: Adult
                            reference: null
                            type: ADULT
                            restrictions:
                              minAge: 18
                              maxAge: 99
                              idRequired: false
                              minQuantity: 1
                              maxQuantity: 10
                              paxCount: 1
                              accompaniedBy: []
                            requiredContactFields:
                              - firstName
                          - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                            internalName: Child
                            reference: null
                            type: CHILD
                            restrictions:
                              minAge: 3
                              maxAge: 12
                              idRequired: false
                              minQuantity: 1
                              maxQuantity: 10
                              paxCount: 1
                              accompaniedBy: []
                            requiredContactFields:
                              - firstName
                          - id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                            internalName: Infant
                            reference: null
                            type: INFANT
                            restrictions:
                              minAge: 0
                              maxAge: 3
                              idRequired: false
                              minQuantity: 1
                              maxQuantity: 10
                              paxCount: 1
                              accompaniedBy:
                                - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                            requiredContactFields:
                              - firstName
                      cancellable: true
                      cancellation: null
                      freesale: false
                      availabilityId: ""
                      availability:
                        id: "2022-05-23T00:00:00+01:00"
                        localDateTimeStart: "2022-05-23T00:00:00+01:00"
                        localDateTimeEnd: "2022-05-24T00:00:00+01:00"
                        utcCutoffAt: "2022-05-22T23:00:00Z"
                        allDay: false
                        available: true
                        status: AVAILABLE
                        vacancies: 10
                        capacity: 10
                        maxUnits: null
                        openingHours:
                          - from: "08:00"
                            to: "16:00"
                      contact:
                        fullName: John Doe
                        firstName: John
                        lastName: Doe
                        emailAddress: johndoe@email.com
                        phoneNumber: ""
                        locales:
                          - en
                        postalCode: ""
                        country: ""
                        notes: ""
                      notes: Optional notes for the booking
                      deliveryMethods:
                        - TICKET
                        - VOUCHER
                      voucher:
                        redemptionMethod: DIGITAL
                        utcRedeemedAt: "2021-10-27T23:28:43Z"
                        deliveryOptions:
                          - deliveryFormat: QRCODE
                            deliveryValue: ""
                      unitItems:
                        - uuid: 3b1bc2ee-3155-4738-9471-f49842a07327
                          resellerReference: 4ec08a62-892c-48c1-a608-dc946531a33a
                          supplierReference: K9T7R4
                          unitId: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                          unit:
                            id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                            internalName: Adult
                            reference: null
                            type: ADULT
                            restrictions:
                              minAge: 18
                              maxAge: 99
                              idRequired: false
                              minQuantity: 1
                              maxQuantity: 10
                              paxCount: 1
                              accompaniedBy: []
                            requiredContactFields:
                              - firstName
                          status: ON_HOLD
                          utcRedeemedAt: null
                          contact:
                            fullName: John Doe
                            firstName: John
                            lastName: Doe
                            emailAddress: johndoe@email.com
                            phoneNumber: ""
                            locales:
                              - en
                            postalCode: ""
                            country: ""
                            notes: ""
                          ticket:
                            redemptionMethod: DIGITAL
                            utcRedeemedAt: "2021-10-27T23:28:43Z"
                            deliveryOptions:
                              - deliveryFormat: QRCODE
                                deliveryValue: ""
                        - uuid: 3b1bc2ee-3155-4738-9471-f49842a07327
                          resellerReference: 4ec08a62-892c-48c1-a608-dc946531a33b
                          supplierReference: K9T7R5
                          unitId: child_797e3ce8-1860-4cbf-80ad-95857df1f640
                          unit:
                            id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                            internalName: Child
                            reference: null
                            type: CHILD
                            restrictions:
                              minAge: 3
                              maxAge: 12
                              idRequired: false
                              minQuantity: 1
                              maxQuantity: 10
                              paxCount: 1
                              accompaniedBy: []
                            requiredContactFields:
                              - firstName
                          status: CONFIRMED
                          utcRedeemedAt: null
                          contact:
                            fullName: John Doe
                            firstName: John
                            lastName: Doe
                            emailAddress: johndoe@email.com
                            phoneNumber: ""
                            locales:
                              - en
                            postalCode: ""
                            country: ""
                            notes: ""
                          ticket:
                            redemptionMethod: DIGITAL
                            utcRedeemedAt: "2021-10-27T23:28:43Z"
                            deliveryOptions:
                              - deliveryFormat: QRCODE
                                deliveryValue: ""
                        - uuid: 3b1bc2ee-3155-4738-9471-f49842a07327
                          resellerReference: 4ec08a62-892c-48c1-a608-dc946531a33c
                          supplierReference: K9T7R6
                          unitId: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                          unit:
                            id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                            internalName: Infant
                            reference: null
                            type: INFANT
                            restrictions:
                              minAge: 0
                              maxAge: 3
                              idRequired: false
                              minQuantity: 1
                              maxQuantity: 10
                              paxCount: 1
                              accompaniedBy:
                                - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                            requiredContactFields:
                              - firstName
                          status: CONFIRMED
                          utcRedeemedAt: null
                          contact:
                            fullName: John Doe
                            firstName: John
                            lastName: Doe
                            emailAddress: johndoe@email.com
                            phoneNumber: ""
                            locales:
                              - en
                            postalCode: ""
                            country: ""
                            notes: ""
                          ticket:
                            redemptionMethod: DIGITAL
                            utcRedeemedAt: "2021-10-27T23:28:43Z"
                            deliveryOptions:
                              - deliveryFormat: QRCODE
                                deliveryValue: ""
        "400":
          description: The server could not understand the request due to invalid syntax.
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: "#/components/schemas/ErrorUnauthorized"
                  - $ref: "#/components/schemas/ErrorInternalServerError"
                  - $ref: "#/components/schemas/ErrorForbidden"
              examples:
                Forbidden Response:
                  summary: Forbidden Response
                  description: Forbidden Response
                  value:
                    error: FORBIDDEN
                    errorMessage: You sent an API Key that was invalid or has been revoked by the backend system. Or you're trying to access an endpoint/resource that you do not have access to
                Internal Server Error Response:
                  summary: Internal Server Error Response
                  description: Internal Server Error Response
                  value:
                    error: INTERNAL_SERVER_ERROR
                    errorMessage: There was an un-recoverable error, please try again
                Unauthorized Response:
                  summary: Unauthorized Response
                  description: Unauthorized Response
                  value:
                    error: UNAUTHORIZED
                    errorMessage: You didn't send the API Key in the Authorization header to an endpoint that requires authentication
                Bad Request Response:
                  summary: Bad Request Response
                  description: Bad Request Response
                  value:
                    error: BAD_REQUEST
                    errorMessage: either resellerReference, supplierReference, localDate or localDateStart/localDateEnd is required
      tags:
        - Bookings
  /bookings/{uuid}:
    get:
      operationId: Bookings_GetBooking
      summary: Get Booking
      description: Fetch the status of an existing booking.
      parameters:
        - $ref: "#/components/parameters/GetBookingRequest.uuid"
        - $ref: "#/components/parameters/RequestHeaders.octoCapabilities"
        - $ref: "#/components/parameters/RequestHeadersContent"
      responses:
        "200":
          description: The request has succeeded.
          headers:
            Octo-Capabilities:
              required: true
              description: A list of the Capabilities (their IDs) initialized with your request.
              schema:
                type: string
            Content-Language:
              required: false
              description: "This response header indicates the language of the content being returned in the response. The OCTO specification allows only one language to be returned per response. This code must conform to the BCP 47 standard, following RFC 5646 and RFC 4647 specifications for language tags. Examples include en-US for American English, fr-FR for French (France), and es-ES for Spanish (Spain).  To obtain content in multiple languages, separate requests must be made for each desired language. This header is defined in the HTTP/1.1 specification (RFC 7231). For more information, see MDN Web Docs: Content-Language - HTTP | MDN. This response header is required when using Content capability."
              schema:
                type: string
                x-capability-data:
                  capability: octo/content
                  required: true
              x-capability-data:
                capability: octo/content
                required: true
            Available-Languages:
              required: false
              description: This response header is used to inform of the languages in which content is available, helping understand the language options without needing additional requests. This code must conform to the BCP 47 standard, following RFC 5646 and RFC 4647 specifications for language tags. Examples include en-US for American English, fr-FR for French (France), and es-ES for Spanish (Spain).  Although not a standard HTTP header, it is commonly used in APIs to list available languages, such as en-US, fr-CA, es-ES, indicating that content can be requested in U.S. English, Canadian French, or Spanish. This response header is required when using Content capability.
              schema:
                type: string
                x-capability-data:
                  capability: octo/content
                  required: true
              x-capability-data:
                capability: octo/content
                required: true
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Booking"
              examples:
                Booking example:
                  summary: Booking example
                  description: Booking example
                  value:
                    id: bbbb6227-54fc-4c32-9ed7-dc3eb99966ea
                    uuid: 559aed3d-6d5b-4fe0-bfca-99f5e7218a56
                    testMode: false
                    resellerReference: null
                    supplierReference: XOPSUT
                    status: CONFIRMED
                    utcCreatedAt: "2022-05-25T10:34:22Z"
                    utcUpdatedAt: "2022-05-25T10:34:22Z"
                    utcExpiresAt: null
                    utcRedeemedAt: null
                    utcConfirmedAt: "2022-05-25T11:00:22Z"
                    productId: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
                    product:
                      id: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
                      internalName: London Eye General Admission
                      reference: LEYE-GA
                      locale: en-GB
                      timeZone: Europe/London
                      allowFreesale: true
                      instantConfirmation: true
                      instantDelivery: true
                      availabilityRequired: true
                      availabilityType: START_TIME
                      deliveryFormats:
                        - QRCODE
                      deliveryMethods:
                        - TICKET
                      redemptionMethod: DIGITAL
                      options:
                        - id: DEFAULT
                          default: true
                          internalName: DEFAULT
                          reference: null
                          availabilityLocalStartTimes:
                            - "00:00"
                          cancellationCutoff: 1 hour
                          cancellationCutoffAmount: 1
                          cancellationCutoffUnit: hour
                          requiredContactFields:
                            - firstName
                          restrictions:
                            minUnits: 0
                            maxUnits: 9
                          units:
                            - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                              internalName: Adult
                              reference: null
                              type: ADULT
                              restrictions:
                                minAge: 18
                                maxAge: 99
                                idRequired: false
                                minQuantity: 1
                                maxQuantity: 10
                                paxCount: 1
                                accompaniedBy: []
                              requiredContactFields:
                                - firstName
                            - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                              internalName: Child
                              reference: null
                              type: CHILD
                              restrictions:
                                minAge: 3
                                maxAge: 12
                                idRequired: false
                                minQuantity: 1
                                maxQuantity: 10
                                paxCount: 1
                                accompaniedBy: []
                              requiredContactFields:
                                - firstName
                            - id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                              internalName: Infant
                              reference: null
                              type: INFANT
                              restrictions:
                                minAge: 0
                                maxAge: 3
                                idRequired: false
                                minQuantity: 1
                                maxQuantity: 10
                                paxCount: 1
                                accompaniedBy:
                                  - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                              requiredContactFields:
                                - firstName
                    optionId: DEFAULT
                    option:
                      id: DEFAULT
                      default: true
                      internalName: DEFAULT
                      reference: null
                      availabilityLocalStartTimes:
                        - "00:00"
                      cancellationCutoff: 1 hour
                      cancellationCutoffAmount: 1
                      cancellationCutoffUnit: hour
                      requiredContactFields:
                        - firstName
                      restrictions:
                        minUnits: 0
                        maxUnits: 9
                      units:
                        - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                          internalName: Adult
                          reference: null
                          type: ADULT
                          restrictions:
                            minAge: 18
                            maxAge: 99
                            idRequired: false
                            minQuantity: 1
                            maxQuantity: 10
                            paxCount: 1
                            accompaniedBy: []
                          requiredContactFields:
                            - firstName
                        - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                          internalName: Child
                          reference: null
                          type: CHILD
                          restrictions:
                            minAge: 3
                            maxAge: 12
                            idRequired: false
                            minQuantity: 1
                            maxQuantity: 10
                            paxCount: 1
                            accompaniedBy: []
                          requiredContactFields:
                            - firstName
                        - id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                          internalName: Infant
                          reference: null
                          type: INFANT
                          restrictions:
                            minAge: 0
                            maxAge: 3
                            idRequired: false
                            minQuantity: 1
                            maxQuantity: 10
                            paxCount: 1
                            accompaniedBy:
                              - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                          requiredContactFields:
                            - firstName
                    cancellable: true
                    cancellation: null
                    freesale: false
                    availabilityId: ""
                    availability:
                      id: "2022-05-23T00:00:00+01:00"
                      localDateTimeStart: "2022-05-23T00:00:00+01:00"
                      localDateTimeEnd: "2022-05-24T00:00:00+01:00"
                      utcCutoffAt: "2022-05-22T23:00:00Z"
                      allDay: false
                      available: true
                      status: AVAILABLE
                      vacancies: 10
                      capacity: 10
                      maxUnits: null
                      openingHours:
                        - from: "08:00"
                          to: "16:00"
                    contact:
                      fullName: John Doe
                      firstName: John
                      lastName: Doe
                      emailAddress: johndoe@email.com
                      phoneNumber: ""
                      locales:
                        - en
                      postalCode: ""
                      country: ""
                      notes: ""
                    notes: Optional notes for the booking
                    deliveryMethods:
                      - TICKET
                      - VOUCHER
                    voucher:
                      redemptionMethod: DIGITAL
                      utcRedeemedAt: "2021-10-27T23:28:43Z"
                      deliveryOptions:
                        - deliveryFormat: QRCODE
                          deliveryValue: ""
                    unitItems:
                      - uuid: 3b1bc2ee-3155-4738-9471-f49842a07327
                        resellerReference: 4ec08a62-892c-48c1-a608-dc946531a33a
                        supplierReference: K9T7R4
                        unitId: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                        unit:
                          id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                          internalName: Adult
                          reference: null
                          type: ADULT
                          restrictions:
                            minAge: 18
                            maxAge: 99
                            idRequired: false
                            minQuantity: 1
                            maxQuantity: 10
                            paxCount: 1
                            accompaniedBy: []
                          requiredContactFields:
                            - firstName
                        status: ON_HOLD
                        utcRedeemedAt: null
                        contact:
                          fullName: John Doe
                          firstName: John
                          lastName: Doe
                          emailAddress: johndoe@email.com
                          phoneNumber: ""
                          locales:
                            - en
                          postalCode: ""
                          country: ""
                          notes: ""
                        ticket:
                          redemptionMethod: DIGITAL
                          utcRedeemedAt: "2021-10-27T23:28:43Z"
                          deliveryOptions:
                            - deliveryFormat: QRCODE
                              deliveryValue: ""
                      - uuid: 3b1bc2ee-3155-4738-9471-f49842a07327
                        resellerReference: 4ec08a62-892c-48c1-a608-dc946531a33b
                        supplierReference: K9T7R5
                        unitId: child_797e3ce8-1860-4cbf-80ad-95857df1f640
                        unit:
                          id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                          internalName: Child
                          reference: null
                          type: CHILD
                          restrictions:
                            minAge: 3
                            maxAge: 12
                            idRequired: false
                            minQuantity: 1
                            maxQuantity: 10
                            paxCount: 1
                            accompaniedBy: []
                          requiredContactFields:
                            - firstName
                        status: CONFIRMED
                        utcRedeemedAt: null
                        contact:
                          fullName: John Doe
                          firstName: John
                          lastName: Doe
                          emailAddress: johndoe@email.com
                          phoneNumber: ""
                          locales:
                            - en
                          postalCode: ""
                          country: ""
                          notes: ""
                        ticket:
                          redemptionMethod: DIGITAL
                          utcRedeemedAt: "2021-10-27T23:28:43Z"
                          deliveryOptions:
                            - deliveryFormat: QRCODE
                              deliveryValue: ""
                      - uuid: 3b1bc2ee-3155-4738-9471-f49842a07327
                        resellerReference: 4ec08a62-892c-48c1-a608-dc946531a33c
                        supplierReference: K9T7R6
                        unitId: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                        unit:
                          id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                          internalName: Infant
                          reference: null
                          type: INFANT
                          restrictions:
                            minAge: 0
                            maxAge: 3
                            idRequired: false
                            minQuantity: 1
                            maxQuantity: 10
                            paxCount: 1
                            accompaniedBy:
                              - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                          requiredContactFields:
                            - firstName
                        status: CONFIRMED
                        utcRedeemedAt: null
                        contact:
                          fullName: John Doe
                          firstName: John
                          lastName: Doe
                          emailAddress: johndoe@email.com
                          phoneNumber: ""
                          locales:
                            - en
                          postalCode: ""
                          country: ""
                          notes: ""
                        ticket:
                          redemptionMethod: DIGITAL
                          utcRedeemedAt: "2021-10-27T23:28:43Z"
                          deliveryOptions:
                            - deliveryFormat: QRCODE
                              deliveryValue: ""
        "400":
          description: The server could not understand the request due to invalid syntax.
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: "#/components/schemas/ErrorInvalidBookingUUID"
                  - $ref: "#/components/schemas/ErrorUnauthorized"
                  - $ref: "#/components/schemas/ErrorInternalServerError"
                  - $ref: "#/components/schemas/ErrorForbidden"
              examples:
                Forbidden Response:
                  summary: Forbidden Response
                  description: Forbidden Response
                  value:
                    error: FORBIDDEN
                    errorMessage: You sent an API Key that was invalid or has been revoked by the backend system. Or you're trying to access an endpoint/resource that you do not have access to
                Internal Server Error Response:
                  summary: Internal Server Error Response
                  description: Internal Server Error Response
                  value:
                    error: INTERNAL_SERVER_ERROR
                    errorMessage: There was an un-recoverable error, please try again
                Unauthorized Response:
                  summary: Unauthorized Response
                  description: Unauthorized Response
                  value:
                    error: UNAUTHORIZED
                    errorMessage: You didn't send the API Key in the Authorization header to an endpoint that requires authentication
                Invalid Booking UUID Response:
                  summary: Invalid Booking UUID Response
                  description: Invalid Booking UUID Response
                  value:
                    error: INVALID_BOOKING_UUID
                    errorMessage: The uuid was already used, missing or invalid
                    uuid: bbbb6227-54fc-4c32-9ed7-dc3eb99966ea
      tags:
        - Bookings
    patch:
      operationId: Bookings_BookingUpdate
      summary: Booking Update
      description: Updates a booking before and after it has been confirmed as long as it hasn''t been redeemed or within the cancellation cutoff window. To know if the booking can be updated check the booking''s `cancellable` field. If the booking can be cancelled, it can also be updated. It''s generally preferred to update a booking rather than cancelling it and rebooking
      parameters:
        - $ref: "#/components/parameters/BookingUpdateRequest.uuid"
        - $ref: "#/components/parameters/RequestHeaders.octoCapabilities"
        - $ref: "#/components/parameters/RequestHeadersContent"
      responses:
        "200":
          description: The request has succeeded.
          headers:
            Octo-Capabilities:
              required: true
              description: A list of the Capabilities (their IDs) initialized with your request.
              schema:
                type: string
            Content-Language:
              required: false
              description: "This response header indicates the language of the content being returned in the response. The OCTO specification allows only one language to be returned per response. This code must conform to the BCP 47 standard, following RFC 5646 and RFC 4647 specifications for language tags. Examples include en-US for American English, fr-FR for French (France), and es-ES for Spanish (Spain).  To obtain content in multiple languages, separate requests must be made for each desired language. This header is defined in the HTTP/1.1 specification (RFC 7231). For more information, see MDN Web Docs: Content-Language - HTTP | MDN. This response header is required when using Content capability."
              schema:
                type: string
                x-capability-data:
                  capability: octo/content
                  required: true
              x-capability-data:
                capability: octo/content
                required: true
            Available-Languages:
              required: false
              description: This response header is used to inform of the languages in which content is available, helping understand the language options without needing additional requests. This code must conform to the BCP 47 standard, following RFC 5646 and RFC 4647 specifications for language tags. Examples include en-US for American English, fr-FR for French (France), and es-ES for Spanish (Spain).  Although not a standard HTTP header, it is commonly used in APIs to list available languages, such as en-US, fr-CA, es-ES, indicating that content can be requested in U.S. English, Canadian French, or Spanish. This response header is required when using Content capability.
              schema:
                type: string
                x-capability-data:
                  capability: octo/content
                  required: true
              x-capability-data:
                capability: octo/content
                required: true
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Booking"
        "400":
          description: The server could not understand the request due to invalid syntax.
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: "#/components/schemas/ErrorInvalidProductID"
                  - $ref: "#/components/schemas/ErrorInvalidOptionID"
                  - $ref: "#/components/schemas/ErrorInvalidUnitID"
                  - $ref: "#/components/schemas/ErrorInvalidAvailabilityID"
                  - $ref: "#/components/schemas/ErrorInvalidBookingUUID"
                  - $ref: "#/components/schemas/ErrorUnprocessableEntity"
                  - $ref: "#/components/schemas/ErrorUnauthorized"
                  - $ref: "#/components/schemas/ErrorInternalServerError"
                  - $ref: "#/components/schemas/ErrorForbidden"
      tags:
        - Bookings
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/BookingUpdateBody"
  /bookings/{uuid}/cancel:
    post:
      operationId: Bookings_BookingCancellation
      summary: Booking Cancellation
      description: For cancelling bookings. You can only cancel a booking if `booking.cancellable` is `TRUE`, and is within the booking cancellation cut-off window.
      parameters:
        - $ref: "#/components/parameters/BookingCancellationRequest.uuid"
        - $ref: "#/components/parameters/RequestHeaders.octoCapabilities"
        - $ref: "#/components/parameters/RequestHeadersContent"
      responses:
        "200":
          description: The request has succeeded.
          headers:
            Octo-Capabilities:
              required: true
              description: A list of the Capabilities (their IDs) initialized with your request.
              schema:
                type: string
            Content-Language:
              required: false
              description: "This response header indicates the language of the content being returned in the response. The OCTO specification allows only one language to be returned per response. This code must conform to the BCP 47 standard, following RFC 5646 and RFC 4647 specifications for language tags. Examples include en-US for American English, fr-FR for French (France), and es-ES for Spanish (Spain).  To obtain content in multiple languages, separate requests must be made for each desired language. This header is defined in the HTTP/1.1 specification (RFC 7231). For more information, see MDN Web Docs: Content-Language - HTTP | MDN. This response header is required when using Content capability."
              schema:
                type: string
                x-capability-data:
                  capability: octo/content
                  required: true
              x-capability-data:
                capability: octo/content
                required: true
            Available-Languages:
              required: false
              description: This response header is used to inform of the languages in which content is available, helping understand the language options without needing additional requests. This code must conform to the BCP 47 standard, following RFC 5646 and RFC 4647 specifications for language tags. Examples include en-US for American English, fr-FR for French (France), and es-ES for Spanish (Spain).  Although not a standard HTTP header, it is commonly used in APIs to list available languages, such as en-US, fr-CA, es-ES, indicating that content can be requested in U.S. English, Canadian French, or Spanish. This response header is required when using Content capability.
              schema:
                type: string
                x-capability-data:
                  capability: octo/content
                  required: true
              x-capability-data:
                capability: octo/content
                required: true
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Booking"
              examples:
                CANCELLED Booking example:
                  summary: CANCELLED Booking example
                  description: CANCELLED Booking example
                  value:
                    id: bbbb6227-54fc-4c32-9ed7-dc3eb99966ea
                    uuid: 559aed3d-6d5b-4fe0-bfca-99f5e7218a56
                    testMode: false
                    resellerReference: null
                    supplierReference: XOPSUT
                    status: CANCELLED
                    utcCreatedAt: "2022-05-25T10:34:22Z"
                    utcUpdatedAt: "2022-05-25T10:34:22Z"
                    utcExpiresAt: null
                    utcRedeemedAt: null
                    utcConfirmedAt: "2022-05-25T11:00:22Z"
                    productId: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
                    product:
                      id: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
                      internalName: London Eye General Admission
                      reference: LEYE-GA
                      locale: en-GB
                      timeZone: Europe/London
                      allowFreesale: true
                      instantConfirmation: true
                      instantDelivery: true
                      availabilityRequired: true
                      availabilityType: START_TIME
                      deliveryFormats:
                        - QRCODE
                      deliveryMethods:
                        - TICKET
                      redemptionMethod: DIGITAL
                      options:
                        - id: DEFAULT
                          default: true
                          internalName: DEFAULT
                          reference: null
                          availabilityLocalStartTimes:
                            - "00:00"
                          cancellationCutoff: 1 hour
                          cancellationCutoffAmount: 1
                          cancellationCutoffUnit: hour
                          requiredContactFields:
                            - firstName
                          restrictions:
                            minUnits: 0
                            maxUnits: 9
                          units:
                            - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                              internalName: Adult
                              reference: null
                              type: ADULT
                              restrictions:
                                minAge: 18
                                maxAge: 99
                                idRequired: false
                                minQuantity: 1
                                maxQuantity: 10
                                paxCount: 1
                                accompaniedBy: []
                              requiredContactFields:
                                - firstName
                            - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                              internalName: Child
                              reference: null
                              type: CHILD
                              restrictions:
                                minAge: 3
                                maxAge: 12
                                idRequired: false
                                minQuantity: 1
                                maxQuantity: 10
                                paxCount: 1
                                accompaniedBy: []
                              requiredContactFields:
                                - firstName
                            - id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                              internalName: Infant
                              reference: null
                              type: INFANT
                              restrictions:
                                minAge: 0
                                maxAge: 3
                                idRequired: false
                                minQuantity: 1
                                maxQuantity: 10
                                paxCount: 1
                                accompaniedBy:
                                  - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                              requiredContactFields:
                                - firstName
                    optionId: DEFAULT
                    option:
                      id: DEFAULT
                      default: true
                      internalName: DEFAULT
                      reference: null
                      availabilityLocalStartTimes:
                        - "00:00"
                      cancellationCutoff: 1 hour
                      cancellationCutoffAmount: 1
                      cancellationCutoffUnit: hour
                      requiredContactFields:
                        - firstName
                      restrictions:
                        minUnits: 0
                        maxUnits: 9
                      units:
                        - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                          internalName: Adult
                          reference: null
                          type: ADULT
                          restrictions:
                            minAge: 18
                            maxAge: 99
                            idRequired: false
                            minQuantity: 1
                            maxQuantity: 10
                            paxCount: 1
                            accompaniedBy: []
                          requiredContactFields:
                            - firstName
                        - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                          internalName: Child
                          reference: null
                          type: CHILD
                          restrictions:
                            minAge: 3
                            maxAge: 12
                            idRequired: false
                            minQuantity: 1
                            maxQuantity: 10
                            paxCount: 1
                            accompaniedBy: []
                          requiredContactFields:
                            - firstName
                        - id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                          internalName: Infant
                          reference: null
                          type: INFANT
                          restrictions:
                            minAge: 0
                            maxAge: 3
                            idRequired: false
                            minQuantity: 1
                            maxQuantity: 10
                            paxCount: 1
                            accompaniedBy:
                              - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                          requiredContactFields:
                            - firstName
                    cancellable: false
                    cancellation:
                      refund: FULL
                      reason: this product sucks
                      utcCancelledAt: "2022-05-25T11:00:22Z"
                    freesale: false
                    availabilityId: ""
                    availability:
                      id: "2022-05-23T00:00:00+01:00"
                      localDateTimeStart: "2022-05-23T00:00:00+01:00"
                      localDateTimeEnd: "2022-05-24T00:00:00+01:00"
                      utcCutoffAt: "2022-05-22T23:00:00Z"
                      allDay: false
                      available: true
                      status: AVAILABLE
                      vacancies: 10
                      capacity: 10
                      maxUnits: null
                      openingHours:
                        - from: "08:00"
                          to: "16:00"
                    contact:
                      fullName: John Doe
                      firstName: John
                      lastName: Doe
                      emailAddress: johndoe@email.com
                      phoneNumber: ""
                      locales:
                        - en
                      postalCode: ""
                      country: ""
                      notes: ""
                    notes: Optional notes for the booking
                    deliveryMethods:
                      - TICKET
                      - VOUCHER
                    voucher: null
                    unitItems: []
        "400":
          description: The server could not understand the request due to invalid syntax.
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: "#/components/schemas/ErrorInvalidBookingUUID"
                  - $ref: "#/components/schemas/ErrorUnprocessableEntity"
                  - $ref: "#/components/schemas/ErrorUnauthorized"
                  - $ref: "#/components/schemas/ErrorInternalServerError"
                  - $ref: "#/components/schemas/ErrorForbidden"
              examples:
                Forbidden Response:
                  summary: Forbidden Response
                  description: Forbidden Response
                  value:
                    error: FORBIDDEN
                    errorMessage: You sent an API Key that was invalid or has been revoked by the backend system. Or you're trying to access an endpoint/resource that you do not have access to
                Internal Server Error Response:
                  summary: Internal Server Error Response
                  description: Internal Server Error Response
                  value:
                    error: INTERNAL_SERVER_ERROR
                    errorMessage: There was an un-recoverable error, please try again
                Unauthorized Response:
                  summary: Unauthorized Response
                  description: Unauthorized Response
                  value:
                    error: UNAUTHORIZED
                    errorMessage: You didn't send the API Key in the Authorization header to an endpoint that requires authentication
                Unprocessable Entity Response:
                  summary: Unprocessable Entity Response
                  description: Unprocessable Entity Response
                  value:
                    error: UNPROCESSABLE_ENTITY
                    errorMessage: The request body is technically correct but cannot be processed for other reasons. e.g. you tried to cancel a booking after the cancellation cutoff had elapsed
                Invalid Booking UUID Response:
                  summary: Invalid Booking UUID Response
                  description: Invalid Booking UUID Response
                  value:
                    error: INVALID_BOOKING_UUID
                    errorMessage: The uuid was already used, missing or invalid
                    uuid: bbbb6227-54fc-4c32-9ed7-dc3eb99966ea
      tags:
        - Bookings
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/BookingCancellationBody"
  /bookings/{uuid}/confirm:
    post:
      operationId: Bookings_BookingConfirmation
      summary: Booking Confirmation
      description: This endpoint confirms the booking so it's ready to be used.
      parameters:
        - $ref: "#/components/parameters/BookingConfirmationRequest.uuid"
        - $ref: "#/components/parameters/RequestHeaders.octoCapabilities"
        - $ref: "#/components/parameters/RequestHeadersContent"
      responses:
        "200":
          description: The request has succeeded.
          headers:
            Octo-Capabilities:
              required: true
              description: A list of the Capabilities (their IDs) initialized with your request.
              schema:
                type: string
            Content-Language:
              required: false
              description: "This response header indicates the language of the content being returned in the response. The OCTO specification allows only one language to be returned per response. This code must conform to the BCP 47 standard, following RFC 5646 and RFC 4647 specifications for language tags. Examples include en-US for American English, fr-FR for French (France), and es-ES for Spanish (Spain).  To obtain content in multiple languages, separate requests must be made for each desired language. This header is defined in the HTTP/1.1 specification (RFC 7231). For more information, see MDN Web Docs: Content-Language - HTTP | MDN. This response header is required when using Content capability."
              schema:
                type: string
                x-capability-data:
                  capability: octo/content
                  required: true
              x-capability-data:
                capability: octo/content
                required: true
            Available-Languages:
              required: false
              description: This response header is used to inform of the languages in which content is available, helping understand the language options without needing additional requests. This code must conform to the BCP 47 standard, following RFC 5646 and RFC 4647 specifications for language tags. Examples include en-US for American English, fr-FR for French (France), and es-ES for Spanish (Spain).  Although not a standard HTTP header, it is commonly used in APIs to list available languages, such as en-US, fr-CA, es-ES, indicating that content can be requested in U.S. English, Canadian French, or Spanish. This response header is required when using Content capability.
              schema:
                type: string
                x-capability-data:
                  capability: octo/content
                  required: true
              x-capability-data:
                capability: octo/content
                required: true
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Booking"
              examples:
                CONFIRMED Booking example:
                  summary: CONFIRMED Booking example
                  description: CONFIRMED Booking example
                  value:
                    id: bbbb6227-54fc-4c32-9ed7-dc3eb99966ea
                    uuid: 559aed3d-6d5b-4fe0-bfca-99f5e7218a56
                    testMode: false
                    resellerReference: null
                    supplierReference: XOPSUT
                    status: CONFIRMED
                    utcCreatedAt: "2022-05-25T10:34:22Z"
                    utcUpdatedAt: "2022-05-25T10:34:22Z"
                    utcExpiresAt: null
                    utcRedeemedAt: null
                    utcConfirmedAt: "2022-05-25T11:00:22Z"
                    productId: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
                    product:
                      id: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
                      internalName: London Eye General Admission
                      reference: LEYE-GA
                      locale: en-GB
                      timeZone: Europe/London
                      allowFreesale: true
                      instantConfirmation: true
                      instantDelivery: true
                      availabilityRequired: true
                      availabilityType: START_TIME
                      deliveryFormats:
                        - QRCODE
                      deliveryMethods:
                        - TICKET
                      redemptionMethod: DIGITAL
                      options:
                        - id: DEFAULT
                          default: true
                          internalName: DEFAULT
                          reference: null
                          availabilityLocalStartTimes:
                            - "00:00"
                          cancellationCutoff: 1 hour
                          cancellationCutoffAmount: 1
                          cancellationCutoffUnit: hour
                          requiredContactFields:
                            - firstName
                          restrictions:
                            minUnits: 0
                            maxUnits: 9
                          units:
                            - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                              internalName: Adult
                              reference: null
                              type: ADULT
                              restrictions:
                                minAge: 18
                                maxAge: 99
                                idRequired: false
                                minQuantity: 1
                                maxQuantity: 10
                                paxCount: 1
                                accompaniedBy: []
                              requiredContactFields:
                                - firstName
                            - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                              internalName: Child
                              reference: null
                              type: CHILD
                              restrictions:
                                minAge: 3
                                maxAge: 12
                                idRequired: false
                                minQuantity: 1
                                maxQuantity: 10
                                paxCount: 1
                                accompaniedBy: []
                              requiredContactFields:
                                - firstName
                            - id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                              internalName: Infant
                              reference: null
                              type: INFANT
                              restrictions:
                                minAge: 0
                                maxAge: 3
                                idRequired: false
                                minQuantity: 1
                                maxQuantity: 10
                                paxCount: 1
                                accompaniedBy:
                                  - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                              requiredContactFields:
                                - firstName
                    optionId: DEFAULT
                    option:
                      id: DEFAULT
                      default: true
                      internalName: DEFAULT
                      reference: null
                      availabilityLocalStartTimes:
                        - "00:00"
                      cancellationCutoff: 1 hour
                      cancellationCutoffAmount: 1
                      cancellationCutoffUnit: hour
                      requiredContactFields:
                        - firstName
                      restrictions:
                        minUnits: 0
                        maxUnits: 9
                      units:
                        - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                          internalName: Adult
                          reference: null
                          type: ADULT
                          restrictions:
                            minAge: 18
                            maxAge: 99
                            idRequired: false
                            minQuantity: 1
                            maxQuantity: 10
                            paxCount: 1
                            accompaniedBy: []
                          requiredContactFields:
                            - firstName
                        - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                          internalName: Child
                          reference: null
                          type: CHILD
                          restrictions:
                            minAge: 3
                            maxAge: 12
                            idRequired: false
                            minQuantity: 1
                            maxQuantity: 10
                            paxCount: 1
                            accompaniedBy: []
                          requiredContactFields:
                            - firstName
                        - id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                          internalName: Infant
                          reference: null
                          type: INFANT
                          restrictions:
                            minAge: 0
                            maxAge: 3
                            idRequired: false
                            minQuantity: 1
                            maxQuantity: 10
                            paxCount: 1
                            accompaniedBy:
                              - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                          requiredContactFields:
                            - firstName
                    cancellable: true
                    cancellation: null
                    freesale: false
                    availabilityId: ""
                    availability:
                      id: "2022-05-23T00:00:00+01:00"
                      localDateTimeStart: "2022-05-23T00:00:00+01:00"
                      localDateTimeEnd: "2022-05-24T00:00:00+01:00"
                      utcCutoffAt: "2022-05-22T23:00:00Z"
                      allDay: false
                      available: true
                      status: AVAILABLE
                      vacancies: 10
                      capacity: 10
                      maxUnits: null
                      openingHours:
                        - from: "08:00"
                          to: "16:00"
                    contact:
                      fullName: John Doe
                      firstName: John
                      lastName: Doe
                      emailAddress: johndoe@email.com
                      phoneNumber: ""
                      locales:
                        - en
                      postalCode: ""
                      country: ""
                      notes: ""
                    notes: Optional notes for the booking
                    deliveryMethods:
                      - TICKET
                      - VOUCHER
                    voucher:
                      redemptionMethod: DIGITAL
                      utcRedeemedAt: "2021-10-27T23:28:43Z"
                      deliveryOptions:
                        - deliveryFormat: QRCODE
                          deliveryValue: ""
                    unitItems:
                      - uuid: 3b1bc2ee-3155-4738-9471-f49842a07327
                        resellerReference: 4ec08a62-892c-48c1-a608-dc946531a33a
                        supplierReference: K9T7R4
                        unitId: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                        unit:
                          id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                          internalName: Adult
                          reference: null
                          type: ADULT
                          restrictions:
                            minAge: 18
                            maxAge: 99
                            idRequired: false
                            minQuantity: 1
                            maxQuantity: 10
                            paxCount: 1
                            accompaniedBy: []
                          requiredContactFields:
                            - firstName
                        status: ON_HOLD
                        utcRedeemedAt: null
                        contact:
                          fullName: John Doe
                          firstName: John
                          lastName: Doe
                          emailAddress: johndoe@email.com
                          phoneNumber: ""
                          locales:
                            - en
                          postalCode: ""
                          country: ""
                          notes: ""
                        ticket:
                          redemptionMethod: DIGITAL
                          utcRedeemedAt: "2021-10-27T23:28:43Z"
                          deliveryOptions:
                            - deliveryFormat: QRCODE
                              deliveryValue: ""
                      - uuid: 3b1bc2ee-3155-4738-9471-f49842a07327
                        resellerReference: 4ec08a62-892c-48c1-a608-dc946531a33b
                        supplierReference: K9T7R5
                        unitId: child_797e3ce8-1860-4cbf-80ad-95857df1f640
                        unit:
                          id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                          internalName: Child
                          reference: null
                          type: CHILD
                          restrictions:
                            minAge: 3
                            maxAge: 12
                            idRequired: false
                            minQuantity: 1
                            maxQuantity: 10
                            paxCount: 1
                            accompaniedBy: []
                          requiredContactFields:
                            - firstName
                        status: CONFIRMED
                        utcRedeemedAt: null
                        contact:
                          fullName: John Doe
                          firstName: John
                          lastName: Doe
                          emailAddress: johndoe@email.com
                          phoneNumber: ""
                          locales:
                            - en
                          postalCode: ""
                          country: ""
                          notes: ""
                        ticket:
                          redemptionMethod: DIGITAL
                          utcRedeemedAt: "2021-10-27T23:28:43Z"
                          deliveryOptions:
                            - deliveryFormat: QRCODE
                              deliveryValue: ""
                      - uuid: 3b1bc2ee-3155-4738-9471-f49842a07327
                        resellerReference: 4ec08a62-892c-48c1-a608-dc946531a33c
                        supplierReference: K9T7R6
                        unitId: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                        unit:
                          id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                          internalName: Infant
                          reference: null
                          type: INFANT
                          restrictions:
                            minAge: 0
                            maxAge: 3
                            idRequired: false
                            minQuantity: 1
                            maxQuantity: 10
                            paxCount: 1
                            accompaniedBy:
                              - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                          requiredContactFields:
                            - firstName
                        status: CONFIRMED
                        utcRedeemedAt: null
                        contact:
                          fullName: John Doe
                          firstName: John
                          lastName: Doe
                          emailAddress: johndoe@email.com
                          phoneNumber: ""
                          locales:
                            - en
                          postalCode: ""
                          country: ""
                          notes: ""
                        ticket:
                          redemptionMethod: DIGITAL
                          utcRedeemedAt: "2021-10-27T23:28:43Z"
                          deliveryOptions:
                            - deliveryFormat: QRCODE
                              deliveryValue: ""
        "400":
          description: The server could not understand the request due to invalid syntax.
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: "#/components/schemas/ErrorInvalidProductID"
                  - $ref: "#/components/schemas/ErrorInvalidOptionID"
                  - $ref: "#/components/schemas/ErrorInvalidUnitID"
                  - $ref: "#/components/schemas/ErrorInvalidAvailabilityID"
                  - $ref: "#/components/schemas/ErrorInvalidBookingUUID"
                  - $ref: "#/components/schemas/ErrorUnprocessableEntity"
                  - $ref: "#/components/schemas/ErrorUnauthorized"
                  - $ref: "#/components/schemas/ErrorInternalServerError"
                  - $ref: "#/components/schemas/ErrorForbidden"
              examples:
                Forbidden Response:
                  summary: Forbidden Response
                  description: Forbidden Response
                  value:
                    error: FORBIDDEN
                    errorMessage: You sent an API Key that was invalid or has been revoked by the backend system. Or you're trying to access an endpoint/resource that you do not have access to
                Internal Server Error Response:
                  summary: Internal Server Error Response
                  description: Internal Server Error Response
                  value:
                    error: INTERNAL_SERVER_ERROR
                    errorMessage: There was an un-recoverable error, please try again
                Unauthorized Response:
                  summary: Unauthorized Response
                  description: Unauthorized Response
                  value:
                    error: UNAUTHORIZED
                    errorMessage: You didn't send the API Key in the Authorization header to an endpoint that requires authentication
                Unprocessable Entity Response:
                  summary: Unprocessable Entity Response
                  description: Unprocessable Entity Response
                  value:
                    error: UNPROCESSABLE_ENTITY
                    errorMessage: The request body is technically correct but cannot be processed for other reasons. e.g. you tried to cancel a booking after the cancellation cutoff had elapsed
                Invalid Booking UUID Response:
                  summary: Invalid Booking UUID Response
                  description: Invalid Booking UUID Response
                  value:
                    error: INVALID_BOOKING_UUID
                    errorMessage: The uuid was already used, missing or invalid
                    uuid: bbbb6227-54fc-4c32-9ed7-dc3eb99966ea
                Invalid Availability Id Response:
                  summary: Invalid Availability Id Response
                  description: Invalid Availability Id Response
                  value:
                    error: INVALID_AVAILABILITY_ID
                    errorMessage: The availabilityId was missing or invalid
                    availabilityId: "2022-03-12T00:00:00+00:00"
                Invalid Unit Id Response:
                  summary: Invalid Unit Id Response
                  description: Invalid Unit Id Response
                  value:
                    error: INVALID_UNIT_ID
                    errorMessage: The unitId was missing or invalid
                    unitId: senior
                Invalid Option Id Response:
                  summary: Invalid Option Id Response
                  description: Invalid Option Id Response
                  value:
                    error: INVALID_OPTION_ID
                    errorMessage: The optionId was missing or invalid
                    optionId: 681fea0f-196e-45da-bec7-467bfacb1d87
                Invalid Product Id Response:
                  summary: Invalid Product Id Response
                  description: Invalid Product Id Response
                  value:
                    error: INVALID_PRODUCT_ID
                    errorMessage: The productId was missing or invalid
                    productId: cc2a6d56-6efe-426f-99c9-6eb10e341565
      tags:
        - Bookings
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/BookingConfirmationBody"
  /bookings/{uuid}/extend:
    post:
      operationId: Bookings_ExtendReservation
      summary: Extend Reservation
      description: Use this endpoint to hold the availability for a booking longer if the status is `ON_HOLD`.
      parameters:
        - $ref: "#/components/parameters/ExtendReservationRequest.uuid"
        - $ref: "#/components/parameters/RequestHeaders.octoCapabilities"
        - $ref: "#/components/parameters/RequestHeadersContent"
      responses:
        "200":
          description: The request has succeeded.
          headers:
            Octo-Capabilities:
              required: true
              description: A list of the Capabilities (their IDs) initialized with your request.
              schema:
                type: string
            Content-Language:
              required: false
              description: "This response header indicates the language of the content being returned in the response. The OCTO specification allows only one language to be returned per response. This code must conform to the BCP 47 standard, following RFC 5646 and RFC 4647 specifications for language tags. Examples include en-US for American English, fr-FR for French (France), and es-ES for Spanish (Spain).  To obtain content in multiple languages, separate requests must be made for each desired language. This header is defined in the HTTP/1.1 specification (RFC 7231). For more information, see MDN Web Docs: Content-Language - HTTP | MDN. This response header is required when using Content capability."
              schema:
                type: string
                x-capability-data:
                  capability: octo/content
                  required: true
              x-capability-data:
                capability: octo/content
                required: true
            Available-Languages:
              required: false
              description: This response header is used to inform of the languages in which content is available, helping understand the language options without needing additional requests. This code must conform to the BCP 47 standard, following RFC 5646 and RFC 4647 specifications for language tags. Examples include en-US for American English, fr-FR for French (France), and es-ES for Spanish (Spain).  Although not a standard HTTP header, it is commonly used in APIs to list available languages, such as en-US, fr-CA, es-ES, indicating that content can be requested in U.S. English, Canadian French, or Spanish. This response header is required when using Content capability.
              schema:
                type: string
                x-capability-data:
                  capability: octo/content
                  required: true
              x-capability-data:
                capability: octo/content
                required: true
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Booking"
              examples:
                ON_HOLD Booking example:
                  summary: ON_HOLD Booking example
                  description: ON_HOLD Booking example
                  value:
                    id: bbbb6227-54fc-4c32-9ed7-dc3eb99966ea
                    uuid: 559aed3d-6d5b-4fe0-bfca-99f5e7218a56
                    testMode: false
                    resellerReference: null
                    supplierReference: XOPSUT
                    status: ON_HOLD
                    utcCreatedAt: "2022-05-25T10:34:22Z"
                    utcUpdatedAt: "2022-05-25T10:34:22Z"
                    utcExpiresAt: "2022-05-25T11:04:22Z"
                    utcRedeemedAt: null
                    utcConfirmedAt: null
                    productId: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
                    product:
                      id: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
                      internalName: London Eye General Admission
                      reference: LEYE-GA
                      locale: en-GB
                      timeZone: Europe/London
                      allowFreesale: true
                      instantConfirmation: true
                      instantDelivery: true
                      availabilityRequired: true
                      availabilityType: START_TIME
                      deliveryFormats:
                        - QRCODE
                      deliveryMethods:
                        - TICKET
                      redemptionMethod: DIGITAL
                      options:
                        - id: DEFAULT
                          default: true
                          internalName: DEFAULT
                          reference: null
                          availabilityLocalStartTimes:
                            - "00:00"
                          cancellationCutoff: 1 hour
                          cancellationCutoffAmount: 1
                          cancellationCutoffUnit: hour
                          requiredContactFields:
                            - firstName
                          restrictions:
                            minUnits: 0
                            maxUnits: 9
                          units:
                            - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                              internalName: Adult
                              reference: null
                              type: ADULT
                              restrictions:
                                minAge: 18
                                maxAge: 99
                                idRequired: false
                                minQuantity: 1
                                maxQuantity: 10
                                paxCount: 1
                                accompaniedBy: []
                              requiredContactFields:
                                - firstName
                            - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                              internalName: Child
                              reference: null
                              type: CHILD
                              restrictions:
                                minAge: 3
                                maxAge: 12
                                idRequired: false
                                minQuantity: 1
                                maxQuantity: 10
                                paxCount: 1
                                accompaniedBy: []
                              requiredContactFields:
                                - firstName
                            - id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                              internalName: Infant
                              reference: null
                              type: INFANT
                              restrictions:
                                minAge: 0
                                maxAge: 3
                                idRequired: false
                                minQuantity: 1
                                maxQuantity: 10
                                paxCount: 1
                                accompaniedBy:
                                  - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                              requiredContactFields:
                                - firstName
                    optionId: DEFAULT
                    option:
                      id: DEFAULT
                      default: true
                      internalName: DEFAULT
                      reference: null
                      availabilityLocalStartTimes:
                        - "00:00"
                      cancellationCutoff: 1 hour
                      cancellationCutoffAmount: 1
                      cancellationCutoffUnit: hour
                      requiredContactFields:
                        - firstName
                      restrictions:
                        minUnits: 0
                        maxUnits: 9
                      units:
                        - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                          internalName: Adult
                          reference: null
                          type: ADULT
                          restrictions:
                            minAge: 18
                            maxAge: 99
                            idRequired: false
                            minQuantity: 1
                            maxQuantity: 10
                            paxCount: 1
                            accompaniedBy: []
                          requiredContactFields:
                            - firstName
                        - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                          internalName: Child
                          reference: null
                          type: CHILD
                          restrictions:
                            minAge: 3
                            maxAge: 12
                            idRequired: false
                            minQuantity: 1
                            maxQuantity: 10
                            paxCount: 1
                            accompaniedBy: []
                          requiredContactFields:
                            - firstName
                        - id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                          internalName: Infant
                          reference: null
                          type: INFANT
                          restrictions:
                            minAge: 0
                            maxAge: 3
                            idRequired: false
                            minQuantity: 1
                            maxQuantity: 10
                            paxCount: 1
                            accompaniedBy:
                              - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                          requiredContactFields:
                            - firstName
                    cancellable: true
                    cancellation: null
                    freesale: false
                    availabilityId: ""
                    availability:
                      id: "2022-05-23T00:00:00+01:00"
                      localDateTimeStart: "2022-05-23T00:00:00+01:00"
                      localDateTimeEnd: "2022-05-24T00:00:00+01:00"
                      utcCutoffAt: "2022-05-22T23:00:00Z"
                      allDay: false
                      available: true
                      status: AVAILABLE
                      vacancies: 10
                      capacity: 10
                      maxUnits: null
                      openingHours:
                        - from: "08:00"
                          to: "16:00"
                    contact:
                      fullName: John Doe
                      firstName: John
                      lastName: Doe
                      emailAddress: johndoe@email.com
                      phoneNumber: ""
                      locales:
                        - en
                      postalCode: ""
                      country: ""
                      notes: ""
                    notes: Optional notes for the booking
                    deliveryMethods:
                      - TICKET
                      - VOUCHER
                    voucher: null
                    unitItems:
                      - uuid: 3b1bc2ee-3155-4738-9471-f49842a07327
                        resellerReference: 4ec08a62-892c-48c1-a608-dc946531a33a
                        supplierReference: K9T7R4
                        unitId: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                        unit:
                          id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                          internalName: Adult
                          reference: null
                          type: ADULT
                          restrictions:
                            minAge: 18
                            maxAge: 99
                            idRequired: false
                            minQuantity: 1
                            maxQuantity: 10
                            paxCount: 1
                            accompaniedBy: []
                          requiredContactFields:
                            - firstName
                        status: ON_HOLD
                        utcRedeemedAt: null
                        contact:
                          fullName: John Doe
                          firstName: John
                          lastName: Doe
                          emailAddress: johndoe@email.com
                          phoneNumber: ""
                          locales:
                            - en
                          postalCode: ""
                          country: ""
                          notes: ""
                        ticket: null
                      - uuid: 3b1bc2ee-3155-4738-9471-f49842a07327
                        resellerReference: 4ec08a62-892c-48c1-a608-dc946531a33b
                        supplierReference: K9T7R5
                        unitId: child_797e3ce8-1860-4cbf-80ad-95857df1f640
                        unit:
                          id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                          internalName: Child
                          reference: null
                          type: CHILD
                          restrictions:
                            minAge: 3
                            maxAge: 12
                            idRequired: false
                            minQuantity: 1
                            maxQuantity: 10
                            paxCount: 1
                            accompaniedBy: []
                          requiredContactFields:
                            - firstName
                        status: ON_HOLD
                        utcRedeemedAt: null
                        contact:
                          fullName: John Doe
                          firstName: John
                          lastName: Doe
                          emailAddress: johndoe@email.com
                          phoneNumber: ""
                          locales:
                            - en
                          postalCode: ""
                          country: ""
                          notes: ""
                        ticket: null
                      - uuid: 3b1bc2ee-3155-4738-9471-f49842a07327
                        resellerReference: 4ec08a62-892c-48c1-a608-dc946531a33c
                        supplierReference: K9T7R6
                        unitId: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                        unit:
                          id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                          internalName: Infant
                          reference: null
                          type: INFANT
                          restrictions:
                            minAge: 0
                            maxAge: 3
                            idRequired: false
                            minQuantity: 1
                            maxQuantity: 10
                            paxCount: 1
                            accompaniedBy:
                              - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                          requiredContactFields:
                            - firstName
                        status: ON_HOLD
                        utcRedeemedAt: null
                        contact:
                          fullName: John Doe
                          firstName: John
                          lastName: Doe
                          emailAddress: johndoe@email.com
                          phoneNumber: ""
                          locales:
                            - en
                          postalCode: ""
                          country: ""
                          notes: ""
                        ticket: null
        "400":
          description: The server could not understand the request due to invalid syntax.
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: "#/components/schemas/ErrorInvalidBookingUUID"
                  - $ref: "#/components/schemas/ErrorUnprocessableEntity"
                  - $ref: "#/components/schemas/ErrorUnauthorized"
                  - $ref: "#/components/schemas/ErrorInternalServerError"
                  - $ref: "#/components/schemas/ErrorForbidden"
              examples:
                Forbidden Response:
                  summary: Forbidden Response
                  description: Forbidden Response
                  value:
                    error: FORBIDDEN
                    errorMessage: You sent an API Key that was invalid or has been revoked by the backend system. Or you're trying to access an endpoint/resource that you do not have access to
                Internal Server Error Response:
                  summary: Internal Server Error Response
                  description: Internal Server Error Response
                  value:
                    error: INTERNAL_SERVER_ERROR
                    errorMessage: There was an un-recoverable error, please try again
                Unauthorized Response:
                  summary: Unauthorized Response
                  description: Unauthorized Response
                  value:
                    error: UNAUTHORIZED
                    errorMessage: You didn't send the API Key in the Authorization header to an endpoint that requires authentication
                Unprocessable Entity Response:
                  summary: Unprocessable Entity Response
                  description: Unprocessable Entity Response
                  value:
                    error: UNPROCESSABLE_ENTITY
                    errorMessage: The request body is technically correct but cannot be processed for other reasons. e.g. you tried to cancel a booking after the cancellation cutoff had elapsed
                Invalid Booking UUID Response:
                  summary: Invalid Booking UUID Response
                  description: Invalid Booking UUID Response
                  value:
                    error: INVALID_BOOKING_UUID
                    errorMessage: The uuid was already used, missing or invalid
                    uuid: bbbb6227-54fc-4c32-9ed7-dc3eb99966ea
      tags:
        - Bookings
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ExtendReservationBody"
  /capabilities/:
    get:
      operationId: Capabilities_get
      summary: List capabilities
      description: List capabiliteis
      parameters:
        - $ref: "#/components/parameters/RequestHeadersContent"
      responses:
        "200":
          description: The request has succeeded.
          headers:
            Octo-Capabilities:
              required: true
              description: A list of the Capabilities (their IDs) initialized with your request.
              schema:
                type: string
            Content-Language:
              required: false
              description: "This response header indicates the language of the content being returned in the response. The OCTO specification allows only one language to be returned per response. This code must conform to the BCP 47 standard, following RFC 5646 and RFC 4647 specifications for language tags. Examples include en-US for American English, fr-FR for French (France), and es-ES for Spanish (Spain).  To obtain content in multiple languages, separate requests must be made for each desired language. This header is defined in the HTTP/1.1 specification (RFC 7231). For more information, see MDN Web Docs: Content-Language - HTTP | MDN. This response header is required when using Content capability."
              schema:
                type: string
                x-capability-data:
                  capability: octo/content
                  required: true
              x-capability-data:
                capability: octo/content
                required: true
            Available-Languages:
              required: false
              description: This response header is used to inform of the languages in which content is available, helping understand the language options without needing additional requests. This code must conform to the BCP 47 standard, following RFC 5646 and RFC 4647 specifications for language tags. Examples include en-US for American English, fr-FR for French (France), and es-ES for Spanish (Spain).  Although not a standard HTTP header, it is commonly used in APIs to list available languages, such as en-US, fr-CA, es-ES, indicating that content can be requested in U.S. English, Canadian French, or Spanish. This response header is required when using Content capability.
              schema:
                type: string
                x-capability-data:
                  capability: octo/content
                  required: true
              x-capability-data:
                capability: octo/content
                required: true
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Capability"
              examples:
                Capabilities:
                  summary: Capabilities
                  description: Capabilities
                  value:
                    - id: octo/pricing
                      revision: 3
                      required: true
                      dependencies: []
                      docs: This capability enables booking creation.
      tags:
        - Capabilities
  /products/:
    get:
      operationId: Products_GetProducts
      summary: Get Products
      description: Fetch the list of products.
      parameters:
        - $ref: "#/components/parameters/RequestHeaders.octoCapabilities"
        - $ref: "#/components/parameters/RequestHeadersContent"
      responses:
        "200":
          description: The request has succeeded.
          headers:
            Octo-Capabilities:
              required: true
              description: A list of the Capabilities (their IDs) initialized with your request.
              schema:
                type: string
            Content-Language:
              required: false
              description: "This response header indicates the language of the content being returned in the response. The OCTO specification allows only one language to be returned per response. This code must conform to the BCP 47 standard, following RFC 5646 and RFC 4647 specifications for language tags. Examples include en-US for American English, fr-FR for French (France), and es-ES for Spanish (Spain).  To obtain content in multiple languages, separate requests must be made for each desired language. This header is defined in the HTTP/1.1 specification (RFC 7231). For more information, see MDN Web Docs: Content-Language - HTTP | MDN. This response header is required when using Content capability."
              schema:
                type: string
                x-capability-data:
                  capability: octo/content
                  required: true
              x-capability-data:
                capability: octo/content
                required: true
            Available-Languages:
              required: false
              description: This response header is used to inform of the languages in which content is available, helping understand the language options without needing additional requests. This code must conform to the BCP 47 standard, following RFC 5646 and RFC 4647 specifications for language tags. Examples include en-US for American English, fr-FR for French (France), and es-ES for Spanish (Spain).  Although not a standard HTTP header, it is commonly used in APIs to list available languages, such as en-US, fr-CA, es-ES, indicating that content can be requested in U.S. English, Canadian French, or Spanish. This response header is required when using Content capability.
              schema:
                type: string
                x-capability-data:
                  capability: octo/content
                  required: true
              x-capability-data:
                capability: octo/content
                required: true
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Product"
              examples:
                Products example:
                  summary: Products example
                  description: Products example
                  value:
                    - id: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
                      internalName: London Eye General Admission
                      reference: LEYE-GA
                      locale: en-GB
                      timeZone: Europe/London
                      allowFreesale: true
                      instantConfirmation: true
                      instantDelivery: true
                      availabilityRequired: true
                      availabilityType: START_TIME
                      deliveryFormats:
                        - QRCODE
                      deliveryMethods:
                        - TICKET
                      redemptionMethod: DIGITAL
                      options:
                        - id: DEFAULT
                          default: true
                          internalName: DEFAULT
                          reference: null
                          availabilityLocalStartTimes:
                            - "00:00"
                          cancellationCutoff: 1 hour
                          cancellationCutoffAmount: 1
                          cancellationCutoffUnit: hour
                          requiredContactFields:
                            - firstName
                          restrictions:
                            minUnits: 0
                            maxUnits: 9
                          units:
                            - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                              internalName: Adult
                              reference: null
                              type: ADULT
                              restrictions:
                                minAge: 18
                                maxAge: 99
                                idRequired: false
                                minQuantity: 1
                                maxQuantity: 10
                                paxCount: 1
                                accompaniedBy: []
                              requiredContactFields:
                                - firstName
                            - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                              internalName: Child
                              reference: null
                              type: CHILD
                              restrictions:
                                minAge: 3
                                maxAge: 12
                                idRequired: false
                                minQuantity: 1
                                maxQuantity: 10
                                paxCount: 1
                                accompaniedBy: []
                              requiredContactFields:
                                - firstName
                            - id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                              internalName: Infant
                              reference: null
                              type: INFANT
                              restrictions:
                                minAge: 0
                                maxAge: 3
                                idRequired: false
                                minQuantity: 1
                                maxQuantity: 10
                                paxCount: 1
                                accompaniedBy:
                                  - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                              requiredContactFields:
                                - firstName
                Products with octo/content:
                  summary: Products with octo/content
                  description: Products with octo/content
                  value:
                    - id: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
                      internalName: London Eye General Admission
                      reference: LEYE-GA
                      locale: en-GB
                      timeZone: Europe/London
                      allowFreesale: true
                      instantConfirmation: true
                      instantDelivery: true
                      availabilityRequired: true
                      availabilityType: START_TIME
                      deliveryFormats:
                        - QRCODE
                      deliveryMethods:
                        - TICKET
                      redemptionMethod: DIGITAL
                      options:
                        - id: DEFAULT
                          default: true
                          internalName: DEFAULT
                          reference: null
                          availabilityLocalStartTimes:
                            - "00:00"
                          cancellationCutoff: 1 hour
                          cancellationCutoffAmount: 1
                          cancellationCutoffUnit: hour
                          requiredContactFields:
                            - firstName
                          restrictions:
                            minUnits: 0
                            maxUnits: 9
                          units:
                            - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                              internalName: Adult
                              reference: null
                              type: ADULT
                              restrictions:
                                minAge: 18
                                maxAge: 99
                                idRequired: false
                                minQuantity: 1
                                maxQuantity: 10
                                paxCount: 1
                                accompaniedBy: []
                              requiredContactFields:
                                - firstName
                              title: ""
                              shortDescription: ""
                              features:
                                - shortDescription: ""
                                  type: CANCELLATION_TERM
                            - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                              internalName: Child
                              reference: null
                              type: CHILD
                              restrictions:
                                minAge: 3
                                maxAge: 12
                                idRequired: false
                                minQuantity: 1
                                maxQuantity: 10
                                paxCount: 1
                                accompaniedBy: []
                              requiredContactFields:
                                - firstName
                              title: ""
                              shortDescription: ""
                              features:
                                - shortDescription: ""
                                  type: CANCELLATION_TERM
                            - id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                              internalName: Infant
                              reference: null
                              type: INFANT
                              restrictions:
                                minAge: 0
                                maxAge: 3
                                idRequired: false
                                minQuantity: 1
                                maxQuantity: 10
                                paxCount: 1
                                accompaniedBy:
                                  - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                              requiredContactFields:
                                - firstName
                              title: ""
                              shortDescription: ""
                              features:
                                - shortDescription: ""
                                  type: CANCELLATION_TERM
                          title: ""
                          shortDescription: ""
                          description: ""
                          features:
                            - shortDescription: ""
                              type: CANCELLATION_TERM
                          faqs:
                            - question: ""
                              answer: ""
                          media:
                            - src: ""
                              type: image/jpeg
                              rel: LOGO
                              title: ""
                              caption: ""
                              copyright: ""
                          locations:
                            - title: ""
                              shortDescription: ""
                              types:
                                - POINT_OF_INTEREST
                              minutesTo: null
                              minutesAt: null
                              place:
                                latitude: 55.9533
                                longitude: -3.1883
                                postalAddress:
                                  streetAddress: ""
                                  addressLocality: ""
                                  addressRegion: ""
                                  postalCode: ""
                                  addressCountry: ""
                                  postOfficeBoxNumber: ""
                                identifiers:
                                  googlePlaceId: null
                                  applePlaceId: null
                                  tripadvisorLocationId: null
                                  yelpPlaceId: null
                                  facebookPlaceId: null
                                  foursquarePlaceId: null
                                  baiduPlaceId: null
                                  amapPlaceId: null
                                sameAs: []
                          categoryLabels:
                            - adults-only
                            - romantic
                          durationMinutesFrom: 30
                          durationMinutesTo: null
                          commentary:
                            - format: IN_PERSON
                              language: ""
                      title: ""
                      shortDescription: ""
                      description: ""
                      features:
                        - shortDescription: ""
                          type: CANCELLATION_TERM
                      faqs:
                        - question: ""
                          answer: ""
                      media:
                        - src: ""
                          type: image/jpeg
                          rel: LOGO
                          title: ""
                          caption: ""
                          copyright: ""
                      locations:
                        - title: ""
                          shortDescription: ""
                          types:
                            - POINT_OF_INTEREST
                          minutesTo: null
                          minutesAt: null
                          place:
                            latitude: 55.9533
                            longitude: -3.1883
                            postalAddress:
                              streetAddress: ""
                              addressLocality: ""
                              addressRegion: ""
                              postalCode: ""
                              addressCountry: ""
                              postOfficeBoxNumber: ""
                            identifiers:
                              googlePlaceId: null
                              applePlaceId: null
                              tripadvisorLocationId: null
                              yelpPlaceId: null
                              facebookPlaceId: null
                              foursquarePlaceId: null
                              baiduPlaceId: null
                              amapPlaceId: null
                            sameAs: []
                      categoryLabels:
                        - adults-only
                        - romantic
                      durationMinutesFrom: 30
                      durationMinutesTo: null
                      commentary:
                        - format: IN_PERSON
                          language: ""
                Products with octo/pricng (pricing per unit):
                  summary: Products with octo/pricng (pricing per unit)
                  description: Products with octo/pricng (pricing per unit)
                  value:
                    - id: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
                      internalName: London Eye General Admission
                      reference: LEYE-GA
                      locale: en-GB
                      timeZone: Europe/London
                      allowFreesale: true
                      instantConfirmation: true
                      instantDelivery: true
                      availabilityRequired: true
                      availabilityType: START_TIME
                      deliveryFormats:
                        - QRCODE
                      deliveryMethods:
                        - TICKET
                      redemptionMethod: DIGITAL
                      options:
                        - id: DEFAULT
                          default: true
                          internalName: DEFAULT
                          reference: null
                          availabilityLocalStartTimes:
                            - "00:00"
                          cancellationCutoff: 1 hour
                          cancellationCutoffAmount: 1
                          cancellationCutoffUnit: hour
                          requiredContactFields:
                            - firstName
                          restrictions:
                            minUnits: 0
                            maxUnits: 9
                          units:
                            - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                              internalName: Adult
                              reference: null
                              type: ADULT
                              restrictions:
                                minAge: 18
                                maxAge: 99
                                idRequired: false
                                minQuantity: 1
                                maxQuantity: 10
                                paxCount: 1
                                accompaniedBy: []
                              requiredContactFields:
                                - firstName
                              pricingFrom:
                                - original: 1000
                                  retail: 1000
                                  net: 8000
                                  currency: EUR
                                  currencyPrecision: 2
                                  includedTaxes: []
                                - original: 1000
                                  retail: 1000
                                  net: 8000
                                  currency: USD
                                  currencyPrecision: 2
                                  includedTaxes: []
                            - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                              internalName: Child
                              reference: null
                              type: CHILD
                              restrictions:
                                minAge: 3
                                maxAge: 12
                                idRequired: false
                                minQuantity: 1
                                maxQuantity: 10
                                paxCount: 1
                                accompaniedBy: []
                              requiredContactFields:
                                - firstName
                              pricingFrom:
                                - original: 500
                                  retail: 500
                                  net: 400
                                  currency: EUR
                                  currencyPrecision: 2
                                  includedTaxes: []
                                - original: 500
                                  retail: 500
                                  net: 400
                                  currency: USD
                                  currencyPrecision: 2
                                  includedTaxes: []
                            - id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                              internalName: Infant
                              reference: null
                              type: INFANT
                              restrictions:
                                minAge: 0
                                maxAge: 3
                                idRequired: false
                                minQuantity: 1
                                maxQuantity: 10
                                paxCount: 1
                                accompaniedBy:
                                  - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                              requiredContactFields:
                                - firstName
                              pricingFrom:
                                - original: 0
                                  retail: 0
                                  net: 0
                                  currency: EUR
                                  currencyPrecision: 2
                                  includedTaxes: []
                                - original: 0
                                  retail: 0
                                  net: 0
                                  currency: USD
                                  currencyPrecision: 2
                                  includedTaxes: []
                      defaultCurrency: USD
                      availableCurrencies:
                        - USD
                        - EUR
                      pricingPer: UNIT
                Products with octo/pricng (pricing per booking):
                  summary: Products with octo/pricng (pricing per booking)
                  description: Products with octo/pricng (pricing per booking)
                  value:
                    - id: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
                      internalName: London Eye General Admission
                      reference: LEYE-GA
                      locale: en-GB
                      timeZone: Europe/London
                      allowFreesale: true
                      instantConfirmation: true
                      instantDelivery: true
                      availabilityRequired: true
                      availabilityType: START_TIME
                      deliveryFormats:
                        - QRCODE
                      deliveryMethods:
                        - TICKET
                      redemptionMethod: DIGITAL
                      options:
                        - id: DEFAULT
                          default: true
                          internalName: DEFAULT
                          reference: null
                          availabilityLocalStartTimes:
                            - "00:00"
                          cancellationCutoff: 1 hour
                          cancellationCutoffAmount: 1
                          cancellationCutoffUnit: hour
                          requiredContactFields:
                            - firstName
                          restrictions:
                            minUnits: 0
                            maxUnits: 9
                          units:
                            - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                              internalName: Adult
                              reference: null
                              type: ADULT
                              restrictions:
                                minAge: 18
                                maxAge: 99
                                idRequired: false
                                minQuantity: 1
                                maxQuantity: 10
                                paxCount: 1
                                accompaniedBy: []
                              requiredContactFields:
                                - firstName
                            - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                              internalName: Child
                              reference: null
                              type: CHILD
                              restrictions:
                                minAge: 3
                                maxAge: 12
                                idRequired: false
                                minQuantity: 1
                                maxQuantity: 10
                                paxCount: 1
                                accompaniedBy: []
                              requiredContactFields:
                                - firstName
                            - id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                              internalName: Infant
                              reference: null
                              type: INFANT
                              restrictions:
                                minAge: 0
                                maxAge: 3
                                idRequired: false
                                minQuantity: 1
                                maxQuantity: 10
                                paxCount: 1
                                accompaniedBy:
                                  - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                              requiredContactFields:
                                - firstName
                          pricingFrom:
                            - original: 2000
                              retail: 2000
                              net: 1600
                              currency: EUR
                              currencyPrecision: 2
                              includedTaxes: []
                      defaultCurrency: USD
                      availableCurrencies:
                        - USD
                        - EUR
                      pricingPer: BOOKING
        "400":
          description: The server could not understand the request due to invalid syntax.
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: "#/components/schemas/ErrorUnauthorized"
                  - $ref: "#/components/schemas/ErrorInternalServerError"
                  - $ref: "#/components/schemas/ErrorForbidden"
              examples:
                Forbidden Response:
                  summary: Forbidden Response
                  description: Forbidden Response
                  value:
                    error: FORBIDDEN
                    errorMessage: You sent an API Key that was invalid or has been revoked by the backend system. Or you're trying to access an endpoint/resource that you do not have access to
                Internal Server Error Response:
                  summary: Internal Server Error Response
                  description: Internal Server Error Response
                  value:
                    error: INTERNAL_SERVER_ERROR
                    errorMessage: There was an un-recoverable error, please try again
                Unauthorized Response:
                  summary: Unauthorized Response
                  description: Unauthorized Response
                  value:
                    error: UNAUTHORIZED
                    errorMessage: You didn't send the API Key in the Authorization header to an endpoint that requires authentication
      tags:
        - Products
  /products/{id}:
    get:
      operationId: Products_GetProduct
      summary: Get Product
      description: Fetch the product for the given id.
      parameters:
        - $ref: "#/components/parameters/GetProductRequest.id"
        - $ref: "#/components/parameters/RequestHeaders.octoCapabilities"
        - $ref: "#/components/parameters/RequestHeadersContent"
      responses:
        "200":
          description: The request has succeeded.
          headers:
            Octo-Capabilities:
              required: true
              description: A list of the Capabilities (their IDs) initialized with your request.
              schema:
                type: string
            Content-Language:
              required: false
              description: "This response header indicates the language of the content being returned in the response. The OCTO specification allows only one language to be returned per response. This code must conform to the BCP 47 standard, following RFC 5646 and RFC 4647 specifications for language tags. Examples include en-US for American English, fr-FR for French (France), and es-ES for Spanish (Spain).  To obtain content in multiple languages, separate requests must be made for each desired language. This header is defined in the HTTP/1.1 specification (RFC 7231). For more information, see MDN Web Docs: Content-Language - HTTP | MDN. This response header is required when using Content capability."
              schema:
                type: string
                x-capability-data:
                  capability: octo/content
                  required: true
              x-capability-data:
                capability: octo/content
                required: true
            Available-Languages:
              required: false
              description: This response header is used to inform of the languages in which content is available, helping understand the language options without needing additional requests. This code must conform to the BCP 47 standard, following RFC 5646 and RFC 4647 specifications for language tags. Examples include en-US for American English, fr-FR for French (France), and es-ES for Spanish (Spain).  Although not a standard HTTP header, it is commonly used in APIs to list available languages, such as en-US, fr-CA, es-ES, indicating that content can be requested in U.S. English, Canadian French, or Spanish. This response header is required when using Content capability.
              schema:
                type: string
                x-capability-data:
                  capability: octo/content
                  required: true
              x-capability-data:
                capability: octo/content
                required: true
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Product"
              examples:
                Product example:
                  summary: Product example
                  description: Product example
                  value:
                    id: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
                    internalName: London Eye General Admission
                    reference: LEYE-GA
                    locale: en-GB
                    timeZone: Europe/London
                    allowFreesale: true
                    instantConfirmation: true
                    instantDelivery: true
                    availabilityRequired: true
                    availabilityType: START_TIME
                    deliveryFormats:
                      - QRCODE
                    deliveryMethods:
                      - TICKET
                    redemptionMethod: DIGITAL
                    options:
                      - id: DEFAULT
                        default: true
                        internalName: DEFAULT
                        reference: null
                        availabilityLocalStartTimes:
                          - "00:00"
                        cancellationCutoff: 1 hour
                        cancellationCutoffAmount: 1
                        cancellationCutoffUnit: hour
                        requiredContactFields:
                          - firstName
                        restrictions:
                          minUnits: 0
                          maxUnits: 9
                        units:
                          - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                            internalName: Adult
                            reference: null
                            type: ADULT
                            restrictions:
                              minAge: 18
                              maxAge: 99
                              idRequired: false
                              minQuantity: 1
                              maxQuantity: 10
                              paxCount: 1
                              accompaniedBy: []
                            requiredContactFields:
                              - firstName
                          - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                            internalName: Child
                            reference: null
                            type: CHILD
                            restrictions:
                              minAge: 3
                              maxAge: 12
                              idRequired: false
                              minQuantity: 1
                              maxQuantity: 10
                              paxCount: 1
                              accompaniedBy: []
                            requiredContactFields:
                              - firstName
                          - id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                            internalName: Infant
                            reference: null
                            type: INFANT
                            restrictions:
                              minAge: 0
                              maxAge: 3
                              idRequired: false
                              minQuantity: 1
                              maxQuantity: 10
                              paxCount: 1
                              accompaniedBy:
                                - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                            requiredContactFields:
                              - firstName
                Product with octo/content:
                  summary: Product with octo/content
                  description: Product with octo/content
                  value:
                    id: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
                    internalName: London Eye General Admission
                    reference: LEYE-GA
                    locale: en-GB
                    timeZone: Europe/London
                    allowFreesale: true
                    instantConfirmation: true
                    instantDelivery: true
                    availabilityRequired: true
                    availabilityType: START_TIME
                    deliveryFormats:
                      - QRCODE
                    deliveryMethods:
                      - TICKET
                    redemptionMethod: DIGITAL
                    options:
                      - id: DEFAULT
                        default: true
                        internalName: DEFAULT
                        reference: null
                        availabilityLocalStartTimes:
                          - "00:00"
                        cancellationCutoff: 1 hour
                        cancellationCutoffAmount: 1
                        cancellationCutoffUnit: hour
                        requiredContactFields:
                          - firstName
                        restrictions:
                          minUnits: 0
                          maxUnits: 9
                        units:
                          - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                            internalName: Adult
                            reference: null
                            type: ADULT
                            restrictions:
                              minAge: 18
                              maxAge: 99
                              idRequired: false
                              minQuantity: 1
                              maxQuantity: 10
                              paxCount: 1
                              accompaniedBy: []
                            requiredContactFields:
                              - firstName
                            title: ""
                            shortDescription: ""
                            features:
                              - shortDescription: ""
                                type: CANCELLATION_TERM
                          - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                            internalName: Child
                            reference: null
                            type: CHILD
                            restrictions:
                              minAge: 3
                              maxAge: 12
                              idRequired: false
                              minQuantity: 1
                              maxQuantity: 10
                              paxCount: 1
                              accompaniedBy: []
                            requiredContactFields:
                              - firstName
                            title: ""
                            shortDescription: ""
                            features:
                              - shortDescription: ""
                                type: CANCELLATION_TERM
                          - id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                            internalName: Infant
                            reference: null
                            type: INFANT
                            restrictions:
                              minAge: 0
                              maxAge: 3
                              idRequired: false
                              minQuantity: 1
                              maxQuantity: 10
                              paxCount: 1
                              accompaniedBy:
                                - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                            requiredContactFields:
                              - firstName
                            title: ""
                            shortDescription: ""
                            features:
                              - shortDescription: ""
                                type: CANCELLATION_TERM
                        title: ""
                        shortDescription: ""
                        description: ""
                        features:
                          - shortDescription: ""
                            type: CANCELLATION_TERM
                        faqs:
                          - question: ""
                            answer: ""
                        media:
                          - src: ""
                            type: image/jpeg
                            rel: LOGO
                            title: ""
                            caption: ""
                            copyright: ""
                        locations:
                          - title: ""
                            shortDescription: ""
                            types:
                              - POINT_OF_INTEREST
                            minutesTo: null
                            minutesAt: null
                            place:
                              latitude: 55.9533
                              longitude: -3.1883
                              postalAddress:
                                streetAddress: ""
                                addressLocality: ""
                                addressRegion: ""
                                postalCode: ""
                                addressCountry: ""
                                postOfficeBoxNumber: ""
                              identifiers:
                                googlePlaceId: null
                                applePlaceId: null
                                tripadvisorLocationId: null
                                yelpPlaceId: null
                                facebookPlaceId: null
                                foursquarePlaceId: null
                                baiduPlaceId: null
                                amapPlaceId: null
                              sameAs: []
                        categoryLabels:
                          - adults-only
                          - romantic
                        durationMinutesFrom: 30
                        durationMinutesTo: null
                        commentary:
                          - format: IN_PERSON
                            language: ""
                    title: ""
                    shortDescription: ""
                    description: ""
                    features:
                      - shortDescription: ""
                        type: CANCELLATION_TERM
                    faqs:
                      - question: ""
                        answer: ""
                    media:
                      - src: ""
                        type: image/jpeg
                        rel: LOGO
                        title: ""
                        caption: ""
                        copyright: ""
                    locations:
                      - title: ""
                        shortDescription: ""
                        types:
                          - POINT_OF_INTEREST
                        minutesTo: null
                        minutesAt: null
                        place:
                          latitude: 55.9533
                          longitude: -3.1883
                          postalAddress:
                            streetAddress: ""
                            addressLocality: ""
                            addressRegion: ""
                            postalCode: ""
                            addressCountry: ""
                            postOfficeBoxNumber: ""
                          identifiers:
                            googlePlaceId: null
                            applePlaceId: null
                            tripadvisorLocationId: null
                            yelpPlaceId: null
                            facebookPlaceId: null
                            foursquarePlaceId: null
                            baiduPlaceId: null
                            amapPlaceId: null
                          sameAs: []
                    categoryLabels:
                      - adults-only
                      - romantic
                    durationMinutesFrom: 30
                    durationMinutesTo: null
                    commentary:
                      - format: IN_PERSON
                        language: ""
                Product with octo/pricng (pricing per unit):
                  summary: Product with octo/pricng (pricing per unit)
                  description: Product with octo/pricng (pricing per unit)
                  value:
                    id: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
                    internalName: London Eye General Admission
                    reference: LEYE-GA
                    locale: en-GB
                    timeZone: Europe/London
                    allowFreesale: true
                    instantConfirmation: true
                    instantDelivery: true
                    availabilityRequired: true
                    availabilityType: START_TIME
                    deliveryFormats:
                      - QRCODE
                    deliveryMethods:
                      - TICKET
                    redemptionMethod: DIGITAL
                    options:
                      - id: DEFAULT
                        default: true
                        internalName: DEFAULT
                        reference: null
                        availabilityLocalStartTimes:
                          - "00:00"
                        cancellationCutoff: 1 hour
                        cancellationCutoffAmount: 1
                        cancellationCutoffUnit: hour
                        requiredContactFields:
                          - firstName
                        restrictions:
                          minUnits: 0
                          maxUnits: 9
                        units:
                          - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                            internalName: Adult
                            reference: null
                            type: ADULT
                            restrictions:
                              minAge: 18
                              maxAge: 99
                              idRequired: false
                              minQuantity: 1
                              maxQuantity: 10
                              paxCount: 1
                              accompaniedBy: []
                            requiredContactFields:
                              - firstName
                            pricingFrom:
                              - original: 1000
                                retail: 1000
                                net: 8000
                                currency: EUR
                                currencyPrecision: 2
                                includedTaxes: []
                              - original: 1000
                                retail: 1000
                                net: 8000
                                currency: USD
                                currencyPrecision: 2
                                includedTaxes: []
                          - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                            internalName: Child
                            reference: null
                            type: CHILD
                            restrictions:
                              minAge: 3
                              maxAge: 12
                              idRequired: false
                              minQuantity: 1
                              maxQuantity: 10
                              paxCount: 1
                              accompaniedBy: []
                            requiredContactFields:
                              - firstName
                            pricingFrom:
                              - original: 500
                                retail: 500
                                net: 400
                                currency: EUR
                                currencyPrecision: 2
                                includedTaxes: []
                              - original: 500
                                retail: 500
                                net: 400
                                currency: USD
                                currencyPrecision: 2
                                includedTaxes: []
                          - id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                            internalName: Infant
                            reference: null
                            type: INFANT
                            restrictions:
                              minAge: 0
                              maxAge: 3
                              idRequired: false
                              minQuantity: 1
                              maxQuantity: 10
                              paxCount: 1
                              accompaniedBy:
                                - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                            requiredContactFields:
                              - firstName
                            pricingFrom:
                              - original: 0
                                retail: 0
                                net: 0
                                currency: EUR
                                currencyPrecision: 2
                                includedTaxes: []
                              - original: 0
                                retail: 0
                                net: 0
                                currency: USD
                                currencyPrecision: 2
                                includedTaxes: []
                    defaultCurrency: USD
                    availableCurrencies:
                      - USD
                      - EUR
                    pricingPer: UNIT
                Product with octo/pricng (pricing per booking):
                  summary: Product with octo/pricng (pricing per booking)
                  description: Product with octo/pricng (pricing per booking)
                  value:
                    id: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
                    internalName: London Eye General Admission
                    reference: LEYE-GA
                    locale: en-GB
                    timeZone: Europe/London
                    allowFreesale: true
                    instantConfirmation: true
                    instantDelivery: true
                    availabilityRequired: true
                    availabilityType: START_TIME
                    deliveryFormats:
                      - QRCODE
                    deliveryMethods:
                      - TICKET
                    redemptionMethod: DIGITAL
                    options:
                      - id: DEFAULT
                        default: true
                        internalName: DEFAULT
                        reference: null
                        availabilityLocalStartTimes:
                          - "00:00"
                        cancellationCutoff: 1 hour
                        cancellationCutoffAmount: 1
                        cancellationCutoffUnit: hour
                        requiredContactFields:
                          - firstName
                        restrictions:
                          minUnits: 0
                          maxUnits: 9
                        units:
                          - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                            internalName: Adult
                            reference: null
                            type: ADULT
                            restrictions:
                              minAge: 18
                              maxAge: 99
                              idRequired: false
                              minQuantity: 1
                              maxQuantity: 10
                              paxCount: 1
                              accompaniedBy: []
                            requiredContactFields:
                              - firstName
                          - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                            internalName: Child
                            reference: null
                            type: CHILD
                            restrictions:
                              minAge: 3
                              maxAge: 12
                              idRequired: false
                              minQuantity: 1
                              maxQuantity: 10
                              paxCount: 1
                              accompaniedBy: []
                            requiredContactFields:
                              - firstName
                          - id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                            internalName: Infant
                            reference: null
                            type: INFANT
                            restrictions:
                              minAge: 0
                              maxAge: 3
                              idRequired: false
                              minQuantity: 1
                              maxQuantity: 10
                              paxCount: 1
                              accompaniedBy:
                                - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                            requiredContactFields:
                              - firstName
                        pricingFrom:
                          - original: 2000
                            retail: 2000
                            net: 1600
                            currency: EUR
                            currencyPrecision: 2
                            includedTaxes: []
                    defaultCurrency: USD
                    availableCurrencies:
                      - USD
                      - EUR
                    pricingPer: BOOKING
        "400":
          description: The server could not understand the request due to invalid syntax.
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: "#/components/schemas/ErrorInvalidProductID"
                  - $ref: "#/components/schemas/ErrorUnauthorized"
                  - $ref: "#/components/schemas/ErrorInternalServerError"
                  - $ref: "#/components/schemas/ErrorForbidden"
              examples:
                Forbidden Response:
                  summary: Forbidden Response
                  description: Forbidden Response
                  value:
                    error: FORBIDDEN
                    errorMessage: You sent an API Key that was invalid or has been revoked by the backend system. Or you're trying to access an endpoint/resource that you do not have access to
                Internal Server Error Response:
                  summary: Internal Server Error Response
                  description: Internal Server Error Response
                  value:
                    error: INTERNAL_SERVER_ERROR
                    errorMessage: There was an un-recoverable error, please try again
                Unauthorized Response:
                  summary: Unauthorized Response
                  description: Unauthorized Response
                  value:
                    error: UNAUTHORIZED
                    errorMessage: You didn't send the API Key in the Authorization header to an endpoint that requires authentication
                Invalid Product Id Response:
                  summary: Invalid Product Id Response
                  description: Invalid Product Id Response
                  value:
                    error: INVALID_PRODUCT_ID
                    errorMessage: The productId was missing or invalid
                    productId: cc2a6d56-6efe-426f-99c9-6eb10e341565
      tags:
        - Products
  /supplier/:
    get:
      operationId: Suppliers_get
      summary: Get Supplier
      description: Returns the supplier and associated contact details.
      parameters:
        - $ref: "#/components/parameters/RequestHeaders.octoCapabilities"
        - $ref: "#/components/parameters/RequestHeadersContent"
      responses:
        "200":
          description: The request has succeeded.
          headers:
            Octo-Capabilities:
              required: true
              description: A list of the Capabilities (their IDs) initialized with your request.
              schema:
                type: string
            Content-Language:
              required: false
              description: "This response header indicates the language of the content being returned in the response. The OCTO specification allows only one language to be returned per response. This code must conform to the BCP 47 standard, following RFC 5646 and RFC 4647 specifications for language tags. Examples include en-US for American English, fr-FR for French (France), and es-ES for Spanish (Spain).  To obtain content in multiple languages, separate requests must be made for each desired language. This header is defined in the HTTP/1.1 specification (RFC 7231). For more information, see MDN Web Docs: Content-Language - HTTP | MDN. This response header is required when using Content capability."
              schema:
                type: string
                x-capability-data:
                  capability: octo/content
                  required: true
              x-capability-data:
                capability: octo/content
                required: true
            Available-Languages:
              required: false
              description: This response header is used to inform of the languages in which content is available, helping understand the language options without needing additional requests. This code must conform to the BCP 47 standard, following RFC 5646 and RFC 4647 specifications for language tags. Examples include en-US for American English, fr-FR for French (France), and es-ES for Spanish (Spain).  Although not a standard HTTP header, it is commonly used in APIs to list available languages, such as en-US, fr-CA, es-ES, indicating that content can be requested in U.S. English, Canadian French, or Spanish. This response header is required when using Content capability.
              schema:
                type: string
                x-capability-data:
                  capability: octo/content
                  required: true
              x-capability-data:
                capability: octo/content
                required: true
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Supplier"
              examples:
                Supplier example:
                  summary: Supplier example
                  description: Supplier example
                  value:
                    id: 697e3ce8-1860-4cbf-80ad-95857df1f640
                    name: Merlin Entertainments
                    endpoint: https://api.my-booking-platform.com/v1
                    contact:
                      website: null
                      email: support@ventrata.com
                      telephone: null
                      address: Marble Arch, London, W1H 7EJ, United Kingdom
                Supplier with octo/content:
                  summary: Supplier with octo/content
                  description: Supplier with octo/content
                  value:
                    id: 697e3ce8-1860-4cbf-80ad-95857df1f640
                    name: Merlin Entertainments
                    endpoint: https://api.my-booking-platform.com/v1
                    contact:
                      website: null
                      email: support@ventrata.com
                      telephone: null
                      address: Marble Arch, London, W1H 7EJ, United Kingdom
                    shortDescription: ""
                    media:
                      - src: ""
                        type: image/jpeg
                        rel: LOGO
                        title: ""
                        caption: ""
                        copyright: ""
        "400":
          description: The server could not understand the request due to invalid syntax.
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: "#/components/schemas/ErrorUnauthorized"
                  - $ref: "#/components/schemas/ErrorInternalServerError"
                  - $ref: "#/components/schemas/ErrorForbidden"
              examples:
                Forbidden Response:
                  summary: Forbidden Response
                  description: Forbidden Response
                  value:
                    error: FORBIDDEN
                    errorMessage: You sent an API Key that was invalid or has been revoked by the backend system. Or you're trying to access an endpoint/resource that you do not have access to
                Internal Server Error Response:
                  summary: Internal Server Error Response
                  description: Internal Server Error Response
                  value:
                    error: INTERNAL_SERVER_ERROR
                    errorMessage: There was an un-recoverable error, please try again
                Unauthorized Response:
                  summary: Unauthorized Response
                  description: Unauthorized Response
                  value:
                    error: UNAUTHORIZED
                    errorMessage: You didn't send the API Key in the Authorization header to an endpoint that requires authentication
      tags:
        - Supplier
security:
  - BearerAuth: []
components:
  parameters:
    BookingCancellationRequest.uuid:
      name: uuid
      in: path
      required: true
      description: The UUID of the booking
      schema:
        type: string
    BookingConfirmationRequest.uuid:
      name: uuid
      in: path
      required: true
      description: The UUID of the booking
      schema:
        type: string
    BookingUpdateRequest.uuid:
      name: uuid
      in: path
      required: true
      description: The UUID of the booking
      schema:
        type: string
    ExtendReservationRequest.uuid:
      name: uuid
      in: path
      required: true
      description: The UUID of the booking
      schema:
        type: string
    GetBookingRequest.uuid:
      name: uuid
      in: path
      required: true
      description: The UUID of the booking
      schema:
        type: string
    GetBookingsQuery.resellerReference:
      name: resellerReference
      in: query
      required: false
      description: The reseller reference on the booking
      schema:
        type: string
      explode: false
    GetBookingsQuery.supplierReference:
      name: supplierReference
      in: query
      required: false
      description: The reference provided by the supplier
      schema:
        type: string
      explode: false
    GetProductRequest.id:
      name: id
      in: path
      required: true
      description: The product id
      schema:
        type: string
    RequestHeaders.octoCapabilities:
      name: Octo-Capabilities
      in: header
      required: true
      description: A list of the Capabilities (their IDs) initialized with your request.
      schema:
        type: string
    RequestHeadersContent:
      name: Accept-Language
      in: header
      required: false
      description: "This optional request header allows to specify preferred languages for content in the response. A language code that specifies the language of the product content. This code must conform to the BCP 47 standard, following RFC 5646 and RFC 4647 specifications for language tags. Examples include en-US for American English, fr-FR for French (France), and es-ES for Spanish (Spain). This header supports a comma-separated list of language tags with optional quality values (q) to indicate priority, such as en-US, fr-CA;q=0.8, fr;q=0.7, which prioritizes U.S. English, followed by Canadian French, and general French. This header is defined in the HTTP/1.1 specification (RFC 7231) and is commonly used for internationalized websites and services to enhance user experience. For more details, visit MDN Web Docs: Accept-Language - HTTP | MDN. Note this only determines preference and does not guarantee location has content available in the desired language."
      schema:
        type: string
        x-capability-data:
          capability: octo/content
          required: true
      x-capability-data:
        capability: octo/content
        required: true
  schemas:
    Availability:
      type: object
      required:
        - id
        - localDateTimeStart
        - localDateTimeEnd
        - utcCutoffAt
        - allDay
        - available
        - status
        - vacancies
        - capacity
        - maxUnits
        - openingHours
      properties:
        id:
          type: string
          description: A unique identifier for this availability. This ID is used during booking and must be unique within the scope of an option.
          example: "2022-05-23T00:00:00+01:00"
        localDateTimeStart:
          type: string
          description: The start time for this availability in the product’s local time zone. This value must conform to ISO 8601 standards (e.g., "2024-11-17T09:00:00+00:00").
          example: "2022-05-23T00:00:00+01:00"
        localDateTimeEnd:
          type: string
          description: The end time for this availability in the product’s local time zone. It must also adhere to ISO 8601 standards.
          example: "2022-05-24T00:00:00+01:00"
        utcCutoffAt:
          type: string
          format: date-time
          description: The time by which the booking must be confirmed at
          example: "2022-05-22T23:00:00Z"
        allDay:
          type: boolean
          description: Indicates if this availability spans the entire day. If set to true, there will be no specific start or end times for this availability.
          example: false
        available:
          type: boolean
          description: Indicates if there are remaining slots available for this date or time slot.
          example: true
        status:
          allOf:
            - $ref: "#/components/schemas/AvailabilityStatus"
          description: |-
            Defines the current status of the availability:
            AVAILABLE: Open for booking.
            FREESALE: Unlimited availability, no capacity limits.
            SOLD_OUT: No spots available.
            LIMITED: Less than 50% capacity remaining.
            CLOSED: The availability is closed.
          example: AVAILABLE
        vacancies:
          type: integer
          nullable: true
          description: Specifies the number of available slots remaining. Should be nulled or omitted when status is FREESALE. If availability is tracked per unit, this represents the maximum remaining quantity across all units.
          example: 10
        capacity:
          type: integer
          nullable: true
          description: The total capacity for this availability.
          example: 10
        maxUnits:
          type: integer
          nullable: true
          description: The maximum number of units that can be sold in a single booking during this availability slot.
          example: null
        openingHours:
          type: array
          items:
            $ref: "#/components/schemas/OpeningHours"
          description: Defines the opening hours for this availability, even for start time-based availability. Supports multiple periods for breaks in the day.
          example:
            - from: "08:00"
              to: "16:00"
        unitPricing:
          type: array
          items:
            $ref: "#/components/schemas/PricingUnit"
          description: "Is on the object when Pricing capability is requested. "
          example:
            - unitId: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
              original: 1000
              retail: 1000
              net: 8000
              currency: EUR
              currencyPrecision: 2
              includedTaxes: []
            - unitId: child_797e3ce8-1860-4cbf-80ad-95857df1f640
              original: 500
              retail: 500
              net: 400
              currency: EUR
              currencyPrecision: 2
              includedTaxes: []
            - unitId: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
              original: 0
              retail: 0
              net: 0
              currency: EUR
              currencyPrecision: 2
              includedTaxes: []
          x-capability-data:
            capability: octo/pricing
            required: true
        pricing:
          allOf:
            - $ref: "#/components/schemas/Pricing"
          description: "Is on the object when Pricing capability is requested. "
          example:
            original: 2000
            retail: 2000
            net: 1600
            currency: EUR
            currencyPrecision: 2
            includedTaxes: []
          x-capability-data:
            capability: octo/pricing
            required: true
        title:
          type: string
          nullable: true
          description: "The public, customer-facing for the availablity. This name is displayed to end customers and should accurately represent the option for marketing and sales purposes. Can be null when not appliable "
          example: ""
          x-capability-data:
            capability: octo/content
            required: true
        shortDescription:
          type: string
          description: "A brief, customer-facing description of the availability. This field provides a concise overview of availability. "
          example: ""
          x-capability-data:
            capability: octo/content
            required: true
      example:
        id: "2022-05-23T00:00:00+01:00"
        localDateTimeStart: "2022-05-23T00:00:00+01:00"
        localDateTimeEnd: "2022-05-24T00:00:00+01:00"
        utcCutoffAt: "2022-05-22T23:00:00Z"
        allDay: false
        available: true
        status: AVAILABLE
        vacancies: 10
        capacity: 10
        maxUnits: null
        openingHours:
          - from: "08:00"
            to: "16:00"
    AvailabilityCalendar:
      type: object
      required:
        - localDate
        - available
        - status
        - vacancies
        - capacity
        - openingHours
      properties:
        localDate:
          type: string
          description: The specific date for querying availability on Availability Calendar endpoint. This field must follow the ISO 8601 date format (e.g., 2024-11-18). It ensures standardized representation of dates across different systems.
          example: "2022-05-12"
        available:
          type: boolean
          description: |-
            Indicates whether there is any remaining availability for the specified date.
            true: Availability exists.
            false: Fully booked or unavailable.
          example: true
        status:
          allOf:
            - $ref: "#/components/schemas/AvailabilityStatus"
          description: |-
            Defines the current status of the availability date:
            AVAILABLE: Open for booking.
            FREESALE: Unlimited availability, no capacity limits.
            SOLD_OUT: No spots available.
            LIMITED: Less than 50% capacity remaining.
            CLOSED: The availability is closed.
          example: AVAILABLE
        vacancies:
          type: integer
          nullable: true
          description: Specifies the number of available slots remaining quantity (highest remaining vacancies from all availabilities of this day). Should be nulled or omitted when status is FREESALE.
          example: 10
        capacity:
          type: integer
          nullable: true
          description: "The total capacity for this availability date. "
          example: 10
        openingHours:
          type: array
          items:
            $ref: "#/components/schemas/OpeningHours"
          description: Defines the opening hours for this availability, even for start time-based availability. Supports multiple periods for breaks in the day.
          example:
            - from: "08:00"
              to: "16:00"
        unitPricingFrom:
          type: array
          items:
            $ref: "#/components/schemas/PricingUnit"
          description: "Is on the object when Pricing capability is requested. "
          example:
            - unitId: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
              original: 1000
              retail: 1000
              net: 8000
              currency: EUR
              currencyPrecision: 2
              includedTaxes: []
            - unitId: child_797e3ce8-1860-4cbf-80ad-95857df1f640
              original: 500
              retail: 500
              net: 400
              currency: EUR
              currencyPrecision: 2
              includedTaxes: []
            - unitId: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
              original: 0
              retail: 0
              net: 0
              currency: EUR
              currencyPrecision: 2
              includedTaxes: []
          x-capability-data:
            capability: octo/pricing
            required: true
        pricingFrom:
          allOf:
            - $ref: "#/components/schemas/Pricing"
          description: "Is on the object when Pricing capability is requested. "
          example:
            original: 2000
            retail: 2000
            net: 1600
            currency: EUR
            currencyPrecision: 2
            includedTaxes: []
          x-capability-data:
            capability: octo/pricing
            required: true
      example:
        localDate: "2022-05-12"
        available: true
        status: AVAILABLE
        vacancies: 10
        capacity: 10
        openingHours:
          - from: "08:00"
            to: "16:00"
    AvailabilityCalendarBody:
      type: object
      required:
        - productId
        - optionId
      properties:
        productId:
          type: string
          description: The product id.
          example: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
        optionId:
          type: string
          description: The option id.
          example: DEFAULT
        localDateStart:
          type: string
          description: Start date to query for (YYYY-MM-DD).
          example: "2022-05-23"
        localDateEnd:
          type: string
          description: End date to query for (YYYY-MM-DD).
          example: "2022-05-29"
        units:
          type: array
          items:
            $ref: "#/components/schemas/AvailabilityUnit"
          description: A list of units.
          example:
            - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
              quantity: 2
            - id: child_797e3ce8-1860-4cbf-80ad-95857df1f640
              quantity: 1
        currency:
          type: string
          nullable: true
          description: Can be used only when pricing capability is used.
          example: USD
      example:
        productId: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
        optionId: DEFAULT
        localDateStart: "2022-05-23"
        localDateEnd: "2022-05-29"
    AvailabilityCalendarPricing:
      type: object
      properties:
        unitPricingFrom:
          type: array
          items:
            $ref: "#/components/schemas/PricingUnit"
          description: "Is on the object when Pricing capability is requested. "
          example:
            - unitId: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
              original: 1000
              retail: 1000
              net: 8000
              currency: EUR
              currencyPrecision: 2
              includedTaxes: []
            - unitId: child_797e3ce8-1860-4cbf-80ad-95857df1f640
              original: 500
              retail: 500
              net: 400
              currency: EUR
              currencyPrecision: 2
              includedTaxes: []
            - unitId: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
              original: 0
              retail: 0
              net: 0
              currency: EUR
              currencyPrecision: 2
              includedTaxes: []
          x-capability-data:
            capability: octo/pricing
            required: true
        pricingFrom:
          allOf:
            - $ref: "#/components/schemas/Pricing"
          description: "Is on the object when Pricing capability is requested. "
          example:
            original: 2000
            retail: 2000
            net: 1600
            currency: EUR
            currencyPrecision: 2
            includedTaxes: []
          x-capability-data:
            capability: octo/pricing
            required: true
      example:
        unitPricingFrom:
          - unitId: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
            original: 1000
            retail: 1000
            net: 8000
            currency: EUR
            currencyPrecision: 2
            includedTaxes: []
          - unitId: child_797e3ce8-1860-4cbf-80ad-95857df1f640
            original: 500
            retail: 500
            net: 400
            currency: EUR
            currencyPrecision: 2
            includedTaxes: []
          - unitId: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
            original: 0
            retail: 0
            net: 0
            currency: EUR
            currencyPrecision: 2
            includedTaxes: []
        pricingFrom:
          original: 2000
          retail: 2000
          net: 1600
          currency: EUR
          currencyPrecision: 2
          includedTaxes: []
    AvailabilityCalendarPricingBody:
      type: object
      properties:
        currency:
          type: string
          nullable: true
          description: Can be used only when pricing capability is used.
          example: USD
    AvailabilityCalendarRequest:
      type: object
      required:
        - body
      properties:
        body:
          allOf:
            - $ref: "#/components/schemas/AvailabilityCalendarBody"
          example:
            productId: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
            optionId: DEFAULT
            localDateStart: "2022-05-23"
            localDateEnd: "2022-05-29"
            units:
              - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                quantity: 2
              - id: child_797e3ce8-1860-4cbf-80ad-95857df1f640
                quantity: 1
    AvailabilityCheckBody:
      type: object
      required:
        - productId
        - optionId
      properties:
        productId:
          type: string
          description: The product id.
          example: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
        optionId:
          type: string
          description: The option id.
          example: DEFAULT
        localDateStart:
          type: string
          description: Start date to query for (YYYY-MM-DD). Required if `localDateEnd` is set.
          example: "2022-05-23"
        localDateEnd:
          type: string
          description: End date to query for (YYYY-MM-DD). Required if `localDateStart` is set.
          example: "2022-05-29"
        availabilityIds:
          type: array
          items:
            type: string
          description: Filter the results by the given ids.
          example:
            - "2022-05-23T00:00:00+01:00"
        units:
          type: array
          items:
            $ref: "#/components/schemas/AvailabilityUnit"
          description: A list of units.
          example:
            - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
              quantity: 2
            - id: child_797e3ce8-1860-4cbf-80ad-95857df1f640
              quantity: 1
        currency:
          type: string
          nullable: true
          description: Can be used only when pricing capability is used.
          example: USD
      example:
        productId: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
        optionId: DEFAULT
        localDateStart: "2022-05-23"
        localDateEnd: "2022-05-29"
    AvailabilityCheckRequest:
      type: object
      required:
        - body
      properties:
        body:
          allOf:
            - $ref: "#/components/schemas/AvailabilityCheckBody"
          example:
            productId: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
            optionId: DEFAULT
            localDateStart: "2022-05-23"
            localDateEnd: "2022-05-29"
            units:
              - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                quantity: 2
              - id: child_797e3ce8-1860-4cbf-80ad-95857df1f640
                quantity: 1
    AvailabilityContent:
      type: object
      properties:
        title:
          type: string
          nullable: true
          description: "The public, customer-facing for the availablity. This name is displayed to end customers and should accurately represent the option for marketing and sales purposes. Can be null when not appliable "
          example: ""
          x-capability-data:
            capability: octo/content
            required: true
        shortDescription:
          type: string
          description: "A brief, customer-facing description of the availability. This field provides a concise overview of availability. "
          example: ""
          x-capability-data:
            capability: octo/content
            required: true
    AvailabilityPricing:
      type: object
      properties:
        unitPricing:
          type: array
          items:
            $ref: "#/components/schemas/PricingUnit"
          description: "Is on the object when Pricing capability is requested. "
          example:
            - unitId: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
              original: 1000
              retail: 1000
              net: 8000
              currency: EUR
              currencyPrecision: 2
              includedTaxes: []
            - unitId: child_797e3ce8-1860-4cbf-80ad-95857df1f640
              original: 500
              retail: 500
              net: 400
              currency: EUR
              currencyPrecision: 2
              includedTaxes: []
            - unitId: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
              original: 0
              retail: 0
              net: 0
              currency: EUR
              currencyPrecision: 2
              includedTaxes: []
          x-capability-data:
            capability: octo/pricing
            required: true
        pricing:
          allOf:
            - $ref: "#/components/schemas/Pricing"
          description: "Is on the object when Pricing capability is requested. "
          example:
            original: 2000
            retail: 2000
            net: 1600
            currency: EUR
            currencyPrecision: 2
            includedTaxes: []
          x-capability-data:
            capability: octo/pricing
            required: true
      example:
        unitPricing:
          - unitId: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
            original: 1000
            retail: 1000
            net: 8000
            currency: EUR
            currencyPrecision: 2
            includedTaxes: []
          - unitId: child_797e3ce8-1860-4cbf-80ad-95857df1f640
            original: 500
            retail: 500
            net: 400
            currency: EUR
            currencyPrecision: 2
            includedTaxes: []
          - unitId: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
            original: 0
            retail: 0
            net: 0
            currency: EUR
            currencyPrecision: 2
            includedTaxes: []
        pricing:
          original: 2000
          retail: 2000
          net: 1600
          currency: EUR
          currencyPrecision: 2
          includedTaxes: []
    AvailabilityPricingBody:
      type: object
      properties:
        currency:
          type: string
          nullable: true
          description: Can be used only when pricing capability is used.
          example: USD
    AvailabilityStatus:
      type: string
      enum:
        - AVAILABLE
        - FREESALE
        - SOLD_OUT
        - LIMITED
        - CLOSED
      example: AVAILABLE
    AvailabilityType:
      type: string
      enum:
        - START_TIME
        - OPENING_HOURS
      example: START_TIME
    AvailabilityUnit:
      type: object
      required:
        - id
        - quantity
      properties:
        id:
          type: string
          description: The unit id.
          example: adult
        quantity:
          type: integer
          description: The quantity of the unit.
          example: 2
      description: A list of units.
      example:
        id: adult
        quantity: 2
    BaseError:
      type: object
      required:
        - error
        - errorMessage
      properties:
        error:
          type: string
          description: The error code. A table of possible error codes is shown below.
        errorMessage:
          type: string
          description: A human-readable error message will be translated depending on the language provided by the Accept-Language header.
    Booking:
      type: object
      required:
        - id
        - uuid
        - testMode
        - resellerReference
        - supplierReference
        - status
        - utcCreatedAt
        - utcUpdatedAt
        - utcExpiresAt
        - utcRedeemedAt
        - utcConfirmedAt
        - productId
        - optionId
        - cancellable
        - cancellation
        - freesale
        - availabilityId
        - availability
        - contact
        - notes
        - deliveryMethods
        - voucher
        - unitItems
      properties:
        id:
          type: string
          description: A unique identifier generated by the supplier system for the booking. This ID ensures traceability and must be unique within the system.
          example: bbbb6227-54fc-4c32-9ed7-dc3eb99966ea
        uuid:
          type: string
          format: uuid
          description: An optional idempotency key set when creating a booking to prevent duplicate bookings in case of retries. Used for API calls.
          example: 559aed3d-6d5b-4fe0-bfca-99f5e7218a56
        testMode:
          type: boolean
          description: Indicates whether the booking was created in test mode. If true, it is a test booking.
          example: false
        resellerReference:
          type: string
          nullable: true
          description: A reference provided by the reseller to identify the booking.
          example: null
        supplierReference:
          type: string
          nullable: true
          description: A reference provided by the reseller to identify the booking.
          example: XOPSUT
        status:
          allOf:
            - $ref: "#/components/schemas/BookingStatus"
          description: |-
            Represents the current state of the booking:
            ON_HOLD: Awaiting confirmation.
            EXPIRED: Not confirmed within the hold expiration time.
            CONFIRMED: Successfully confirmed.
            CANCELLED: The booking was canceled.
            PENDING: Awaiting external confirmation.
            REDEEMED: The booking has been used.
          example: CONFIRMED
        utcCreatedAt:
          type: string
          format: date-time
          description: An ISO8601 date time in UTC when the booking was created.
          example: "2022-05-25T10:34:22Z"
        utcUpdatedAt:
          type: string
          format: date-time
          description: An ISO8601 date time in UTC when the booking was last updated, if applicable.
          example: "2022-05-25T10:34:22Z"
        utcExpiresAt:
          type: string
          format: date-time
          nullable: true
          description: An ISO8601 date times in UTC for when this booking is due to expire if the status is ON_HOLD.
          example: "2022-05-25T11:04:22Z"
        utcRedeemedAt:
          type: string
          format: date-time
          nullable: true
          description: An ISO8601 date time in UTC at when the booking was redeemed, if applicable.
          example: "2022-06-25T10:34:22Z"
        utcConfirmedAt:
          type: string
          format: date-time
          nullable: true
          description: An ISO8601 date time in UTC when the booking was confirmed, if applicable.
          example: "2022-05-25T11:00:22Z"
        productId:
          type: string
          description: The ID of product booked.
          example: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
        product:
          allOf:
            - $ref: "#/components/schemas/Product"
          description: "The object of booked product. "
          example:
            id: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
            internalName: London Eye General Admission
            reference: LEYE-GA
            locale: en-GB
            timeZone: Europe/London
            allowFreesale: true
            instantConfirmation: true
            instantDelivery: true
            availabilityRequired: true
            availabilityType: START_TIME
            deliveryFormats:
              - QRCODE
            deliveryMethods:
              - TICKET
            redemptionMethod: DIGITAL
            options:
              - id: DEFAULT
                default: true
                internalName: DEFAULT
                reference: null
                availabilityLocalStartTimes:
                  - "00:00"
                cancellationCutoff: 1 hour
                cancellationCutoffAmount: 1
                cancellationCutoffUnit: hour
                requiredContactFields:
                  - firstName
                restrictions:
                  minUnits: 0
                  maxUnits: 9
                units:
                  - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                    internalName: Adult
                    reference: null
                    type: ADULT
                    restrictions:
                      minAge: 18
                      maxAge: 99
                      idRequired: false
                      minQuantity: 1
                      maxQuantity: 10
                      paxCount: 1
                      accompaniedBy: []
                    requiredContactFields:
                      - firstName
                  - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                    internalName: Child
                    reference: null
                    type: CHILD
                    restrictions:
                      minAge: 3
                      maxAge: 12
                      idRequired: false
                      minQuantity: 1
                      maxQuantity: 10
                      paxCount: 1
                      accompaniedBy: []
                    requiredContactFields:
                      - firstName
                  - id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                    internalName: Infant
                    reference: null
                    type: INFANT
                    restrictions:
                      minAge: 0
                      maxAge: 3
                      idRequired: false
                      minQuantity: 1
                      maxQuantity: 10
                      paxCount: 1
                      accompaniedBy:
                        - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                    requiredContactFields:
                      - firstName
        optionId:
          type: string
          description: The ID of option booked.
          example: DEFAULT
        option:
          allOf:
            - $ref: "#/components/schemas/Option"
          description: The ID of option booked.
          example:
            id: DEFAULT
            default: true
            internalName: DEFAULT
            reference: null
            availabilityLocalStartTimes:
              - "00:00"
            cancellationCutoff: 1 hour
            cancellationCutoffAmount: 1
            cancellationCutoffUnit: hour
            requiredContactFields:
              - firstName
            restrictions:
              minUnits: 0
              maxUnits: 9
            units:
              - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                internalName: Adult
                reference: null
                type: ADULT
                restrictions:
                  minAge: 18
                  maxAge: 99
                  idRequired: false
                  minQuantity: 1
                  maxQuantity: 10
                  paxCount: 1
                  accompaniedBy: []
                requiredContactFields:
                  - firstName
              - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                internalName: Child
                reference: null
                type: CHILD
                restrictions:
                  minAge: 3
                  maxAge: 12
                  idRequired: false
                  minQuantity: 1
                  maxQuantity: 10
                  paxCount: 1
                  accompaniedBy: []
                requiredContactFields:
                  - firstName
              - id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                internalName: Infant
                reference: null
                type: INFANT
                restrictions:
                  minAge: 0
                  maxAge: 3
                  idRequired: false
                  minQuantity: 1
                  maxQuantity: 10
                  paxCount: 1
                  accompaniedBy:
                    - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                requiredContactFields:
                  - firstName
        cancellable:
          type: boolean
          description: The object of booked option.
          example: true
        cancellation:
          type: object
          allOf:
            - $ref: "#/components/schemas/BookingCancellation"
          nullable: true
          description: A boolean field indicating whether this booking can be cancelled.
          example:
            refund: FULL
            reason: this product sucks
            utcCancelledAt: "2022-05-25T11:00:22Z"
        freesale:
          type: boolean
          description: Indicates if the booking was made without checking availability.
          example: false
        availabilityId:
          type: string
          nullable: true
          description: The ID of availability booked.
          example: ""
        availability:
          type: object
          allOf:
            - $ref: "#/components/schemas/Availability"
          nullable: true
          description: The availability object that was booked.
          example:
            id: "2022-05-23T00:00:00+01:00"
            localDateTimeStart: "2022-05-23T00:00:00+01:00"
            localDateTimeEnd: "2022-05-24T00:00:00+01:00"
            utcCutoffAt: "2022-05-22T23:00:00Z"
            allDay: false
            available: true
            status: AVAILABLE
            vacancies: 10
            capacity: 10
            maxUnits: null
            openingHours:
              - from: "08:00"
                to: "16:00"
        contact:
          allOf:
            - $ref: "#/components/schemas/Contact"
          description: Customer contact details for the booking (see unit object for per ticket / unit details).
          example:
            fullName: John Doe
            firstName: John
            lastName: Doe
            emailAddress: johndoe@email.com
            phoneNumber: ""
            locales:
              - en
            postalCode: ""
            country: ""
            notes: ""
        notes:
          type: string
          nullable: true
          description: Customer-facing public notes for the booking.
          example: Optional notes for the booking
        deliveryMethods:
          type: array
          items:
            $ref: "#/components/schemas/DeliveryMethod"
          description: |-
            Specifies all supported methods of how tickets or vouchers for this booking are delivered.
            TICKET: Delivered individually per unit in the booking, where each person or unit receives a separate ticket. These will be provided in the ticket object.
            VOUCHER: Delivered as a single voucher for the entire booking, consolidating all units under one document. These will be provided in the voucher object.
            This field ensures clarity on the format of ticket or voucher delivery to resellers and customers.
          example:
            - TICKET
            - VOUCHER
        voucher:
          type: object
          allOf:
            - $ref: "#/components/schemas/Ticket"
          nullable: true
          description: Details for voucher-based delivery, provided when VOUCHER is one of deliveryMethods.
          example:
            redemptionMethod: DIGITAL
            utcRedeemedAt: "2021-10-27T23:28:43Z"
            deliveryOptions:
              - deliveryFormat: QRCODE
                deliveryValue: ""
        unitItems:
          type: array
          items:
            $ref: "#/components/schemas/UnitItem"
          description: An array of unit items included in the booking.
          example:
            - uuid: 3b1bc2ee-3155-4738-9471-f49842a07327
              resellerReference: 4ec08a62-892c-48c1-a608-dc946531a33a
              supplierReference: K9T7R4
              unitId: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
              unit:
                id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                internalName: Adult
                reference: null
                type: ADULT
                restrictions:
                  minAge: 18
                  maxAge: 99
                  idRequired: false
                  minQuantity: 1
                  maxQuantity: 10
                  paxCount: 1
                  accompaniedBy: []
                requiredContactFields:
                  - firstName
              status: ON_HOLD
              utcRedeemedAt: null
              contact:
                fullName: John Doe
                firstName: John
                lastName: Doe
                emailAddress: johndoe@email.com
                phoneNumber: ""
                locales:
                  - en
                postalCode: ""
                country: ""
                notes: ""
              ticket: null
        pricing:
          allOf:
            - $ref: "#/components/schemas/Pricing"
          description: "Is on the object when Pricing capability is requested. "
          example:
            original: 2000
            retail: 2000
            net: 1600
            currency: EUR
            currencyPrecision: 2
            includedTaxes: []
          x-capability-data:
            capability: octo/pricing
            required: true
    BookingCancellation:
      type: object
      required:
        - refund
        - reason
        - utcCancelledAt
      properties:
        refund:
          allOf:
            - $ref: "#/components/schemas/Refund"
          description: Whether the booking was refunded as part of the cancellation. Possible values are FULL, PARTIAL or NONE
          example: FULL
        reason:
          type: string
          nullable: true
          description: A text value describing why the cancellation happened.
          example: this product sucks
        utcCancelledAt:
          type: string
          format: date-time
          description: An ISO8601 date time in UTC indicating when the booking was cancelled.
          example: "2022-05-25T11:00:22Z"
      example:
        refund: FULL
        reason: this product sucks
        utcCancelledAt: "2022-05-25T11:00:22Z"
    BookingCancellationBody:
      type: object
      properties:
        reason:
          type: string
          nullable: true
          description: A text value describing why the cancellation happened.
          example: Whether you want OCTO Cloud to email the guest a copy of their receipt and tickets. (defaults to false)
        force:
          type: boolean
          description: Whether you want OCTO Cloud to email the guest a copy of their receipt and tickets. (defaults to false)
          example: false
      example:
        reason: this product sucks
    BookingCancellationPathParams:
      type: object
      required:
        - uuid
      properties:
        uuid:
          type: string
          description: The UUID of the booking
    BookingConfirmationBody:
      type: object
      required:
        - contact
      properties:
        emailReceipt:
          type: boolean
          description: Whether you want OCTO Cloud to email the guest a copy of their receipt and tickets. (defaults to false)
          example: true
        resellerReference:
          type: string
          description: Your reference for this booking. Also known as a Voucher Number.
          example: VOUCHER-0123
        contact:
          allOf:
            - $ref: "#/components/schemas/BookingContact"
          description: Contact details for the main guest who will attend the tour/attraction. Contact BODY can be applied to both the booking object (the main reservation) or the unit object (individual ticket holders - if the supplier requires this information).
          example:
            fullName: John Doe
            firstName: John
            lastName: Doe
            emailAddress: johndoe@email.com
            phoneNumber: "+447840739436"
            locales:
              - en
              - en-GB
              - en-US
            country: GB
        unitItems:
          type: array
          items:
            $ref: "#/components/schemas/BookingUnitItem"
          description: An array of unit items that will be included in the booking. This allows you to provide contact details or a reseller reference for each unit item. Be careful to make sure you include ALL unit items that you also had in the original booking reservation request, if you provide more or less than in the booking reservation call this will change the number of unit items being purchased also.
          example:
            - uuid: 3b1bc2ee-3155-4738-9471-f49842a07327
              unitId: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
      example:
        resellerReference: VOUCHER-0123
        contact:
          fullName: John Doe
          firstName: John
          lastName: Doe
          emailAddress: johndoe@email.com
          phoneNumber: "+447840739436"
          locales:
            - en
            - en-GB
            - en-US
          country: GB
    BookingConfirmationPathParams:
      type: object
      required:
        - uuid
      properties:
        uuid:
          type: string
          description: The UUID of the booking
    BookingContact:
      type: object
      properties:
        fullName:
          type: string
          nullable: true
          description: The full name of the booking holder or the ticket holder. Can also be retrieved as an alias for the concatenation of `firstName` and `lastName`
          example: John Doe
        firstName:
          type: string
          nullable: true
          description: The first name of the booking holder or the ticket holder.
          example: John
        lastName:
          type: string
          nullable: true
          description: The last name of the booking holder or the ticket holder.
          example: Doe
        emailAddress:
          type: string
          nullable: true
          format: email
          description: The email address of the booking holder or the ticket holder.
          example: johndoe@email.com
        phoneNumber:
          type: string
          nullable: true
          description: The phone number of the booking holder or the ticket holder.
          example: "+447840739436"
        locales:
          type: array
          items:
            type: string
          description: An array of locale values, equivalent to navigator.languages in a browsers environment.
          example:
            - en
            - en-GB
            - en-US
        postalCode:
          type: string
          nullable: true
          description: The PO Box of the booking holder or the ticket holder.
          example: ""
        country:
          type: string
          nullable: true
          description: The country of the booking holder or the ticket holder.
          example: GB
        notes:
          type: string
          nullable: true
          description: Optional notes for the booking.
          example: Optional notes
      example:
        fullName: John Doe
        firstName: John
        lastName: Doe
        emailAddress: johndoe@email.com
        phoneNumber: "+447840739436"
        locales:
          - en
          - en-GB
          - en-US
        country: GB
    BookingPricing:
      type: object
      properties:
        pricing:
          allOf:
            - $ref: "#/components/schemas/Pricing"
          description: "Is on the object when Pricing capability is requested. "
          example:
            original: 2000
            retail: 2000
            net: 1600
            currency: EUR
            currencyPrecision: 2
            includedTaxes: []
          x-capability-data:
            capability: octo/pricing
            required: true
      example:
        pricing:
          original: 2000
          retail: 2000
          net: 1600
          currency: EUR
          currencyPrecision: 2
          includedTaxes: []
    BookingReservationBody:
      type: object
      required:
        - productId
        - optionId
        - unitItems
      properties:
        uuid:
          type: string
          format: uuid
          description: A unique UUID to identify the booking. Setting this value acts like an idempotency key preventing you from double booking.
          example: 559aed3d-6d5b-4fe0-bfca-99f5e7218a56
        productId:
          type: string
          description: The product ID for this booking.
          example: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
        optionId:
          type: string
          description: The option ID for this booking.
          example: DEFAULT
        availabilityId:
          type: string
          description: The availability ID for the selected timeslot.
          example: "2022-05-23T00:00:00+01:00"
        expirationMinutes:
          type: integer
          description: How many minutes to reserve the availability, otherwise defaults to the supplier default amount.
          example: 30
        notes:
          type: string
          nullable: true
          description: Optional notes for the booking.
          example: Optional notes
        unitItems:
          type: array
          items:
            $ref: "#/components/schemas/BookingUnitItem"
          description: An list of unit items that will be included in the booking.
          example:
            - uuid: 3b1bc2ee-3155-4738-9471-f49842a07327
              unitId: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
        resellerReference:
          type: string
          description: Your reference for this booking. Also known as a Voucher Number.
          example: VOUCHER-0123
        contact:
          allOf:
            - $ref: "#/components/schemas/BookingContact"
          description: Contact details for the main guest who will attend the tour/attraction. Contact BODY can be applied to both the booking object (the main reservation) or the unit object (individual ticket holders - if the supplier requires this information).
          example:
            fullName: John Doe
            firstName: John
            lastName: Doe
            emailAddress: johndoe@email.com
            phoneNumber: "+447840739436"
            locales:
              - en
              - en-GB
              - en-US
            country: GB
        currency:
          type: string
          nullable: true
          description: Can be used only when pricing capability is used.
          example: USD
      example:
        productId: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
        optionId: DEFAULT
        availabilityId: "2022-05-23T00:00:00+01:00"
        notes: Optional notes
        unitItems:
          - unitId: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
          - unitId: child_797e3ce8-1860-4cbf-80ad-95857df1f640
          - unitId: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
    BookingReservationPricingBody:
      type: object
      properties:
        currency:
          type: string
          nullable: true
          description: Can be used only when pricing capability is used.
          example: USD
    BookingReservationRequest:
      type: object
      required:
        - body
      properties:
        body:
          allOf:
            - $ref: "#/components/schemas/BookingReservationBody"
          example:
            productId: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
            optionId: DEFAULT
            availabilityId: "2022-05-23T00:00:00+01:00"
            notes: Optional notes
            unitItems:
              - unitId: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
              - unitId: child_797e3ce8-1860-4cbf-80ad-95857df1f640
              - unitId: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
    BookingStatus:
      type: string
      enum:
        - ON_HOLD
        - CONFIRMED
        - EXPIRED
        - CANCELLED
        - REDEEMED
        - PENDING
        - REJECTED
      example: CONFIRMED
    BookingUnitItem:
      type: object
      required:
        - unitId
      properties:
        uuid:
          type: string
          format: uuid
          description: The unit item unit ID.
          example: 3b1bc2ee-3155-4738-9471-f49842a07327
        unitId:
          type: string
          description: A unique UUID to identify the unit, same as the booking uuid except per unit.
          example: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
        resellerReference:
          type: string
        contact:
          $ref: "#/components/schemas/BookingContact"
      example:
        uuid: 3b1bc2ee-3155-4738-9471-f49842a07327
        unitId: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
    BookingUpdateBody:
      type: object
      properties:
        resellerReference:
          type: string
          description: Your reference for this booking. Also known as a Voucher Number.
          example: VOUCHER-0123
        productId:
          type: string
          description: The product ID.
          example: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
        optionId:
          type: string
          description: The option id.
          example: DEFAULT
        availabilityId:
          type: string
          description: The availability ID for the selected timeslot.
          example: "2022-05-23T00:00:00+01:00"
        expirationMinutes:
          type: integer
          description: How many minutes to reserve the availability, otherwise defaults to the supplier default amount.
          example: 15
        notes:
          type: string
          nullable: true
          description: Optional notes for the booking.
          example: Optional notes
        emailReceipt:
          type: boolean
          description: Whether you want OCTO Cloud to email the guest a copy of their receipt and tickets. (defaults to false).
          example: true
        unitItems:
          type: array
          items:
            $ref: "#/components/schemas/BookingUnitItem"
          description: An array of unit items in the booking. To retain or modify existing unit items, you must include the unit item with the associated uuid, otherwise that unit item will be removed.
          example:
            - uuid: 3b1bc2ee-3155-4738-9471-f49842a07327
              unitId: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
        contact:
          allOf:
            - $ref: "#/components/schemas/BookingContact"
          description: Contact details for the main guest who will attend the tour/attraction. Contact BODY can be applied to both the booking object (the main reservation) or the unit object (individual ticket holders - if the supplier requires this information).
          example:
            fullName: John Doe
            firstName: John
            lastName: Doe
            emailAddress: johndoe@email.com
            phoneNumber: "+447840739436"
            locales:
              - en
              - en-GB
              - en-US
            country: GB
      example:
        resellerReference: VOUCHER-0123
        productId: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
        optionId: DEFAULT
        availabilityId: "2022-05-23T00:00:00+01:00"
        expirationMinutes: 15
        notes: Optional notes
        emailReceipt: true
        unitItems:
          - uuid: 3b1bc2ee-3155-4738-9471-f49842a07327
            unitId: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
        contact:
          fullName: John Doe
          firstName: John
          lastName: Doe
          emailAddress: johndoe@email.com
          phoneNumber: "+447840739436"
          locales:
            - en
            - en-GB
            - en-US
          country: GB
    BookingUpdatePathParams:
      type: object
      required:
        - uuid
      properties:
        uuid:
          type: string
          description: The UUID of the booking
    Capability:
      type: object
      required:
        - id
        - revision
        - required
        - dependencies
        - docs
      properties:
        id:
          allOf:
            - $ref: "#/components/schemas/CapabilityId"
          description: Unique identifier of the capability.
          example: octo/pricing
        revision:
          type: integer
          format: int32
          description: Revision number for the capability.
          example: 3
        required:
          type: boolean
          description: Whether this capability is required.
          example: true
        dependencies:
          type: array
          items:
            $ref: "#/components/schemas/CapabilityId"
          description: List of dependent capability IDs.
          example: []
        docs:
          type: string
          nullable: true
          description: Optional documentation or description for this capability.
          example: This capability enables booking creation.
      example:
        id: octo/pricing
        revision: 3
        required: true
        dependencies: []
        docs: This capability enables booking creation.
    CapabilityId:
      type: string
      enum:
        - octo/adjustments
        - octo/cart
        - octo/content
        - octo/mappings
        - octo/packages
        - octo/pickups
        - octo/pricing
        - octo/offers
        - octo/questions
        - octo/webhooks
    CategoryLabel:
      type: string
      enum:
        - multi-day
        - city-cards
        - adults-only
        - animals
        - audio-guide
        - beaches
        - bike-tours
        - boat-tours
        - classes
        - day-trips
        - family-friendly
        - fast-track
        - food
        - guided-tours
        - history
        - hop-on-hop-off
        - literature
        - live-music
        - museums
        - nightlife
        - outdoors
        - private-tours
        - romantic
        - recurring-events
        - self-guided
        - small-group-tours
        - sports
        - theme-parks
        - walking-tours
        - wheelchair-accessible
        - accommodation-included
        - trip-difficulty-easy
        - trip-difficulty-medium
        - trip-difficulty-hard
      example: adults-only
    Commentary:
      type: object
      required:
        - format
        - language
      properties:
        format:
          allOf:
            - $ref: "#/components/schemas/CommentaryFormat"
          description: |-
            Specifies the format in which commentary is provided. Possible values are:
            IN_PERSON: Live commentary delivered by a guide or host during the activity. Examples include a tour guide providing real-time explanations about historical landmarks or itinerary highlights.
            RECORDED_AUDIO: Pre-recorded audio commentary accessible during the activity. Delivered via headphones, mobile apps, or speaker systems, covering key details in multiple languages.
            WRITTEN: Commentary provided as written material, such as printed brochures, guidebooks, or on-site informational displays at points of interest.
            OTHER: Commentary formats not explicitly listed, such as augmented reality experiences or interactive digital guides.
          example: IN_PERSON
        language:
          type: string
          description: Specifies the language in which the commentary is offered, adhering to IETF BCP 47 language tags for compatibility.
          example: ""
      example:
        format: IN_PERSON
        language: ""
    CommentaryFormat:
      type: string
      enum:
        - IN_PERSON
        - RECORDED_AUDIO
        - WRITTEN
        - OTHER
      example: IN_PERSON
    Contact:
      type: object
      required:
        - fullName
        - firstName
        - lastName
        - emailAddress
        - phoneNumber
        - locales
        - postalCode
        - country
        - notes
      properties:
        fullName:
          type: string
          nullable: true
          description: The full name of the booking holder. Can also be retrieved as an alias for the concatenation of firstName and lastName
          example: John Doe
        firstName:
          type: string
          nullable: true
          description: The first name of the booking holder.
          example: John
        lastName:
          type: string
          nullable: true
          description: The last name of the booking holder.
          example: Doe
        emailAddress:
          type: string
          nullable: true
          format: email
          description: The email address of the booking holder.
          example: johndoe@email.com
        phoneNumber:
          type: string
          nullable: true
          description: The phone number of the booking holder.
          example: ""
        locales:
          type: array
          items:
            type: string
          description: An array of locale values, equivalent to navigator.languages in a browsers environment; representing customer language for booking communications.
          example:
            - en
        postalCode:
          type: string
          nullable: true
          description: The PO Box of the booking holder or the ticket holder.
          example: ""
        country:
          type: string
          nullable: true
          description: The country of the booking holder or the ticket holder.
          example: ""
        notes:
          type: string
          nullable: true
          description: Customer-facing public notes for the booking.
          example: ""
      example:
        fullName: John Doe
        firstName: John
        lastName: Doe
        emailAddress: johndoe@email.com
        phoneNumber: ""
        locales:
          - en
        postalCode: ""
        country: ""
        notes: ""
    ContactField:
      type: string
      enum:
        - firstName
        - lastName
        - emailAddress
        - phoneNumber
        - country
        - notes
        - locales
        - allowMarketing
        - postalCode
      example: emailAddress
    DeliveryFormat:
      type: string
      enum:
        - PDF_URL
        - QRCODE
        - CODE128
        - PKPASS_URL
        - AZTECCODE
      example: QRCODE
    DeliveryMethod:
      type: string
      enum:
        - VOUCHER
        - TICKET
      example: TICKET
    DeliveryOption:
      type: object
      required:
        - deliveryFormat
        - deliveryValue
      properties:
        deliveryFormat:
          allOf:
            - $ref: "#/components/schemas/DeliveryFormat"
          description: |-
            The format in which vouchers for this product are delivered. Each format specifies how the vouchers will be represented:
            QRCODE: A code presented as a QR Code, commonly used for scanning at entry points.
            CODE128: A linear barcode format widely used for retail and ticketing purposes.
            AZTECCODE: A two-dimensional barcode format similar to QR codes but more compact. It is optimized for small spaces and often used in transportation and event ticketing.
            PDF_URL: A URL linking to a downloadable PDF containing the complete ticket details for this product.
            PKPASS_URL: A URL for adding the ticket to Apple Wallet (Passbook) for easy access on iOS devices.
            This field ensures resellers can understand and integrate the appropriate ticket delivery formats specifically associated with this product."
          example: QRCODE
        deliveryValue:
          type: string
          description: The string with the value of the delivery option, e.g. value behind the QRCODE, CODE128, AZTECCODE, or URL hosting the file for PDF_URL or PKPASS_URL)
          example: ""
      example:
        deliveryFormat: QRCODE
        deliveryValue: ""
    DurationUnit:
      type: string
      enum:
        - minute
        - hour
        - day
      example: hour
    ErrorBadRequest:
      type: object
      allOf:
        - $ref: "#/components/schemas/BaseError"
      example:
        error: BAD_REQUEST
        errorMessage: PAYMENT_DECLINED
    ErrorForbidden:
      type: object
      allOf:
        - $ref: "#/components/schemas/BaseError"
      example:
        error: BAD_REQUEST
        errorMessage: PAYMENT_DECLINED
    ErrorInternalServerError:
      type: object
      allOf:
        - $ref: "#/components/schemas/BaseError"
      example:
        error: INTERNAL_SERVER_ERROR
        errorMessage: There was an un-recoverable error, please try again
    ErrorInvalidAvailabilityID:
      type: object
      required:
        - availabilityId
      properties:
        availabilityId:
          type: string
          description: Missing or invalid `availabilityId` in the request
      allOf:
        - $ref: "#/components/schemas/BaseError"
      example:
        error: INVALID_AVAILABILITY_ID
        errorMessage: The availabilityId was missing or invalid
        availabilityId: "2022-03-12T00:00:00+00:00"
    ErrorInvalidBookingUUID:
      type: object
      required:
        - uuid
      properties:
        uuid:
          type: string
          description: Missing or invalid booking UUID, or if you're confirming the booking the booking may have expired already.
      allOf:
        - $ref: "#/components/schemas/BaseError"
      example:
        error: INVALID_BOOKING_UUID
        errorMessage: The uuid was already used, missing or invalid
        uuid: bbbb6227-54fc-4c32-9ed7-dc3eb99966ea
    ErrorInvalidOptionID:
      type: object
      required:
        - optionId
      properties:
        optionId:
          type: string
          description: Missing or invalid `optionId` in the request
      allOf:
        - $ref: "#/components/schemas/BaseError"
      example:
        error: INVALID_OPTION_ID
        errorMessage: The optionId was missing or invalid
        optionId: 681fea0f-196e-45da-bec7-467bfacb1d87
    ErrorInvalidProductID:
      type: object
      required:
        - productId
      properties:
        productId:
          type: string
          description: Missing or invalid `productId` in the request
      allOf:
        - $ref: "#/components/schemas/BaseError"
      example:
        error: INVALID_PRODUCT_ID
        errorMessage: The productId was missing or invalid
        productId: cc2a6d56-6efe-426f-99c9-6eb10e341565
    ErrorInvalidUnitID:
      type: object
      required:
        - unitId
      properties:
        unitId:
          type: string
          description: Missing or invalid `unitId` in the request
      allOf:
        - $ref: "#/components/schemas/BaseError"
      example:
        error: INVALID_UNIT_ID
        errorMessage: The unitId was missing or invalid
        unitId: senior
    ErrorUnauthorized:
      type: object
      allOf:
        - $ref: "#/components/schemas/BaseError"
      example:
        error: UNAUTHORIZED
        errorMessage: You didn't send the API Key in the Authorization header to an endpoint that requires authentication
    ErrorUnprocessableEntity:
      type: object
      allOf:
        - $ref: "#/components/schemas/BaseError"
      example:
        error: UNPROCESSABLE_ENTITY
        errorMessage: The request body is technically correct but cannot be processed for other reasons. e.g. you tried to cancel a booking after the cancellation cutoff had elapsed
    ExtendReservationBody:
      type: object
      properties:
        expirationMinutes:
          type: integer
      example:
        expirationMinutes: 15
    ExtendReservationPathParams:
      type: object
      required:
        - uuid
      properties:
        uuid:
          type: string
          description: The UUID of the booking
    FAQ:
      type: object
      required:
        - question
        - answer
      properties:
        question:
          type: string
          description: 'The text of the frequently asked question. This should be a well-phrased question that reflects typical customer concerns or queries about the product (e.g., "Is hotel pickup included?", "What is the cancellation policy?"). Note: FAQs are intentionally repeated at both product and option levels, enabling suppliers to address questions specific to each context. Resellers must combine FAQs from both levels for customer presentation.'
          example: ""
        answer:
          type: string
          description: The detailed response to the corresponding question. Answers should be accurate, informative, and written in a way that resolves customer uncertainty (e.g., "Yes, hotel pickup is included within a 10-mile radius of the city center.", "Cancellations are free up to 24 hours before the activity.").
          example: ""
      example:
        question: ""
        answer: ""
    Feature:
      type: object
      required:
        - shortDescription
        - type
      properties:
        shortDescription:
          type: string
          nullable: true
          description: A brief summary of a specific feature, providing quick and precise information about an aspect of the product.
          example: ""
        type:
          allOf:
            - $ref: "#/components/schemas/FeatureType"
          description: |-
            Specifies the category of the feature to ensure clear and organized communication. Each category serves a distinct purpose:

            INCLUSION: Details what is included in the product offering (e.g., "Hotel pickup included," "Lunch provided," "All equipment supplied"), emphasizing the product's completeness and value.
            EXCLUSION: Lists what is not included (e.g., "Gratuities not included," "Admission tickets not provided"), managing customer expectations and reducing ambiguity.
            HIGHLIGHT: Emphasizes the product's key selling points or unique aspects (e.g., "Skip-the-line access to the Eiffel Tower," "Expert-guided tour"), captivating potential customers by showcasing standout qualities.
            PREBOOKING_INFORMATION: Contains essential details customers need to know before booking (e.g., "Not suitable for children under 3 years," "Wear sturdy footwear").
            PREARRIVAL_INFORMATION: Offers details to prepare customers for their experience before arrival (e.g., "Arrive 15 minutes early," "Bring a printed ticket").
            REDEMPTION_INSTRUCTION: Provides clear instructions on how to redeem the product or service (e.g., "Show your booking confirmation at the ticket counter," "Scan your QR code upon entry").
            ACCESSIBILITY_INFORMATION: Highlights accessibility-related details (e.g., "Wheelchair accessible," "No elevators available").
            ADDITIONAL_INFORMATION: Supplies supplementary details that add context or clarity (e.g., "Pets allowed with prior notice," "Multilingual guides available").
            BOOKING_TERM: Describes terms related to the booking process (e.g., "Reservations must be made at least 48 hours in advance," "No changes allowed after booking").
            CANCELLATION_TERM: Explains the terms and conditions for cancellations (e.g., "Free cancellation up to 24 hours before the start time," "Non-refundable").
            This structured classification enhances the product's appeal, ensures transparency, and facilitates informed decision-making for resellers and customers.
          example: CANCELLATION_TERM
      example:
        shortDescription: ""
        type: CANCELLATION_TERM
    FeatureType:
      type: string
      enum:
        - INCLUSION
        - EXCLUSION
        - HIGHLIGHT
        - PREBOOKING_INFORMATION
        - PREARRIVAL_INFORMATION
        - REDEMPTION_INSTRUCTION
        - ACCESSIBILITY_INFORMATION
        - ADDITIONAL_INFORMATION
        - BOOKING_TERM
        - CANCELLATION_TERM
      example: CANCELLATION_TERM
    GetBookingsQueryParams:
      type: object
      properties:
        resellerReference:
          type: string
          description: The reseller reference on the booking
        supplierReference:
          type: string
          description: The reference provided by the supplier
    GetBookingsRequest:
      type: object
      properties:
        resellerReference:
          type: string
          description: The reseller reference on the booking
        supplierReference:
          type: string
          description: The reference provided by the supplier
    GetProductPathParams:
      type: object
      required:
        - id
      properties:
        id:
          type: string
          description: The id of the product
    GetProductsRequest:
      type: object
    GetSupplierRequest:
      type: object
    Identifiers:
      type: object
      required:
        - googlePlaceId
        - applePlaceId
        - tripadvisorLocationId
        - yelpPlaceId
        - facebookPlaceId
        - foursquarePlaceId
        - baiduPlaceId
        - amapPlaceId
      properties:
        googlePlaceId:
          type: string
          nullable: true
        applePlaceId:
          type: string
          nullable: true
        tripadvisorLocationId:
          type: string
          nullable: true
        yelpPlaceId:
          type: string
          nullable: true
        facebookPlaceId:
          type: string
          nullable: true
        foursquarePlaceId:
          type: string
          nullable: true
        baiduPlaceId:
          type: string
          nullable: true
        amapPlaceId:
          type: string
          nullable: true
      description: |-
        Specifies the type or source of the identifier for the location. This field defines the platform or system where the identifier is valid, allowing for seamless integration with third-party systems or mapping platforms. Common examples include:
        googlePlaceId: A unique identifier for locations on Google Maps.
        applePlaceId: A unique identifier for locations on Apple Maps.
        tripadvisorLocationId: A unique identifier for listings on TripAdvisor.
        yelpPlaceId: A unique identifier for locations on Yelp.
        facebookPlaceId: A unique identifier for places on Facebook.
        foursquarePlaceId: A unique identifier for venues on Foursquare.
        baiduPlaceId: A unique identifier for locations on Baidu Maps.
        amapPlaceId: A unique identifier for locations on Amap (China-based mapping platform).
      example:
        googlePlaceId: null
        applePlaceId: null
        tripadvisorLocationId: null
        yelpPlaceId: null
        facebookPlaceId: null
        foursquarePlaceId: null
        baiduPlaceId: null
        amapPlaceId: null
    ListCapabilitiesRequest:
      type: object
    ListCapabilitiesRequestHeaders:
      type: object
    Location:
      type: object
      required:
        - title
        - shortDescription
        - types
        - minutesTo
        - minutesAt
        - place
      properties:
        title:
          type: string
          nullable: true
          description: The name of the location, providing a recognizable identifier for customers (e.g., "Statue of Liberty"). This field can be null if no name is available.
          example: ""
        shortDescription:
          type: string
          nullable: true
          description: A brief description of the location, summarizing its significance or role in the product (e.g., "Historic landmark and popular tourist destination"). This field can be null if no description is provided.
          example: ""
        types:
          type: array
          items:
            $ref: "#/components/schemas/LocationType"
          description: |-
            Specifies the roles or purposes of the location within the product. START: The starting point or meeting location for the product or experience. This is where customers are expected to gather before the activity begins.
            REDEMPTION: A location where customers must go to exchange tickets, collect passes, or redeem vouchers before proceeding to the starting point or experience (if applicable).
            ITINERARY_ITEM: A designated stop or location within the itinerary, typically where customers pause or spend time during a moving tour or activity.
            POINT_OF_INTEREST: A notable location or attraction that customers may see or pass by without stopping. Generally used for sightseeing locations.
            ADMISSION_INCLUDED: A location where entry is included in the product price, often highlighting an attraction or event that customers can access as part of the experience.
            END: The final point or drop-off location where the activity concludes.
          example:
            - POINT_OF_INTEREST
        minutesTo:
          type: integer
          nullable: true
          description: The travel time, in minutes, needed to reach this location from the previous one in the itinerary. Useful for building schedules or itineraries. Set to null if travel time is unknown, not relevant, or not required.
          example: null
        minutesAt:
          type: integer
          nullable: true
          description: The approximate duration, in minutes, spent at this location. Helps provide clarity on the itinerary or scheduling details. Set to null if the time spent is flexible, unknown, or not applicable.
          example: null
        place:
          allOf:
            - $ref: "#/components/schemas/Place"
          description: An object containing detailed geospatial and postal address data for the location.
          example:
            latitude: 55.9533
            longitude: -3.1883
            postalAddress:
              streetAddress: ""
              addressLocality: ""
              addressRegion: ""
              postalCode: ""
              addressCountry: ""
              postOfficeBoxNumber: ""
            identifiers:
              googlePlaceId: null
              applePlaceId: null
              tripadvisorLocationId: null
              yelpPlaceId: null
              facebookPlaceId: null
              foursquarePlaceId: null
              baiduPlaceId: null
              amapPlaceId: null
            sameAs: []
      example:
        title: ""
        shortDescription: ""
        types:
          - POINT_OF_INTEREST
        minutesTo: null
        minutesAt: null
        place:
          latitude: 55.9533
          longitude: -3.1883
          postalAddress:
            streetAddress: ""
            addressLocality: ""
            addressRegion: ""
            postalCode: ""
            addressCountry: ""
            postOfficeBoxNumber: ""
          identifiers:
            googlePlaceId: null
            applePlaceId: null
            tripadvisorLocationId: null
            yelpPlaceId: null
            facebookPlaceId: null
            foursquarePlaceId: null
            baiduPlaceId: null
            amapPlaceId: null
          sameAs: []
    LocationType:
      type: string
      enum:
        - START
        - ITINERARY_ITEM
        - POINT_OF_INTEREST
        - ADMISSION_INCLUDED
        - END
        - REDEMPTION
      example: POINT_OF_INTEREST
    Media:
      type: object
      required:
        - src
        - type
        - rel
        - title
        - caption
        - copyright
      properties:
        src:
          type: string
          format: uri
          description: The URL of the media file. The URL must be stable and publicly accessible.
          example: ""
        type:
          allOf:
            - $ref: "#/components/schemas/MediaType"
          description: |-
            Specifies the type of the media file, which indicates its format and intended usage. Recommended types include: image/jpeg: High-quality compressed images, ideal for general use. Suggested dimensions: 1920x1080 or higher.
            image/png: Images with transparency or higher visual fidelity, recommended for logos. Suggested dimensions: At least 1000x1000 pixels.
            video/mp4: Universal video format for high-quality playback. Suggested resolution: 1080p or higher.
            video/avi: A less common video format; MP4 is generally preferred for compatibility.
            external/youtube: URL links to YouTube videos for dynamic content. Use a shareable URL format.
            external/vimeo: URL links to Vimeo-hosted videos for high-quality or private video content.
          example: image/jpeg
        rel:
          allOf:
            - $ref: "#/components/schemas/MediaRel"
          description: |-
            Defines the relationship of the media file to the supplier's content. Common values include: LOGO: For branding assets like supplier logos.
            COVER: For primary visual elements representing the supplier.
            GALLERY: For additional images or videos.
          example: LOGO
        title:
          type: string
          nullable: true
          description: The title or name of the media, providing a brief description or identifier for the media file. This helps in organizing and identifying media files (e.g., "Main Attraction Image," "Promotional Video"). This field can be null if no title is provided.
          example: ""
        caption:
          type: string
          nullable: true
          description: A caption providing additional context or information about what is depicted in the media. Captions should be customer-facing and provide insights such as "Overview of the city skyline at sunset" or "Guests enjoying the guided tour." This field can be null if no caption is provided.
          example: ""
        copyright:
          type: string
          nullable: true
          description: Information about the copyright status or usage restrictions of the media. This may include details about ownership, licensing terms, or attribution requirements (e.g., "© 2024 Example Corp, All Rights Reserved"). If null, it is assumed there are no copyright restrictions or attribution requirements.
          example: ""
      example:
        src: ""
        type: image/jpeg
        rel: LOGO
        title: ""
        caption: ""
        copyright: ""
    MediaRel:
      type: string
      enum:
        - LOGO
        - COVER
        - GALLERY
      example: LOGO
    MediaType:
      type: string
      enum:
        - image/jpeg
        - image/png
        - video/mp4
        - video/avi
        - external/youtube
        - external/vimeo
      example: image/jpeg
    OpeningHours:
      type: object
      required:
        - from
        - to
      properties:
        from:
          type: string
          description: The opening time
          example: "08:00"
        to:
          type: string
          description: The closing time
          example: "16:00"
      description: Defines the opening hours for this availability, even for start time-based availability. Supports multiple periods for breaks in the day.
      example:
        from: "08:00"
        to: "16:00"
    Option:
      type: object
      required:
        - id
        - default
        - internalName
        - reference
        - availabilityLocalStartTimes
        - cancellationCutoff
        - cancellationCutoffAmount
        - cancellationCutoffUnit
        - requiredContactFields
        - restrictions
        - units
      properties:
        id:
          type: string
          description: A unique identifier for the option within the product. This ID is critical for identifying specific options during bookings or other API interactions.
          example: DEFAULT
        default:
          type: boolean
          description: |-
            Indicates whether the option is the default selection.
            true: This option should be rendered and selected first in customer-facing interfaces.
            false: The option is not default and requires manual selection.
          example: true
        internalName:
          type: string
          description: The internal name used by the supplier to refer to the option. This name is for internal or operational purposes and may differ from the public, customer-facing name. The customer-facing name is defined separately in the title field under the octo/content capability.
          example: DEFAULT
        reference:
          type: string
          nullable: true
          description: An optional internal code used by the supplier to refer to the product. This field is useful for supplier-specific workflows or cross-referencing. It can be null if no reference code exists for the product.
          example: null
        availabilityLocalStartTimes:
          type: array
          items:
            type: string
          minItems: 1
          description: An array containing all possible start times for the option that can be returned during availability. For example a tour with multiple departure times may have multiple:["09:00", "14:00", "17:00"].
          example:
            - "00:00"
        cancellationCutoff:
          type: string
          description: A text description of the option's cancellation policy, providing clear guidelines to customers.
          example: 1 hour
        cancellationCutoffAmount:
          type: integer
          description: The numeric value of the cutoff period for cancellations, relative to start time or closing hour (of opening hours product)
          example: 1
        cancellationCutoffUnit:
          allOf:
            - $ref: "#/components/schemas/DurationUnit"
          description: |-
            The time unit associated with the cutoff period. Possible values are:
            hour: Cutoff is measured in hours.
            minute: Cutoff is measured in minutes.
            day: Cutoff is measured in days.
          example: hour
        requiredContactFields:
          type: array
          items:
            $ref: "#/components/schemas/ContactField"
          description: |-
            An array specifying the contact fields required to confirm a booking. These apply to the lead traveler, not individual tickets. Possible values:
            firstName: The first name of the traveler.
            lastName: The last name of the traveler.
            fullName: The full name of the traveler.
            emailAddress: The email address of the traveler.
            phoneNumber: The phone number of the traveler.
            postalCode: The postal code of the traveler.
            country: The country of the traveler.
            notes: Optional notes from the traveler.
            locales: Preferred language/localization preferences.
          example:
            - firstName
        restrictions:
          allOf:
            - $ref: "#/components/schemas/OptionRestrictions"
          description: Specifies the limitations on booking the option.
          example:
            minUnits: 0
            maxUnits: 9
        units:
          type: array
          items:
            $ref: "#/components/schemas/Unit"
          description: The list array of all units (ticket types) available for this product. Each unit represents a specific type of ticket (e.g., Adult, Child). See Unit for a detailed on the object.
          example:
            - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
              internalName: Adult
              reference: null
              type: ADULT
              restrictions:
                minAge: 18
                maxAge: 99
                idRequired: false
                minQuantity: 1
                maxQuantity: 10
                paxCount: 1
                accompaniedBy: []
              requiredContactFields:
                - firstName
            - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
              internalName: Child
              reference: null
              type: CHILD
              restrictions:
                minAge: 3
                maxAge: 12
                idRequired: false
                minQuantity: 1
                maxQuantity: 10
                paxCount: 1
                accompaniedBy: []
              requiredContactFields:
                - firstName
            - id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
              internalName: Infant
              reference: null
              type: INFANT
              restrictions:
                minAge: 0
                maxAge: 3
                idRequired: false
                minQuantity: 1
                maxQuantity: 10
                paxCount: 1
                accompaniedBy:
                  - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
              requiredContactFields:
                - firstName
        pricingFrom:
          type: array
          items:
            $ref: "#/components/schemas/Pricing"
          description: "Is on the object when Pricing capability is requested. "
          example:
            - original: 2000
              retail: 2000
              net: 1600
              currency: EUR
              currencyPrecision: 2
              includedTaxes: []
          x-capability-data:
            capability: octo/pricing
            required: true
        pricing:
          type: array
          items:
            $ref: "#/components/schemas/Pricing"
          description: "Is on the object when Pricing capability is requested. "
          example:
            - original: 2000
              retail: 2000
              net: 1600
              currency: EUR
              currencyPrecision: 2
              includedTaxes: []
          x-capability-data:
            capability: octo/pricing
            required: true
        title:
          type: string
          description: The public, customer-facing name of the product. This name is displayed to end customers and should accurately represent the product for marketing and sales purposes
          example: ""
          x-capability-data:
            capability: octo/content
            required: true
        shortDescription:
          type: string
          nullable: true
          description: A brief, customer-facing description of the product. This field provides a concise overview of the product and can be null if no description is available.
          example: ""
          x-capability-data:
            capability: octo/content
            required: true
        description:
          type: string
          nullable: true
          description: A detailed description of the product, offering in-depth information about it and relevant details. This field can be null if extended details are not provided.
          example: ""
          x-capability-data:
            capability: octo/content
            required: true
        features:
          type: array
          items:
            $ref: "#/components/schemas/Feature"
          description: "An array of structured objects describing various aspects of the product's features, grouped into clear categories. These include details about what is included, excluded, emphasized, essential, or safety-related, ensuring transparency and enhancing the product’s appeal to customers. Note: Features are intentionally repeated at both product and option levels, allowing suppliers to specify details where most applicable. Resellers must combine information from both levels for a comprehensive customer view."
          example:
            - shortDescription: ""
              type: CANCELLATION_TERM
          x-capability-data:
            capability: octo/content
            required: true
        faqs:
          type: array
          items:
            $ref: "#/components/schemas/FAQ"
          description: "An array containing frequently asked questions (FAQs) related to the product. This field is designed to address common customer inquiries by providing clear and concise answers, enhancing the customer experience and reducing potential confusion. Each object represents a single question and its corresponding answer. Note: FAQs are intentionally repeated at both product and option levels, enabling suppliers to address questions specific to each context. Resellers must combine FAQs from both levels for customer presentation."
          example:
            - question: ""
              answer: ""
          x-capability-data:
            capability: octo/content
            required: true
        media:
          type: array
          items:
            $ref: "#/components/schemas/Media"
          description: |-
            A list of media files hosted at stable URLs. Media enhances the visual and informational representation of the product, supporting images, videos, or documents.
            Note: Media details are intentionally repeated at both product and option levels. Suppliers should use the level most relevant for the resource. Resellers must merge media information for customer presentation.
          example:
            - src: ""
              type: image/jpeg
              rel: LOGO
              title: ""
              caption: ""
              copyright: ""
          x-capability-data:
            capability: octo/content
            required: true
        locations:
          type: array
          items:
            $ref: "#/components/schemas/Location"
          description: "A list of geographical locations associated with the product. These locations can represent an itinerary where the order of locations matters, such as for tours or experiences, or simply a list of related locations linked to the product. This field is particularly useful for map-dependent reseller platforms, as it provides geographic and contextual details to enhance customer understanding and platform integration. Each object in the array represents a single related location and includes the following fields:"
          example:
            - title: ""
              shortDescription: ""
              types:
                - POINT_OF_INTEREST
              minutesTo: null
              minutesAt: null
              place:
                latitude: 55.9533
                longitude: -3.1883
                postalAddress:
                  streetAddress: ""
                  addressLocality: ""
                  addressRegion: ""
                  postalCode: ""
                  addressCountry: ""
                  postOfficeBoxNumber: ""
                identifiers:
                  googlePlaceId: null
                  applePlaceId: null
                  tripadvisorLocationId: null
                  yelpPlaceId: null
                  facebookPlaceId: null
                  foursquarePlaceId: null
                  baiduPlaceId: null
                  amapPlaceId: null
                sameAs: []
          x-capability-data:
            capability: octo/content
            required: true
        categoryLabels:
          type: array
          items:
            $ref: "#/components/schemas/CategoryLabel"
          description: A list of labels representing the categories applicable to the product or experience. These categories help customers quickly understand the nature, format, or features of the product. The predefined category labels are based on Google's Product Categories for Things to Do, ensuring alignment with industry standards. OCTO has also added custom categories to cover additional popular offerings. OCTO welcomes suggestions for additional categories to ensure consistency and better coverage. Please contact the team to propose updates to the specification.
          example:
            - adults-only
            - romantic
          x-capability-data:
            capability: octo/content
            required: true
        durationMinutesFrom:
          type: integer
          description: Indicates the duration of the product or experience in minutes. If the duration is flexible, this represents the typical minimum duration.
          example: 30
          x-capability-data:
            capability: octo/content
            required: true
        durationMinutesTo:
          type: integer
          nullable: true
          description: |-
            If a number: Represents the maximum in flexible duration of the product or experience in minutes, defining a range.
            If null: Indicates that the duration is exact and matches the value of durationMinutesFrom.
          example: null
          x-capability-data:
            capability: octo/content
            required: true
        commentary:
          type: array
          items:
            $ref: "#/components/schemas/Commentary"
          description: A list of commentary options available for the product. Each object in the array specifies the format and language of the commentary.
          example:
            - format: IN_PERSON
              language: ""
          x-capability-data:
            capability: octo/content
            required: true
      example:
        id: DEFAULT
        default: true
        internalName: DEFAULT
        reference: null
        availabilityLocalStartTimes:
          - "00:00"
        cancellationCutoff: 1 hour
        cancellationCutoffAmount: 1
        cancellationCutoffUnit: hour
        requiredContactFields:
          - firstName
        restrictions:
          minUnits: 0
          maxUnits: 9
        units:
          - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
            internalName: Adult
            reference: null
            type: ADULT
            restrictions:
              minAge: 18
              maxAge: 99
              idRequired: false
              minQuantity: 1
              maxQuantity: 10
              paxCount: 1
              accompaniedBy: []
            requiredContactFields:
              - firstName
          - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
            internalName: Child
            reference: null
            type: CHILD
            restrictions:
              minAge: 3
              maxAge: 12
              idRequired: false
              minQuantity: 1
              maxQuantity: 10
              paxCount: 1
              accompaniedBy: []
            requiredContactFields:
              - firstName
          - id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
            internalName: Infant
            reference: null
            type: INFANT
            restrictions:
              minAge: 0
              maxAge: 3
              idRequired: false
              minQuantity: 1
              maxQuantity: 10
              paxCount: 1
              accompaniedBy:
                - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
            requiredContactFields:
              - firstName
        pricingFrom:
          - original: 2000
            retail: 2000
            net: 1600
            currency: EUR
            currencyPrecision: 2
            includedTaxes: []
    OptionContent:
      type: object
      properties:
        title:
          type: string
          description: The public, customer-facing name of the product. This name is displayed to end customers and should accurately represent the product for marketing and sales purposes
          example: ""
          x-capability-data:
            capability: octo/content
            required: true
        shortDescription:
          type: string
          nullable: true
          description: A brief, customer-facing description of the product. This field provides a concise overview of the product and can be null if no description is available.
          example: ""
          x-capability-data:
            capability: octo/content
            required: true
        description:
          type: string
          nullable: true
          description: A detailed description of the product, offering in-depth information about it and relevant details. This field can be null if extended details are not provided.
          example: ""
          x-capability-data:
            capability: octo/content
            required: true
        features:
          type: array
          items:
            $ref: "#/components/schemas/Feature"
          description: "An array of structured objects describing various aspects of the product's features, grouped into clear categories. These include details about what is included, excluded, emphasized, essential, or safety-related, ensuring transparency and enhancing the product’s appeal to customers. Note: Features are intentionally repeated at both product and option levels, allowing suppliers to specify details where most applicable. Resellers must combine information from both levels for a comprehensive customer view."
          example:
            - shortDescription: ""
              type: CANCELLATION_TERM
          x-capability-data:
            capability: octo/content
            required: true
        faqs:
          type: array
          items:
            $ref: "#/components/schemas/FAQ"
          description: "An array containing frequently asked questions (FAQs) related to the product. This field is designed to address common customer inquiries by providing clear and concise answers, enhancing the customer experience and reducing potential confusion. Each object represents a single question and its corresponding answer. Note: FAQs are intentionally repeated at both product and option levels, enabling suppliers to address questions specific to each context. Resellers must combine FAQs from both levels for customer presentation."
          example:
            - question: ""
              answer: ""
          x-capability-data:
            capability: octo/content
            required: true
        media:
          type: array
          items:
            $ref: "#/components/schemas/Media"
          description: |-
            A list of media files hosted at stable URLs. Media enhances the visual and informational representation of the product, supporting images, videos, or documents.
            Note: Media details are intentionally repeated at both product and option levels. Suppliers should use the level most relevant for the resource. Resellers must merge media information for customer presentation.
          example:
            - src: ""
              type: image/jpeg
              rel: LOGO
              title: ""
              caption: ""
              copyright: ""
          x-capability-data:
            capability: octo/content
            required: true
        locations:
          type: array
          items:
            $ref: "#/components/schemas/Location"
          description: "A list of geographical locations associated with the product. These locations can represent an itinerary where the order of locations matters, such as for tours or experiences, or simply a list of related locations linked to the product. This field is particularly useful for map-dependent reseller platforms, as it provides geographic and contextual details to enhance customer understanding and platform integration. Each object in the array represents a single related location and includes the following fields:"
          example:
            - title: ""
              shortDescription: ""
              types:
                - POINT_OF_INTEREST
              minutesTo: null
              minutesAt: null
              place:
                latitude: 55.9533
                longitude: -3.1883
                postalAddress:
                  streetAddress: ""
                  addressLocality: ""
                  addressRegion: ""
                  postalCode: ""
                  addressCountry: ""
                  postOfficeBoxNumber: ""
                identifiers:
                  googlePlaceId: null
                  applePlaceId: null
                  tripadvisorLocationId: null
                  yelpPlaceId: null
                  facebookPlaceId: null
                  foursquarePlaceId: null
                  baiduPlaceId: null
                  amapPlaceId: null
                sameAs: []
          x-capability-data:
            capability: octo/content
            required: true
        categoryLabels:
          type: array
          items:
            $ref: "#/components/schemas/CategoryLabel"
          description: A list of labels representing the categories applicable to the product or experience. These categories help customers quickly understand the nature, format, or features of the product. The predefined category labels are based on Google's Product Categories for Things to Do, ensuring alignment with industry standards. OCTO has also added custom categories to cover additional popular offerings. OCTO welcomes suggestions for additional categories to ensure consistency and better coverage. Please contact the team to propose updates to the specification.
          example:
            - adults-only
            - romantic
          x-capability-data:
            capability: octo/content
            required: true
        durationMinutesFrom:
          type: integer
          description: Indicates the duration of the product or experience in minutes. If the duration is flexible, this represents the typical minimum duration.
          example: 30
          x-capability-data:
            capability: octo/content
            required: true
        durationMinutesTo:
          type: integer
          nullable: true
          description: |-
            If a number: Represents the maximum in flexible duration of the product or experience in minutes, defining a range.
            If null: Indicates that the duration is exact and matches the value of durationMinutesFrom.
          example: null
          x-capability-data:
            capability: octo/content
            required: true
        commentary:
          type: array
          items:
            $ref: "#/components/schemas/Commentary"
          description: A list of commentary options available for the product. Each object in the array specifies the format and language of the commentary.
          example:
            - format: IN_PERSON
              language: ""
          x-capability-data:
            capability: octo/content
            required: true
      example:
        title: ""
        shortDescription: ""
        description: ""
        features:
          - shortDescription: ""
            type: CANCELLATION_TERM
        faqs:
          - question: ""
            answer: ""
        media:
          - src: ""
            type: image/jpeg
            rel: LOGO
            title: ""
            caption: ""
            copyright: ""
        locations:
          - title: ""
            shortDescription: ""
            types:
              - POINT_OF_INTEREST
            minutesTo: null
            minutesAt: null
            place:
              latitude: 55.9533
              longitude: -3.1883
              postalAddress:
                streetAddress: ""
                addressLocality: ""
                addressRegion: ""
                postalCode: ""
                addressCountry: ""
                postOfficeBoxNumber: ""
              identifiers:
                googlePlaceId: null
                applePlaceId: null
                tripadvisorLocationId: null
                yelpPlaceId: null
                facebookPlaceId: null
                foursquarePlaceId: null
                baiduPlaceId: null
                amapPlaceId: null
              sameAs: []
        categoryLabels:
          - adults-only
          - romantic
        durationMinutesFrom: 30
        durationMinutesTo: null
        commentary:
          - format: IN_PERSON
            language: ""
    OptionPricing:
      type: object
      properties:
        pricingFrom:
          type: array
          items:
            $ref: "#/components/schemas/Pricing"
          description: "Is on the object when Pricing capability is requested. "
          example:
            - original: 2000
              retail: 2000
              net: 1600
              currency: EUR
              currencyPrecision: 2
              includedTaxes: []
          x-capability-data:
            capability: octo/pricing
            required: true
        pricing:
          type: array
          items:
            $ref: "#/components/schemas/Pricing"
          description: "Is on the object when Pricing capability is requested. "
          example:
            - original: 2000
              retail: 2000
              net: 1600
              currency: EUR
              currencyPrecision: 2
              includedTaxes: []
          x-capability-data:
            capability: octo/pricing
            required: true
      example:
        pricingFrom:
          - original: 2000
            retail: 2000
            net: 1600
            currency: EUR
            currencyPrecision: 2
            includedTaxes: []
        pricing:
          - original: 2000
            retail: 2000
            net: 1600
            currency: EUR
            currencyPrecision: 2
            includedTaxes: []
    OptionRestrictions:
      type: object
      required:
        - minUnits
        - maxUnits
      properties:
        minUnits:
          type: integer
          nullable: true
          description: The minimum number of units (tickets) that can be purchased in a single booking. A null value indicates no minimum.
          example: 0
        maxUnits:
          type: integer
          nullable: true
          description: The maximum number of units (tickets) that can be purchased in a single booking. A null value indicates no maximum.
          example: 9
      example:
        minUnits: 0
        maxUnits: 9
    Place:
      type: object
      required:
        - latitude
        - longitude
        - postalAddress
        - identifiers
        - sameAs
      properties:
        latitude:
          type: number
          description: The latitude of the location, expressed in decimal degrees. Negative values represent southern latitudes.
          example: 55.9533
        longitude:
          type: number
          description: The longitude of the location, expressed in decimal degrees. Negative values represent western longitudes.
          example: -3.1883
        postalAddress:
          allOf:
            - $ref: "#/components/schemas/PostalAddress"
          description: Structured postal address details for the location.
          example:
            streetAddress: ""
            addressLocality: ""
            addressRegion: ""
            postalCode: ""
            addressCountry: ""
            postOfficeBoxNumber: ""
        identifiers:
          allOf:
            - $ref: "#/components/schemas/Identifiers"
          description: A list of unique identifiers from third-party platforms (e.g., Google Maps, Yelp, Tripadvisor).
          example:
            googlePlaceId: null
            applePlaceId: null
            tripadvisorLocationId: null
            yelpPlaceId: null
            facebookPlaceId: null
            foursquarePlaceId: null
            baiduPlaceId: null
            amapPlaceId: null
        sameAs:
          type: array
          items:
            type: string
          description: A list of URLs pointing to web pages or social media profiles for the location.
          example: []
      example:
        latitude: 55.9533
        longitude: -3.1883
        postalAddress:
          streetAddress: ""
          addressLocality: ""
          addressRegion: ""
          postalCode: ""
          addressCountry: ""
          postOfficeBoxNumber: ""
        identifiers:
          googlePlaceId: null
          applePlaceId: null
          tripadvisorLocationId: null
          yelpPlaceId: null
          facebookPlaceId: null
          foursquarePlaceId: null
          baiduPlaceId: null
          amapPlaceId: null
        sameAs: []
    PostalAddress:
      type: object
      required:
        - streetAddress
        - addressLocality
        - addressRegion
        - postalCode
        - addressCountry
        - postOfficeBoxNumber
      properties:
        streetAddress:
          type: string
          nullable: true
          description: The primary address line, such as a street address, P.O. box, or company name. Null if not provided.
          example: ""
        addressLocality:
          type: string
          nullable: true
          description: The city or locality associated with the address.
          example: ""
        addressRegion:
          type: string
          nullable: true
          description: The state, province, or region associated with the address.
          example: ""
        postalCode:
          type: string
          nullable: true
          description: The postal code or ZIP code for the address.
          example: ""
        addressCountry:
          type: string
          nullable: true
          description: The postal code or ZIP code for the address.
          example: ""
        postOfficeBoxNumber:
          type: string
          nullable: true
          description: The post office box number associated with the address, if applicable.
          example: ""
      example:
        streetAddress: ""
        addressLocality: ""
        addressRegion: ""
        postalCode: ""
        addressCountry: ""
        postOfficeBoxNumber: ""
    Pricing:
      type: object
      required:
        - original
        - retail
        - net
        - currency
        - currencyPrecision
        - includedTaxes
      properties:
        original:
          type: integer
          description: Represents the advertised marketing price, which must be equal to or higher than pricingFrom.retail. Typically used for strike-through pricing, it highlights the original or component-based value of the product when the retail price reflects a discount or bundled offer. For example, a package product combining multiple components (e.g., hotel + tour + meals) may have a total component value of $500 (original), while the bundled retail price is $400. In such cases, the original price is displayed to show savings.This field should only be shown when it is higher than pricingFrom.retail and must accurately reflect a valid reference price, ensuring transparency and trust.
          example: 3995
        retail:
          type: integer
          description: The supplier’s recommended sale price, including all taxes and fees. This is the price charged to end customers and represents the total cost.
          example: 3995
        net:
          type: integer
          nullable: true
          description: The wholesale price charged to the reseller, including all taxes and fees. This price reflects the amount the reseller pays to the supplier.
          example: 2996
        currency:
          type: string
          description: Specifies the currency used for the prices provided in the pricingFrom object. The value must adhere to ISO 4217 currency codes (e.g., USD, EUR, JPY) to ensure consistency across systems.
          example: USD
        currencyPrecision:
          type: integer
          description: "All pricing is given in integers to avoid floating point rounding issues. e.g. USD = 2 and JPY = 0. To convert a price to decimal you should do: price / (10 ** currencyPrecision) where ** is to the power of e.g. Math.pow(10, currencyPrecision)."
          example: 2
        includedTaxes:
          type: array
          items:
            $ref: "#/components/schemas/Tax"
          description: This field defines the number of decimal places used for the currency in the pricingFrom object, ensuring precise representation and preventing rounding errors during calculations. For example, in currencies like USD, which have a precision of 2, prices are expressed in cents (e.g., $45.00 is represented as 4500). In currencies like JPY, which have a precision of 0, prices are expressed as whole yen amounts (e.g., ¥4500 is represented as 4500). By aligning with the specific decimal requirements of different currencies, this field guarantees accurate pricing calculations and consistent handling across various currency formats.
          example:
            - name: VAT 10
              retail: 700
              original: 700
              net: 400
      example:
        original: 3995
        retail: 3995
        net: 2996
        currency: USD
        currencyPrecision: 2
        includedTaxes:
          - name: VAT 10
            retail: 700
            original: 700
            net: 400
    PricingPer:
      type: string
      enum:
        - BOOKING
        - UNIT
      example: BOOKING
    PricingUnit:
      type: object
      required:
        - unitId
      properties:
        unitId:
          type: string
          description: ID of the unit this pricing is related to
          example: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
      allOf:
        - $ref: "#/components/schemas/Pricing"
      example:
        unitId: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
        original: 1000
        retail: 1000
        net: 8000
        currency: EUR
        currencyPrecision: 2
        includedTaxes: []
    Product:
      type: object
      required:
        - id
        - internalName
        - reference
        - locale
        - allowFreesale
        - instantConfirmation
        - instantDelivery
        - availabilityRequired
        - availabilityType
        - deliveryFormats
        - deliveryMethods
        - redemptionMethod
        - options
      properties:
        id:
          type: string
          description: The unique identifier for the product, used across the platform to check availability, create bookings, etc. This identifier must be unique within the scope of the supplier’s system to ensure accurate referencing and operations.
          example: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
        internalName:
          type: string
          description: The internal name used by the supplier to refer to the product. This name is for internal or operational purposes and may differ from the public, customer-facing name. The customer-facing name is defined separately in the title field under the octo/content capability.
          example: London Eye General Admission
        reference:
          type: string
          nullable: true
          description: An optional internal code used by the supplier to refer to the product. This field is useful for supplier-specific workflows or cross-referencing. It can be null if no reference code exists for the product.
          example: LEYE-GA
        locale:
          type: string
          description: The language code specifying the primary language in which the product operates. It must conform to the IETF BCP 47 standard, which defines language tags for localization (e.g., en-US for American English, fr-FR for French (France), es-ES for Spanish (Spain)).
          example: en-GB
        timeZone:
          type: string
          description: The IANA Time Zone identifier indicating the product's location (e.g., America/New_York, Europe/London).
          example: Europe/London
        allowFreesale:
          type: boolean
          description: Indicates whether an availabilityId is required when creating a booking. If set to false, bookings can be made without specifying a travel date, creating open-dated bookings.
          example: true
        instantConfirmation:
          type: boolean
          description: Indicates whether the customer’s tickets or vouchers are delivered immediately after the booking is confirmed. If false, resellers must manage delayed ticket delivery processes.
          example: true
        instantDelivery:
          type: boolean
          description: This indicates whether the Reseller can expect immediate delivery of the customer's tickets. If `false` then the Reseller MUST be able to delay delivery of the tickets to the customer.
          example: true
        availabilityRequired:
          type: boolean
          description: Indicates whether an availabilityId is required when creating a booking. If set to false, bookings can be made without specifying a travel date, creating open-dated bookings.
          example: true
        availabilityType:
          allOf:
            - $ref: "#/components/schemas/AvailabilityType"
          description: |-
            Specifies the type of availability for the product:
            START_TIME: For products with fixed departure times (e.g., walking tour at set times during the day).
            OPENING_HOURS: For products where customers select a date and can visit anytime during operating hours (e.g., museums general admission ticket valid at any time when museum is open).
          example: START_TIME
        deliveryFormats:
          type: array
          items:
            $ref: "#/components/schemas/DeliveryFormat"
          description: |-
            Lists the formats in which tickets or vouchers for this product are delivered. Each format specifies how the tickets or vouchers will be represented:
            QRCODE: A code presented as a QR Code, commonly used for scanning at entry points.
            CODE128: A linear barcode format widely used for retail and ticketing purposes.
            AZTECCODE: A two-dimensional barcode format similar to QR codes but more compact. It is optimized for small spaces and often used in transportation and event ticketing.
            PDF_URL: A URL linking to a downloadable PDF containing the complete ticket details for this product.
            PKPASS_URL: A URL for adding the ticket to Apple Wallet (Passbook) for easy access on iOS devices.
            This field ensures resellers can understand and integrate the appropriate ticket delivery formats specifically associated with this product.
          example:
            - QRCODE
        deliveryMethods:
          type: array
          items:
            $ref: "#/components/schemas/DeliveryMethod"
          description: |-
            Specifies all supported methods of how tickets or vouchers for this product are delivered in the booking response:
            TICKET: Delivered individually per unit in the booking, where each person or unit receives a separate ticket.
            VOUCHER: Delivered as a single voucher for the entire booking, consolidating all units under one document.
            This field ensures clarity on the format of ticket or voucher delivery to resellers and customers.
          example:
            - TICKET
        redemptionMethod:
          allOf:
            - $ref: "#/components/schemas/RedemptionMethod"
          description: |-
            Specifies how the product can be redeemed by the customer:
            DIGITAL: The ticket or voucher must be presented, either scanned from a digital device (e.g., smartphone) or as a printed copy. Redemption requires a valid voucher or ticket, even in digital form.
            MANIFEST: The customer’s name, reference, or other information is checked against a manifest by the supplier. Redemption does not require a ticket or voucher.
            PRINT: A physical printed ticket or voucher is strictly required for redemption and must be presented at the time of use.
            This field ensures resellers and customers understand the specific requirements for redeeming this product.
          example: DIGITAL
        options:
          type: array
          items:
            $ref: "#/components/schemas/Option"
          description: The list array of all options (variations of the product). Each product must have at lest one option. See Option for a detailed on the object.
          example:
            - id: DEFAULT
              default: true
              internalName: DEFAULT
              reference: null
              availabilityLocalStartTimes:
                - "00:00"
              cancellationCutoff: 1 hour
              cancellationCutoffAmount: 1
              cancellationCutoffUnit: hour
              requiredContactFields:
                - firstName
              restrictions:
                minUnits: 0
                maxUnits: 9
              units:
                - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                  internalName: Adult
                  reference: null
                  type: ADULT
                  restrictions:
                    minAge: 18
                    maxAge: 99
                    idRequired: false
                    minQuantity: 1
                    maxQuantity: 10
                    paxCount: 1
                    accompaniedBy: []
                  requiredContactFields:
                    - firstName
                - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                  internalName: Child
                  reference: null
                  type: CHILD
                  restrictions:
                    minAge: 3
                    maxAge: 12
                    idRequired: false
                    minQuantity: 1
                    maxQuantity: 10
                    paxCount: 1
                    accompaniedBy: []
                  requiredContactFields:
                    - firstName
                - id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                  internalName: Infant
                  reference: null
                  type: INFANT
                  restrictions:
                    minAge: 0
                    maxAge: 3
                    idRequired: false
                    minQuantity: 1
                    maxQuantity: 10
                    paxCount: 1
                    accompaniedBy:
                      - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                  requiredContactFields:
                    - firstName
        defaultCurrency:
          type: string
          description: Is on the object when Pricing capability is requested. Default currency for this product, if you omit the currency parameter on future endpoints this is the value the reservation system will fallback to.
          example: USD
          x-capability-data:
            capability: octo/pricing
            required: true
        availableCurrencies:
          type: array
          items:
            type: string
          description: Is on the object when Pricing capability is requested. All the possible currencies that we accept for this product.
          example:
            - USD
            - EUR
          x-capability-data:
            capability: octo/pricing
            required: true
        pricingPer:
          allOf:
            - $ref: "#/components/schemas/PricingPer"
          description: Is on the object when Pricing capability is requested. Indicates whether the pricing is per unit (most common), or per booking. Pricing which is per booking is common for private charters or group booking products where the price is the same regardless of how many tickets are purchased.
          example: UNIT
          x-capability-data:
            capability: octo/pricing
            required: true
        title:
          type: string
          description: The public, customer-facing name of the product. This name is displayed to end customers and should accurately represent the product for marketing and sales purposes
          example: ""
          x-capability-data:
            capability: octo/content
            required: true
        shortDescription:
          type: string
          nullable: true
          description: A brief, customer-facing description of the product. This field provides a concise overview of the product and can be null if no description is available.
          example: ""
          x-capability-data:
            capability: octo/content
            required: true
        description:
          type: string
          nullable: true
          description: A detailed description of the product, offering in-depth information about it and relevant details. This field can be null if extended details are not provided.
          example: ""
          x-capability-data:
            capability: octo/content
            required: true
        features:
          type: array
          items:
            $ref: "#/components/schemas/Feature"
          description: "An array of structured objects describing various aspects of the product's features, grouped into clear categories. These include details about what is included, excluded, emphasized, essential, or safety-related, ensuring transparency and enhancing the product’s appeal to customers. Note: Features are intentionally repeated at both product and option levels, allowing suppliers to specify details where most applicable. Resellers must combine information from both levels for a comprehensive customer view."
          example:
            - shortDescription: ""
              type: CANCELLATION_TERM
          x-capability-data:
            capability: octo/content
            required: true
        faqs:
          type: array
          items:
            $ref: "#/components/schemas/FAQ"
          description: "An array containing frequently asked questions (FAQs) related to the product. This field is designed to address common customer inquiries by providing clear and concise answers, enhancing the customer experience and reducing potential confusion. Each object represents a single question and its corresponding answer. Note: FAQs are intentionally repeated at both product and option levels, enabling suppliers to address questions specific to each context. Resellers must combine FAQs from both levels for customer presentation."
          example:
            - question: ""
              answer: ""
          x-capability-data:
            capability: octo/content
            required: true
        media:
          type: array
          items:
            $ref: "#/components/schemas/Media"
          description: |-
            A list of media files hosted at stable URLs. Media enhances the visual and informational representation of the product, supporting images, videos, or documents.
            Note: Media details are intentionally repeated at both product and option levels. Suppliers should use the level most relevant for the resource. Resellers must merge media information for customer presentation.
          example:
            - src: ""
              type: image/jpeg
              rel: LOGO
              title: ""
              caption: ""
              copyright: ""
          x-capability-data:
            capability: octo/content
            required: true
        locations:
          type: array
          items:
            $ref: "#/components/schemas/Location"
          description: "A list of geographical locations associated with the product. These locations can represent an itinerary where the order of locations matters, such as for tours or experiences, or simply a list of related locations linked to the product. This field is particularly useful for map-dependent reseller platforms, as it provides geographic and contextual details to enhance customer understanding and platform integration. Each object in the array represents a single related location and includes the following fields:"
          example:
            - title: ""
              shortDescription: ""
              types:
                - POINT_OF_INTEREST
              minutesTo: null
              minutesAt: null
              place:
                latitude: 55.9533
                longitude: -3.1883
                postalAddress:
                  streetAddress: ""
                  addressLocality: ""
                  addressRegion: ""
                  postalCode: ""
                  addressCountry: ""
                  postOfficeBoxNumber: ""
                identifiers:
                  googlePlaceId: null
                  applePlaceId: null
                  tripadvisorLocationId: null
                  yelpPlaceId: null
                  facebookPlaceId: null
                  foursquarePlaceId: null
                  baiduPlaceId: null
                  amapPlaceId: null
                sameAs: []
          x-capability-data:
            capability: octo/content
            required: true
        categoryLabels:
          type: array
          items:
            $ref: "#/components/schemas/CategoryLabel"
          description: A list of labels representing the categories applicable to the product or experience. These categories help customers quickly understand the nature, format, or features of the product. The predefined category labels are based on Google's Product Categories for Things to Do, ensuring alignment with industry standards. OCTO has also added custom categories to cover additional popular offerings. OCTO welcomes suggestions for additional categories to ensure consistency and better coverage. Please contact the team to propose updates to the specification.
          example:
            - adults-only
            - romantic
          x-capability-data:
            capability: octo/content
            required: true
        durationMinutesFrom:
          type: integer
          description: Indicates the duration of the product or experience in minutes. If the duration is flexible, this represents the typical minimum duration.
          example: 30
          x-capability-data:
            capability: octo/content
            required: true
        durationMinutesTo:
          type: integer
          nullable: true
          description: |-
            If a number: Represents the maximum in flexible duration of the product or experience in minutes, defining a range.
            If null: Indicates that the duration is exact and matches the value of durationMinutesFrom.
          example: null
          x-capability-data:
            capability: octo/content
            required: true
        commentary:
          type: array
          items:
            $ref: "#/components/schemas/Commentary"
          description: A list of commentary options available for the product. Each object in the array specifies the format and language of the commentary.
          example:
            - format: IN_PERSON
              language: ""
          x-capability-data:
            capability: octo/content
            required: true
      example:
        id: 6b903d44-dc24-4ca4-ae71-6bde6c4f4854
        internalName: London Eye General Admission
        reference: LEYE-GA
        locale: en-GB
        timeZone: Europe/London
        allowFreesale: true
        instantConfirmation: true
        instantDelivery: true
        availabilityRequired: true
        availabilityType: START_TIME
        deliveryFormats:
          - QRCODE
        deliveryMethods:
          - TICKET
        redemptionMethod: DIGITAL
        options:
          - id: DEFAULT
            default: true
            internalName: DEFAULT
            reference: null
            availabilityLocalStartTimes:
              - "00:00"
            cancellationCutoff: 1 hour
            cancellationCutoffAmount: 1
            cancellationCutoffUnit: hour
            requiredContactFields:
              - firstName
            restrictions:
              minUnits: 0
              maxUnits: 9
            units:
              - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                internalName: Adult
                reference: null
                type: ADULT
                restrictions:
                  minAge: 18
                  maxAge: 99
                  idRequired: false
                  minQuantity: 1
                  maxQuantity: 10
                  paxCount: 1
                  accompaniedBy: []
                requiredContactFields:
                  - firstName
              - id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                internalName: Child
                reference: null
                type: CHILD
                restrictions:
                  minAge: 3
                  maxAge: 12
                  idRequired: false
                  minQuantity: 1
                  maxQuantity: 10
                  paxCount: 1
                  accompaniedBy: []
                requiredContactFields:
                  - firstName
              - id: infant_897e3ce8-1860-4cbf-80ad-95857df1f640
                internalName: Infant
                reference: null
                type: INFANT
                restrictions:
                  minAge: 0
                  maxAge: 3
                  idRequired: false
                  minQuantity: 1
                  maxQuantity: 10
                  paxCount: 1
                  accompaniedBy:
                    - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
                requiredContactFields:
                  - firstName
    ProductContent:
      type: object
      properties:
        title:
          type: string
          description: The public, customer-facing name of the product. This name is displayed to end customers and should accurately represent the product for marketing and sales purposes
          example: ""
          x-capability-data:
            capability: octo/content
            required: true
        shortDescription:
          type: string
          nullable: true
          description: A brief, customer-facing description of the product. This field provides a concise overview of the product and can be null if no description is available.
          example: ""
          x-capability-data:
            capability: octo/content
            required: true
        description:
          type: string
          nullable: true
          description: A detailed description of the product, offering in-depth information about it and relevant details. This field can be null if extended details are not provided.
          example: ""
          x-capability-data:
            capability: octo/content
            required: true
        features:
          type: array
          items:
            $ref: "#/components/schemas/Feature"
          description: "An array of structured objects describing various aspects of the product's features, grouped into clear categories. These include details about what is included, excluded, emphasized, essential, or safety-related, ensuring transparency and enhancing the product’s appeal to customers. Note: Features are intentionally repeated at both product and option levels, allowing suppliers to specify details where most applicable. Resellers must combine information from both levels for a comprehensive customer view."
          example:
            - shortDescription: ""
              type: CANCELLATION_TERM
          x-capability-data:
            capability: octo/content
            required: true
        faqs:
          type: array
          items:
            $ref: "#/components/schemas/FAQ"
          description: "An array containing frequently asked questions (FAQs) related to the product. This field is designed to address common customer inquiries by providing clear and concise answers, enhancing the customer experience and reducing potential confusion. Each object represents a single question and its corresponding answer. Note: FAQs are intentionally repeated at both product and option levels, enabling suppliers to address questions specific to each context. Resellers must combine FAQs from both levels for customer presentation."
          example:
            - question: ""
              answer: ""
          x-capability-data:
            capability: octo/content
            required: true
        media:
          type: array
          items:
            $ref: "#/components/schemas/Media"
          description: |-
            A list of media files hosted at stable URLs. Media enhances the visual and informational representation of the product, supporting images, videos, or documents.
            Note: Media details are intentionally repeated at both product and option levels. Suppliers should use the level most relevant for the resource. Resellers must merge media information for customer presentation.
          example:
            - src: ""
              type: image/jpeg
              rel: LOGO
              title: ""
              caption: ""
              copyright: ""
          x-capability-data:
            capability: octo/content
            required: true
        locations:
          type: array
          items:
            $ref: "#/components/schemas/Location"
          description: "A list of geographical locations associated with the product. These locations can represent an itinerary where the order of locations matters, such as for tours or experiences, or simply a list of related locations linked to the product. This field is particularly useful for map-dependent reseller platforms, as it provides geographic and contextual details to enhance customer understanding and platform integration. Each object in the array represents a single related location and includes the following fields:"
          example:
            - title: ""
              shortDescription: ""
              types:
                - POINT_OF_INTEREST
              minutesTo: null
              minutesAt: null
              place:
                latitude: 55.9533
                longitude: -3.1883
                postalAddress:
                  streetAddress: ""
                  addressLocality: ""
                  addressRegion: ""
                  postalCode: ""
                  addressCountry: ""
                  postOfficeBoxNumber: ""
                identifiers:
                  googlePlaceId: null
                  applePlaceId: null
                  tripadvisorLocationId: null
                  yelpPlaceId: null
                  facebookPlaceId: null
                  foursquarePlaceId: null
                  baiduPlaceId: null
                  amapPlaceId: null
                sameAs: []
          x-capability-data:
            capability: octo/content
            required: true
        categoryLabels:
          type: array
          items:
            $ref: "#/components/schemas/CategoryLabel"
          description: A list of labels representing the categories applicable to the product or experience. These categories help customers quickly understand the nature, format, or features of the product. The predefined category labels are based on Google's Product Categories for Things to Do, ensuring alignment with industry standards. OCTO has also added custom categories to cover additional popular offerings. OCTO welcomes suggestions for additional categories to ensure consistency and better coverage. Please contact the team to propose updates to the specification.
          example:
            - adults-only
            - romantic
          x-capability-data:
            capability: octo/content
            required: true
        durationMinutesFrom:
          type: integer
          description: Indicates the duration of the product or experience in minutes. If the duration is flexible, this represents the typical minimum duration.
          example: 30
          x-capability-data:
            capability: octo/content
            required: true
        durationMinutesTo:
          type: integer
          nullable: true
          description: |-
            If a number: Represents the maximum in flexible duration of the product or experience in minutes, defining a range.
            If null: Indicates that the duration is exact and matches the value of durationMinutesFrom.
          example: null
          x-capability-data:
            capability: octo/content
            required: true
        commentary:
          type: array
          items:
            $ref: "#/components/schemas/Commentary"
          description: A list of commentary options available for the product. Each object in the array specifies the format and language of the commentary.
          example:
            - format: IN_PERSON
              language: ""
          x-capability-data:
            capability: octo/content
            required: true
      example:
        title: ""
        shortDescription: ""
        description: ""
        features:
          - shortDescription: ""
            type: CANCELLATION_TERM
        faqs:
          - question: ""
            answer: ""
        media:
          - src: ""
            type: image/jpeg
            rel: LOGO
            title: ""
            caption: ""
            copyright: ""
        locations:
          - title: ""
            shortDescription: ""
            types:
              - POINT_OF_INTEREST
            minutesTo: null
            minutesAt: null
            place:
              latitude: 55.9533
              longitude: -3.1883
              postalAddress:
                streetAddress: ""
                addressLocality: ""
                addressRegion: ""
                postalCode: ""
                addressCountry: ""
                postOfficeBoxNumber: ""
              identifiers:
                googlePlaceId: null
                applePlaceId: null
                tripadvisorLocationId: null
                yelpPlaceId: null
                facebookPlaceId: null
                foursquarePlaceId: null
                baiduPlaceId: null
                amapPlaceId: null
              sameAs: []
        categoryLabels:
          - adults-only
          - romantic
        durationMinutesFrom: 30
        durationMinutesTo: null
        commentary:
          - format: IN_PERSON
            language: ""
    ProductPricing:
      type: object
      properties:
        defaultCurrency:
          type: string
          description: Is on the object when Pricing capability is requested. Default currency for this product, if you omit the currency parameter on future endpoints this is the value the reservation system will fallback to.
          example: USD
          x-capability-data:
            capability: octo/pricing
            required: true
        availableCurrencies:
          type: array
          items:
            type: string
          description: Is on the object when Pricing capability is requested. All the possible currencies that we accept for this product.
          example:
            - USD
            - EUR
          x-capability-data:
            capability: octo/pricing
            required: true
        pricingPer:
          allOf:
            - $ref: "#/components/schemas/PricingPer"
          description: Is on the object when Pricing capability is requested. Indicates whether the pricing is per unit (most common), or per booking. Pricing which is per booking is common for private charters or group booking products where the price is the same regardless of how many tickets are purchased.
          example: UNIT
          x-capability-data:
            capability: octo/pricing
            required: true
      example:
        defaultCurrency: USD
        availableCurrencies:
          - USD
          - EUR
        pricingPer: BOOKING
    RedemptionMethod:
      type: string
      enum:
        - DIGITAL
        - PRINT
        - MANIFEST
      example: DIGITAL
    Refund:
      type: string
      enum:
        - FULL
        - PARTIAL
        - NONE
      example: PARTIAL
    ResponseHeaders:
      type: object
    ResponseHeadersContent:
      type: object
    RestrictionsContent:
      type: object
      properties:
        minHeight:
          type: integer
          description: Minimum height required for this unit (e.g., for amusement park rides).
          example: 220
          x-capability-data:
            capability: octo/content
            required: false
        maxHeight:
          type: integer
          description: Maximum height allowed.
          example: 120
          x-capability-data:
            capability: octo/content
            required: false
        heightUnit:
          type: string
          description: Unit of height measurement (e.g., "cm" or "in") used for values of minHeight, maxHeight.
          example: ""
          x-capability-data:
            capability: octo/content
            required: false
        minWeight:
          type: integer
          description: Minimum weight required.
          example: 50
          x-capability-data:
            capability: octo/content
            required: false
        maxWeight:
          type: integer
          description: Maximum weight allowed.
          example: 120
          x-capability-data:
            capability: octo/content
            required: false
        weightUnit:
          type: string
          description: Unit of weight measurement (e.g., "kg" or "lb") used for values of minWeight, maxWeight.
          example: ""
          x-capability-data:
            capability: octo/content
            required: false
      example:
        maxHeight: 220
        minHeight: 120
        heightUnit: ""
        maxWeight: 120
        minWeight: 50
        weightUnit: ""
    Supplier:
      type: object
      required:
        - id
        - name
        - endpoint
        - contact
      properties:
        id:
          type: string
          description: Unique identifier for the supplier, used across the platform to represent this supplier entity. This identifier must be unique within the supplier system.
          example: 697e3ce8-1860-4cbf-80ad-95857df1f640
        name:
          type: string
          description: Name used to identify the supplier within the platform. This name is typically recognized by end customers as the official name of the supplier's business entity. It should clearly represent the supplier's brand or identity to ensure consistency across platforms. For larger multi-venue suppliers, this represents the parent entity's name. Other associated entities or sub-divisions can be specified using the octo/content capability through the venues field.
          example: Merlin Entertainments
        endpoint:
          type: string
          format: uri
          description: The base URL that is prepended to all other API paths. The value should not contain a trailing slash and must follow URI format.
          example: https://api.my-booking-platform.com/v1
        contact:
          allOf:
            - $ref: "#/components/schemas/SupplierContact"
          description: A structured object containing defined contact fields related to the supplier. This includes various communication methods (e.g., website, email, phone) and address information. It ensures standardized contact details that facilitate seamless communication with the supplier for both customers and partners.
          example:
            website: null
            email: support@ventrata.com
            telephone: null
            address: Marble Arch, London, W1H 7EJ, United Kingdom
        shortDescription:
          type: string
          nullable: true
          description: A brief, customer-facing description of the supplier. This field provides a concise overview of the supplier's business and may be null if no description is available.
          example: ""
          x-capability-data:
            capability: octo/content
            required: true
        media:
          type: array
          items:
            $ref: "#/components/schemas/Media"
          description: "A list of supplier media files hosted at stable URLs. Media enhances the visual and informational representation of the supplier, such as logos and supporting images. This array can be null if no media is available. Note: Media details are intentionally repeated at various levels. "
          example:
            - src: ""
              type: image/jpeg
              rel: LOGO
              title: ""
              caption: ""
              copyright: ""
          x-capability-data:
            capability: octo/content
            required: true
      example:
        id: 697e3ce8-1860-4cbf-80ad-95857df1f640
        name: Merlin Entertainments
        endpoint: https://api.my-booking-platform.com/v1
        contact:
          website: null
          email: support@ventrata.com
          telephone: null
          address: Marble Arch, London, W1H 7EJ, United Kingdom
      x-supported-capabilities:
        - octo/content
    SupplierContact:
      type: object
      required:
        - website
        - email
        - telephone
        - address
      properties:
        website:
          type: string
          nullable: true
          description: The supplier's official website URL. This should link directly to the supplier's primary website or a dedicated page about the supplier within a supplier system. The URL should not reference a general supplier system but a specific, identifiable supplier presence. This field can be null if no website is available.
          example: null
        email:
          type: string
          nullable: true
          format: email
          description: The email address for customer service inquiries, primarily for end customers. This should be a direct and monitored email address for resolving queries and providing support. The field may be null if email support is not offered or the email address is unavailable or not provided in supplier system.
          example: support@ventrata.com
        telephone:
          type: string
          nullable: true
          description: The customer service telephone number for end customers, formatted according to the E.164 standard. This format includes the country code followed by the national number, with no spaces, dashes, or special characters. This field can be null if telephone support is unavailable or not provided in supplier system.
          example: null
        address:
          type: string
          nullable: true
          description: The full mailing address of the location as a single string. It includes street address, city, state, postal code, and country. If no address is provided, this field can be null. For structured details, use the additional address-related fields
          example: Marble Arch, London, W1H 7EJ, United Kingdom
      example:
        website: null
        email: support@ventrata.com
        telephone: null
        address: Marble Arch, London, W1H 7EJ, United Kingdom
    SupplierContent:
      type: object
      properties:
        shortDescription:
          type: string
          nullable: true
          description: A brief, customer-facing description of the supplier. This field provides a concise overview of the supplier's business and may be null if no description is available.
          example: ""
          x-capability-data:
            capability: octo/content
            required: true
        media:
          type: array
          items:
            $ref: "#/components/schemas/Media"
          description: "A list of supplier media files hosted at stable URLs. Media enhances the visual and informational representation of the supplier, such as logos and supporting images. This array can be null if no media is available. Note: Media details are intentionally repeated at various levels. "
          example:
            - src: ""
              type: image/jpeg
              rel: LOGO
              title: ""
              caption: ""
              copyright: ""
          x-capability-data:
            capability: octo/content
            required: true
      example:
        shortDescription: ""
        media:
          - src: ""
            type: image/jpeg
            rel: LOGO
            title: ""
            caption: ""
            copyright: ""
    Tax:
      type: object
      required:
        - name
        - retail
        - original
        - net
      properties:
        name:
          type: string
          description: The name of the tax or fee, such as "VAT", "City Tax", or "Service Charge". This field provides clear labeling of the tax or fee being applied, making the pricing structure easier to interpret.
          example: VAT 10
        retail:
          type: integer
          description: The value of the tax or fee included in the retail price, expressed in the same currency as the pricingFrom.currency. This value indicates the portion of the end-customer price attributable to the specific tax or fee.
          example: 700
        original:
          type: integer
          description: ""
          example: 700
        net:
          type: integer
          nullable: true
          description: The value of the tax or fee included in the net price, expressed in the same currency as the pricingFrom.currency. This value indicates the portion of the reseller’s cost attributable to the specific tax or fee.
          example: 400
      example:
        name: VAT 10
        retail: 700
        original: 700
        net: 400
    Ticket:
      type: object
      required:
        - redemptionMethod
        - utcRedeemedAt
        - deliveryOptions
      properties:
        redemptionMethod:
          allOf:
            - $ref: "#/components/schemas/RedemptionMethod"
          description: |-
            Specifies how the voucher can be redeemed by the customer:
            DIGITAL: The voucher must be presented, either scanned from a digital device (e.g., smartphone) or as a printed copy. Redemption requires a valid voucher or ticket, even in digital form.
            MANIFEST: The customer’s name, reference, or other information is checked against a manifest by the supplier. Redemption does not require a ticket or voucher.
            PRINT: A physical printed voucher is strictly required for redemption and must be presented at the time of use.
            This field ensures resellers and customers understand the specific requirements for redeeming this booking.
          example: DIGITAL
        utcRedeemedAt:
          type: string
          nullable: true
          description: An ISO8601 date time in UTC at when the voucher was redeemed, if applicable.
          example: "2021-10-27T23:28:43Z"
        deliveryOptions:
          type: array
          items:
            $ref: "#/components/schemas/DeliveryOption"
          description: All possible delivery options supplier accepts, in the order of supplier preference
          example:
            - deliveryFormat: QRCODE
              deliveryValue: ""
      example:
        redemptionMethod: DIGITAL
        utcRedeemedAt: "2021-10-27T23:28:43Z"
        deliveryOptions:
          - deliveryFormat: QRCODE
            deliveryValue: ""
    Unit:
      type: object
      required:
        - id
        - internalName
        - reference
        - type
        - restrictions
        - requiredContactFields
      properties:
        id:
          type: string
          description: The unique identifier for this unit within the scope of the option. This ID ensures that each unit can be uniquely referenced and managed.
          example: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
        internalName:
          type: string
          description: An internal name for the unit, used for backend purposes and not visible to customers. This field helps with identifying and managing the unit in the supplier’s system.
          example: Adult(s)
        reference:
          type: string
          nullable: true
          description: An optional internal reference code used by the supplier for identification purposes. This field may not be unique and is meant for operational use.
          example: LR1-01-new
        type:
          allOf:
            - $ref: "#/components/schemas/UnitType"
          description: "This is the base unit type for this unit definition. A value of TRAVELLER must only be used in replacement of ADULT, CHILD, INFANT, YOUTH, STUDENT, MILITARY or SENIOR. "
          example: ADULT
        restrictions:
          allOf:
            - $ref: "#/components/schemas/UnitRestrictions"
          description: Specifies booking or usage restrictions for the unit.
          example:
            minAge: 3
            maxAge: 17
            idRequired: true
            minQuantity: 2
            maxQuantity: 7
            paxCount: 1
            accompaniedBy:
              - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
        requiredContactFields:
          type: array
          items:
            $ref: "#/components/schemas/ContactField"
          description: |-
            Lists the contact information required per ticket for the unit. Possible values include:
            firstName: First name of the ticket holder.
            lastName: Last name of the ticket holder.
            fullName: Full name, as a combination of first and last name.
            emailAddress: Email address of the ticket holder.
            phoneNumber: Phone number of the ticket holder.
            postalCode: Postal code for identification purposes.
            country: Country code (ISO 3166-1 alpha-2).
            notes: Additional notes or special instructions.
            locales: Locale preferences (IETF BCP 47 tags).
          example:
            - firstName
        pricingFrom:
          type: array
          items:
            $ref: "#/components/schemas/Pricing"
          description: "Is on the object when Pricing capability is requested. "
          example:
            - original: 1000
              retail: 1000
              net: 8000
              currency: EUR
              currencyPrecision: 2
              includedTaxes: []
            - original: 1000
              retail: 1000
              net: 8000
              currency: USD
              currencyPrecision: 2
              includedTaxes: []
          x-capability-data:
            capability: octo/pricing
            required: true
        pricing:
          type: array
          items:
            $ref: "#/components/schemas/Pricing"
          description: "Is on the object when Pricing capability is requested. "
          example:
            - original: 1000
              retail: 1000
              net: 8000
              currency: EUR
              currencyPrecision: 2
              includedTaxes: []
            - original: 1000
              retail: 1000
              net: 8000
              currency: USD
              currencyPrecision: 2
              includedTaxes: []
          x-capability-data:
            capability: octo/pricing
            required: true
        title:
          type: string
          nullable: true
          description: The public-facing name of the unit, designed to be displayed to customers. This should clearly convey the nature of the unit, such as "Adult" or "Student".
          example: ""
          x-capability-data:
            capability: octo/content
            required: true
        shortDescription:
          type: string
          description: A concise summary of the unit, offering key details to customers. This helps in differentiating units and highlighting important characteristics.
          example: ""
          x-capability-data:
            capability: octo/content
            required: true
        features:
          type: array
          items:
            $ref: "#/components/schemas/Feature"
          description: "An array of structured objects describing various aspects of the unit's features, grouped into clear categories. These include details about what is included, excluded, emphasized, essential, or safety-related, ensuring transparency and enhancing the option’s appeal to customers. Note: Features are intentionally repeated at both product and option levels, allowing suppliers to specify details where most applicable. Resellers must combine information from both levels for a comprehensive customer view."
          example:
            - shortDescription: ""
              type: CANCELLATION_TERM
          x-capability-data:
            capability: octo/content
            required: true
      example:
        id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
        internalName: Adult(s)
        reference: LR1-01-new
        type: ADULT
        restrictions:
          minAge: 3
          maxAge: 17
          idRequired: true
          minQuantity: 2
          maxQuantity: 7
          paxCount: 1
          accompaniedBy:
            - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
        requiredContactFields:
          - firstName
    UnitContent:
      type: object
      properties:
        title:
          type: string
          nullable: true
          description: The public-facing name of the unit, designed to be displayed to customers. This should clearly convey the nature of the unit, such as "Adult" or "Student".
          example: ""
          x-capability-data:
            capability: octo/content
            required: true
        shortDescription:
          type: string
          description: A concise summary of the unit, offering key details to customers. This helps in differentiating units and highlighting important characteristics.
          example: ""
          x-capability-data:
            capability: octo/content
            required: true
        features:
          type: array
          items:
            $ref: "#/components/schemas/Feature"
          description: "An array of structured objects describing various aspects of the unit's features, grouped into clear categories. These include details about what is included, excluded, emphasized, essential, or safety-related, ensuring transparency and enhancing the option’s appeal to customers. Note: Features are intentionally repeated at both product and option levels, allowing suppliers to specify details where most applicable. Resellers must combine information from both levels for a comprehensive customer view."
          example:
            - shortDescription: ""
              type: CANCELLATION_TERM
          x-capability-data:
            capability: octo/content
            required: true
    UnitItem:
      type: object
      required:
        - uuid
        - resellerReference
        - supplierReference
        - unitId
        - status
        - utcRedeemedAt
        - contact
        - ticket
      properties:
        uuid:
          type: string
          description: The id of the unit, this will be unique to the option.
          example: 3b1bc2ee-3155-4738-9471-f49842a07327
        resellerReference:
          type: string
          nullable: true
          description: A reference the reseller uses to identify the unit within all bookings.
          example: 4ec08a62-892c-48c1-a608-dc946531a33a
        supplierReference:
          type: string
          nullable: true
          description: A reference the supplier uses to identify the unit within all bookings.
          example: K9T7R4
        unitId:
          type: string
          description: This MUST be a unique identifier within the scope of the option.
          example: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
        unit:
          allOf:
            - $ref: "#/components/schemas/Unit"
          description: ""
          example:
            id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
            internalName: Adult
            reference: null
            type: ADULT
            restrictions:
              minAge: 18
              maxAge: 99
              idRequired: false
              minQuantity: 1
              maxQuantity: 10
              paxCount: 1
              accompaniedBy: []
            requiredContactFields:
              - firstName
        status:
          allOf:
            - $ref: "#/components/schemas/BookingStatus"
          description: |-
            The status of the booking, possible values are:
            `ON_HOLD` The booking is pending confirmation, this is the default value when you first create the booking.
            `EXPIRED` If the booking is not confirmed before the expiration hold expires, it goes into an expired state.
            `CONFIRMED` Once the confirmation call is made the booking is ready to be used.
            `CANCELLED` If the booking is cancelled.
            `PENDING` If the booking is pending outside availability confirmation.
            `REDEEMED` If the booking is already redeemed.
          example: CONFIRMED
        utcRedeemedAt:
          type: string
          format: date-time
          nullable: true
          description: The ISO8601 date in UTC indicating when the ticket was used at the attraction.
          example: null
        contact:
          allOf:
            - $ref: "#/components/schemas/Contact"
          description: Contact details for the guests that will attend the tour/attraction. Contact Body can be applied to both the booking object (the main reservation) or the unit object (individual ticket holders - if the supplier requires this information)
          example:
            fullName: John Doe
            firstName: John
            lastName: Doe
            emailAddress: johndoe@email.com
            phoneNumber: ""
            locales:
              - en
            postalCode: ""
            country: ""
            notes: ""
        ticket:
          type: object
          allOf:
            - $ref: "#/components/schemas/Ticket"
          nullable: true
          description: ""
          example:
            redemptionMethod: DIGITAL
            utcRedeemedAt: "2021-10-27T23:28:43Z"
            deliveryOptions:
              - deliveryFormat: QRCODE
                deliveryValue: ""
        pricing:
          allOf:
            - $ref: "#/components/schemas/Pricing"
          description: "Is on the object when Pricing capability is requested. "
          example:
            original: 1000
            retail: 1000
            net: 8000
            currency: EUR
            currencyPrecision: 2
            includedTaxes: []
          x-capability-data:
            capability: octo/pricing
            required: true
      example:
        uuid: 3b1bc2ee-3155-4738-9471-f49842a07327
        resellerReference: 4ec08a62-892c-48c1-a608-dc946531a33a
        supplierReference: K9T7R4
        unitId: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
        unit:
          id: adult_697e3ce8-1860-4cbf-80ad-95857df1f640
          internalName: Adult
          reference: null
          type: ADULT
          restrictions:
            minAge: 18
            maxAge: 99
            idRequired: false
            minQuantity: 1
            maxQuantity: 10
            paxCount: 1
            accompaniedBy: []
          requiredContactFields:
            - firstName
        status: ON_HOLD
        utcRedeemedAt: null
        contact:
          fullName: John Doe
          firstName: John
          lastName: Doe
          emailAddress: johndoe@email.com
          phoneNumber: ""
          locales:
            - en
          postalCode: ""
          country: ""
          notes: ""
        ticket: null
    UnitItemPricing:
      type: object
      properties:
        pricing:
          allOf:
            - $ref: "#/components/schemas/Pricing"
          description: "Is on the object when Pricing capability is requested. "
          example:
            original: 1000
            retail: 1000
            net: 8000
            currency: EUR
            currencyPrecision: 2
            includedTaxes: []
          x-capability-data:
            capability: octo/pricing
            required: true
      example:
        pricing:
          original: 1000
          retail: 1000
          net: 8000
          currency: EUR
          currencyPrecision: 2
          includedTaxes: []
    UnitPricing:
      type: object
      properties:
        pricingFrom:
          type: array
          items:
            $ref: "#/components/schemas/Pricing"
          description: "Is on the object when Pricing capability is requested. "
          example:
            - original: 1000
              retail: 1000
              net: 8000
              currency: EUR
              currencyPrecision: 2
              includedTaxes: []
            - original: 1000
              retail: 1000
              net: 8000
              currency: USD
              currencyPrecision: 2
              includedTaxes: []
          x-capability-data:
            capability: octo/pricing
            required: true
        pricing:
          type: array
          items:
            $ref: "#/components/schemas/Pricing"
          description: "Is on the object when Pricing capability is requested. "
          example:
            - original: 1000
              retail: 1000
              net: 8000
              currency: EUR
              currencyPrecision: 2
              includedTaxes: []
            - original: 1000
              retail: 1000
              net: 8000
              currency: USD
              currencyPrecision: 2
              includedTaxes: []
          x-capability-data:
            capability: octo/pricing
            required: true
      example:
        pricingFrom:
          - original: 1000
            retail: 1000
            net: 8000
            currency: EUR
            currencyPrecision: 2
            includedTaxes: []
          - original: 1000
            retail: 1000
            net: 8000
            currency: USD
            currencyPrecision: 2
            includedTaxes: []
        pricing:
          - original: 1000
            retail: 1000
            net: 8000
            currency: EUR
            currencyPrecision: 2
            includedTaxes: []
          - original: 1000
            retail: 1000
            net: 8000
            currency: USD
            currencyPrecision: 2
            includedTaxes: []
    UnitRestrictions:
      type: object
      required:
        - minAge
        - maxAge
        - idRequired
        - minQuantity
        - maxQuantity
        - paxCount
        - accompaniedBy
      properties:
        minAge:
          type: integer
          description: Minimum age to purchase the unit.
          example: 3
        maxAge:
          type: integer
          description: Maximum age to purchase the unit.
          example: 17
        idRequired:
          type: boolean
          description: Indicates if identification (e.g., student ID) is required for redemption.
          example: true
        minQuantity:
          type: integer
          nullable: true
          description: Minimum number of units that must be purchased (e.g., 2 tickets). Null means no minimum.
          example: 2
        maxQuantity:
          type: integer
          nullable: true
          description: Maximum number of units allowed in a single booking. Null means unlimited.
          example: 7
        paxCount:
          type: integer
          description: The number of people each unit represents (e.g., 1 family ticket = 4 pax).
          example: 1
        accompaniedBy:
          type: array
          items:
            type: string
          description: "Specifies if this unit must be accompanied by another unit (e.g., an infant ticket must be purchased with an adult ticket). Array of unit IDs which must be booked together. "
          example:
            - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
        minHeight:
          type: integer
          description: Minimum height required for this unit (e.g., for amusement park rides).
          example: 220
          x-capability-data:
            capability: octo/content
            required: false
        maxHeight:
          type: integer
          description: Maximum height allowed.
          example: 120
          x-capability-data:
            capability: octo/content
            required: false
        heightUnit:
          type: string
          description: Unit of height measurement (e.g., "cm" or "in") used for values of minHeight, maxHeight.
          example: ""
          x-capability-data:
            capability: octo/content
            required: false
        minWeight:
          type: integer
          description: Minimum weight required.
          example: 50
          x-capability-data:
            capability: octo/content
            required: false
        maxWeight:
          type: integer
          description: Maximum weight allowed.
          example: 120
          x-capability-data:
            capability: octo/content
            required: false
        weightUnit:
          type: string
          description: Unit of weight measurement (e.g., "kg" or "lb") used for values of minWeight, maxWeight.
          example: ""
          x-capability-data:
            capability: octo/content
            required: false
      example:
        minAge: 3
        maxAge: 17
        idRequired: true
        minQuantity: 2
        maxQuantity: 7
        paxCount: 1
        accompaniedBy:
          - adult_697e3ce8-1860-4cbf-80ad-95857df1f640
    UnitType:
      type: string
      enum:
        - ADULT
        - YOUTH
        - CHILD
        - INFANT
        - FAMILY
        - SENIOR
        - STUDENT
        - MILITARY
        - OTHER
      example: ADULT
  securitySchemes:
    BearerAuth:
      type: http
      scheme: Bearer
servers:
  - url: http://localhost:8080/api/octo
    description: ""
    variables: {}
  - url: https://ventrata-api-1011165921260.us-central1.run.app/api/octo
    description: ""
    variables: {}
