# Table of Contents - [Welcome | OCTO Developer Hub](#welcome-octo-developer-hub) - [Glossary of Terms | OCTO Developer Hub](#glossary-of-terms-octo-developer-hub) - [Errors | OCTO Developer Hub](#errors-octo-developer-hub) - [Development Support | OCTO Developer Hub](#development-support-octo-developer-hub) - [Endpoints & Capabilities | OCTO Developer Hub](#endpoints-capabilities-octo-developer-hub) - [Products | OCTO Developer Hub](#products-octo-developer-hub) - [Schemas | OCTO Developer Hub](#schemas-octo-developer-hub) - [Authentication | OCTO Developer Hub](#authentication-octo-developer-hub) - [Headers | OCTO Developer Hub](#headers-octo-developer-hub) - [Availability | OCTO Developer Hub](#availability-octo-developer-hub) - [Supplier | OCTO Developer Hub](#supplier-octo-developer-hub) - [Notifications | OCTO Developer Hub](#notifications-octo-developer-hub) - [Dropoffs [NEW] | OCTO Developer Hub](#dropoffs-new-octo-developer-hub) - [Pickups [NEW] | OCTO Developer Hub](#pickups-new-octo-developer-hub) - [Promotions [IN DEV] | OCTO Developer Hub](#promotions-in-dev-octo-developer-hub) - [Self-Certification Tool | OCTO Developer Hub](#self-certification-tool-octo-developer-hub) - [Slack Workspace | OCTO Developer Hub](#slack-workspace-octo-developer-hub) - [Content | OCTO Developer Hub](#content-octo-developer-hub) - [Postman Collections | OCTO Developer Hub](#postman-collections-octo-developer-hub) - [Pricing | OCTO Developer Hub](#pricing-octo-developer-hub) - [Known Implementations | OCTO Developer Hub](#known-implementations-octo-developer-hub) - [Glossary of Terms | OCTO Developer Hub](#glossary-of-terms-octo-developer-hub) - [Supplier | OCTO Developer Hub](#supplier-octo-developer-hub) - [Slack Workspace | OCTO Developer Hub](#slack-workspace-octo-developer-hub) - [Pricing | OCTO Developer Hub](#pricing-octo-developer-hub) - [Bookings | OCTO Developer Hub](#bookings-octo-developer-hub) --- # Welcome | OCTO Developer Hub Welcome to the official OCTO API Developer Hub! This portal describes the OCTO specification and provides additional resources and recommendations for developers implementing OCTO API to accept and provide data following this standard. You may also directly access [OCTO OpenAPI Specificationarrow-up-right](https://app.swaggerhub.com/apis-docs/OCTO-API/OCTO-API/1.0) referenced throughout this documentation as well as [OCTO GitHubarrow-up-right](https://github.com/octotravel) for additional dev resources. [hashtag](https://docs.octo.travel/#about-octo-api) About OCTO API ----------------------------------------------------------------------- [OCTOarrow-up-right](https://www.octo.travel/) (Open Connectivity for Tours, Activities, and Attractions) is an open standard API specification for the in-destination experiences sector of the travel industry. The standard defines agreed-upon schemas, endpoints, and capabilities commonly needed when connecting platforms, resellers, OTAs, and other technologies in tours, activities, and attractions. OCTO API is already adopted by a number of industry players. Check out [known implementations](https://docs.octo.travel/additional-resources/known-implementations) summarized by our member volunteers. circle-check **The OCTO API Specification is open source and available to anyone who wants to use it.** You do not need to be a member to use this specification in your business. If, however, you would like to support OCTO and have a voice in how the specification evolves, please consider [becoming a memberarrow-up-right](https://www.octo.travel/membership) . OCTO is developed and administered by a member-based not-for-profit organization OCTO Standards NP Inc. To learn more about OCTO and join the initiative as a member to contribute to the specification development, please visit [https://www.octo.travel/arrow-up-right](https://www.octo.travel/) . [hashtag](https://docs.octo.travel/#whats-new) What's New -------------------------------------------------------------- ### [hashtag](https://docs.octo.travel/#november-13-2025) November 13, 2025 * Published the [Pickups](https://docs.octo.travel/capabilities-optional/pickups-new) capability. * Published the [Dropoffs](https://docs.octo.travel/capabilities-optional/dropoffs-new) capability. * Added the draft [Promotions](https://docs.octo.travel/capabilities-optional/promotions-in-dev) capability. * Replaced the outdated Validator page with current [Self-Certification Tool](https://docs.octo.travel/additional-resources/self-certification-tool) information. * Fixed outdated details and links across [Endpoints and Capabilities](https://docs.octo.travel/getting-started/endpoints-and-capabilities) . * Added a new page about the OCTO [Slack Workspace](https://docs.octo.travel/additional-resources/slack-workspace) . ### [hashtag](https://docs.octo.travel/#may-10-2025) May 10, 2025 * Published [Content](https://docs.octo.travel/capabilities-optional/content) capability. * Published the proposed draft for the [Pickups](https://docs.octo.travel/capabilities-optional/pickups-new) capability. Still pending the Specification Committee review. ### [hashtag](https://docs.octo.travel/#april-22-2024) April 22, 2024 * Replaced Webhooks capability proposed draft with the [Notifications](https://docs.octo.travel/capabilities-optional/notifications) capability placeholder, based on Specification Committee review. * Added placeholders for [Content](https://docs.octo.travel/capabilities-optional/content) and [Pickups](https://docs.octo.travel/capabilities-optional/pickups-new) capabilities that are next in the development queue. ### [hashtag](https://docs.octo.travel/#february-3-2024) February 3, 2024 * [Pricing](https://docs.octo.travel/capabilities-optional/pricing) capability is out of draft ### [hashtag](https://docs.octo.travel/#july-28-2023) July 28, 2023 * The official specification [OCTO OpenAPI Specificationarrow-up-right](https://app.swaggerhub.com/apis-docs/OCTO-API/OCTO-API/1.0) has been updated to correct typos and all the latest changes in line with the 1.0 specification. * [https://docs.octo.travelarrow-up-right](https://docs.octo.travel/) has been migrated to GitBook to provide additional tools for users. * Additional information was added to explain the concept of OCTO API Core Endpoints and additional capabilities to be added to the specification. * Corrected [Booking Cancellation](https://docs.octo.travel/octo-api-core/bookings#booking-cancellation) to `POST` `/bookings/{uuid}/cancel` instead of `DELETE` `/bookings/{uuid}` as per OpenAPI 3.0. [NextGlossary of Termschevron-right](https://docs.octo.travel/getting-started/glossary-of-terms) Last updated 3 months ago --- # Glossary of Terms | OCTO Developer Hub OCTO defines core terms that are re-used throughout the specification. Below we include some of the key terms you need to know before getting started. Refer to [Schemas](https://docs.octo.travel/getting-started/schemas) for detailed definitions of fields used in the specification. Term Definition **Reseller** The reseller, connecting to the Supplier via the API, to further distribute their Products **Supplier** The provider of Products, which Reseller is connecting to. **Product** The attraction, activity or tour offered by Supplier. **Option** A variant of the Product. All products must have at least one option. **Unit** The ticket type, e.g. Adult, Child, Senior, etc. **Unit Item** A line item per unit within the booking. **Booking** A booking made for a specific Product and Option and one or more Unit Items. **Voucher** A single admission document (barcode, QRcode, PDF, etc.) that can be used for the entire booking. **Ticket** An admission document (barcode, QRcode, PDF, etc.) that can be used per unit item. [PreviousWelcomechevron-left](https://docs.octo.travel/) [NextErrorschevron-right](https://docs.octo.travel/getting-started/errors) Last updated 2 years ago --- # Errors | OCTO Developer Hub OCTO API should respond to every request with either a `200 OK` if everything went ok or `400 Bad Request` if it didn't. In the case of the `400 Bad Request`, the response body should similar to this: Copy { "error": "INVALID_PRODUCT_ID", "errorMessage": "The Product ID was invalid or missing", "productId": "123" } Error response should always provide `error` and `errorMessage` defined as: FIELD DESCRIPTION `error` The error code, a table of possible error codes is shown below. `errorMessage` A human readable error message which will be translated depending on the language provided by the `Accept-Language` header. Depending on the error code we also may pass additional fields which can make it easier to understand what's wrong with your request. In the example above we provide `productId` and pass the value that was sent in the request, indicating that the productId of `123` is not valid. [hashtag](https://docs.octo.travel/getting-started/errors#list-of-error-codes) List of Error Codes ------------------------------------------------------------------------------------------------------- Below is a list of the error codes and a description of what each means. Further down this page we also provide an example request body for all the error codes that provide additional attributes. CODE DESCRIPTION `INVALID_PRODUCT_ID` Missing or invalid `productId` in the request `INVALID_OPTION_ID` Missing or invalid `optionId` in the request `INVALID_UNIT_ID` Missing or invalid `unitId` in the request `INVALID_AVAILABILITY_ID` Missing or invalid `availabilityId` in the request `INVALID_BOOKING_UUID` Missing or invalid booking uuid, or if you're confirming the booking the booking may have expired already. `BAD_REQUEST` If your request body is not formatted correctly, you have missing required fields or any of the data types are incorrect. `UNPROCESSABLE_ENTITY` If your 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. `INTERNAL_SERVER_ERROR` Hopefully this never happens, but if the backend server is down or there's a network outage. `UNAUTHORIZED` You didn't send the API Key in the `Authorization` header to an endpoint that requires authentication. `FORBIDDEN` 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. As explained above it's also possible for specific error codes to have additional attributes that help you diagnose what is wrong with your request. Below are all the specific errors that contain these attributes: ### [hashtag](https://docs.octo.travel/getting-started/errors#invalid_product_id) INVALID\_PRODUCT\_ID Copy { "error": "INVALID_PRODUCT_ID", "errorMessage": "The Product ID was invalid or missing", "productId": "123" } ### [hashtag](https://docs.octo.travel/getting-started/errors#invalid_product_id-1) INVALID\_OPTION\_ID Copy { "error": "INVALID_OPTION_ID", "errorMessage": "The Option ID was invalid or missing", "optionId": "321" } ### [hashtag](https://docs.octo.travel/getting-started/errors#invlid_unit_id) INVLID\_UNIT\_ID Copy { "error": "INVALID_UNIT_ID", "errorMessage": "The Unit ID was invalid or missing", "unitId": "senior-123678" } ### [hashtag](https://docs.octo.travel/getting-started/errors#invalid_availabaility_id) INVALID\_AVAILABAILITY\_ID Copy { "error": "INVALID_AVAILABILITY_ID", "errorMessage": "The Availability ID was invalid or missing", "availabilityId": "2020-01-01T10:30+08:00" } [PreviousGlossary of Termschevron-left](https://docs.octo.travel/getting-started/glossary-of-terms) [NextHeaderschevron-right](https://docs.octo.travel/getting-started/headers) Last updated 2 years ago --- # Development Support | OCTO Developer Hub circle-check [**Join OCTO as a member**arrow-up-right](https://www.octo.travel/join) **to get support with implementing OCTO from fellow members via our 300+ member** [**Slack community**arrow-up-right](https://octo-travel.slack.com/) **.** If you are a non-member and have questions about implementing OCTO, you may reach out to the volunteer-run inbox [help@octo.travelenvelope](mailto:help@octo.travel) . Note, we cannot guarantee a timelily and accurate reply to non-members. Reservation/ticketing system providers can also take advantage of the [OCTO Self-Certification Tool](https://docs.octo.travel/additional-resources/self-certification-tool) to test their implementations. [PreviousSchemaschevron-left](https://docs.octo.travel/getting-started/schemas) [NextSupplierchevron-right](https://docs.octo.travel/octo-api-core/supplier) Last updated 3 months ago --- # Endpoints & Capabilities | OCTO Developer Hub OCTO defines several [Core Endpoints](https://docs.octo.travel/getting-started/endpoints-and-capabilities#octo-api-core-endpoints) that apply to most use cases and are **required** for the implementation. Since not all use cases can be fulfilled with just the core endpoints, OCTO provides a concept of [Capabilities](https://docs.octo.travel/getting-started/endpoints-and-capabilities#capabilities) , allowing for enhancement to the integrations based on specific needs. Capabilities are **optional** for implementation and to enhance integration by, for example, adding additional information about pricing, content, pickups, etc. [hashtag](https://docs.octo.travel/getting-started/endpoints-and-capabilities#octo-api-core-endpoints) OCTO API Core Endpoints ----------------------------------------------------------------------------------------------------------------------------------- ### [hashtag](https://docs.octo.travel/getting-started/endpoints-and-capabilities#supplier) [Supplier](https://docs.octo.travel/getting-started/endpoints-and-capabilities#suppliers) Name Method Description [Get Supplier](https://docs.octo.travel/octo-api-core/supplier) `GET` Returns a single Supplier and associated details for a given Supplier ID. ### [hashtag](https://docs.octo.travel/getting-started/endpoints-and-capabilities#products) [Products](https://docs.octo.travel/getting-started/endpoints-and-capabilities#products) [Get Product List](https://docs.octo.travel/octo-api-core/products#get-product-list) `GET` Returns a list of Products and associated details. [Get Product](https://docs.octo.travel/octo-api-core/products#get-product) `GET` Returns a single Product and associated details for a given Product ID. ### [hashtag](https://docs.octo.travel/getting-started/endpoints-and-capabilities#availability) [Availability](https://docs.octo.travel/getting-started/endpoints-and-capabilities#availability) [Availablity Calendar](https://docs.octo.travel/octo-api-core/availability#availability-calendar) `POST` Returns availability for a given Product & Option as a single object per day. Optimized to be queried for large date ranges and to populate an availability calendar. [Availability Check](https://docs.octo.travel/octo-api-core/availability#availability-check) `POST` Returns availability for a given Product & Option as a single object per start time (or day). You have to perform this step to retrieve an `availabilityId` required for Bookings. ### [hashtag](https://docs.octo.travel/getting-started/endpoints-and-capabilities#bookings) [Bookings](https://docs.octo.travel/getting-started/endpoints-and-capabilities#bookings) [Create Booking](https://docs.octo.travel/octo-api-core/bookings#create-booking) `POST` Creates a booking that reserves the availability (e.g. while you collect payment and contact information from the customer) for a given `availabilityId`. The booking will remain with the status `ON_HOLD` until Booking Confirmation or when the reservation hold expires. [Confirm Booking](https://docs.octo.travel/octo-api-core/bookings#confirm-booking) `POST` Confirms previously placed Booking Reservation, finalizing the booking and making it ready to be used. [Update Booking](https://docs.octo.travel/octo-api-core/bookings#update-booking) `PATCH` Updates/changes your booking before and after it has been confirmed as long as it hasn't yet been redeemed or within the cancellation cutoff window. [Cancel Booking](https://docs.octo.travel/octo-api-core/bookings#cancel-booking) `POST` Cancels your booking. You can only cancel a booking if `booking.cancellable` is `TRUE`, and is within the booking cancellation cut-off window. [Extend Pending Booking Expiration](https://docs.octo.travel/octo-api-core/bookings#extend-pending-booking-expiration) `POST` Extends the Booking Reservation availability hold if the booking status is `ON_HOLD`. [Get Booking](https://docs.octo.travel/octo-api-core/bookings#get-booking) `GET` Returns the status and details of your existing booking. [Get Booking List](https://docs.octo.travel/octo-api-core/bookings#get-booking-list) `GET` Returns the list of the bookings you made for the given filters. [hashtag](https://docs.octo.travel/getting-started/endpoints-and-capabilities#capabilities) Capabilities ------------------------------------------------------------------------------------------------------------- Name ID Description location-plus[Pickups \[NEW\]](https://docs.octo.travel/capabilities-optional/pickups-new) `pricing` Adds pricing to most endpoints, giving you advanced static and dynamic pricing capabilities. webhook[Notifications](https://docs.octo.travel/capabilities-optional/notifications) `notifications` Allows to subscribe to be notified when something changes against products, availability or bookings. image-landscape[Content](https://docs.octo.travel/capabilities-optional/content) `content` Extends the core product, option, and unit schemas to provide rich content and images. location-plus[Pickups \[NEW\]](https://docs.octo.travel/capabilities-optional/pickups-new) `pickups` Adds structured pickup support, allowing predefined or customer-defined pickup locations, including pickup time windows. location-minus[Dropoffs \[NEW\]](https://docs.octo.travel/capabilities-optional/dropoffs-new) `dropoffs` Adds structured dropoff support, allowing predefined or customer-defined end-of-tour return locations, including time-window details. badge-percent[Promotions \[IN DEV\]](https://docs.octo.travel/capabilities-optional/promotions-in-dev) `promotions` _🚨 In development, not reviewed or ratified._ Adds promotional pricing to availability and bookings, exposing promotional offers and their details. You control which capabilities you want to enable by using the `Octo-Capabilities` [header](https://docs.octo.travel/getting-started/headers) . For example: Copy GET /availability HTTP/1.1 Host: {host} Authorization: Bearer {your_API_key} Octo-Capabilities: octo/content, octo/offers It's also possible to use the `_capabilities` query parameter if you're unable to use headers: Copy GET /availability?_capabilities=octo/content,octo/pricing HTTP/1.1 Host: {host} Authorization: Bearer {your_API_key} You can list all the capabilities with a comma to separate each one. [PreviousAuthenticationchevron-left](https://docs.octo.travel/getting-started/authentication) [NextSchemaschevron-right](https://docs.octo.travel/getting-started/schemas) Last updated 3 months ago --- # Products | OCTO Developer Hub [hashtag](https://docs.octo.travel/octo-api-core/products#get-product-list) Get Product List ------------------------------------------------------------------------------------------------- ### [hashtag](https://docs.octo.travel/octo-api-core/products#get-products) Get Products get http://localhost:8080/api/octochevron-down http://localhost:8080/api/octohttps://ventrata-api-1011165921260.us-central1.run.app/api/octo /products/copy Fetch the list of products. Authorizations BearerAuthchevron-down BearerAuth HTTPRequired Header parameters Octo-CapabilitiesstringRequired A list of the Capabilities (their IDs) initialized with your request. Accept-LanguagestringOptional 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. Responses chevron-right 200 The request has succeeded. application/json Headersobject Show Headersplus Responseobject\[\]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"]}]}]}` Show propertiesplus chevron-right 400 The server could not understand the request due to invalid syntax. application/json get /products/ HTTPchevron-down HTTPcURLJavaScriptPython Copy GET /api/octo/products/ HTTP/1.1 Host: localhost:8080 Authorization: Bearer YOUR_SECRET_TOKEN Octo-Capabilities: text Accept: */* Test it 200 The request has succeeded. chevron-down Copy [\ {\ "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 examplechevron-down [hashtag](https://docs.octo.travel/octo-api-core/products#get-product) Get Product --------------------------------------------------------------------------------------- ### [hashtag](https://docs.octo.travel/octo-api-core/products#get-products-id) Get Product get http://localhost:8080/api/octochevron-down http://localhost:8080/api/octohttps://ventrata-api-1011165921260.us-central1.run.app/api/octo /products/{id}copy Fetch the product for the given id. Authorizations BearerAuthchevron-down BearerAuth HTTPRequired Path parameters idstringRequired The product id Header parameters Octo-CapabilitiesstringRequired A list of the Capabilities (their IDs) initialized with your request. Accept-LanguagestringOptional 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. Responses chevron-right 200 The request has succeeded. application/json Headersobject Show Headersplus ResponseobjectExample: `{"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"]}]}]}` Show propertiesplus chevron-right 400 The server could not understand the request due to invalid syntax. application/json get /products/{id} HTTPchevron-down HTTPcURLJavaScriptPython Copy GET /api/octo/products/{id} HTTP/1.1 Host: localhost:8080 Authorization: Bearer YOUR_SECRET_TOKEN Octo-Capabilities: text Accept: */* Test it 200 The request has succeeded. chevron-down Copy { "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 examplechevron-down [PreviousSupplierchevron-left](https://docs.octo.travel/octo-api-core/supplier) [NextAvailabilitychevron-right](https://docs.octo.travel/octo-api-core/availability) Last updated 3 months ago --- # Schemas | OCTO Developer Hub See [OCTO OpenAPI Specification (Swagger)arrow-up-right](https://app.swaggerhub.com/apis-docs/OCTO-API/OCTO-API/1.0) for the list of OCTO Schemas. [PreviousEndpoints & Capabilitieschevron-left](https://docs.octo.travel/getting-started/endpoints-and-capabilities) [NextDevelopment Supportchevron-right](https://docs.octo.travel/getting-started/development-support) Last updated 2 years ago --- # Authentication | OCTO Developer Hub OCTO uses Bearer authentication. To authenticate requests, an API key must be sent as a Bearer token in the Authorization [header](https://docs.octo.travel/getting-started/headers) of your request: Copy GET /supplier HTTP/1.1 Host: {host} Authorization: Bearer {your_API_key} circle-info For security reasons, it's recommended to use a single unique API key per reseller-supplier relationship. All API requests must be made over HTTPS. Calls made over plain HTTP should fail. API requests without authentication will also fail. If the token is invalid or is deactivated by Supplier a 403 Forbidden error should be returned. [PreviousHeaderschevron-left](https://docs.octo.travel/getting-started/headers) [NextEndpoints & Capabilitieschevron-right](https://docs.octo.travel/getting-started/endpoints-and-capabilities) Last updated 2 years ago --- # Headers | OCTO Developer Hub A set of HTTP headers must be set when making a request to OCTO API. These headers can include both standard HTTP headers as well as some custom OCTO API headers. Below are the standard request headers and OCTO custom headers that are required to use: [hashtag](https://docs.octo.travel/getting-started/headers#request-headers) Request Headers ------------------------------------------------------------------------------------------------ Header Required Description `Authorization` Required Your [Authentication](https://docs.octo.travel/getting-started/authentication) `Bearer` token. `Content-Type` Required This must be `application/json` for all `POST` `PATCH` and `DELETE` requests. `Octo-Capabilities` Required A list of the Capabilities (their IDs) to be included in the response. See [Endpoints and Capabilities](https://docs.octo.travel/getting-started/endpoints-and-capabilities) to learn more about Capabilities. [hashtag](https://docs.octo.travel/getting-started/headers#response-headers) Response Headers -------------------------------------------------------------------------------------------------- Header Required Description `Content-Type` Required `application/json` `Octo-Capabilities` Required A list of the Capabilities (their IDs) initialized with your request. See [Endpoints and Capabilities](https://docs.octo.travel/getting-started/endpoints-and-capabilities) to learn more about Capabilities. [PreviousErrorschevron-left](https://docs.octo.travel/getting-started/errors) [NextAuthenticationchevron-right](https://docs.octo.travel/getting-started/authentication) Last updated 1 year ago --- # Availability | OCTO Developer Hub The first step when making a sale is to check for availability. Note if `allowFreesale` is set to true on the [product](https://docs.octo.travel/octo-api-core/products) then this step is optional but it is advised you check it anyway if you can to check for closures. OCTO has two main availability calls: [Availability Calendar](https://docs.octo.travel/octo-api-core/availability#availability-calendar) endpoint is designed to be highly optimized and returns 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. [Availability Check](https://docs.octo.travel/octo-api-core/availability#availability-check) endpoint may be slightly slower as it will return an object for each individual departure time (or day). [hashtag](https://docs.octo.travel/octo-api-core/availability#availability-calendar) Availability Calendar --------------------------------------------------------------------------------------------------------------- ### [hashtag](https://docs.octo.travel/octo-api-core/availability#post-availability-calendar) Availability Calendar post http://localhost:8080/api/octochevron-down http://localhost:8080/api/octohttps://ventrata-api-1011165921260.us-central1.run.app/api/octo /availability/calendarcopy 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 Authorizations BearerAuthchevron-down BearerAuth HTTPRequired Header parameters Octo-CapabilitiesstringRequired A list of the Capabilities (their IDs) initialized with your request. Accept-LanguagestringOptional 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. Body application/jsonchevron-down application/json productIdstringRequired The product id. Example: `6b903d44-dc24-4ca4-ae71-6bde6c4f4854` optionIdstringRequired The option id. Example: `DEFAULT` localDateStartstringOptional Start date to query for (YYYY-MM-DD). Example: `2022-05-23` localDateEndstringOptional End date to query for (YYYY-MM-DD). Example: `2022-05-29` unitsobject\[\]Optional A list of units. Example: `[{"id":"adult_697e3ce8-1860-4cbf-80ad-95857df1f640","quantity":2},{"id":"child_797e3ce8-1860-4cbf-80ad-95857df1f640","quantity":1}]` Show propertiesplus currencystringOptional Can be used only when pricing capability is used. Example: `USD` Responses chevron-right 200 The request has succeeded. application/json Headersobject Show Headersplus Responseobject\[\]Example: `{"localDate":"2022-05-12","available":true,"status":"AVAILABLE","vacancies":10,"capacity":10,"openingHours":[{"from":"08:00","to":"16:00"}]}` Show propertiesplus chevron-right 400 The server could not understand the request due to invalid syntax. application/json post /availability/calendar HTTPchevron-down HTTPcURLJavaScriptPython Copy POST /api/octo/availability/calendar HTTP/1.1 Host: localhost:8080 Authorization: Bearer YOUR_SECRET_TOKEN Octo-Capabilities: text Content-Type: application/json Accept: */* Content-Length: 131 { "productId": "6b903d44-dc24-4ca4-ae71-6bde6c4f4854", "optionId": "DEFAULT", "localDateStart": "2022-05-23", "localDateEnd": "2022-05-29" } Test it 200 The request has succeeded. chevron-down Copy [\ {\ "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"\ }\ ]\ }\ ] Opening Hours Examplechevron-down [hashtag](https://docs.octo.travel/octo-api-core/availability#availability-check) Availability Check --------------------------------------------------------------------------------------------------------- triangle-exclamation **A reseller has to perform** [**Availability Check**](https://docs.octo.travel/octo-api-core/availability#availability-check) **to retrieve an** `availabilityId` **in order to make a** [**Booking Reservation**](https://docs.octo.travel/octo-api-core/bookings#booking-reservation) **, so this endpoint is critical for the booking flow.** ### [hashtag](https://docs.octo.travel/octo-api-core/availability#post-availability) Availability Check post http://localhost:8080/api/octochevron-down http://localhost:8080/api/octohttps://ventrata-api-1011165921260.us-central1.run.app/api/octo /availability/copy 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` Authorizations BearerAuthchevron-down BearerAuth HTTPRequired Header parameters Octo-CapabilitiesstringRequired A list of the Capabilities (their IDs) initialized with your request. Accept-LanguagestringOptional 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. Body application/jsonchevron-down application/json productIdstringRequired The product id. Example: `6b903d44-dc24-4ca4-ae71-6bde6c4f4854` optionIdstringRequired The option id. Example: `DEFAULT` localDateStartstringOptional Start date to query for (YYYY-MM-DD). Required if `localDateEnd` is set. Example: `2022-05-23` localDateEndstringOptional End date to query for (YYYY-MM-DD). Required if `localDateStart` is set. Example: `2022-05-29` availabilityIdsstring\[\]Optional Filter the results by the given ids. Example: `["2022-05-23T00:00:00+01:00"]` unitsobject\[\]Optional A list of units. Example: `[{"id":"adult_697e3ce8-1860-4cbf-80ad-95857df1f640","quantity":2},{"id":"child_797e3ce8-1860-4cbf-80ad-95857df1f640","quantity":1}]` Show propertiesplus currencystringOptional Can be used only when pricing capability is used. Example: `USD` Responses chevron-right 200 The request has succeeded. application/json Headersobject Show Headersplus Responseobject\[\]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"}]}` Show propertiesplus chevron-right 400 The server could not understand the request due to invalid syntax. application/json post /availability/ HTTPchevron-down HTTPcURLJavaScriptPython Copy POST /api/octo/availability/ HTTP/1.1 Host: localhost:8080 Authorization: Bearer YOUR_SECRET_TOKEN Octo-Capabilities: text Content-Type: application/json Accept: */* Content-Length: 131 { "productId": "6b903d44-dc24-4ca4-ae71-6bde6c4f4854", "optionId": "DEFAULT", "localDateStart": "2022-05-23", "localDateEnd": "2022-05-29" } Test it 200 The request has succeeded. chevron-down Copy [\ {\ "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"\ }\ ]\ }\ ] Opening Hours Examplechevron-down [PreviousProductschevron-left](https://docs.octo.travel/octo-api-core/products) [NextBookingschevron-right](https://docs.octo.travel/octo-api-core/bookings) Last updated 7 months ago --- # Supplier | OCTO Developer Hub [hashtag](https://docs.octo.travel/octo-api-core/supplier#get-supplier) Get Supplier ----------------------------------------------------------------------------------------- ### [hashtag](https://docs.octo.travel/octo-api-core/supplier#get-supplier-1) Get Supplier get http://localhost:8080/api/octochevron-down http://localhost:8080/api/octohttps://ventrata-api-1011165921260.us-central1.run.app/api/octo /supplier/copy Returns the supplier and associated contact details. Authorizations BearerAuthchevron-down BearerAuth HTTPRequired Header parameters Octo-CapabilitiesstringRequired A list of the Capabilities (their IDs) initialized with your request. Accept-LanguagestringOptional 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. Responses chevron-right 200 The request has succeeded. application/json Headersobject Show Headersplus ResponseobjectExample: `{"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"}}` Show propertiesplus chevron-right 400 The server could not understand the request due to invalid syntax. application/json get /supplier/ HTTPchevron-down HTTPcURLJavaScriptPython Copy GET /api/octo/supplier/ HTTP/1.1 Host: localhost:8080 Authorization: Bearer YOUR_SECRET_TOKEN Octo-Capabilities: text Accept: */* Test it 200 The request has succeeded. chevron-down Copy { "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 examplechevron-down [PreviousDevelopment Supportchevron-left](https://docs.octo.travel/getting-started/development-support) [NextProductschevron-right](https://docs.octo.travel/octo-api-core/products) Last updated 7 months ago --- # Notifications | OCTO Developer Hub To use this capability, add `notifications` to your `Octo-Capabilities` header. This capability allows you to subscribe to be notified when something changes against either of the: 1. **Product** 2. **Availability** 3. **Booking** [hashtag](https://docs.octo.travel/capabilities-optional/notifications#managing-notification-subscriptions) Managing Notification Subscriptions ---------------------------------------------------------------------------------------------------------------------------------------------------- You can subscribe to notifications by creating subscriptions, which can be [created](https://docs.octo.travel/capabilities-optional/notifications#create-notification) , [updated](https://docs.octo.travel/capabilities-optional/notifications#update-notification) or [deleted](https://docs.octo.travel/capabilities-optional/notifications#delete-notification) . You can also [list](https://docs.octo.travel/capabilities-optional/notifications#list-notifications) your subscriptions or [retrieve](https://docs.octo.travel/capabilities-optional/notifications#get-notification) a specific one. ### [hashtag](https://docs.octo.travel/capabilities-optional/notifications#create-subscription) Create Subscription `POST` `/notifications/subcriptions` **Headers** Name Value Content-Type `application/json` Authorization `Bearer ` Octo-Capabilities `notifications` **Body** Name Type Description `url` string The URL where you want the notifications to be sent to `notificationTypes` array The type(s) of notifications you would like to be subscribed to as a part of this subscription. Possible events are: 1. `PRODUCT_UPDATE` (changes to product object, including option, ticket, etc. within it) 2. `AVAILABILITY_UPDATE` (changes to availabilities) 3. `BOOKING_UPDATE` (changes to bookings) `headers` object List of HTTP headers you want to be included in the request (eg. for authentication) #### [hashtag](https://docs.octo.travel/capabilities-optional/notifications#example-request) Example Request Copy POST /notifications/subcriptions Content-Type: application/json { "url": "https://example.com/myapp/example1", "notificationTypes": [\ "PRODUCT_UPDATE",\ "AVAILABILITY_UPDATE",\ "BOOKING_UPDATE"\ ], "headers": { "Api-Key": "secret" } } **Example Response** Copy { "id": "5c7d6dbb-cd4c-48fd-9709-0ebaa14d7a00", "notificationTypes": [\ "PRODUCT_UPDATE",\ "AVAILABILITY_UPDATE",\ "BOOKING_UPDATE"\ ], "url": "https://example.com/myapp/example1", "headers": { "Api-Key": "secret" } } Note the `id` of your created subscription. You can use it to manage your created notification as described below. The REST endpoints will behave as you'd expect using the same schema as above. ### [hashtag](https://docs.octo.travel/capabilities-optional/notifications#update-subscription) Update Subscription Update an existing notification: `PATCH` `/notifications/subscriptions/` ### [hashtag](https://docs.octo.travel/capabilities-optional/notifications#delete-subscription) Delete Subscription Delete an existing notification: `DELETE` `/notifications/subscriptions/` ### [hashtag](https://docs.octo.travel/capabilities-optional/notifications#get-subscription) Get Subscription Retrieve an existing notification: `GET` `/notifications/subscriptions/` ### [hashtag](https://docs.octo.travel/capabilities-optional/notifications#list-subscriptions) List Subscriptions List all of the notifications associated with your account (Bearer Token): `GET` `/notifications/subscriptions` [hashtag](https://docs.octo.travel/capabilities-optional/notifications#receiving-notifications) Receiving Notifications ---------------------------------------------------------------------------------------------------------------------------- When receiving notification you've created, the request body will not include the fully serialized object of either a product, availability or booking. Instead it'll simply provide you with the parameters needed to fetch that updated resource if you choose to. This can be done using OCTO Core [Get Product](https://docs.octo.travel/octo-api-core/products#products-id) , [Get Booking](https://docs.octo.travel/octo-api-core/bookings#bookings-uuid) , and [Availability](https://docs.octo.travel/octo-api-core/availability#availability) endpoints correspondingly. This is to reduce the volume of data sent in the request and allow the receiver of the notification to chose which capabilities they want to include when fetching the updated resource. All notifications will be HTTP POST requests and include a standard payload scheme: Copy { "subscriptionId": "5c7d6dbb-cd4c-48fd-9709-0ebaa14d7a00", "notificationType": "PRODUCT_UPDATE", "data": { ... } } The value included in `data` is the content of the notification will vary based on `type`: PRODUCT\_UPDATE AVAILABILITY\_UPDATE BOOKING\_UPDATE Copy { "id": "503eac5-bfab-4465-aad1-fc023b23cdc6", "subscriptionId": "5c7d6dbb-cd4c-48fd-9709-0ebaa14d7a00", "notificationType": "PRODUCT_UPDATE", "utcCreatedAt": "2024-05-07T15:47:32Z", "data": { "productId": "ff53a321-a07b-4428-b8b3-086c94fb4147" } } `productId` then be used to request the updated product details using [Get Product](https://docs.octo.travel/octo-api-core/products#get-product) . Copy { "id": "5d6e16a3-17af-4293-b3a5-406b5be5fc37", "subscriptionId": "5c7d6dbb-cd4c-48fd-9709-0ebaa14d7a00", "notificationType": "AVAILABILITY_UPDATE", "utcCreatedAt": "2024-05-07T15:42:37Z", "data": { "productId": "ff53a321-a07b-4428-b8b3-086c94fb4147", "optionId": "49bb9bd7-2cb2-4125-9e8b-c6efdee1e060", "localDateStart": "2025-01-01", "localDateEnd": "2025-01-07" } } The data object will contain request parameters compatible with any valid Availability Check request, eg. including `availabilityIds` instead of `localDateStart/localDateEnd`. You can then retrieve change details for these using [Availability](https://docs.octo.travel/octo-api-core/availability) endpoints. Copy { "id": "2a84129e-3fab-461d-adb1-b12217ef0637", "subscriptionId": "5c7d6dbb-cd4c-48fd-9709-0ebaa14d7a00", "notificationType": "BOOKING_UPDATE", "utcCreatedAt": "2024-05-07T15:49:31Z", "data": { "uuid": "383ef506-f632-4cc1-bdf1-f619e12e94dd" } } Booking `uuid` then be used to request the updated product details using [Get Booking](https://docs.octo.travel/octo-api-core/bookings#bookings-uuid) . circle-info It is recommended that all notifications receive a 2xx response to confirm successful delivery and processing. [PreviousPricingchevron-left](https://docs.octo.travel/capabilities-optional/pricing) [NextContentchevron-right](https://docs.octo.travel/capabilities-optional/content) Last updated 10 months ago --- # Dropoffs [NEW] | OCTO Developer Hub ### [hashtag](https://docs.octo.travel/capabilities-optional/dropoffs-new#business-context) Business Context Dropoff service is commonly offered for tours and activities. It allows customers to be returned to one of the designated locations, or even to a customer-defined point within a supported dropoff area, instead of being left at the main ending point. This service may be included for free or offered at an additional cost. The OCTO Dropoffs Capability allows: * **Supplier systems** to indicate whether a product option supports dropoff, whether dropoff is required, and to provide structured dropoff locations and areas. * **Reseller systems** to obtain dropoff data, display available choices to customers during the booking flow, pass the customer’s selected dropoff location when creating, confirming, or updating a booking, and leverage a capability-specific endpoint to validate dropoff availability based on a customer-defined point (e.g., latitude/longitude). Identical functionality is also available for pickups through the [Pickups](https://docs.octo.travel/capabilities-optional/pickups-new) , which mirrors dropoffs and provides structured or customer-defined start-of-tour collection options. ### [hashtag](https://docs.octo.travel/capabilities-optional/dropoffs-new#capability-summary) Capability Summary To enable this capability when supported by a supplier system’s OCTO API, the reseller system must include `dropoffs` in the `Octo-Capabilities` header of its requests to the supplier system. Adding `dropoffs` to your `Octo-Capabilities` header will alter OCTO Core endpoint behavior as follows: Endpoint Dropoffs Capability Enhancements to OCTO Core [Get Supplier](https://docs.octo.travel/octo-api-core/supplier#get-supplier) _No additional functionality._ [Get Product List](https://docs.octo.travel/octo-api-core/products#get-product-list) [Response](https://docs.octo.travel/capabilities-optional/dropoffs-new#get-product-list-and-get-product-with-pickups) payload includes, per product option, whether dropoff is available, required for booking, and a list of supported locations/areas with their details. [Get Product](https://docs.octo.travel/octo-api-core/products#get-product) [Response](https://docs.octo.travel/capabilities-optional/dropoffs-new#get-product-list-and-get-product-with-pickups) payload includes, per product option, whether dropoff is available, required for booking, and a list of supported locations/areas with their details. [Availability Calendar](https://docs.octo.travel/octo-api-core/availability#availability-calendar) [Request](https://docs.octo.travel/capabilities-optional/dropoffs-new#post-availability-calendar-with-pickups) can specify if the customer wants dropoff and the chosen location. [Response](https://docs.octo.travel/capabilities-optional/dropoffs-new#post-availability-calendar-with-pickups) includes, per calendar day, whether dropoff is available, required, and the list of supported locations/areas with details. [Availability Check](https://docs.octo.travel/octo-api-core/availability#availability-check) [Request](https://docs.octo.travel/capabilities-optional/dropoffs-new#post-availability-check-with-pickups) can specify if the customer wants dropoff and the chosen location. [Response](https://docs.octo.travel/capabilities-optional/dropoffs-new#post-availability-check-with-pickups) includes, per availability, whether dropoff is available, required, the list of supported locations/areas with details, including dropoff time window. [Create Booking](https://docs.octo.travel/octo-api-core/bookings#create-booking) [Request](https://docs.octo.travel/capabilities-optional/dropoffs-new#post-create-booking-patch-update-booking-with-pickups) can specify if the customer wants dropoff, the chosen location, as well as any dropoff notes for booking. [Response](https://docs.octo.travel/capabilities-optional/dropoffs-new#post-create-booking-patch-update-booking-with-pickups) includes if the dropoff is requested for the booking, the selected dropoff location with details, including the dropoff time window. [Extend Pending Booking Expiration](https://docs.octo.travel/octo-api-core/bookings#extend-pending-booking-expiration) [Response](https://docs.octo.travel/capabilities-optional/dropoffs-new#post-create-booking-patch-update-booking-with-pickups) includes if the dropoff is requested for the booking, the selected dropoff location with details, including the dropoff time window. [Confirm Booking](https://docs.octo.travel/octo-api-core/bookings#confirm-booking) [Response](https://docs.octo.travel/capabilities-optional/dropoffs-new#post-create-booking-patch-update-booking-with-pickups) includes if the dropoff is requested for the booking, the selected dropoff location with details, including the dropoff time window. [Cancel Booking](https://docs.octo.travel/octo-api-core/bookings#cancel-booking) [Response](https://docs.octo.travel/capabilities-optional/dropoffs-new#post-create-booking-patch-update-booking-with-pickups) includes if the dropoff is requested for the booking, the selected dropoff location with details, including the dropoff time window. [Update Booking](https://docs.octo.travel/octo-api-core/bookings#update-booking) [Request](https://docs.octo.travel/capabilities-optional/dropoffs-new#post-create-booking-patch-update-booking-with-pickups) can specify if the customer wants dropoff, the chosen location, as well as any dropoff notes for booking. [Response](https://docs.octo.travel/octo-api-core/bookings#update-booking) includes if the dropoff is requested for the booking, the selected dropoff location with details, including the dropoff time window. [Get Booking List](https://docs.octo.travel/octo-api-core/bookings#get-booking-list) [Response](https://docs.octo.travel/capabilities-optional/dropoffs-new#post-create-booking-patch-update-booking-with-pickups) includes if the dropoff is requested for the booking, the selected dropoff location with details, including the dropoff time window. [Get Booking](https://docs.octo.travel/octo-api-core/bookings#get-booking) [Response](https://docs.octo.travel/capabilities-optional/dropoffs-new#post-create-booking-patch-update-booking-with-pickups) includes if the dropoff is requested for the booking, the selected dropoff location with details, including the dropoff time window. **GET Booking Dropoff Locations Endpoint** Additionally, this capability provides a dedicated endpoint [GET Booking Dropoffs Locations](https://docs.octo.travel/capabilities-optional/dropoffs-new#get-booking-pickup-locations) , which enables searching for dropoff locations based on a customer-defined latitude and longitude, and validates whether dropoff service is available at that exact location or recommends alternate dropoff locations. ### [hashtag](https://docs.octo.travel/capabilities-optional/dropoffs-new#additional-octo-core-parameters-and-schemas) Additional OCTO Core Parameters & Schemas #### [hashtag](https://docs.octo.travel/capabilities-optional/dropoffs-new#get-product-list-and-get-product-with-dropoffs) [**GET Product List**](https://docs.octo.travel/octo-api-core/products#get-product-list) **AND** [**GET Product**](https://docs.octo.travel/octo-api-core/products#get-product) **(with** `dropoffs`**)** **Request Body:** Copy { // ...rest of the OPTION object "dropoffAvailable": true, "dropoffRequired": false, "dropoffLocations": [\ {\ "id": "c1b2a3d4-5e6f-7081-92a3-b4c5d6e7f801",\ "title": "Sagrada Família",\ "shortDescription": "Dropoff available near the Basílica de la Sagrada Família in Barcelona. Guests are dropped at the coach parking area on Carrer de la Marina.",\ "place": {\ "latitude": 41.4036,\ "longitude": 2.1744,\ "postalAddress": {\ "streetAddress": "Carrer de la Marina, 253",\ "addressLocality": "Barcelona",\ "addressRegion": "Catalunya",\ "postalCode": "08013",\ "addressCountry": "ES",\ "postOfficeBoxNumber": null\ },\ "identifiers": [\ { "googlePlaceId": "ChIJp2VwQ0-hpBIRsY0R5pY2W7E" },\ { "tripadvisorLocationId": "876543" }\ ],\ "sameAs": [\ "https://maps.google.com/?cid=11111111111111111111"\ ]\ }\ },\ {\ "id": "f9e8d7c6-b5a4-3210-98f7-e6d5c4b3a210",\ "title": "Plaça de Catalunya",\ "shortDescription": "Central Barcelona dropoff at Plaça de Catalunya. Guests meet at the bus bays on the south side of the square.",\ "place": {\ "latitude": 41.3870,\ "longitude": 2.1701,\ "postalAddress": {\ "streetAddress": "Plaça de Catalunya",\ "addressLocality": "Barcelona",\ "addressRegion": "Catalunya",\ "postalCode": "08002",\ "addressCountry": "ES",\ "postOfficeBoxNumber": null\ },\ "identifiers": [\ { "googlePlaceId": "ChIJD7fiBh9uQgwR7-8fITgxTmU" }\ ],\ "sameAs": [\ "https://maps.google.com/?cid=22222222222222222222"\ ]\ }\ }\ ], // Optional, just intended as a visual aid "dropoffAreas": [\ {\ "title": "Central Barcelona Zone",\ "shortDescription": "Dropoff available across central Barcelona, including Eixample, the Gothic Quarter, and the waterfront around Port Vell. Guests are dropped at approved coach stops within this zone.",\ "area": {\ "coordinates": [\ { "latitude": 41.3945, "longitude": 2.1682 },\ { "latitude": 41.3891, "longitude": 2.1830 },\ { "latitude": 41.3758, "longitude": 2.1820 },\ { "latitude": 41.3769, "longitude": 2.1635 },\ { "latitude": 41.3945, "longitude": 2.1682 } // end up where you start\ ],\ "identifiers": [\ { "googlePlaceId": "ChIJ5TCOcRaipBIRX9G6FFzC7m8" },\ { "tripadvisorLocationId": "654321" }\ ],\ "sameAs": [\ "https://maps.google.com/?cid=33333333333333333333",\ "https://www.tripadvisor.com/Attraction_Review-central-barcelona"\ ]\ }\ }\ ] } #### [hashtag](https://docs.octo.travel/capabilities-optional/dropoffs-new#post-availability-calendar-with-dropoffs) [**POST Availability Calendar**](https://docs.octo.travel/octo-api-core/availability#availability-calendar) **(with** `dropoffs`**)** **Request Body:** Copy { // ... rest of the OCTO Core availability request body "dropoffRequested": true, "dropoffLocationId": "9f1a3c1e-6b28-4e2a-9c7e-32d5a3a1f45e" } Field Type Required Description `dropoffRequested` boolean optional Whether the customer requested dropoff. `dropoffLocationId` string optional The dropoff location ID selected by the customer (must match one of `dropoffLocations[].id`). **Response Body:** Copy { // ...rest of the CALENDAR DAY object "dropoffAvailable": true, "dropoffRequired": false } Field Type Required Description `dropoffAvailable` boolean required Indicates whether dropoff service is offered for this date. `dropoffRequired` boolean required Indicates whether selecting a dropoff location is mandatory for booking. #### [hashtag](https://docs.octo.travel/capabilities-optional/dropoffs-new#post-availability-check-with-dropoffs) [**POST Availability Check**](https://docs.octo.travel/octo-api-core/availability#post-availability) **(with** `dropoffs`**)** **Request Body:** Copy { // ... rest of the OCTO Core availability request body "dropoffRequested": true, "dropoffLocationId": null (optional, if dropoffLocation is requested up-front) } Field Type Required Description `dropoffRequested` boolean optional Whether the customer requested dropoff. `dropoffLocationId` string optional The dropoff location ID selected by the customer (must match one of `dropoffLocations[].id`). **Response Body:** Copy { // ...rest of the AVAILABILITY object // ...note addition of localDateTimeStart and localDateTimeEnd below "dropoffAvailable": true, "dropoffRequired": false, "localDropoffDateTimeStart": null, (only set if dropoffLocationId is set) "localDropoffDateTimeEnd": null, (only set if dropoffLocationId is set) } Field Type Required Description `localDropoffDateTimeStart` string ([ISO 8601arrow-up-right](https://www.iso.org/iso-8601-date-and-time-format.html) , i.e. YYYY-MM-DD) optional Start of the dropoff time window in the local time zone of the dropoff location. Indicates the earliest time the customer can be collected. `localDropoffDateTimeEnd` string ([ISO 8601arrow-up-right](https://www.iso.org/iso-8601-date-and-time-format.html) , i.e. YYYY-MM-DD) optional End of the dropoff time window in the local time zone of the dropoff location. Indicates the latest time the customer can be collected. #### [hashtag](https://docs.octo.travel/capabilities-optional/dropoffs-new#post-create-booking-patch-update-booking-with-dropoffs) [**POST Create Booking**](https://docs.octo.travel/octo-api-core/bookings#create-booking) **/** [**PATCH Update Booking**](https://docs.octo.travel/octo-api-core/bookings#update-booking) **(with** `dropoffs`**)** **Request Body:** Copy { // ... rest of the OCTO Core CREATE BOOKING request body "dropoffRequested": true, "dropoffLocationId": "9f1a3c1e-6b28-4e2a-9c7e-32d5a3a1f45e" "dropoffNotes": "Blue door next to the bakery" } Field Type Required Description `dropoffRequested` boolean optional Whether the customer requested dropoff. `dropoffLocationId` string optional The dropoff location ID selected by the customer (must match one of dropoffLocations\[\].id). `dropoffpNotes` string optional Free-text notes provided by the customer for dropoff (e.g., Airbnb directions, gate code, nearby landmark, hotel room, etc). **Response Body:** Copy // ...rest of the BOOKING object { "dropoffRequested": true, "dropoffLocationId": "a3f9c2d1-7e45-4b89-91f2-5d6e7c8b9a10", "dropoffNotes": "Main entrance under the glass canopy", "localDropoffDateTimeStart": "2025-06-15T18:10:00+02:00", "localDropoffDateTimeEnd": "2025-06-15T18:25:00+02:00", "dropoffLocation": { "id": "a3f9c2d1-7e45-4b89-91f2-5d6e7c8b9a10", "title": "Hotel Colosseo View", "shortDescription": "Dropoff available at Hotel Colosseo View, a short walk from the Colosseum. Guests should wait at the coach bay in front of the main entrance on Via dei Fori Imperiali.", "place": { "latitude": 41.8910, "longitude": 12.4923, "postalAddress": { "streetAddress": "Via dei Fori Imperiali 12", "addressLocality": "Roma", "addressRegion": "Lazio", "postalCode": "00184", "addressCountry": "IT", "postOfficeBoxNumber": null }, "identifiers": [\ { "googlePlaceId": "ChIJ0X31pIKJPxMRXkS7Gz5Q2f8" },\ { "tripadvisorLocationId": "789012" }\ ], "sameAs": [\ "https://maps.google.com/?cid=44444444444444444444"\ ] } } } ### [hashtag](https://docs.octo.travel/capabilities-optional/dropoffs-new#get-booking-dropoff-locations) GET Booking Dropoff Locations `GET` {host}/bookings/{uuid}/dropoffLocations?latitude={lat}&longitude={lng} **Query Parameters:** Name Type Required Description `latitude` number required Customer-defined latitude (WGS84). `longitude` number required Customer-defined longitude (WGS84). When latitude and longitude are not provided, the supplier system should return the full list of dropoff locations. When latitude and longitude _are_ provided, the supplier system may choose to either: * return the full list of dropoff locations in any order, * return the full list ordered in a way that reflects the lat/lon query, * return only a subset of locations that best match the passenger’s position, or * generate a new, virtual dropoff location on the fly that corresponds to the provided coordinates and can be used for booking creation or updates. Reseller systems must be prepared for scenarios where a dropoff location ID returned during availability or booking does not appear in the static list retrieved via the general `dropoffLocations` query for that product option. **Response Body:** Copy { "localDropoffDateTimeStart": "2025-09-14T14:20:00+01:00", "localDropoffDateTimeEnd": "2025-09-14T14:35:00+01:00", "dropoffLocation": { "id": "b72c4e81-9d3f-4a3c-8a6f-0e92c4b1d993", "title": "Paddington Station – Praed St Entrance", "shortDescription": "Dropoff at the main Praed Street entrance, next to the taxi rank.", "place": { "latitude": 51.5167, "longitude": -0.1761, "postalAddress": { "streetAddress": "Praed Street", "addressLocality": "London", "addressRegion": "England", "postalCode": "W2 1HB", "addressCountry": "UK" }, "identifiers": [\ { "googlePlaceId": "ChIJ5wCQT3YPdkgR0b6l5LjxaQ8" }\ ], "sameAs": [\ "https://maps.google.com/?q=Paddington+Station+Praed+Street"\ ] } } }, { "localDropoffDateTimeStart": "2025-09-14T14:50:00+01:00", "localDropoffDateTimeEnd": "2025-09-14T15:05:00+01:00", "dropoffLocation": { "id": "e19a873b-04c3-48cc-9cb0-78bbcf6c1f44", "title": "London Eye – Riverside Walk", "shortDescription": "Dropoff near the entrance queue area on Riverside Walk.", "place": { "latitude": 51.5033, "longitude": -0.1195, "postalAddress": { "streetAddress": "Riverside Walk", "addressLocality": "London", "addressRegion": "England", "postalCode": "SE1 7PB", "addressCountry": "UK" } } } } [PreviousPickups \[NEW\]chevron-left](https://docs.octo.travel/capabilities-optional/pickups-new) [NextPromotions \[IN DEV\]chevron-right](https://docs.octo.travel/capabilities-optional/promotions-in-dev) Last updated 3 months ago --- # Pickups [NEW] | OCTO Developer Hub ### [hashtag](https://docs.octo.travel/capabilities-optional/pickups-new#business-context) Business Context Pickup service is commonly offered for tours and activities. It allows customers to be collected from one of the designated locations, or even from a customer-defined point within a supported pickup area, instead of the main meeting point. This service may be included for free or offered at an additional cost. The OCTO Pickups Capability allows: * **Supplier systems** to indicate whether a product option supports pickup, whether pickup is required, and to provide structured pickup locations and areas. * **Reseller systems** to obtain pickup data, display available choices to customers during the booking flow, pass the customer’s selected pickup location when creating, confirming, or updating a booking, and leverage a capability-specific endpoint to validate pickup availability based on a customer-defined point (e.g., latitude/longitude). Identical functionality is also available for dropoffs through the [Dropoffs Capability,](https://docs.octo.travel/capabilities-optional/dropoffs-new) which mirrors pickups and provides structured or customer-defined end-of-tour return options. ### [hashtag](https://docs.octo.travel/capabilities-optional/pickups-new#capability-summary) Capability Summary To enable this capability when supported by a supplier system’s OCTO API, the reseller system must include `pickups` in the `Octo-Capabilities` header of its requests to the supplier system. Adding `pickups` to your `Octo-Capabilities` header will alter OCTO Core endpoint behavior as follows: Endpoint Pickups Capability Enhancements to OCTO Core [Get Supplier](https://docs.octo.travel/octo-api-core/supplier#get-supplier) _No additional functionality._ [Get Product List](https://docs.octo.travel/octo-api-core/products#get-product-list) [Response](https://docs.octo.travel/capabilities-optional/pickups-new#get-product-list-and-get-product-with-pickups) payload includes, per product option, whether pickup is available, required for booking, and a list of supported locations/areas with their details. [Get Product](https://docs.octo.travel/octo-api-core/products#get-product) [Response](https://docs.octo.travel/capabilities-optional/pickups-new#get-product-list-and-get-product-with-pickups) payload includes, per product option, whether pickup is available, required for booking, and a list of supported locations/areas with their details. [Availability Calendar](https://docs.octo.travel/octo-api-core/availability#availability-calendar) [Request](https://docs.octo.travel/capabilities-optional/pickups-new#post-availability-calendar-with-pickups) can specify if the customer wants pickup and the chosen location. [Response](https://docs.octo.travel/capabilities-optional/pickups-new#post-availability-calendar-with-pickups) includes, per calendar day, whether pickup is available, required, and the list of supported locations/areas with details. [Availability Check](https://docs.octo.travel/octo-api-core/availability#availability-check) [Request](https://docs.octo.travel/capabilities-optional/pickups-new#post-availability-check-with-pickups) can specify if the customer wants pickup and the chosen location. [Response](https://docs.octo.travel/capabilities-optional/pickups-new#post-availability-check-with-pickups) includes, per availability, whether pickup is available, required, the list of supported locations/areas with details, including pickup time window. [Create Booking](https://docs.octo.travel/octo-api-core/bookings#create-booking) [Request](https://docs.octo.travel/capabilities-optional/pickups-new#post-create-booking-patch-update-booking-with-pickups) can specify if the customer wants pickup, the chosen location, as well as any pickup notes for booking. [Response](https://docs.octo.travel/capabilities-optional/pickups-new#post-create-booking-patch-update-booking-with-pickups) includes if the pickup is requested for the booking, the selected pickup location with details, including the pickup time window. [Extend Pending Booking Expiration](https://docs.octo.travel/octo-api-core/bookings#extend-pending-booking-expiration) [Response](https://docs.octo.travel/capabilities-optional/pickups-new#post-create-booking-patch-update-booking-with-pickups) includes if the pickup is requested for the booking, the selected pickup location with details, including the pickup time window. [Confirm Booking](https://docs.octo.travel/octo-api-core/bookings#confirm-booking) [Response](https://docs.octo.travel/capabilities-optional/pickups-new#post-create-booking-patch-update-booking-with-pickups) includes if the pickup is requested for the booking, the selected pickup location with details, including the pickup time window. [Cancel Booking](https://docs.octo.travel/octo-api-core/bookings#cancel-booking) [Response](https://docs.octo.travel/capabilities-optional/pickups-new#post-create-booking-patch-update-booking-with-pickups) includes if the pickup is requested for the booking, the selected pickup location with details, including the pickup time window. [Update Booking](https://docs.octo.travel/octo-api-core/bookings#update-booking) [Request](https://docs.octo.travel/capabilities-optional/pickups-new#post-create-booking-patch-update-booking-with-pickups) can specify if the customer wants pickup, the chosen location, as well as any pickup notes for booking. [Response](https://docs.octo.travel/octo-api-core/bookings#update-booking) includes if the pickup is requested for the booking, the selected pickup location with details, including the pickup time window. [Get Booking List](https://docs.octo.travel/octo-api-core/bookings#get-booking-list) [Response](https://docs.octo.travel/capabilities-optional/pickups-new#post-create-booking-patch-update-booking-with-pickups) includes if the pickup is requested for the booking, the selected pickup location with details, including the pickup time window. [Get Booking](https://docs.octo.travel/octo-api-core/bookings#get-booking) [Response](https://docs.octo.travel/capabilities-optional/pickups-new#post-create-booking-patch-update-booking-with-pickups) includes if the pickup is requested for the booking, the selected pickup location with details, including the pickup time window. **GET Booking Pickup Locations Endpoint** Additionally, this capability provides a dedicated endpoint [GET Booking Pickup Locations](https://docs.octo.travel/capabilities-optional/pickups-new#get-booking-pickup-locations) , which enables searching for pickup locations based on a customer-defined latitude and longitude, and validates whether pickup service is available at that exact location or recommends alternate pickup locations. ### [hashtag](https://docs.octo.travel/capabilities-optional/pickups-new#additional-octo-core-parameters-and-schemas) Additional OCTO Core Parameters & Schemas #### [hashtag](https://docs.octo.travel/capabilities-optional/pickups-new#get-product-list-and-get-product-with-pickups) [**GET Product List**](https://docs.octo.travel/octo-api-core/products#get-product-list) **AND** [**GET Product**](https://docs.octo.travel/octo-api-core/products#get-product) **(with** `**pickups**`**)** **Request Body:** Copy { // ...rest of the OPTION object "pickupAvailable": true, "pickupRequired": false, "pickupLocations": [\ {\ "id": "e7c0f5a6-3b3a-4c8f-9a1d-2f4a7a9b1c23",\ "title": "Hotel Avenida Palace",\ "shortDescription": "Pickup available directly from Hotel Avenida Palace, located in the heart of Lisbon near Rossio Square. Guests should wait at the main lobby entrance.",\ "place": {\ "latitude": 38.7123,\ "longitude": -9.1334,\ "postalAddress": {\ "streetAddress": "Rua 1",\ "addressLocality": "Lisboa",\ "addressRegion": "Lisboa",\ "postalCode": "1000-000",\ "addressCountry": "PT",\ "postOfficeBoxNumber": null\ },\ "identifiers": [\ { "googlePlaceId": "ChIJd7zN_th2GQ0Rj..." },\ { "tripadvisorLocationId": "123456" }\ ],\ "sameAs": [\ "https://maps.google.com/?cid=..."\ ]\ },\ },\ {\ "id": "9f1b0a77-6d52-4f0a-9b7c-3d1a2b5c6e88",\ "title": "Praça do Comércio",\ "shortDescription": "Pickup available from Lisbon’s iconic Praça do Comércio, a large public square facing the Tagus River. Meeting point is next to the central equestrian statue.",\ "place": {\ "latitude": 38.7079,\ "longitude": -9.1366,\ "postalAddress": {\ "streetAddress": "Praça do Comércio",\ "addressLocality": "Lisboa",\ "addressRegion": "Lisboa",\ "postalCode": "1100-148",\ "addressCountry": "PT",\ "postOfficeBoxNumber": null\ },\ "identifiers": [\ { "googlePlaceId": "ChIJW0..." }\ ],\ "sameAs": [\ "https://maps.google.com/?cid=..."\ ]\ },\ }\ ], # Optional, just intended as a visual aid "pickupAreas": [\ {\ "title": "Downtown Zone",\ "shortDescription": "Pickup available across the downtown Lisbon area, covering hotels, landmarks, and popular meeting points such as Rossio, Baixa, and Cais do Sodré. Guests can be collected from designated stops within this zone.",\ "area": {\ "coordinates": [\ { "latitude": 38.7139, "longitude": -9.1437 },\ { "latitude": 38.7132, "longitude": -9.1379 },\ { "latitude": 38.7098, "longitude": -9.1375 },\ { "latitude": 38.7139, "longitude": -9.1437 } # end up where you start\ ],\ "identifiers": [\ { "googlePlaceId": "ChIJd7zN_th2GQ0Rj..." },\ { "tripadvisorLocationId": "123456" }\ ],\ "sameAs": [\ "https://maps.google.com/?cid=...",\ "https://www.tripadvisor.com/Attraction_Review-..."\ ]\ },\ }\ ] } #### [hashtag](https://docs.octo.travel/capabilities-optional/pickups-new#post-availability-calendar-with-pickups) [**POST Availability Calendar**](https://docs.octo.travel/octo-api-core/availability#availability-calendar) **(with** `**pickups**`**)** **Request Body:** Copy { // ... rest of the OCTO Core availability request body "pickupRequested": true, "pickupLocationId": "9f1a3c1e-6b28-4e2a-9c7e-32d5a3a1f45e" } Field Type Required Description `pickupRequested` boolean optional Whether the customer requested pickup. `pickupLocationId` string optional The pickup location ID selected by the customer (must match one of `pickupLocations[].id)`. **Response Body:** Copy { // ...rest of the CALENDAR DAY object "pickupAvailable": true, "pickupRequired": false } Field Type Required Description `pickupAvailable` boolean required Indicates whether pickup service is offered for this date. `pickupRequired` boolean required Indicates whether selecting a pickup location is mandatory for booking. #### [hashtag](https://docs.octo.travel/capabilities-optional/pickups-new#post-availability-check-with-pickups) [**POST Availability Check**](https://docs.octo.travel/octo-api-core/availability#post-availability) **(with** `**pickups**`**)** **Request Body:** Copy { // ... rest of the OCTO Core availability request body "pickupRequested": true, "pickupLocationId": null (optional, if pickupLocation is requested up-front) } Field Type Required Description `pickupRequested` boolean optional Whether the customer requested pickup. `pickupLocationId` string optional The pickup location ID selected by the customer (must match one of `pickupLocations[].id)`. **Response Body:** Copy { // ...rest of the AVAILABILITY object // ...note addition of localDateTimeStart and localDateTimeEnd below "pickupAvailable": true, "pickupRequired": false, "localPickupDateTimeStart": null, (only set if pickupLocationId is set) "localPickupDateTimeEnd": null, (only set if pickupLocationId is set) } Field Type Required Description `localPickupDateTimeStart` string ([ISO 8601arrow-up-right](https://www.iso.org/iso-8601-date-and-time-format.html) , i.e. YYYY-MM-DD) optional Start of the pickup time window in the local time zone of the pickup location. Indicates the earliest time the customer can be collected. `localPickupDateTimeEnd` string ([ISO 8601arrow-up-right](https://www.iso.org/iso-8601-date-and-time-format.html) , i.e. YYYY-MM-DD) optional End of the pickup time window in the local time zone of the pickup location. Indicates the latest time the customer can be collected. #### [hashtag](https://docs.octo.travel/capabilities-optional/pickups-new#post-create-booking-patch-update-booking-with-pickups) [**POST Create Booking**](https://docs.octo.travel/octo-api-core/bookings#create-booking) **/** [**PATCH Update Booking**](https://docs.octo.travel/octo-api-core/bookings#update-booking) **(with** `**pickups**`**)** **Request Body:** Copy { // ... rest of the OCTO Core CREATE BOOKING request body "pickupRequested": true, "pickupLocationId": "9f1a3c1e-6b28-4e2a-9c7e-32d5a3a1f45e" "pickupNotes": "Blue door next to the bakery" } Field Type Required Description `pickupRequested` boolean optional Whether the customer requested pickup. `pickupLocationId` string optional The pickup location ID selected by the customer (must match one of pickupLocations\[\].id). `pickupNotes` string optional Free-text notes provided by the customer for pickup (e.g., Airbnb directions, gate code, nearby landmark, hotel room, etc). **Response Body:** Copy // ...rest of the BOOKING object "pickupRequested": true, "pickupLocationId": "e7c0f5a6-3b3a-4c8f-9a1d-2f4a7a9b1c23", "pickupNotes": "Blue door next to the bakery", "localPickupDateTimeStart": "2025-12-01T05:40:00-08:00", "localPickupDateTimeEnd": "2025-12-01T05:55:00-08:00", "pickupLocation": { "id": "e7c0f5a6-3b3a-4c8f-9a1d-2f4a7a9b1c23", "title": "Hotel Avenida Palace", "shortDescription": "Pickup available directly from Hotel Avenida Palace, located in the heart of Lisbon near Rossio Square. Guests should wait at the main lobby entrance.", "place": { "latitude": 38.7123, "longitude": -9.1334, "postalAddress": { "streetAddress": "Rua 1", "addressLocality": "Lisboa", "addressRegion": "Lisboa", "postalCode": "1000-000", "addressCountry": "PT", "postOfficeBoxNumber": null }, "identifiers": [\ { "googlePlaceId": "ChIJd7zN_th2GQ0Rj..." },\ { "tripadvisorLocationId": "123456" }\ ], "sameAs": [\ "https://maps.google.com/?cid=..."\ ] } } } ### [hashtag](https://docs.octo.travel/capabilities-optional/pickups-new#get-booking-pickup-locations) GET Booking Pickup Locations `GET` {host}/bookings/{uuid}/pickupLocations?latitude={lat}&longitude={lng} **Query Parameters:** Name Type Required Description `latitude` number required Customer-defined latitude (WGS84). `longitude` number required Customer-defined longitude (WGS84). When latitude and longitude are not provided, the supplier system should return the full list of pickup locations. When latitude and longitude _are_ provided, the supplier system may choose to either: * return the full list of pickup locations in any order, * return the full list ordered in a way that reflects the lat/lon query, * return only a subset of locations that best match the passenger’s position, or * generate a new, virtual pickup location on the fly that corresponds to the provided coordinates and can be used for booking creation or updates. Reseller systems must be prepared for scenarios where a pickup location ID returned during availability or booking does not appear in the static list retrieved via the general `pickupLocations` query for that product option. **Response Body:** Copy { "localPickupDateTimeStart": "2025-12-01T05:40:00-08:00", "localPickupDateTimeEnd": "2025-12-01T05:55:00-08:00", "pickupLocation": { "id": "9f1a3c1e-6b28-4e2a-9c7e-32d5a3a1f45e", "title": "Americania Hotel - 121 7th St", "shortDescription": "Meet next to the parking lot entrance.", "place": { "latitude": 37.7788005, "longitude": -122.4102065, "postalAddress": { "streetAddress": "121 7th Street", "addressLocality": "San Francisco", "addressRegion": "California", "postalCode": "94103", "addressCountry": "US" }, "identifiers": [\ { "googlePlaceId": "ChIJOTbxc4OAhYARrK82JwxWZFY" }\ ], "sameAs": [\ "https://www.americaniahotel.com",\ "https://maps.google.com/?q=121+7th+St+San+Francisco"\ ] } } }, { "localPickupDateTimeStart": "2025-12-01T06:10:00-08:00", "localPickupDateTimeEnd": "2025-12-01T06:25:00-08:00", "pickupLocation": { "id": "d41e236b-3927-48ad-9c68-66c3a4789a2f", "title": "Union Square - 333 Post St", "shortDescription": "Pickup near the central monument.", "place": { "latitude": 37.788056, "longitude": -122.4075, "postalAddress": { "streetAddress": "333 Post Street", "addressLocality": "San Francisco", "addressRegion": "California", "postalCode": "94108", "addressCountry": "US" } } }, } ] [PreviousContentchevron-left](https://docs.octo.travel/capabilities-optional/content) [NextDropoffs \[NEW\]chevron-right](https://docs.octo.travel/capabilities-optional/dropoffs-new) Last updated 3 months ago --- # Promotions [IN DEV] | OCTO Developer Hub triangle-exclamation This capability is currently being developed by the working group and has not yet undergone Specification Committee Review, Member Review, and Public Review phases before ratification. OCTO members interested in joining the working group can find details in the **#promotions-capability-development** channel in the OCTO Slack workspace. This page provides draft materials and ongoing updates from the working group, all of which remain subject to change throughout the review process. ### [hashtag](https://docs.octo.travel/capabilities-optional/promotions-in-dev#business-context) Business Context Promotional (or discounted) pricing is a fundamental part of how tour and activity suppliers and resellers attract customers, drive conversions, and run marketing campaigns. This extends the [Pricing Capability](https://docs.octo.travel/capabilities-optional/pricing) by allowing supplier systems to expose structured promotional offers to reseller systems during availability and pricing requests, and throughout the entire booking flow. This capability only covers price-based discounts (i.e., reductions to retail or net prices). More complex constructs, such as product bundling, will be defined under a separate capability. The Promotions Capability requires the use of [Pricing Capability](https://docs.octo.travel/capabilities-optional/pricing) . The additional fields provided through this capability describe promotional details associated with pricing, clarifying which discounts are available and/or have been applied. This supports both open promotions and gated offers such as member-only pricing, loyalty discounts, and promo codes. ### [hashtag](https://docs.octo.travel/capabilities-optional/promotions-in-dev#working-draft) Working Draft: [https://docs.google.com/document/d/18n\_FmBM3T-BRwdRKW1D3d6dRqNuJFOeP6Z1q4ebYb90/edit?usp=sharingarrow-up-right](https://docs.google.com/document/d/18n_FmBM3T-BRwdRKW1D3d6dRqNuJFOeP6Z1q4ebYb90/edit?usp=sharing) [PreviousDropoffs \[NEW\]chevron-left](https://docs.octo.travel/capabilities-optional/dropoffs-new) [NextSlack Workspacechevron-right](https://docs.octo.travel/additional-resources/slack-workspace) Last updated 3 months ago --- # Self-Certification Tool | OCTO Developer Hub The OCTO Self-Certification Tool is the new way for suppliers and resellers to validate their OCTO API implementation against the open standard. It runs automated tests against your system, confirms whether you meet the OCTO Core requirements, and generates a public certificate with an official “OCTO Certified” badge. The tool replaces the older OCTO Validator and introduces account-based management, recurring test runs, and a public directory of certified systems. The tool is available at [**https://certify.octo.travel**arrow-up-right](https://certify.octo.travel/) and requires an OCTO login. Members and non-members can both use it (an option of a free account is available). #### [hashtag](https://docs.octo.travel/additional-resources/self-certification-tool#what-it-does) What it Does The tool checks technical compliance with the OCTO API specification. It focuses on the fundamentals - schema validation, required fields, request structure, headers, paths, and expected error handling. It is not a functional or performance test: the goal is to verify that your implementation behaves consistently with the standard. Depending on your system type, the tool works in one of two ways: * **Supplier systems:** You provide your OCTO API Host URL and Bearer Token. The tool sends real OCTO test calls to your system and validates the responses. * **Reseller systems:** You receive a mock OCTO endpoint and a unique token. Your system calls the mock endpoint, and the tool validates each request in real time. When you reach a 100% pass rate, your certificate becomes **Valid** and appears in the public OCTO certification directory. You also receive an embeddable badge linking to your certificate page. #### [hashtag](https://docs.octo.travel/additional-resources/self-certification-tool#how-to-use-it) How to use it 1. **Log in** Use your OCTO account. If you’re a member who logged in before, use “Forgot Password” to set credentials. Alternatively, create a new account. 2. **Create a certificate** Choose your system type - Supplier, Reseller - and enter the required details. 3. **Run the tests** For suppliers, the tool triggers calls to your OCTO API. For resellers, your system needs to call the issued mock endpoint. 4. **Review results** Each test run shows its success/fail/warning status and any issues that need to be fixed. A certificate becomes **Valid** when you have a full 100% successful run. Certificates remain valid for 12 months. 5. **Share your certification** Every certificate has a public page and a badge - this is your official OCTO certificate to share with fellow industry implementers as proof of OCTO compliance. You can also embed the OCTO Certified badge on your website or partner materials. #### [hashtag](https://docs.octo.travel/additional-resources/self-certification-tool#why-it-matters) Why it matters Self-certification increases trust across the ecosystem. Implementers can prove their OCTO compliance, partners can verify readiness before an integration, and OCTO can maintain a transparent, up-to-date directory of systems following the standard. It lowers friction across the entire supply chain and helps everyone ship integrations more confidently. If you need help or want to contribute feedback during the beta period, contact [help@octo.travelenvelope](mailto:help@octo.travel) . [PreviousSlack Workspacechevron-left](https://docs.octo.travel/additional-resources/slack-workspace) [NextPostman Collectionschevron-right](https://docs.octo.travel/additional-resources/postman-collections) Last updated 3 months ago --- # Slack Workspace | OCTO Developer Hub ### [hashtag](https://docs.octo.travel/additional-resources/slack-workspace#octo-slack-community) OCTO Slack Community The OCTO Slack workspace is where the OCTO community collaborates, asks questions, and helps each other build better OCTO implementations. More than 300 members use it daily to share knowledge, discuss challenges, and stay aligned on the latest developments in the standard. #### [hashtag](https://docs.octo.travel/additional-resources/slack-workspace#what-its-for) What it’s for OCTO Slack is the best place to get support directly from fellow members—suppliers, resellers, developers, integrators, and working group contributors who are implementing OCTO in real production environments. You’ll find active channels covering implementation questions, capability discussions, working groups, announcements, and broader ecosystem topics. #### [hashtag](https://docs.octo.travel/additional-resources/slack-workspace#who-can-access-it) Who can access it The Slack workspace is available **exclusively to OCTO members**. If you’re already a member and don’t have access yet, contact [help@octo.travelenvelope](mailto:help@octo.travel) and we’ll get you added. To become a member, visit [https://www.octo.travel/joinarrow-up-right](https://www.octo.travel/join) #### [hashtag](https://docs.octo.travel/additional-resources/slack-workspace#how-to-access) How to access If you’re an OCTO member, you can access the workspace at: [https://octo-travel.slack.comarrow-up-right](https://octo-travel.slack.com/) [PreviousPromotions \[IN DEV\]chevron-left](https://docs.octo.travel/capabilities-optional/promotions-in-dev) [NextSelf-Certification Toolchevron-right](https://docs.octo.travel/additional-resources/self-certification-tool) Last updated 3 months ago --- # Content | OCTO Developer Hub To use this capability, add `content` to your `Octo-Capabilities` header. This capability extends the Supplier, Product, Option, Unit, Availability, and Booking schemas to add additional descriptive content that can be used to populate product listings as well as for various other use cases that require this information. [hashtag](https://docs.octo.travel/capabilities-optional/content#localization) Localization ------------------------------------------------------------------------------------------------ Since suppliers and their systems may offer content in different languages, this content capability supports localization through: * the `Accept-Language` request header * the `Content-Language` response header * and the `Available-Languages` response header This allows clients to request and receive content in their preferred languages, and understand what language options are available for a product. ### [hashtag](https://docs.octo.travel/capabilities-optional/content#request-headers) Request Headers The reseller system can include language preferences in the API call to the supplier system to request content in a specific language. The `Accept-Language` header communicates which languages are preferred and in what order. This header is optional—if omitted or empty, the supplier system will fall back to their default language: Header Type (Format) Required/Optional Field Description Example `Accept-Language` string ([IETF BCP 47 tagarrow-up-right](https://en.wikipedia.org/wiki/E.164) ) Optional Optional request header to specify preferred languages for response content. Supports a comma-separated list of language tags with optional `q` values to set priority. Follows BCP 47 (RFC 5646 & RFC 4647). Does not guarantee content availability in those languages. Commonly used for localization in HTTP (RFC 7231). See also: [MDN Docsarrow-up-right](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Language) . `en-US`, `en-GB`, `fr-CA;q=0.8`, `fr;q=0.7` ### [hashtag](https://docs.octo.travel/capabilities-optional/content#response-headers) Response Headers The supplier system response may include headers that indicate the language of the returned content and the set of available language options. These help reseller systems interpret the response and determine if additional requests are needed for other languages. When the `content` capability is used, both `Content-Language` and `Available-Languages` headers must be present in the response: Header Type (Format) Required/Optional Field Description Example `Content-Language` string ([IETF BCP 47 tagarrow-up-right](https://en.wikipedia.org/wiki/E.164) ) Required Indicates the language of the returned content. Only one language is allowed per response. To get multiple languages, separate requests are needed. Conforms to BCP 47 and is defined in RFC 7231. See also: [MDN Docsarrow-up-right](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Language) . `en-GB` `Available-Languages` array ([IETF BCP 47 tagarrow-up-right](https://en.wikipedia.org/wiki/E.164) ) Required Lists all languages in which the content is available. Not a standard HTTP header, but widely used in APIs for localization awareness. Helps determine language options without making extra requests. Must follow BCP 47 standards. `en-GB`, `es-ES`, `de-DE` ### [hashtag](https://docs.octo.travel/capabilities-optional/content#example-headers-with-localization) Example Headers with Localization: #### [hashtag](https://docs.octo.travel/capabilities-optional/content#request) Request Copy GET /octo/products/be665021-a694-4320-9e7d-6f04a7541755 HTTP/1.1 Host: api.example.com User-Agent: MyClient/1.0.0 Accept: application/json Authorization: Bearer 3b162482-7fe3-4d91-b6b4-26302530f0dc Content-Type: application/json Octo-Capabilities: content, pricing Octo-Env: live Accept-Language: fr-FR, fr;q=0.9, en;q=0.8 #### [hashtag](https://docs.octo.travel/capabilities-optional/content#response) Response Copy HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Octo-Capabilities: content, pricing Content-Language: fr-FR Octo-Env: live Octo-Available-Languages: en, fr, es, de [hashtag](https://docs.octo.travel/capabilities-optional/content#additional-content-fields) Additional Content Fields -------------------------------------------------------------------------------------------------------------------------- The `content` capability enriches standard OCTO Core objects with additional, language-specific content such as titles, descriptions, and other localized attributes. When the capability `content` is included in the `Octo-Capabilities` header of a request to any OCTO Core endpoint, and if the supplier system supports this capability, the following objects may include additional fields: * Supplier * Product * Option * Unit * Availability * Booking These enrichments are dynamically included in the response based on language preferences provided in the request (via `Accept-Language`) and the available translations on the supplier side. Each object’s additional fields will be detailed in the following sections below: ### [hashtag](https://docs.octo.travel/capabilities-optional/content#supplier) Supplier The following fields are **added** to the [OCTO Core Supplier objectarrow-up-right](https://docs.octo.travel/octo-api-core/supplier) when the `content` capability is used and supported by the supplier system. These fields provide localized, customer-facing information and rich media assets. They are returned only when: * The supplier supports the `content` capability * The request includes the header: `Octo-Capabilities: content` #### [hashtag](https://docs.octo.travel/capabilities-optional/content#enriched-fields-from-content-capability) Enriched Fields (from `content` Capability) Field Type Description `shortDescription` string | null A brief, customer-facing summary of the supplier’s business. Can be localized. May be `null` if not available. `media` array of objects A list of associated media objects such as logos, promotional images, or videos. Each object contains metadata to support display and attribution. `**media[]**` **Object Fields** Field Type Description `type` string (enum) Format of the media. Supported types include: `image/jpeg`, `image/png`, `image/webp`, `image/svg+xml`, `video/mp4`, `video/avi`, `external/youtube`, `external/vimeo`, `external/other`, `application/pdf`. `rel` string (enum) Defines the relationship of the media to the supplier. Values: `LOGO`, `COVER`, `GALLERY`. `src` string (uri) The URL of the media file. Must be stable and publicly accessible. `title` string | null Title or label of the media file. Useful for organizational or display purposes. `caption` string | null A customer-facing caption that provides additional context or information about the media. `copyright` string | null Copyright or usage restrictions, such as attribution or licensing notes. Can be `null` if no restrictions apply. * * * #### [hashtag](https://docs.octo.travel/capabilities-optional/content#example-supplier-object-with-content-capability-fields) Example: Supplier Object with `content` Capability Fields: Copy { "id": "697e3ce8-1860-4cbf-80ad-95857df1f640", // OCTO Core field "endpoint": "https://api.supplierdomain.com/octo", // OCTO Core field "name": "Merlin Entertainments", // OCTO Core field "contact": { // OCTO Core field "website": "https://www.merlinentertainments.biz", // OCTO Core field "email": "info@merlinentertainments.biz", // OCTO Core field "telephone": "+441202666900", // OCTO Core field "address": "Link House, 25 West St, Poole BH15 1LD, United Kingdom" // OCTO Core field }, "shortDescription": "Merlin Entertainments is a global leader in location-based entertainment, operating iconic attractions such as LEGOLAND, Madame Tussauds, SEA LIFE, and The Dungeons.", "media": [ \ {\ "type": "image/png", \ "rel": "LOGO", \ "src": "https://www.merlinentertainments.biz/media/logo-blue.png", \ "title": "Merlin Entertainments Logo", \ "caption": "Official Logo of Merlin Entertainments", \ "copyright": "© 2024 Merlin Entertainments" \ },\ {\ "type": "image/jpeg", \ "rel": "COVER", \ "src": "https://cdn.example.com/images/cover-merlin.jpg", \ "title": "Main Visual", \ "caption": "Families enjoying the LEGOLAND experience", \ "copyright": null \ },\ {\ "type": "external/youtube", \ "rel": "GALLERY", \ "src": "https://www.youtube.com/watch?v=xyz12345", \ "title": "Promo Video", \ "caption": "Discover Merlin attractions worldwide", \ "copyright": null \ },\ {\ "type": "external/other", \ "rel": "GALLERY", \ "src": "https://cdn.example.com/media/promo-pdf.pdf", \ "title": "Brochure PDF", \ "caption": "Download our detailed product brochure", \ "copyright": "© 2024 Merlin Entertainments" \ }\ ] } #### [hashtag](https://docs.octo.travel/capabilities-optional/content#product) Product The following fields are added to the [OCTO Core Product object arrow-up-right](https://docs.octo.travel/octo-api-core/products) when the `content` capability is supported and requested. They enhance the product with **localized titles, descriptions, rich media, features, FAQs, category labels, durations, commentary, and location data** to help resellers provide a complete, customer-facing product view. These fields are returned when: * The supplier supports the `content` capability * The request includes the header: `Octo-Capabilities: content` #### [hashtag](https://docs.octo.travel/capabilities-optional/content#enriched-fields-from-content-capability-1) Enriched Fields (from `content` Capability) Field Type (Format) Description `title` string Public, customer-facing name of the product. `shortDescription` string | null Brief marketing summary. `description` string | null Long-form product narrative. `features[]` array List of structured features grouped by type. `features[].shortDescription` string | null Short label for the feature. `features[].type` string (enum) One of: `INCLUSION`, `EXCLUSION`, `HIGHLIGHT`, `PREBOOKING_INFORMATION`, `PREARRIVAL_INFORMATION`, `REDEMPTION_INSTRUCTION`, `ACCESSIBILITY_INFORMATION`, `ADDITIONAL_INFORMATION`, `BOOKING_TERM`, `CANCELLATION_TERM`. `faqs[]` array Frequently asked questions. `faqs[].question` string The question text. `faqs[].answer` string The corresponding answer. `media[]` array List of media assets (images, PDFs, videos, etc.). `media[].src` string (uri) URL of the media file. `media[].type` string (enum) One of: `image/jpeg`, `image/png`, `image/webp`, `image/svg+xml`, `video/mp4`, `video/avi`, `external/youtube`, `external/vimeo`, `external/other`, `application/pdf`. `media[].rel` string (enum) One of: `LOGO`, `COVER`, `GALLERY`. `media[].title` string | null Title of the media. `media[].caption` string | null Customer-facing caption. `media[].copyright` string | null Copyright or license information. `locations[]` array List of places associated with the product. `locations[].title` string | null Name of the location. `locations[].shortDescription` string | null Short description of the location. `locations[].types[]` array One or more of: `START`, `ITINERARY_ITEM`, `POINT_OF_INTEREST`, `ADMISSION_INCLUDED`, `END`, `REDEMPTION`. `locations[].minutesTo` integer | null Minutes to reach this location from the previous. Required for `ITINERARY_ITEM` or `END`. `locations[].minutesAt` integer | null Minutes spent at this location. Required for `ITINERARY_ITEM` or `END`. `locations[].place` object Detailed geographic and address information. `place.latitude` float Latitude in decimal degrees. `place.longitude` float Longitude in decimal degrees. `place.postalAddress` object Postal address object. `postalAddress.streetAddress` string | null Street line. `postalAddress.addressLocality` string | null City. `postalAddress.addressRegion` string | null Region or state. `postalAddress.postalCode` string | null ZIP or postal code. `postalAddress.addressCountry` string | null (ISO 3166-1 alpha-2) Two-letter country code. `postalAddress.postOfficeBoxNumber` string | null PO box if available. `place.identifiers[]` array Third-party platform identifiers. `identifiers.` string Source platform (e.g., `googlePlaceId`). `identifiers.` string ID value from the source. `place.sameAs[]` array URLs for social or external location pages. `categoryLabels[]` array Tags such as `skip-the-line`, `wheelchair-accessible`. `durationMinutesFrom` integer Minimum or exact duration in minutes. `durationMinutesTo` integer | null Maximum duration if flexible; null if fixed. `commentary[]` array Commentary formats and languages. `commentary[].format` string (enum) One of: `IN_PERSON`, `RECORDED_AUDIO`, `WRITTEN`, `OTHER`. `commentary[].language` string (IETF BCP 47 tag) Language code (e.g., `en-GB`, `fr-FR`). `defaultCurrency` string (ISO 4217 alpha code) Default currency of the product. Returned with `octo/pricing` capability. `availableCurrencies` array List of supported currencies. Returned with `octo/pricing` capability. `pricingPer` array (enum: UNIT, BOOKING) Defines whether pricing is per unit or per booking. Returned with `octo/pricing` capability. #### [hashtag](https://docs.octo.travel/capabilities-optional/content#example-product-object-with-content-and-pricing-capabilities) Example: Product Object with `content` and `pricing` Capabilities Copy { "id": "6b903d44-dc24-4ca4-ae71-6bde6c4f4854", // OCTO Core field "reference": "LEYE", // OCTO Core field "internalName": "London Eye Admission", // OCTO Core field "locale": "en-GB", // OCTO Core field "timeZone": "Europe/London", // OCTO Core field "allowFreesale": true, // OCTO Core field "availabilityRequired": true, // OCTO Core field "instantConfirmation": true, // OCTO Core field "instantDelivery": true, // OCTO Core field "availabilityType": "OPENING_HOURS", // OCTO Core field "deliveryMethods": ["TICKET", "VOUCHER"], // OCTO Core field "deliveryFormats": ["QRCODE", "PDF_URL", "PKPASS_URL"], // OCTO Core field "redemptionMethod": "DIGITAL", // OCTO Core field, "title": "The Official London Eye Entry Ticket", "shortDescription": "Experience breathtaking 360-degree views of London from the iconic London Eye.", "description": "Step into one of the 32 high-tech glass capsules and ascend 135 meters above the River Thames...", "features": [\ { "shortDescription": "Air-conditioned glass capsules", "type": "INCLUSION" },\ { "shortDescription": "Free Wi-Fi at the boarding area", "type": "INCLUSION" },\ { "shortDescription": "Wheelchair accessible", "type": "ACCESSIBILITY_INFORMATION" },\ { "shortDescription": "Baby changing facilities available", "type": "ACCESSIBILITY_INFORMATION" },\ { "shortDescription": "No food or drink allowed inside capsules", "type": "PREBOOKING_INFORMATION" },\ { "shortDescription": "Binoculars available at the gift shop", "type": "ADDITIONAL_INFORMATION" }\ ], "faqs": [\ { "question": "How long does a ride on the London Eye take?", "answer": "A full rotation takes approximately 30 minutes." },\ { "question": "Can I bring my luggage?", "answer": "Large luggage items are not allowed." },\ { "question": "Are pets allowed?", "answer": "Only assistance dogs are permitted." },\ { "question": "Is there a fast-track option?", "answer": "Yes, fast-track tickets are available for an additional fee." }\ ], "media": [\ {\ "src": "https://www.londoneye.com/media/london-eye-day.jpg",\ "type": "image/jpeg",\ "rel": "COVER",\ "title": "London Eye Daytime View",\ "caption": "Panoramic view of the London Eye in daylight.",\ "copyright": "© London Eye"\ },\ {\ "src": "https://www.londoneye.com/media/london-eye-night.jpg",\ "type": "image/jpeg",\ "rel": "GALLERY",\ "title": "London Eye at Night",\ "caption": "The illuminated wheel at night.",\ "copyright": "© London Eye"\ },\ {\ "src": "https://www.youtube.com/watch?v=abc123",\ "type": "external/youtube",\ "rel": "GALLERY",\ "title": "Experience the London Eye",\ "caption": "Promotional video overview."\ },\ {\ "src": "https://www.londoneye.com/media/brochure.pdf",\ "type": "application/pdf",\ "rel": "GALLERY",\ "title": "Visitor Brochure",\ "caption": null\ }\ ], "locations": [\ {\ "title": "London Eye",\ "shortDescription": "Observation wheel on the South Bank of the River Thames.",\ "types": ["POINT_OF_INTEREST", "REDEMPTION", "ADMISSION_INCLUDED"],\ "place": {\ "latitude": 51.5033,\ "longitude": -0.1195,\ "postalAddress": {\ "streetAddress": "Riverside Building, County Hall",\ "addressLocality": "London",\ "addressRegion": null,\ "postalCode": "SE1 7PB",\ "addressCountry": "GB",\ "postOfficeBoxNumber": null\ },\ "identifiers": [\ { "googlePlaceId": "ChIJc2nSALkEdkgRkuoJJBfzkUI" }\ ],\ "sameAs": [\ "https://www.londoneye.com"\ ]\ }\ }\ ], "categoryLabels": ["skip-the-line", "wheelchair-accessible", "family-friendly"], "durationMinutesFrom": 30, "durationMinutesTo": null, "commentary": [\ { "format": "RECORDED_AUDIO", "language": "en-GB" },\ { "format": "WRITTEN", "language": "fr-FR" }\ ], "defaultCurrency": "GBP", // pricing capability field "availableCurrencies": ["GBP", "EUR", "USD"], // pricing capability field "pricingPer": ["UNIT"] // pricing capability field } ### [hashtag](https://docs.octo.travel/capabilities-optional/content#option) Option The following fields are added to the OCTO Core Option object when the `content` capability is supported and requested. > ⚠️ **Content Field Reuse Across Levels** > > Certain `content` fields such as `features`, `faqs`, `media`, `locations`, `categoryLabels`, and `commentary` are intentionally repeated across the Product and Option levels. > > Implementer supplier systems must return these fields only at the most appropriate level (product or option) depending on the relevance of the content. > > Reseller systems are expected to concatenate or display these fields according to their presentation logic, combining product-level and option-level data where suitable. #### [hashtag](https://docs.octo.travel/capabilities-optional/content#enriched-fields-from-content-capability-2) Enriched Fields (from `content` Capability) Field Type (Format) Description `title` string Public, customer-facing name of the option. `shortDescription` string | null A brief summary of the option. May be null. `description` string | null A detailed description of the option, highlighting experience-specific details. `features[]` array (feature object) Customer-facing feature details specific to this option. `features[].shortDescription` string | null Short summary of a feature (e.g., "Fast Track entry included"). `features[].type` string (enum) One of: INCLUSION, EXCLUSION, HIGHLIGHT, PREBOOKING\_INFORMATION, PREARRIVAL\_INFORMATION, REDEMPTION\_INSTRUCTION, ACCESSIBILITY\_INFORMATION, ADDITIONAL\_INFORMATION, BOOKING\_TERM, CANCELLATION\_TERM. `faqs[]` array (faq object) Option-specific questions and answers to clarify expectations. `faqs[].question` string The question text. `faqs[].answer` string Answer text providing clarity or support. `media[]` array (media object) Images or videos specific to the option, if applicable. `media[].src` string (uri) Stable, publicly accessible URL pointing to the media file. `media[].type` string (enum: image/jpeg, image/png, video/mp4, video/avi, external/youtube, external/vimeo) Format of the media. `media[].rel` string (enum: LOGO, COVER, GALLERY) The relation of this media to the option (branding, cover, gallery). `media[].title` string | null Optional title or identifier. `media[].caption` string | null Caption shown alongside the media asset, if any. `media[].copyright` string | null Copyright notice or license info, if required. Copy ... "id": "2214b32d-ffa1-426c-b4d2-947dca724e50", "reference": "LEYE-FT", "default": false, "internalName": "Fast Track", "availabilityLocalStartTimes": ["10:00", "11:00", "12:00"], "cancellationCutoff": "24 hours", "cancellationCutoffAmount": 24, "cancellationCutoffUnit": "hour", "requiredContactFields": ["firstName", "lastName"], "restrictions": { "minUnits": 1, "maxUnits": 20 }, "title": "Fast Track Admission to the London Eye", "shortDescription": "Skip the lines with fast track entry to the iconic observation wheel.", "description": "Enjoy priority access and spend less time queuing for your unforgettable London Eye experience.", "features": [\ {\ "shortDescription": "Priority boarding through Fast Track entrance",\ "type": "INCLUSION"\ },\ {\ "shortDescription": "Tickets non-transferable and non-refundable",\ "type": "CANCELLATION_TERM"\ }\ ], "faqs": [\ {\ "question": "Do I need to queue if I have Fast Track?",\ "answer": "Fast Track tickets allow you to bypass the standard line, but short waits may still occur."\ }\ ], "media": [\ {\ "src": "https://www.londoneye.com/media/fast-track-entry.jpg",\ "type": "image/jpeg",\ "rel": "GALLERY",\ "title": "Fast Track Entrance",\ "caption": "Guests entering through the Fast Track gate",\ "copyright": "© London Eye"\ }\ ] } ### [hashtag](https://docs.octo.travel/capabilities-optional/content#unit) Unit The following fields are added to the OCTO Core **Unit** object when the `content` capability is supported and requested: #### [hashtag](https://docs.octo.travel/capabilities-optional/content#enriched-fields-from-content-capability-3) Enriched Fields (from `content` Capability) Field Type (Format) Field Description `title` string Customer-facing name of the unit (e.g., "Adult", "Student"). `shortDescription` string | null Brief summary describing the unit's eligibility or characteristics. `features[]` array (feature object) Features specific to this unit, such as inclusions, exclusions, or safety notes. `features[].shortDescription` string A short, clear label describing the unit-specific feature. `features[].type` string (enum: INCLUSION, EXCLUSION, HIGHLIGHT, MUST\_KNOW, SAFETY\_INFORMATION, REDEMPTION\_INSTRUCTIONS, ADDITIONAL\_INFORMATION) Categorizes the feature for display and filtering. Copy ... { "id": "unit_adult_001", // OCTO Core "reference": "ADULT-TICKET", // OCTO Core "internalName": "Adult Ticket", // OCTO Core "type": "ADULT", // OCTO Core "requiredContactFields": ["firstName", "lastName"], // OCTO Core "restrictions": { "minAge": 18, "maxAge": 64, "idRequired": false, "minQuantity": 1, "maxQuantity": 10, "paxCount": 1, "accompaniedBy": [] }, "title": "Adult", // content capability "shortDescription": "Standard ticket for adults aged 18 to 64." // content capability }, { "id": "unit_child_001", // OCTO Core "reference": "CHILD-TICKET", // OCTO Core "internalName": "Child Ticket", // OCTO Core "type": "CHILD", // OCTO Core "requiredContactFields": ["firstName"], // OCTO Core "restrictions": { "minAge": 5, "maxAge": 12, "idRequired": false, "minQuantity": 1, "maxQuantity": 5, "paxCount": 1, "accompaniedBy": ["unit_adult_001"] }, "title": "Child", // content capability "shortDescription": "Discounted ticket for children aged 5 to 12.", // content capability "features": [\ {\ "shortDescription": "Access to children's exhibits and audio guide",\ "type": "INCLUSION"\ },\ {\ "shortDescription": "Must be accompanied by an adult",\ "type": "MUST_KNOW"\ }\ ] } ... ### [hashtag](https://docs.octo.travel/capabilities-optional/content#availability) Availability The following fields are added to the OCTO Core Availability object when the `content` capability is supported and requested. Field Type (Format) Field Description `title` string | null Public-facing name for the availability slot. Can be null when not applicable. `shortDescription` string | null A brief summary description of the availability window or conditions. Copy [\ {\ "id": "2025-05-01T20:15:00+01:00", // OCTO Core\ "localDateTimeStart": "2025-05-01T20:15:00+01:00", // OCTO Core\ "localDateTimeEnd": "2025-05-01T20:30:00+01:00", // OCTO Core\ "allDay": false, // OCTO Core\ "available": true, // OCTO Core\ "status": "LIMITED", // OCTO Core\ "vacancies": 3, // OCTO Core\ "capacity": 20, // OCTO Core\ "maxUnits": 3, // OCTO Core\ "openingHours": [ // OCTO Core\ { "from": "09:00", "to": "23:00" }\ ],\ "title": "Sunset Ride", \ "shortDescription": "Perfect for catching golden hour views from the London Eye." \ },\ {\ "id": "2025-05-01T21:00:00+01:00", // OCTO Core\ "localDateTimeStart": "2025-05-01T21:00:00+01:00", // OCTO Core\ "localDateTimeEnd": "2025-05-01T21:15:00+01:00", // OCTO Core\ "allDay": false, // OCTO Core\ "available": true, // OCTO Core\ "status": "LIMITED", // OCTO Core\ "vacancies": 5, // OCTO Core\ "capacity": 20, // OCTO Core\ "maxUnits": 5, // OCTO Core\ "openingHours": [ // OCTO Core\ { "from": "09:00", "to": "23:00" }\ ],\ "title": null, \ "shortDescription": null\ }\ ] [PreviousNotificationschevron-left](https://docs.octo.travel/capabilities-optional/notifications) [NextPickups \[NEW\]chevron-right](https://docs.octo.travel/capabilities-optional/pickups-new) Last updated 3 months ago --- # Postman Collections | OCTO Developer Hub OCTO API Postman Collection can be downloaded here: [https://github.com/octotravel/openapi/raw/main/OCTO%20API%20Specification.postman\_collection.jsonarrow-up-right](https://github.com/octotravel/openapi/raw/main/OCTO%20API%20Specification.postman_collection.json) [PreviousSelf-Certification Toolchevron-left](https://docs.octo.travel/additional-resources/self-certification-tool) [NextKnown Implementationschevron-right](https://docs.octo.travel/additional-resources/known-implementations) Last updated 3 months ago --- # Pricing | OCTO Developer Hub To use this capability, add `pricing` to your `Octo-Capabilities` header. This capability adds pricing to most endpoints, giving you advanced static and dynamic pricing capabilities. [hashtag](https://docs.octo.travel/capabilities-optional/pricing#product-pricing) Product Pricing ------------------------------------------------------------------------------------------------------ `GET` `{host}/products/:id` Returns top-level pricing by unit on each product. #### [hashtag](https://docs.octo.travel/capabilities-optional/pricing#path-parameters) Path Parameters Name Type Description id string The product id, leave this out to get every product. 200 Copy { "id": "93c335bc-07b9-4f10-84e2-3df8f2daa257", "internalName": "Mega Pass", "reference": null, "locale": "en", "timeZone": "America/Los_Angeles", "allowFreesale": false, "availabilityRequired": true, "availabilityType": "OPENING_HOURS", "deliveryFormats": [\ "PDF_URL",\ "QRCODE"\ ], "deliveryMethods": [\ "VOUCHER",\ "TICKET"\ ], "redemptionMethod": "DIGITAL", "options": [\ {\ "id": "6963c6a3-5d6a-4f15-924c-be2530589422",\ "default": false,\ "internalName": "Pick 3",\ "reference": null,\ "restrictions": {\ "minUnits": 0,\ "maxUnits": null\ },\ "units": [\ {\ "id": "adult",\ "internalName": "Adult",\ "reference": "adult",\ "type": "ADULT",\ "restrictions": {\ "minAge": 0,\ "maxAge": 99,\ "idRequired": false,\ "minQuantity": null,\ "maxQuantity": null,\ "paxCount": 1,\ "accompaniedBy": []\ },\ "pricingFrom": [\ {\ "original": 7999,\ "retail": 7999,\ "net": null,\ "currency": "USD",\ "currencyPrecision": 2\ }\ ]\ },\ {\ "id": "child",\ "internalName": "Child",\ "reference": "child",\ "type": "CHILD",\ "restrictions": {\ "minAge": 0,\ "maxAge": 99,\ "idRequired": false,\ "minQuantity": null,\ "maxQuantity": null,\ "paxCount": 1,\ "accompaniedBy": []\ },\ "pricingFrom": [\ {\ "original": 5999,\ "retail": 5999,\ "net": null,\ "currency": "USD",\ "currencyPrecision": 2\ }\ ]\ }\ ]\ },\ {\ "id": "f39bde2f-2cc0-48c1-b404-af68ce2370ae",\ "default": false,\ "internalName": "Pick 4",\ "reference": null,\ "restrictions": {\ "minUnits": 0,\ "maxUnits": null\ },\ "units": [\ {\ "id": "adult",\ "internalName": "Adult",\ "reference": "adult",\ "type": "ADULT",\ "restrictions": {\ "minAge": 0,\ "maxAge": 99,\ "idRequired": false,\ "minQuantity": null,\ "maxQuantity": null,\ "paxCount": 1,\ "accompaniedBy": []\ },\ "pricingFrom": [\ {\ "original": 9999,\ "retail": 9999,\ "net": null,\ "currency": "USD",\ "currencyPrecision": 2\ }\ ]\ },\ {\ "id": "child",\ "internalName": "Child",\ "reference": "child",\ "type": "CHILD",\ "restrictions": {\ "minAge": 0,\ "maxAge": 99,\ "idRequired": false,\ "minQuantity": null,\ "maxQuantity": null,\ "paxCount": 1,\ "accompaniedBy": []\ },\ "pricingFrom": [\ {\ "original": 7999,\ "retail": 7999,\ "net": null,\ "currency": "USD",\ "currencyPrecision": 2\ }\ ]\ }\ ]\ },\ {\ "id": "f996c316-7541-4cb4-a96f-4a6f08cea70a",\ "default": false,\ "internalName": "Pick 5",\ "reference": null,\ "restrictions": {\ "minUnits": 0,\ "maxUnits": null\ },\ "units": [\ {\ "id": "adult",\ "internalName": "Adult",\ "reference": "adult",\ "type": "ADULT",\ "restrictions": {\ "minAge": 0,\ "maxAge": 99,\ "idRequired": false,\ "minQuantity": null,\ "maxQuantity": null,\ "paxCount": 1,\ "accompaniedBy": []\ },\ "pricingFrom": [\ {\ "original": 11499,\ "retail": 11499,\ "net": null,\ "currency": "USD",\ "currencyPrecision": 2\ }\ ]\ },\ {\ "id": "child",\ "internalName": "Child",\ "reference": "child",\ "type": "CHILD",\ "restrictions": {\ "minAge": 0,\ "maxAge": 99,\ "idRequired": false,\ "minQuantity": null,\ "maxQuantity": null,\ "paxCount": 1,\ "accompaniedBy": []\ },\ "pricingFrom": [\ {\ "original": 9299,\ "retail": 9299,\ "net": null,\ "currency": "USD",\ "currencyPrecision": 2\ }\ ]\ }\ ]\ }\ ], "defaultCurrency": "USD", "availableCurrencies": [\ "USD"\ ] } On the response, the only changes from the original schema is on the Product object: Copy { // ...rest of Product object "defaultCurrency": "USD", "availableCurrencies": ["USD", "EUR", "GBP"], "pricingPer": "UNIT" // "UNIT" or "BOOKING" } The `defaultCurrency` is the default currency for this product, if you omit the `currency` parameter on future endpoints this is the value the reservation system will fallback to. `availableCurrencies` are all the possible currencies that we accept for this product. `pricingPer` 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. Next, if `pricingPer = "UNIT"`, on each Unit (adult, child, etc.) we add the following: Copy { // ...rest of the Unit object "pricingFrom": [\ {\ "original": 4500,\ "retail": 4500,\ "net": 3500,\ "currency": "USD",\ "currencyPrecision": 2,\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 800,\ "net": 500\ }\ ]\ },\ {\ "original": 4000,\ "retail": 4000,\ "net": 3000,\ "currency": "GBP",\ "currencyPrecision": 2,\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 700,\ "net": 400\ }\ ]\ }\ // ...etc...\ ] } If `pricingPer = "BOOKING"` then these fields will be on the Product itself instead of the Unit as the pricing applies once to the booking regardless of how many units (tickets) are purchased. We'll produce one `pricingFrom` object for each currency in `availableCurrencies` . The meaning of each pricing field is given below: Field Description `original` The original price for this product which will be the same or higher than the sale amount. Use this to show a discount has been applied e.g. ~$10~ **$8.50** `retail` The sale price you should charge your customers. `net` The wholesale rate the supplier will charge you for this sale. `currency` The currency. `currencyPrecision` 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)`. `includedTaxes` Any taxes included in the retail and/or net price. circle-exclamation Throughout this capability, we'll use a convention where we'll end the object key with `From` to indicate this is indicative and not the final price. Make sure you communicate this also to the customer. [hashtag](https://docs.octo.travel/capabilities-optional/pricing#pricing-calendar) Pricing Calendar -------------------------------------------------------------------------------------------------------- `POST` `{host}/availability/calendar` Returns pricing per day for when you're generating a calendar view. #### [hashtag](https://docs.octo.travel/capabilities-optional/pricing#request-body) Request Body Name Type Description currency string The currency to use 200 Copy [\ //.. each day\ {\ "localDate": "2020-07-01",\ "status": "AVAILABLE",\ "capacity": 24,\ "openingHours": []\ "unitPricingFrom": [\ {\ "unitId": "adult",\ "original": 4500,\ "retail": 4500,\ "net": 3500,\ "currency": "USD",\ "currencyPrecision": 2\ },\ {\ "unitId": "child",\ "original": 4200,\ "retail": 4200,\ "net": 3200,\ "currency": "USD",\ "currencyPrecision": 2\ }\ ]\ }\ ] The documentation above only shows the additions this capability adds to the availability calendar endpoint. See the documentation here to see the full request parameters and response object. Each availability object is given a new `unitPricingFrom` field with an array of unit prices in the currency for example: pricingPer = UNIT pricingPer = BOOKING Copy { "localDate": "2020-07-01", "status": "AVAILABLE", "capacity": 24, "openingHours": [] "unitPricingFrom": [\ {\ "unitId": "unit_adult123",\ "original": 4500,\ "retail": 4500,\ "net": 3500,\ "currency": "USD",\ "currencyPrecision": 2,\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 700,\ "net": 400\ }\ ]\ },\ {\ "unitId": "unit_child321",\ "original": 4200,\ "retail": 4200,\ "net": 3200,\ "currency": "USD",\ "currencyPrecision": 2,\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 800,\ "net": 500\ }\ ]\ }\ ] } Copy { "localDate": "2020-07-01", "status": "AVAILABLE", "capacity": 24, "openingHours": [] "pricingFrom": [\ {\ "original": 4500,\ "retail": 4500,\ "net": 3500,\ "currency": "USD",\ "currencyPrecision": 2,\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 700,\ "net": 400\ }\ ]\ },\ {\ "original": 4200,\ "retail": 4200,\ "net": 3200,\ "currency": "USD",\ "currencyPrecision": 2,\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 800,\ "net": 500\ }\ ]\ }\ ] } If you pass the `units` to the request then we'll give the total pricing for the selection under the `pricingFrom` field, which is also included by default if `pricingPer = BOOKING` as the number of units isn't needed to know what the price of the booking is. For example: Request Response (pricingPer = UNIT) ellipsis Copy { "productId": "1a7213eb-3a33-4cbb-b114-64d771c201ac", "optionId": "DEFAULT", "localDateStart": "2020-07-01", "localDateEnd": "2020-07-02", "units": [\ {\ "id": "unit_adult123",\ "quantity": 2\ },\ {\ "id": "unit_child321",\ "quantity": 1\ }\ ] } Copy [\ {\ "localDate": "2020-07-01",\ "status": "AVAILABLE",\ "capacity": 24,\ "openingHours": [],\ "unitPricingFrom": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "adult",\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 400,\ "net": 250\ }\ ]\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "child",\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 200,\ "net": 50\ }\ ]\ }\ ],\ "pricingFrom": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2,\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 800,\ "net": 500\ }\ ]\ }\ }\ ] Copy [\ {\ "localDate": "2020-07-01",\ "status": "AVAILABLE",\ "capacity": 24,\ "openingHours": [],\ "pricingFrom": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2,\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 800,\ "net": 500\ }\ ]\ }\ }\ ] Having the `pricingFrom` value calculated for you makes it much easier to display a single price on each date on the calendar (assuming the guest has chosen how many units they want before you display the calendar). If pricingPer = BOOKING then unitPricingFrom will not be provided. [hashtag](https://docs.octo.travel/capabilities-optional/pricing#pricing-check) Pricing Check -------------------------------------------------------------------------------------------------- `POST` `{host}/availability` Returns a final quote of the price before making a booking. #### [hashtag](https://docs.octo.travel/capabilities-optional/pricing#request-body-1) Request Body Name Type Description currency string The currency to use 200 Copy [\ {\ "id": "2020-07-01T11:30:00-05:00",\ "localDateTimeStart": "2020-07-01T11:30:00-05:00",\ "localDateTimeEnd": "2020-07-01T23:30:00-05:00",\ "utcCutoffAt": "2020-07-01T16:30:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "adult"\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "child"\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T12:00:00-05:00",\ "localDateTimeStart": "2020-07-01T12:00:00-05:00",\ "localDateTimeEnd": "2020-07-02T00:00:00-05:00",\ "utcCutoffAt": "2020-07-01T17:00:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "adult"\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "child"\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currencyPrecision": 2,\ "currency": "USD"\ }\ },\ {\ "id": "2020-07-01T14:30:00-05:00",\ "localDateTimeStart": "2020-07-01T14:30:00-05:00",\ "localDateTimeEnd": "2020-07-02T02:30:00-05:00",\ "utcCutoffAt": "2020-07-01T19:00:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "adult"\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "child"\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T15:00:00-05:00",\ "localDateTimeStart": "2020-07-01T15:00:00-05:00",\ "localDateTimeEnd": "2020-07-02T03:00:00-05:00",\ "utcCutoffAt": "2020-07-01T20:00:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "adult"\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "child"\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T10:30:00-05:00",\ "localDateTimeStart": "2020-07-01T10:30:00-05:00",\ "localDateTimeEnd": "2020-07-01T22:30:00-05:00",\ "utcCutoffAt": "2020-07-01T15:30:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "adult"\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "child"\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T13:30:00-05:00",\ "localDateTimeStart": "2020-07-01T13:30:00-05:00",\ "localDateTimeEnd": "2020-07-02T01:30:00-05:00",\ "utcCutoffAt": "2020-07-01T15:30:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "adult"\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "child"\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T09:30:00-05:00",\ "localDateTimeStart": "2020-07-01T09:30:00-05:00",\ "localDateTimeEnd": "2020-07-01T21:30:00-05:00",\ "utcCutoffAt": "2020-07-01T14:30:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "adult"\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "child"\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T12:30:00-05:00",\ "localDateTimeStart": "2020-07-01T12:30:00-05:00",\ "localDateTimeEnd": "2020-07-02T00:30:00-05:00",\ "utcCutoffAt": "2020-07-01T17:30:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "adult"\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "child"\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ }\ ] This endpoint is the availability check endpoint which has been extended to add pricing. We only document the added parameters here, to see the full documentation for the original availability check you can find it here. If we were to repeat the request above in the calendar section this is what the response would look like instead: Request Response (pricingPer = UNIT) ellipsis Copy { "productId": "1a7213eb-3a33-4cbb-b114-64d771c201ac", "optionId": "DEFAULT", "localDateStart": "2020-07-01", "localDateEnd": "2020-07-02", "units": [\ {\ "id": "unit_123abcadult",\ "quantity": 2\ },\ {\ "id": "unit_321abcchild",\ "quantity": 1\ }\ ] } Copy [\ {\ "id": "2020-07-01T11:30:00-05:00",\ "localDateTimeStart": "2020-07-01T11:30:00-05:00",\ "localDateTimeEnd": "2020-07-01T23:30:00-05:00",\ "utcCutoffAt": "2020-07-01T16:30:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_123abcadult",\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 400,\ "net": 250\ }\ ]\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_321abcchild",\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 200,\ "net": 50\ }\ ]\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2,\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 800,\ "net": 500\ }\ ]\ }\ },\ {\ "id": "2020-07-01T12:00:00-05:00",\ "localDateTimeStart": "2020-07-01T12:00:00-05:00",\ "localDateTimeEnd": "2020-07-02T00:00:00-05:00",\ "utcCutoffAt": "2020-07-01T17:00:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_123abcadult",\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 400,\ "net": 250\ }\ ]\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_321abcchild",\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 200,\ "net": 50\ }\ ]\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2,\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 800,\ "net": 500\ }\ ]\ }\ },\ {\ "id": "2020-07-01T14:30:00-05:00",\ "localDateTimeStart": "2020-07-01T14:30:00-05:00",\ "localDateTimeEnd": "2020-07-02T02:30:00-05:00",\ "utcCutoffAt": "2020-07-01T19:30:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_123abcadult"\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_321abcchild"\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T15:00:00-05:00",\ "localDateTimeStart": "2020-07-01T15:00:00-05:00",\ "localDateTimeEnd": "2020-07-02T03:00:00-05:00",\ "utcCutoffAt": "2020-07-01T20:00:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_123abcadult"\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_321abcchild"\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T10:30:00-05:00",\ "localDateTimeStart": "2020-07-01T10:30:00-05:00",\ "localDateTimeEnd": "2020-07-01T22:30:00-05:00",\ "utcCutoffAt": "2020-07-01T15:30:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_123abcadult"\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_321abcchild"\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T13:30:00-05:00",\ "localDateTimeStart": "2020-07-01T13:30:00-05:00",\ "localDateTimeEnd": "2020-07-02T01:30:00-05:00",\ "utcCutoffAt": "2020-07-01T18:30:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_123abcadult"\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_321abcchild"\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T09:30:00-05:00",\ "localDateTimeStart": "2020-07-01T09:30:00-05:00",\ "localDateTimeEnd": "2020-07-01T21:30:00-05:00",\ "utcCutoffAt": "2020-07-01T14:30:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_123abcadult"\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_321abcchild"\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T12:30:00-05:00",\ "localDateTimeStart": "2020-07-01T12:30:00-05:00",\ "localDateTimeEnd": "2020-07-02T00:30:00-05:00",\ "utcCutoffAt": "2020-07-01T17:30:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_123abcadult"\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_321abcchild"\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ }\ ] Copy [\ {\ "id": "2020-07-01T11:30:00-05:00",\ "localDateTimeStart": "2020-07-01T11:30:00-05:00",\ "localDateTimeEnd": "2020-07-01T23:30:00-05:00",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2,\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 800,\ "net": 500\ }\ ]\ }\ },\ {\ "id": "2020-07-01T12:00:00-05:00",\ "localDateTimeStart": "2020-07-01T12:00:00-05:00",\ "localDateTimeEnd": "2020-07-02T00:00:00-05:00",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2,\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 800,\ "net": 500\ }\ ]\ }\ },\ {\ "id": "2020-07-01T14:30:00-05:00",\ "localDateTimeStart": "2020-07-01T14:30:00-05:00",\ "localDateTimeEnd": "2020-07-02T02:30:00-05:00",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T15:00:00-05:00",\ "localDateTimeStart": "2020-07-01T15:00:00-05:00",\ "localDateTimeEnd": "2020-07-02T03:00:00-05:00",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T10:30:00-05:00",\ "localDateTimeStart": "2020-07-01T10:30:00-05:00",\ "localDateTimeEnd": "2020-07-01T22:30:00-05:00",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T13:30:00-05:00",\ "localDateTimeStart": "2020-07-01T13:30:00-05:00",\ "localDateTimeEnd": "2020-07-02T01:30:00-05:00",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T09:30:00-05:00",\ "localDateTimeStart": "2020-07-01T09:30:00-05:00",\ "localDateTimeEnd": "2020-07-01T21:30:00-05:00",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T12:30:00-05:00",\ "localDateTimeStart": "2020-07-01T12:30:00-05:00",\ "localDateTimeEnd": "2020-07-02T00:30:00-05:00",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ }\ ] Notice how the response fields are `unitPricing` and `pricing` (without the From suffix). That is because this is the final price, and this is what the booking will be once confirmed. [hashtag](https://docs.octo.travel/capabilities-optional/pricing#booking-reservation) Booking Reservation -------------------------------------------------------------------------------------------------------------- `POST` `{host}/bookings` The booking reservation call #### [hashtag](https://docs.octo.travel/capabilities-optional/pricing#request-body-2) Request Body Name Type Description currency string The currency to use 200 Copy { "uuid": "4de58057-e7bd-4ec0-be9b-08eb674098b9", "testMode": true, "resellerReference": null, "supplierReference": "DV2JG2", "status": "ON_HOLD", "utcExpiresAt": "2020-06-08T07:32:24Z", "utcConfirmedAt": null, "productId": "8d7519d2-cac2-4daa-8aab-d9f97265e495", "optionId": "23df0f5c-781a-4bee-9dae-2355bdd792c5", "cancellable": true, "cancellation": null, "freesale": false, "availability": { "id": "2020-06-27T00:00:00+02:00", "localDateTimeStart": "2020-06-27T00:00:00+02:00", "localDateTimeEnd": "2020-06-28T00:00:00+02:00", "allDay": true, "openingHours": [] }, "contact": { "fullName": null, "emailAddress": null, "phoneNumber": null, "locales": [], "country": null, "notes": null }, "notes": null, "deliveryMethods": [\ "VOUCHER",\ "TICKET"\ ], "voucher": { "redemptionMethod": "DIGITAL", "utcRedeemedAt": null, "deliveryOptions": [] }, "unitItems": [\ {\ "uuid": "4c4a52cd-c0a5-49d9-b1e7-a713564993d4",\ "resellerReference": null,\ "supplierReference": "VD8KTS",\ "unitId": "unit_321abcchild",\ "ticket": {\ "redemptionMethod": "DIGITAL",\ "utcRedeemedAt": null,\ "deliveryOptions": []\ }\ },\ {\ "uuid": "8d4e198d-e337-465c-b17c-e3a55798ee97",\ "resellerReference": null,\ "supplierReference": "ENV98P",\ "unitId": "unit_123abcadult",\ "ticket": {\ "redemptionMethod": "DIGITAL",\ "utcRedeemedAt": null,\ "deliveryOptions": []\ }\ },\ {\ "uuid": "f3183108-32f4-4816-99e6-b04ae40dd433",\ "resellerReference": null,\ "supplierReference": "43FJJ4",\ "unitId": "unit_123abcadult",\ "ticket": {\ "redemptionMethod": "DIGITAL",\ "utcRedeemedAt": null,\ "deliveryOptions": []\ }\ }\ ], "pricing": { "original": 8800, "retail": 8800, "net": 5500, "currency": "EUR", "currencyPrecision": 2, "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 800,\ "net": 500\ }\ ] } } This capability extends the booking schema to add a `pricing` field which gives you the final price of the booking as well as any included taxes. The final price includes tax, and should be what you display to the guest as the amount they need to pay. Copy "pricing": { "original": 8800, "retail": 8800, "net": 5500, "currency": "EUR", "currencyPrecision": 2, "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 800,\ "net": 500\ }\ ] } We include the net amount as well as any taxes included in the net price. [PreviousBookingschevron-left](https://docs.octo.travel/octo-api-core/bookings) [NextNotificationschevron-right](https://docs.octo.travel/capabilities-optional/notifications) Last updated 10 months ago --- # Known Implementations | OCTO Developer Hub The document below provides a summary of OCTO implementations by members as well as known implementations by non-members (as reported by members or known from public sources). The information provided is gathered by member volunteers, OCTO Standards NP Inc. is not responsible for the quality of the information in this document. [https://docs.google.com/spreadsheets/d/1UIgUYAPO3SUsdoGmg5xIGHIBHWHOx7XfQCOzOTML6ms/edit?usp=sharingarrow-up-right](https://docs.google.com/spreadsheets/d/1UIgUYAPO3SUsdoGmg5xIGHIBHWHOx7XfQCOzOTML6ms/edit?usp=sharing) **See a mistake or would like to contribute?** Get in touch with OCTO Implementation Support Team via [#implementation-supportarrow-up-right](https://octo-travel.slack.com/archives/C0573FGQG0J) on Slack (Members Only) or email [help@octo.travelenvelope](mailto:help@octo.travel) . [PreviousPostman Collectionschevron-left](https://docs.octo.travel/additional-resources/postman-collections) Last updated 3 months ago This site uses cookies to deliver its service and to analyze traffic. By browsing this site, you accept the [privacy policy](https://www.octo.travel/privacy) . close AcceptReject --- # Glossary of Terms | OCTO Developer Hub OCTO defines core terms that are re-used throughout the specification. Below we include some of the key terms you need to know before getting started. Refer to [Schemas](https://docs.octo.travel/getting-started/schemas) for detailed definitions of fields used in the specification. Term Definition **Reseller** The reseller, connecting to the Supplier via the API, to further distribute their Products **Supplier** The provider of Products, which Reseller is connecting to. **Product** The attraction, activity or tour offered by Supplier. **Option** A variant of the Product. All products must have at least one option. **Unit** The ticket type, e.g. Adult, Child, Senior, etc. **Unit Item** A line item per unit within the booking. **Booking** A booking made for a specific Product and Option and one or more Unit Items. **Voucher** A single admission document (barcode, QRcode, PDF, etc.) that can be used for the entire booking. **Ticket** An admission document (barcode, QRcode, PDF, etc.) that can be used per unit item. [PreviousWelcomechevron-left](https://docs.octo.travel/) [NextErrorschevron-right](https://docs.octo.travel/getting-started/errors) Last updated 2 years ago --- # Supplier | OCTO Developer Hub [hashtag](https://docs.octo.travel/octo-api-core#get-supplier) Get Supplier -------------------------------------------------------------------------------- ### [hashtag](https://docs.octo.travel/octo-api-core#get-supplier-1) Get Supplier get http://localhost:8080/api/octochevron-down http://localhost:8080/api/octohttps://ventrata-api-1011165921260.us-central1.run.app/api/octo /supplier/copy Returns the supplier and associated contact details. Authorizations BearerAuthchevron-down BearerAuth HTTPRequired Header parameters Octo-CapabilitiesstringRequired A list of the Capabilities (their IDs) initialized with your request. Accept-LanguagestringOptional 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. Responses chevron-right 200 The request has succeeded. application/json Headersobject Show Headersplus ResponseobjectExample: `{"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"}}` Show propertiesplus chevron-right 400 The server could not understand the request due to invalid syntax. application/json get /supplier/ HTTPchevron-down HTTPcURLJavaScriptPython Copy GET /api/octo/supplier/ HTTP/1.1 Host: localhost:8080 Authorization: Bearer YOUR_SECRET_TOKEN Octo-Capabilities: text Accept: */* Test it 200 The request has succeeded. chevron-down Copy { "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 examplechevron-down [PreviousDevelopment Supportchevron-left](https://docs.octo.travel/getting-started/development-support) [NextProductschevron-right](https://docs.octo.travel/octo-api-core/products) Last updated 7 months ago --- # Slack Workspace | OCTO Developer Hub ### [hashtag](https://docs.octo.travel/additional-resources#octo-slack-community) OCTO Slack Community The OCTO Slack workspace is where the OCTO community collaborates, asks questions, and helps each other build better OCTO implementations. More than 300 members use it daily to share knowledge, discuss challenges, and stay aligned on the latest developments in the standard. #### [hashtag](https://docs.octo.travel/additional-resources#what-its-for) What it’s for OCTO Slack is the best place to get support directly from fellow members—suppliers, resellers, developers, integrators, and working group contributors who are implementing OCTO in real production environments. You’ll find active channels covering implementation questions, capability discussions, working groups, announcements, and broader ecosystem topics. #### [hashtag](https://docs.octo.travel/additional-resources#who-can-access-it) Who can access it The Slack workspace is available **exclusively to OCTO members**. If you’re already a member and don’t have access yet, contact [help@octo.travelenvelope](mailto:help@octo.travel) and we’ll get you added. To become a member, visit [https://www.octo.travel/joinarrow-up-right](https://www.octo.travel/join) #### [hashtag](https://docs.octo.travel/additional-resources#how-to-access) How to access If you’re an OCTO member, you can access the workspace at: [https://octo-travel.slack.comarrow-up-right](https://octo-travel.slack.com/) [PreviousPromotions \[IN DEV\]chevron-left](https://docs.octo.travel/capabilities-optional/promotions-in-dev) [NextSelf-Certification Toolchevron-right](https://docs.octo.travel/additional-resources/self-certification-tool) Last updated 3 months ago --- # Pricing | OCTO Developer Hub To use this capability, add `pricing` to your `Octo-Capabilities` header. This capability adds pricing to most endpoints, giving you advanced static and dynamic pricing capabilities. [hashtag](https://docs.octo.travel/capabilities-optional#product-pricing) Product Pricing ---------------------------------------------------------------------------------------------- `GET` `{host}/products/:id` Returns top-level pricing by unit on each product. #### [hashtag](https://docs.octo.travel/capabilities-optional#path-parameters) Path Parameters Name Type Description id string The product id, leave this out to get every product. 200 Copy { "id": "93c335bc-07b9-4f10-84e2-3df8f2daa257", "internalName": "Mega Pass", "reference": null, "locale": "en", "timeZone": "America/Los_Angeles", "allowFreesale": false, "availabilityRequired": true, "availabilityType": "OPENING_HOURS", "deliveryFormats": [\ "PDF_URL",\ "QRCODE"\ ], "deliveryMethods": [\ "VOUCHER",\ "TICKET"\ ], "redemptionMethod": "DIGITAL", "options": [\ {\ "id": "6963c6a3-5d6a-4f15-924c-be2530589422",\ "default": false,\ "internalName": "Pick 3",\ "reference": null,\ "restrictions": {\ "minUnits": 0,\ "maxUnits": null\ },\ "units": [\ {\ "id": "adult",\ "internalName": "Adult",\ "reference": "adult",\ "type": "ADULT",\ "restrictions": {\ "minAge": 0,\ "maxAge": 99,\ "idRequired": false,\ "minQuantity": null,\ "maxQuantity": null,\ "paxCount": 1,\ "accompaniedBy": []\ },\ "pricingFrom": [\ {\ "original": 7999,\ "retail": 7999,\ "net": null,\ "currency": "USD",\ "currencyPrecision": 2\ }\ ]\ },\ {\ "id": "child",\ "internalName": "Child",\ "reference": "child",\ "type": "CHILD",\ "restrictions": {\ "minAge": 0,\ "maxAge": 99,\ "idRequired": false,\ "minQuantity": null,\ "maxQuantity": null,\ "paxCount": 1,\ "accompaniedBy": []\ },\ "pricingFrom": [\ {\ "original": 5999,\ "retail": 5999,\ "net": null,\ "currency": "USD",\ "currencyPrecision": 2\ }\ ]\ }\ ]\ },\ {\ "id": "f39bde2f-2cc0-48c1-b404-af68ce2370ae",\ "default": false,\ "internalName": "Pick 4",\ "reference": null,\ "restrictions": {\ "minUnits": 0,\ "maxUnits": null\ },\ "units": [\ {\ "id": "adult",\ "internalName": "Adult",\ "reference": "adult",\ "type": "ADULT",\ "restrictions": {\ "minAge": 0,\ "maxAge": 99,\ "idRequired": false,\ "minQuantity": null,\ "maxQuantity": null,\ "paxCount": 1,\ "accompaniedBy": []\ },\ "pricingFrom": [\ {\ "original": 9999,\ "retail": 9999,\ "net": null,\ "currency": "USD",\ "currencyPrecision": 2\ }\ ]\ },\ {\ "id": "child",\ "internalName": "Child",\ "reference": "child",\ "type": "CHILD",\ "restrictions": {\ "minAge": 0,\ "maxAge": 99,\ "idRequired": false,\ "minQuantity": null,\ "maxQuantity": null,\ "paxCount": 1,\ "accompaniedBy": []\ },\ "pricingFrom": [\ {\ "original": 7999,\ "retail": 7999,\ "net": null,\ "currency": "USD",\ "currencyPrecision": 2\ }\ ]\ }\ ]\ },\ {\ "id": "f996c316-7541-4cb4-a96f-4a6f08cea70a",\ "default": false,\ "internalName": "Pick 5",\ "reference": null,\ "restrictions": {\ "minUnits": 0,\ "maxUnits": null\ },\ "units": [\ {\ "id": "adult",\ "internalName": "Adult",\ "reference": "adult",\ "type": "ADULT",\ "restrictions": {\ "minAge": 0,\ "maxAge": 99,\ "idRequired": false,\ "minQuantity": null,\ "maxQuantity": null,\ "paxCount": 1,\ "accompaniedBy": []\ },\ "pricingFrom": [\ {\ "original": 11499,\ "retail": 11499,\ "net": null,\ "currency": "USD",\ "currencyPrecision": 2\ }\ ]\ },\ {\ "id": "child",\ "internalName": "Child",\ "reference": "child",\ "type": "CHILD",\ "restrictions": {\ "minAge": 0,\ "maxAge": 99,\ "idRequired": false,\ "minQuantity": null,\ "maxQuantity": null,\ "paxCount": 1,\ "accompaniedBy": []\ },\ "pricingFrom": [\ {\ "original": 9299,\ "retail": 9299,\ "net": null,\ "currency": "USD",\ "currencyPrecision": 2\ }\ ]\ }\ ]\ }\ ], "defaultCurrency": "USD", "availableCurrencies": [\ "USD"\ ] } On the response, the only changes from the original schema is on the Product object: Copy { // ...rest of Product object "defaultCurrency": "USD", "availableCurrencies": ["USD", "EUR", "GBP"], "pricingPer": "UNIT" // "UNIT" or "BOOKING" } The `defaultCurrency` is the default currency for this product, if you omit the `currency` parameter on future endpoints this is the value the reservation system will fallback to. `availableCurrencies` are all the possible currencies that we accept for this product. `pricingPer` 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. Next, if `pricingPer = "UNIT"`, on each Unit (adult, child, etc.) we add the following: Copy { // ...rest of the Unit object "pricingFrom": [\ {\ "original": 4500,\ "retail": 4500,\ "net": 3500,\ "currency": "USD",\ "currencyPrecision": 2,\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 800,\ "net": 500\ }\ ]\ },\ {\ "original": 4000,\ "retail": 4000,\ "net": 3000,\ "currency": "GBP",\ "currencyPrecision": 2,\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 700,\ "net": 400\ }\ ]\ }\ // ...etc...\ ] } If `pricingPer = "BOOKING"` then these fields will be on the Product itself instead of the Unit as the pricing applies once to the booking regardless of how many units (tickets) are purchased. We'll produce one `pricingFrom` object for each currency in `availableCurrencies` . The meaning of each pricing field is given below: Field Description `original` The original price for this product which will be the same or higher than the sale amount. Use this to show a discount has been applied e.g. ~$10~ **$8.50** `retail` The sale price you should charge your customers. `net` The wholesale rate the supplier will charge you for this sale. `currency` The currency. `currencyPrecision` 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)`. `includedTaxes` Any taxes included in the retail and/or net price. circle-exclamation Throughout this capability, we'll use a convention where we'll end the object key with `From` to indicate this is indicative and not the final price. Make sure you communicate this also to the customer. [hashtag](https://docs.octo.travel/capabilities-optional#pricing-calendar) Pricing Calendar ------------------------------------------------------------------------------------------------ `POST` `{host}/availability/calendar` Returns pricing per day for when you're generating a calendar view. #### [hashtag](https://docs.octo.travel/capabilities-optional#request-body) Request Body Name Type Description currency string The currency to use 200 Copy [\ //.. each day\ {\ "localDate": "2020-07-01",\ "status": "AVAILABLE",\ "capacity": 24,\ "openingHours": []\ "unitPricingFrom": [\ {\ "unitId": "adult",\ "original": 4500,\ "retail": 4500,\ "net": 3500,\ "currency": "USD",\ "currencyPrecision": 2\ },\ {\ "unitId": "child",\ "original": 4200,\ "retail": 4200,\ "net": 3200,\ "currency": "USD",\ "currencyPrecision": 2\ }\ ]\ }\ ] The documentation above only shows the additions this capability adds to the availability calendar endpoint. See the documentation here to see the full request parameters and response object. Each availability object is given a new `unitPricingFrom` field with an array of unit prices in the currency for example: pricingPer = UNIT pricingPer = BOOKING Copy { "localDate": "2020-07-01", "status": "AVAILABLE", "capacity": 24, "openingHours": [] "unitPricingFrom": [\ {\ "unitId": "unit_adult123",\ "original": 4500,\ "retail": 4500,\ "net": 3500,\ "currency": "USD",\ "currencyPrecision": 2,\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 700,\ "net": 400\ }\ ]\ },\ {\ "unitId": "unit_child321",\ "original": 4200,\ "retail": 4200,\ "net": 3200,\ "currency": "USD",\ "currencyPrecision": 2,\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 800,\ "net": 500\ }\ ]\ }\ ] } Copy { "localDate": "2020-07-01", "status": "AVAILABLE", "capacity": 24, "openingHours": [] "pricingFrom": [\ {\ "original": 4500,\ "retail": 4500,\ "net": 3500,\ "currency": "USD",\ "currencyPrecision": 2,\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 700,\ "net": 400\ }\ ]\ },\ {\ "original": 4200,\ "retail": 4200,\ "net": 3200,\ "currency": "USD",\ "currencyPrecision": 2,\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 800,\ "net": 500\ }\ ]\ }\ ] } If you pass the `units` to the request then we'll give the total pricing for the selection under the `pricingFrom` field, which is also included by default if `pricingPer = BOOKING` as the number of units isn't needed to know what the price of the booking is. For example: Request Response (pricingPer = UNIT) ellipsis Copy { "productId": "1a7213eb-3a33-4cbb-b114-64d771c201ac", "optionId": "DEFAULT", "localDateStart": "2020-07-01", "localDateEnd": "2020-07-02", "units": [\ {\ "id": "unit_adult123",\ "quantity": 2\ },\ {\ "id": "unit_child321",\ "quantity": 1\ }\ ] } Copy [\ {\ "localDate": "2020-07-01",\ "status": "AVAILABLE",\ "capacity": 24,\ "openingHours": [],\ "unitPricingFrom": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "adult",\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 400,\ "net": 250\ }\ ]\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "child",\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 200,\ "net": 50\ }\ ]\ }\ ],\ "pricingFrom": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2,\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 800,\ "net": 500\ }\ ]\ }\ }\ ] Copy [\ {\ "localDate": "2020-07-01",\ "status": "AVAILABLE",\ "capacity": 24,\ "openingHours": [],\ "pricingFrom": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2,\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 800,\ "net": 500\ }\ ]\ }\ }\ ] Having the `pricingFrom` value calculated for you makes it much easier to display a single price on each date on the calendar (assuming the guest has chosen how many units they want before you display the calendar). If pricingPer = BOOKING then unitPricingFrom will not be provided. [hashtag](https://docs.octo.travel/capabilities-optional#pricing-check) Pricing Check ------------------------------------------------------------------------------------------ `POST` `{host}/availability` Returns a final quote of the price before making a booking. #### [hashtag](https://docs.octo.travel/capabilities-optional#request-body-1) Request Body Name Type Description currency string The currency to use 200 Copy [\ {\ "id": "2020-07-01T11:30:00-05:00",\ "localDateTimeStart": "2020-07-01T11:30:00-05:00",\ "localDateTimeEnd": "2020-07-01T23:30:00-05:00",\ "utcCutoffAt": "2020-07-01T16:30:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "adult"\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "child"\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T12:00:00-05:00",\ "localDateTimeStart": "2020-07-01T12:00:00-05:00",\ "localDateTimeEnd": "2020-07-02T00:00:00-05:00",\ "utcCutoffAt": "2020-07-01T17:00:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "adult"\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "child"\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currencyPrecision": 2,\ "currency": "USD"\ }\ },\ {\ "id": "2020-07-01T14:30:00-05:00",\ "localDateTimeStart": "2020-07-01T14:30:00-05:00",\ "localDateTimeEnd": "2020-07-02T02:30:00-05:00",\ "utcCutoffAt": "2020-07-01T19:00:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "adult"\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "child"\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T15:00:00-05:00",\ "localDateTimeStart": "2020-07-01T15:00:00-05:00",\ "localDateTimeEnd": "2020-07-02T03:00:00-05:00",\ "utcCutoffAt": "2020-07-01T20:00:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "adult"\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "child"\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T10:30:00-05:00",\ "localDateTimeStart": "2020-07-01T10:30:00-05:00",\ "localDateTimeEnd": "2020-07-01T22:30:00-05:00",\ "utcCutoffAt": "2020-07-01T15:30:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "adult"\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "child"\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T13:30:00-05:00",\ "localDateTimeStart": "2020-07-01T13:30:00-05:00",\ "localDateTimeEnd": "2020-07-02T01:30:00-05:00",\ "utcCutoffAt": "2020-07-01T15:30:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "adult"\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "child"\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T09:30:00-05:00",\ "localDateTimeStart": "2020-07-01T09:30:00-05:00",\ "localDateTimeEnd": "2020-07-01T21:30:00-05:00",\ "utcCutoffAt": "2020-07-01T14:30:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "adult"\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "child"\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T12:30:00-05:00",\ "localDateTimeStart": "2020-07-01T12:30:00-05:00",\ "localDateTimeEnd": "2020-07-02T00:30:00-05:00",\ "utcCutoffAt": "2020-07-01T17:30:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "adult"\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "child"\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ }\ ] This endpoint is the availability check endpoint which has been extended to add pricing. We only document the added parameters here, to see the full documentation for the original availability check you can find it here. If we were to repeat the request above in the calendar section this is what the response would look like instead: Request Response (pricingPer = UNIT) ellipsis Copy { "productId": "1a7213eb-3a33-4cbb-b114-64d771c201ac", "optionId": "DEFAULT", "localDateStart": "2020-07-01", "localDateEnd": "2020-07-02", "units": [\ {\ "id": "unit_123abcadult",\ "quantity": 2\ },\ {\ "id": "unit_321abcchild",\ "quantity": 1\ }\ ] } Copy [\ {\ "id": "2020-07-01T11:30:00-05:00",\ "localDateTimeStart": "2020-07-01T11:30:00-05:00",\ "localDateTimeEnd": "2020-07-01T23:30:00-05:00",\ "utcCutoffAt": "2020-07-01T16:30:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_123abcadult",\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 400,\ "net": 250\ }\ ]\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_321abcchild",\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 200,\ "net": 50\ }\ ]\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2,\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 800,\ "net": 500\ }\ ]\ }\ },\ {\ "id": "2020-07-01T12:00:00-05:00",\ "localDateTimeStart": "2020-07-01T12:00:00-05:00",\ "localDateTimeEnd": "2020-07-02T00:00:00-05:00",\ "utcCutoffAt": "2020-07-01T17:00:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_123abcadult",\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 400,\ "net": 250\ }\ ]\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_321abcchild",\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 200,\ "net": 50\ }\ ]\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2,\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 800,\ "net": 500\ }\ ]\ }\ },\ {\ "id": "2020-07-01T14:30:00-05:00",\ "localDateTimeStart": "2020-07-01T14:30:00-05:00",\ "localDateTimeEnd": "2020-07-02T02:30:00-05:00",\ "utcCutoffAt": "2020-07-01T19:30:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_123abcadult"\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_321abcchild"\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T15:00:00-05:00",\ "localDateTimeStart": "2020-07-01T15:00:00-05:00",\ "localDateTimeEnd": "2020-07-02T03:00:00-05:00",\ "utcCutoffAt": "2020-07-01T20:00:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_123abcadult"\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_321abcchild"\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T10:30:00-05:00",\ "localDateTimeStart": "2020-07-01T10:30:00-05:00",\ "localDateTimeEnd": "2020-07-01T22:30:00-05:00",\ "utcCutoffAt": "2020-07-01T15:30:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_123abcadult"\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_321abcchild"\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T13:30:00-05:00",\ "localDateTimeStart": "2020-07-01T13:30:00-05:00",\ "localDateTimeEnd": "2020-07-02T01:30:00-05:00",\ "utcCutoffAt": "2020-07-01T18:30:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_123abcadult"\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_321abcchild"\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T09:30:00-05:00",\ "localDateTimeStart": "2020-07-01T09:30:00-05:00",\ "localDateTimeEnd": "2020-07-01T21:30:00-05:00",\ "utcCutoffAt": "2020-07-01T14:30:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_123abcadult"\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_321abcchild"\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T12:30:00-05:00",\ "localDateTimeStart": "2020-07-01T12:30:00-05:00",\ "localDateTimeEnd": "2020-07-02T00:30:00-05:00",\ "utcCutoffAt": "2020-07-01T17:30:00Z",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "unitPricing": [\ {\ "original": 3995,\ "retail": 3995,\ "net": 2996,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_123abcadult"\ },\ {\ "original": 1995,\ "retail": 1995,\ "net": 1496,\ "currency": "USD",\ "currencyPrecision": 2,\ "unitId": "unit_321abcchild"\ }\ ],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ }\ ] Copy [\ {\ "id": "2020-07-01T11:30:00-05:00",\ "localDateTimeStart": "2020-07-01T11:30:00-05:00",\ "localDateTimeEnd": "2020-07-01T23:30:00-05:00",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2,\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 800,\ "net": 500\ }\ ]\ }\ },\ {\ "id": "2020-07-01T12:00:00-05:00",\ "localDateTimeStart": "2020-07-01T12:00:00-05:00",\ "localDateTimeEnd": "2020-07-02T00:00:00-05:00",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2,\ "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 800,\ "net": 500\ }\ ]\ }\ },\ {\ "id": "2020-07-01T14:30:00-05:00",\ "localDateTimeStart": "2020-07-01T14:30:00-05:00",\ "localDateTimeEnd": "2020-07-02T02:30:00-05:00",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T15:00:00-05:00",\ "localDateTimeStart": "2020-07-01T15:00:00-05:00",\ "localDateTimeEnd": "2020-07-02T03:00:00-05:00",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T10:30:00-05:00",\ "localDateTimeStart": "2020-07-01T10:30:00-05:00",\ "localDateTimeEnd": "2020-07-01T22:30:00-05:00",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T13:30:00-05:00",\ "localDateTimeStart": "2020-07-01T13:30:00-05:00",\ "localDateTimeEnd": "2020-07-02T01:30:00-05:00",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T09:30:00-05:00",\ "localDateTimeStart": "2020-07-01T09:30:00-05:00",\ "localDateTimeEnd": "2020-07-01T21:30:00-05:00",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ },\ {\ "id": "2020-07-01T12:30:00-05:00",\ "localDateTimeStart": "2020-07-01T12:30:00-05:00",\ "localDateTimeEnd": "2020-07-02T00:30:00-05:00",\ "allDay": false,\ "status": "AVAILABLE",\ "vacancies": 24,\ "capacity": 24,\ "maxUnits": 24,\ "openingHours": [],\ "pricing": {\ "original": 9985,\ "retail": 9985,\ "net": 7488,\ "currency": "USD",\ "currencyPrecision": 2\ }\ }\ ] Notice how the response fields are `unitPricing` and `pricing` (without the From suffix). That is because this is the final price, and this is what the booking will be once confirmed. [hashtag](https://docs.octo.travel/capabilities-optional#booking-reservation) Booking Reservation ------------------------------------------------------------------------------------------------------ `POST` `{host}/bookings` The booking reservation call #### [hashtag](https://docs.octo.travel/capabilities-optional#request-body-2) Request Body Name Type Description currency string The currency to use 200 Copy { "uuid": "4de58057-e7bd-4ec0-be9b-08eb674098b9", "testMode": true, "resellerReference": null, "supplierReference": "DV2JG2", "status": "ON_HOLD", "utcExpiresAt": "2020-06-08T07:32:24Z", "utcConfirmedAt": null, "productId": "8d7519d2-cac2-4daa-8aab-d9f97265e495", "optionId": "23df0f5c-781a-4bee-9dae-2355bdd792c5", "cancellable": true, "cancellation": null, "freesale": false, "availability": { "id": "2020-06-27T00:00:00+02:00", "localDateTimeStart": "2020-06-27T00:00:00+02:00", "localDateTimeEnd": "2020-06-28T00:00:00+02:00", "allDay": true, "openingHours": [] }, "contact": { "fullName": null, "emailAddress": null, "phoneNumber": null, "locales": [], "country": null, "notes": null }, "notes": null, "deliveryMethods": [\ "VOUCHER",\ "TICKET"\ ], "voucher": { "redemptionMethod": "DIGITAL", "utcRedeemedAt": null, "deliveryOptions": [] }, "unitItems": [\ {\ "uuid": "4c4a52cd-c0a5-49d9-b1e7-a713564993d4",\ "resellerReference": null,\ "supplierReference": "VD8KTS",\ "unitId": "unit_321abcchild",\ "ticket": {\ "redemptionMethod": "DIGITAL",\ "utcRedeemedAt": null,\ "deliveryOptions": []\ }\ },\ {\ "uuid": "8d4e198d-e337-465c-b17c-e3a55798ee97",\ "resellerReference": null,\ "supplierReference": "ENV98P",\ "unitId": "unit_123abcadult",\ "ticket": {\ "redemptionMethod": "DIGITAL",\ "utcRedeemedAt": null,\ "deliveryOptions": []\ }\ },\ {\ "uuid": "f3183108-32f4-4816-99e6-b04ae40dd433",\ "resellerReference": null,\ "supplierReference": "43FJJ4",\ "unitId": "unit_123abcadult",\ "ticket": {\ "redemptionMethod": "DIGITAL",\ "utcRedeemedAt": null,\ "deliveryOptions": []\ }\ }\ ], "pricing": { "original": 8800, "retail": 8800, "net": 5500, "currency": "EUR", "currencyPrecision": 2, "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 800,\ "net": 500\ }\ ] } } This capability extends the booking schema to add a `pricing` field which gives you the final price of the booking as well as any included taxes. The final price includes tax, and should be what you display to the guest as the amount they need to pay. Copy "pricing": { "original": 8800, "retail": 8800, "net": 5500, "currency": "EUR", "currencyPrecision": 2, "includedTaxes": [\ {\ "name": "VAT 10",\ "retail": 800,\ "net": 500\ }\ ] } We include the net amount as well as any taxes included in the net price. [PreviousBookingschevron-left](https://docs.octo.travel/octo-api-core/bookings) [NextNotificationschevron-right](https://docs.octo.travel/capabilities-optional/notifications) Last updated 10 months ago --- # Bookings | OCTO Developer Hub [hashtag](https://docs.octo.travel/octo-api-core/bookings#create-booking) Create Booking --------------------------------------------------------------------------------------------- triangle-exclamation **A reseller has to perform** [**Availability Check**](https://docs.octo.travel/octo-api-core/bookings#availability-check) **to retrieve an** `availabilityId` **in order to make a** [**Booking Reservation**](https://docs.octo.travel/octo-api-core/bookings#booking-reservation) **.** ### [hashtag](https://docs.octo.travel/octo-api-core/bookings#post-bookings) Booking Reservation post http://localhost:8080/api/octochevron-down http://localhost:8080/api/octohttps://ventrata-api-1011165921260.us-central1.run.app/api/octo /bookings/copy Reserving availability when making a booking. The steps to make a reservation are: 1. **Check Availability**: Check the availability on the /availability 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 endpoint. A reserved booking can be confirmed after the customer finalizes their choice on the /bookings/{uuid}/confirm endpoint provided the reservation had not expired. Authorizations BearerAuthchevron-down BearerAuth HTTPRequired Header parameters Octo-CapabilitiesstringRequired A list of the Capabilities (their IDs) initialized with your request. Accept-LanguagestringOptional 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. Body application/jsonchevron-down application/json uuidstring · uuidOptional 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` productIdstringRequired The product ID for this booking. Example: `6b903d44-dc24-4ca4-ae71-6bde6c4f4854` optionIdstringRequired The option ID for this booking. Example: `DEFAULT` availabilityIdstringOptional The availability ID for the selected timeslot. Example: `2022-05-23T00:00:00+01:00` expirationMinutesintegerOptional How many minutes to reserve the availability, otherwise defaults to the supplier default amount. Example: `30` notesstringOptional Optional notes for the booking. Example: `Optional notes` unitItemsobject\[\]Required 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"}]` Show propertiesplus currencystringOptional Can be used only when pricing capability is used. Example: `USD` Responses chevron-right 200 The request has succeeded. application/json Headersobject Show Headersplus Responseobject Show propertiesplus chevron-right 400 The server could not understand the request due to invalid syntax. application/json post /bookings/ HTTPchevron-down HTTPcURLJavaScriptPython Copy POST /api/octo/bookings/ HTTP/1.1 Host: localhost:8080 Authorization: Bearer YOUR_SECRET_TOKEN Octo-Capabilities: text Content-Type: application/json Accept: */* Content-Length: 326 { "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"\ }\ ] } Test it 200 The request has succeeded. chevron-down Copy { "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\ }\ ] } [hashtag](https://docs.octo.travel/octo-api-core/bookings#confirm-booking) Confirm Booking ----------------------------------------------------------------------------------------------- ### [hashtag](https://docs.octo.travel/octo-api-core/bookings#post-bookings-uuid-confirm) Booking Confirmation post http://localhost:8080/api/octochevron-down http://localhost:8080/api/octohttps://ventrata-api-1011165921260.us-central1.run.app/api/octo /bookings/{uuid}/confirmcopy This endpoint confirms the booking so it's ready to be used. Authorizations BearerAuthchevron-down BearerAuth HTTPRequired Path parameters uuidstringRequired The UUID of the booking Header parameters Octo-CapabilitiesstringRequired A list of the Capabilities (their IDs) initialized with your request. Accept-LanguagestringOptional 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. Body application/jsonchevron-down application/json emailReceiptbooleanOptional Whether you want OCTO Cloud to email the guest a copy of their receipt and tickets. (defaults to false) Example: `true` resellerReferencestringOptional Your reference for this booking. Also known as a Voucher Number. Example: `VOUCHER-0123` contactall ofRequired 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"}` Show propertiesplus unitItemsobject\[\]Optional 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"}]` Show propertiesplus Responses chevron-right 200 The request has succeeded. application/json Headersobject Show Headersplus Responseobject Show propertiesplus chevron-right 400 The server could not understand the request due to invalid syntax. application/json post /bookings/{uuid}/confirm HTTPchevron-down HTTPcURLJavaScriptPython Copy POST /api/octo/bookings/{uuid}/confirm HTTP/1.1 Host: localhost:8080 Authorization: Bearer YOUR_SECRET_TOKEN Octo-Capabilities: text Content-Type: application/json Accept: */* Content-Length: 219 { "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" } } Test it 200 The request has succeeded. chevron-down Copy { "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": ""\ }\ ]\ }\ }\ ] } [hashtag](https://docs.octo.travel/octo-api-core/bookings#cancel-booking) Cancel Booking --------------------------------------------------------------------------------------------- ### [hashtag](https://docs.octo.travel/octo-api-core/bookings#post-bookings-uuid-cancel) Booking Cancellation post http://localhost:8080/api/octochevron-down http://localhost:8080/api/octohttps://ventrata-api-1011165921260.us-central1.run.app/api/octo /bookings/{uuid}/cancelcopy For cancelling bookings. You can only cancel a booking if `booking.cancellable` is `TRUE`, and is within the booking cancellation cut-off window. Authorizations BearerAuthchevron-down BearerAuth HTTPRequired Path parameters uuidstringRequired The UUID of the booking Header parameters Octo-CapabilitiesstringRequired A list of the Capabilities (their IDs) initialized with your request. Accept-LanguagestringOptional 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. Body application/jsonchevron-down application/json reasonstringOptional 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)` forcebooleanOptional Whether you want OCTO Cloud to email the guest a copy of their receipt and tickets. (defaults to false) Example: `false` Responses chevron-right 200 The request has succeeded. application/json Headersobject Show Headersplus Responseobject Show propertiesplus chevron-right 400 The server could not understand the request due to invalid syntax. application/json post /bookings/{uuid}/cancel HTTPchevron-down HTTPcURLJavaScriptPython Copy POST /api/octo/bookings/{uuid}/cancel HTTP/1.1 Host: localhost:8080 Authorization: Bearer YOUR_SECRET_TOKEN Octo-Capabilities: text Content-Type: application/json Accept: */* Content-Length: 31 { "reason": "this product sucks" } Test it 200 The request has succeeded. chevron-down Copy { "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": [] } [hashtag](https://docs.octo.travel/octo-api-core/bookings#get-booking-list) Get Booking List ------------------------------------------------------------------------------------------------- ### [hashtag](https://docs.octo.travel/octo-api-core/bookings#get-bookings-uuid) Get Booking get http://localhost:8080/api/octochevron-down http://localhost:8080/api/octohttps://ventrata-api-1011165921260.us-central1.run.app/api/octo /bookings/{uuid}copy Fetch the status of an existing booking. Authorizations BearerAuthchevron-down BearerAuth HTTPRequired Path parameters uuidstringRequired The UUID of the booking Header parameters Octo-CapabilitiesstringRequired A list of the Capabilities (their IDs) initialized with your request. Accept-LanguagestringOptional 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. Responses chevron-right 200 The request has succeeded. application/json Headersobject Show Headersplus Responseobject Show propertiesplus chevron-right 400 The server could not understand the request due to invalid syntax. application/json get /bookings/{uuid} HTTPchevron-down HTTPcURLJavaScriptPython Copy GET /api/octo/bookings/{uuid} HTTP/1.1 Host: localhost:8080 Authorization: Bearer YOUR_SECRET_TOKEN Octo-Capabilities: text Accept: */* Test it 200 The request has succeeded. chevron-down Copy { "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": ""\ }\ ]\ }\ }\ ] } [hashtag](https://docs.octo.travel/octo-api-core/bookings#get-booking) Get Booking --------------------------------------------------------------------------------------- ### [hashtag](https://docs.octo.travel/octo-api-core/bookings#get-bookings-uuid-1) Get Booking get http://localhost:8080/api/octochevron-down http://localhost:8080/api/octohttps://ventrata-api-1011165921260.us-central1.run.app/api/octo /bookings/{uuid}copy Fetch the status of an existing booking. Authorizations BearerAuthchevron-down BearerAuth HTTPRequired Path parameters uuidstringRequired The UUID of the booking Header parameters Octo-CapabilitiesstringRequired A list of the Capabilities (their IDs) initialized with your request. Accept-LanguagestringOptional 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. Responses chevron-right 200 The request has succeeded. application/json Headersobject Show Headersplus Responseobject Show propertiesplus chevron-right 400 The server could not understand the request due to invalid syntax. application/json get /bookings/{uuid} HTTPchevron-down HTTPcURLJavaScriptPython Copy GET /api/octo/bookings/{uuid} HTTP/1.1 Host: localhost:8080 Authorization: Bearer YOUR_SECRET_TOKEN Octo-Capabilities: text Accept: */* Test it 200 The request has succeeded. chevron-down Copy { "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": ""\ }\ ]\ }\ }\ ] } [hashtag](https://docs.octo.travel/octo-api-core/bookings#update-booking) Update Booking --------------------------------------------------------------------------------------------- ### [hashtag](https://docs.octo.travel/octo-api-core/bookings#patch-bookings-uuid) Booking Update patch http://localhost:8080/api/octochevron-down http://localhost:8080/api/octohttps://ventrata-api-1011165921260.us-central1.run.app/api/octo /bookings/{uuid}copy 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 Authorizations BearerAuthchevron-down BearerAuth HTTPRequired Path parameters uuidstringRequired The UUID of the booking Header parameters Octo-CapabilitiesstringRequired A list of the Capabilities (their IDs) initialized with your request. Accept-LanguagestringOptional 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. Body application/jsonchevron-down application/json resellerReferencestringOptional Your reference for this booking. Also known as a Voucher Number. Example: `VOUCHER-0123` productIdstringOptional The product ID. Example: `6b903d44-dc24-4ca4-ae71-6bde6c4f4854` optionIdstringOptional The option id. Example: `DEFAULT` availabilityIdstringOptional The availability ID for the selected timeslot. Example: `2022-05-23T00:00:00+01:00` expirationMinutesintegerOptional How many minutes to reserve the availability, otherwise defaults to the supplier default amount. Example: `15` notesstringOptional Optional notes for the booking. Example: `Optional notes` emailReceiptbooleanOptional Whether you want OCTO Cloud to email the guest a copy of their receipt and tickets. (defaults to false). Example: `true` unitItemsobject\[\]Optional 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"}]` Show propertiesplus contactall ofOptional 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"}` Show propertiesplus Responses chevron-right 200 The request has succeeded. application/json Headersobject Show Headersplus Responseobject Show propertiesplus chevron-right 400 The server could not understand the request due to invalid syntax. application/json patch /bookings/{uuid} HTTPchevron-down HTTPcURLJavaScriptPython Copy PATCH /api/octo/bookings/{uuid} HTTP/1.1 Host: localhost:8080 Authorization: Bearer YOUR_SECRET_TOKEN Octo-Capabilities: text Content-Type: application/json Accept: */* Content-Length: 520 { "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" } } Test it 200 The request has succeeded. chevron-down Copy { "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": "2022-05-25T11:04:22Z", "utcRedeemedAt": "2022-06-25T10:34:22Z", "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": { "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": { "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": null\ }\ ], "pricing": { "original": 2000, "retail": 2000, "net": 1600, "currency": "EUR", "currencyPrecision": 2, "includedTaxes": [] } } [hashtag](https://docs.octo.travel/octo-api-core/bookings#extend-pending-booking-expiration) Extend Pending Booking Expiration ----------------------------------------------------------------------------------------------------------------------------------- ### [hashtag](https://docs.octo.travel/octo-api-core/bookings#patch-bookings-uuid-1) Booking Update patch http://localhost:8080/api/octochevron-down http://localhost:8080/api/octohttps://ventrata-api-1011165921260.us-central1.run.app/api/octo /bookings/{uuid}copy 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 Authorizations BearerAuthchevron-down BearerAuth HTTPRequired Path parameters uuidstringRequired The UUID of the booking Header parameters Octo-CapabilitiesstringRequired A list of the Capabilities (their IDs) initialized with your request. Accept-LanguagestringOptional 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. Body application/jsonchevron-down application/json resellerReferencestringOptional Your reference for this booking. Also known as a Voucher Number. Example: `VOUCHER-0123` productIdstringOptional The product ID. Example: `6b903d44-dc24-4ca4-ae71-6bde6c4f4854` optionIdstringOptional The option id. Example: `DEFAULT` availabilityIdstringOptional The availability ID for the selected timeslot. Example: `2022-05-23T00:00:00+01:00` expirationMinutesintegerOptional How many minutes to reserve the availability, otherwise defaults to the supplier default amount. Example: `15` notesstringOptional Optional notes for the booking. Example: `Optional notes` emailReceiptbooleanOptional Whether you want OCTO Cloud to email the guest a copy of their receipt and tickets. (defaults to false). Example: `true` unitItemsobject\[\]Optional 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"}]` Show propertiesplus contactall ofOptional 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"}` Show propertiesplus Responses chevron-right 200 The request has succeeded. application/json Headersobject Show Headersplus Responseobject Show propertiesplus chevron-right 400 The server could not understand the request due to invalid syntax. application/json patch /bookings/{uuid} HTTPchevron-down HTTPcURLJavaScriptPython Copy PATCH /api/octo/bookings/{uuid} HTTP/1.1 Host: localhost:8080 Authorization: Bearer YOUR_SECRET_TOKEN Octo-Capabilities: text Content-Type: application/json Accept: */* Content-Length: 520 { "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" } } Test it 200 The request has succeeded. chevron-down Copy { "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": "2022-05-25T11:04:22Z", "utcRedeemedAt": "2022-06-25T10:34:22Z", "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": { "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": { "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": null\ }\ ], "pricing": { "original": 2000, "retail": 2000, "net": 1600, "currency": "EUR", "currencyPrecision": 2, "includedTaxes": [] } } [PreviousAvailabilitychevron-left](https://docs.octo.travel/octo-api-core/availability) [NextPricingchevron-right](https://docs.octo.travel/capabilities-optional/pricing) Last updated 3 months ago ---