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 AvailabilityCalendarSchema: 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 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 AvailabilityCheckSchema: 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 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 BookingCancellationSchema: type: object required: - uuid properties: uuid: type: string description: The UUID of the booking 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 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 BookingConfirmationSchema: type: object required: - uuid - contact properties: uuid: type: string description: The UUID of the booking 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 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 BookingReservationSchema: 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 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 BookingUpdateSchema: type: object required: - uuid properties: uuid: type: string description: The UUID of the booking 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 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 ExtendReservationSchema: type: object required: - uuid properties: uuid: type: string description: The UUID of the booking expirationMinutes: type: integer 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 GetBookingPathParams: type: object required: - uuid properties: uuid: type: string description: The UUID of the booking GetBookingSchema: type: object required: - uuid properties: uuid: type: string description: The UUID of the booking 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 GetBookingsSchema: 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 GetProductSchema: type: object required: - id properties: id: type: string description: The id of the product GetProductsRequest: type: object GetProductsSchema: type: object GetSupplierRequest: type: object GetSupplierSchema: 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: {}