openapi: 3.2.0 info: title: Viator Reservation System Reservation system APIs API x-logo: url: resources/img/sapi/Viator_Logo_RGB_Green.png altText: Viator href: https://www.viator.com contact: name: API Integrations Support email: supplierAPI@viator.com version: '' description: "\n\n# Introduction\nThese API specifications detail the technical requirements for integrating operator reservation systems with Viator. This guide is intended for developers and technical teams to ensure a standardized implementation and reliable data exchange.\n\n# Prerequisites\nAccess is restricted to operators registered with Viator and their authorized reservation system providers. Integration workflows may only proceed following technical evaluation and formal approval by Viator.\n\nFurthermore, development **may only commence** if Viator registered operators are using the reservation system. For operator onboarding details, please refer to the [supplier sign-up page](https://supplier.viator.com/sign-up-info).\n\n# Getting Started\nReview the following core components to begin your implementation:\n\n- [What’s new](#tag/What's-new)\n- [Connectivity overview](#tag/Connectivity-overview)\n- [API overview](#tag/API-overview)\n- [Implementation approach](#tag/Implementation-approach)\n- [Frequently asked questions](#tag/FAQs)\n\nAdherence to these specifications is crucial for successful integration, guaranteeing optimal performance, data integrity, and a superior user experience for both operators and Viator customers. \n\nIf at any point you need clarification or help, please don’t hesitate to [contact us here](#tag/Contact-us).\n" servers: - url: https://your-reservation-system.example.com description: Placeholder for the reservation system's own server — replace with your actual domain. Viator calls this host for all operations except event and special offer notifications, which are sent by the reservation system to Viator instead (see below). tags: - name: Reservation system APIs description: "This section describes all the possible services, some of which are mandatory, that reservation systems can develop to integrate with Viator. \n\nAll API requests made by Viator to the reservation system are specified. The reservation system will respond to Viator requests in a synchronous manner, responding as per specification. Both request and response formats are described in detail in subsequent sections of this document.\n\n### Authentication\n\nThese endpoints support two authentication mechanisms: the legacy body-embedded `ApiKey` field, which is always required in the request payload for v1 APIs, or the `X-Api-Key` header used by the v2 APIs. The header option was added so existing partners could migrate to header-based authentication without changing endpoints.\n\n### BookingCutoff and Capacity elements\n\nThe [Availability response](#tag/Reservation-system-APIs/operation/availability) includes two elements used to determine whether a booking can proceed:\n\n- **`BookingCutoff`** communicates the point in time after which a tour option may no longer be purchased. Exactly one of its three child elements must be provided: `DateTime` (a timezone-qualified timestamp), `ProductDateTime` (a timestamp in the product's own local time, with no timezone offset), or `NotApplicable` (a boolean, `true` if no cut-off exists for the product option).\n- **`Capacity`** communicates the remaining places available for Viator to book. Its `Simple` child element holds `Remaining` (the number of places left) and `ConsumedBy` (the age bands — `ADULT`, `CHILD`, `INFANT`, `YOUTH`, `SENIOR` — that draw down on those places), which lets specific age bands (e.g. infants) be excluded from consuming capacity.\n\nBoth elements are part of the [Availability response schema](#tag/Reservation-system-APIs/operation/availability) — see that operation for the full field definitions." paths: /v2/availability/check: post: summary: Availability Check operationId: availabilityCheck x-codeSamples: - lang: curl label: cURL source: "curl -X POST \"https://your-reservation-system.example.com/v2/availability/check\" \\\n -H \"X-Api-Key: \" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"supplierId\": 123,\n \"productOptions\": [\n {\n \"productOptionId\": \"r1172330\",\n \"startTimes\": [\n \"09:00\"\n ]\n }\n ],\n \"travelDate\": \"2025-04-29\",\n \"tickets\": [\n {\n \"type\": \"ADULT\",\n \"quantity\": 2\n }\n ],\n \"totalTravelers\": 2\n}'\n" - lang: JavaScript label: Node.js source: "const response = await fetch(\"https://your-reservation-system.example.com/v2/availability/check\", {\n method: \"POST\",\n headers: {\n \"X-Api-Key\": \"\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n \"supplierId\": 123,\n \"productOptions\": [\n {\n \"productOptionId\": \"r1172330\",\n \"startTimes\": [\n \"09:00\"\n ]\n }\n ],\n \"travelDate\": \"2025-04-29\",\n \"tickets\": [\n {\n \"type\": \"ADULT\",\n \"quantity\": 2\n }\n ],\n \"totalTravelers\": 2\n})\n});\nconst data = await response.json();\nconsole.log(data);\n" - lang: Python label: Python source: "import json\nimport requests\n\npayload = json.loads('''{\n \"supplierId\": 123,\n \"productOptions\": [\n {\n \"productOptionId\": \"r1172330\",\n \"startTimes\": [\n \"09:00\"\n ]\n }\n ],\n \"travelDate\": \"2025-04-29\",\n \"tickets\": [\n {\n \"type\": \"ADULT\",\n \"quantity\": 2\n }\n ],\n \"totalTravelers\": 2\n}''')\n\nresponse = requests.post(\n \"https://your-reservation-system.example.com/v2/availability/check\",\n headers={\n \"X-Api-Key\": \"\",\n \"Content-Type\": \"application/json\",\n },\n json=payload,\n)\nprint(response.json())\n" - lang: PHP label: PHP source: "\",\n \"Content-Type: application/json\",\n]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, $payload);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n$response = curl_exec($ch);\ncurl_close($ch);\necho $response;\n" tags: - Reservation system APIs description: 'The Availability check endpoint enables Viator to retrieve capacity and pricing information of one or more items for a specific date and one or more ticket types (adult, child, etc). This endpoint is used by Viator when customers have chosen a specific product or a specific item for which capacity and pricing is required to determine the ability for the customers to proceed with the purchase. The Availability check endpoint supersedes the existing V1.0 [Real-time availability API](#tag/Deprecated/operation/availability). ' security: - ApiKeyHeader: [] x-badges: - name: New color: '#00876A' position: after requestBody: content: application/json: schema: $ref: '#/components/schemas/AvailabilityCheckRequest' examples: availabilityCheckRequest: $ref: '#/components/examples/availabilityCheckRequest' responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/AvailabilityCheckResponse' examples: availabilityCheckResponseWithAvailabilities: $ref: '#/components/examples/availabilityCheckResponseWithAvailabilities' availabilityCheckResponseWithUnlimitedCapacity: $ref: '#/components/examples/availabilityCheckResponseWithUnlimitedCapacity' availabilityCheckResponseWithoutAvailabilities: $ref: '#/components/examples/availabilityCheckResponseWithoutAvailabilities' availabilityCheckResponseWithPerUnitPrice: $ref: '#/components/examples/availabilityCheckResponseWithPerUnitPrice' availabilityCheckResponseWithUnsupportedPrice: $ref: '#/components/examples/availabilityCheckResponseWithUnsupportedPrice' '400': description: Bad Request '401': description: Unauthorized '408': description: Request Timeout '422': description: Unprocessable Content content: application/json: schema: $ref: '#/components/schemas/ContentErrorResponse' examples: error422: $ref: '#/components/examples/error422' '429': description: Too Many Requests '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/InternalErrorResponse' examples: error500: $ref: '#/components/examples/error500' '503': description: Service Unavailable /v2/availability/calendar: post: summary: Calendar operationId: calendar x-codeSamples: - lang: curl label: cURL source: "curl -X POST \"https://your-reservation-system.example.com/v2/availability/calendar\" \\\n -H \"X-Api-Key: \" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"supplierId\": 1004,\n \"productOptionIds\": [\n \"r1172330\"\n ],\n \"startDate\": \"2026-01-21\",\n \"endDate\": \"2026-01-25\"\n}'\n" - lang: JavaScript label: Node.js source: "const response = await fetch(\"https://your-reservation-system.example.com/v2/availability/calendar\", {\n method: \"POST\",\n headers: {\n \"X-Api-Key\": \"\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n \"supplierId\": 1004,\n \"productOptionIds\": [\n \"r1172330\"\n ],\n \"startDate\": \"2026-01-21\",\n \"endDate\": \"2026-01-25\"\n})\n});\nconst data = await response.json();\nconsole.log(data);\n" - lang: Python label: Python source: "import json\nimport requests\n\npayload = json.loads('''{\n \"supplierId\": 1004,\n \"productOptionIds\": [\n \"r1172330\"\n ],\n \"startDate\": \"2026-01-21\",\n \"endDate\": \"2026-01-25\"\n}''')\n\nresponse = requests.post(\n \"https://your-reservation-system.example.com/v2/availability/calendar\",\n headers={\n \"X-Api-Key\": \"\",\n \"Content-Type\": \"application/json\",\n },\n json=payload,\n)\nprint(response.json())\n" - lang: PHP label: PHP source: "\",\n \"Content-Type: application/json\",\n]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, $payload);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n$response = curl_exec($ch);\ncurl_close($ch);\necho $response;\n" tags: - Reservation system APIs description: 'The Calendar endpoint enables Viator to retrieve capacity and pricing information of one or more items for a date range across all ticket types (adult, child, unit, etc). This endpoint is used by Viator to populate availability in the calendars and to create the pricing structure required to accurately price products. The Calendar endpoint supersedes both the existing V1.0 [Batch Availability availability API](#tag/Deprecated/operation/batchAvailability) and [Batch Pricing API](#tag/Deprecated/operation/batchPricing). ' security: - ApiKeyHeader: [] x-badges: - name: New position: after color: '#00876A' requestBody: content: application/json: schema: $ref: '#/components/schemas/CalendarRequest' examples: calendarRequest: $ref: '#/components/examples/CalendarRequest' responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/CalendarResponse' examples: availableSimple: $ref: '#/components/examples/CalendarResponseAvailableSimple' availableTiered: $ref: '#/components/examples/CalendarResponseAvailableTiered' unitSimple: $ref: '#/components/examples/CalendarResponseUnitSimple' availableUnsupportedPrice: $ref: '#/components/examples/CalendarResponseUnsupportedPrice' availableOpeningHours: $ref: '#/components/examples/CalendarResponseAvailableOpeningHours' unavailable: $ref: '#/components/examples/CalendarResponseUnavailable' unavailablePastCutoff: $ref: '#/components/examples/CalendarResponseUnavailablePastCutoff' noEvents: $ref: '#/components/examples/CalendarResponseNoEvents' '400': description: Bad Request '401': description: Unauthorized '408': description: Request Timeout '422': description: Unprocessable Content content: application/json: schema: $ref: '#/components/schemas/ContentErrorResponse' examples: error422: $ref: '#/components/examples/error422' '429': description: Too Many Requests '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/InternalErrorResponse' examples: error500: $ref: '#/components/examples/error500' '503': description: Service Unavailable /v2/reserve: post: summary: Reserve operationId: reserve x-codeSamples: - lang: curl label: cURL source: "curl -X POST \"https://your-reservation-system.example.com/v2/reserve\" \\\n -H \"X-Api-Key: \" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"supplierId\": 1004,\n \"productOptionId\": \"r1172330\",\n \"startTime\": \"15:30\",\n \"travelDate\": \"2026-01-21\",\n \"tickets\": [\n {\n \"type\": \"ADULT\",\n \"quantity\": 2\n },\n {\n \"type\": \"CHILD\",\n \"quantity\": 1\n }\n ],\n \"totalTravelers\": 3\n}'\n" - lang: JavaScript label: Node.js source: "const response = await fetch(\"https://your-reservation-system.example.com/v2/reserve\", {\n method: \"POST\",\n headers: {\n \"X-Api-Key\": \"\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n \"supplierId\": 1004,\n \"productOptionId\": \"r1172330\",\n \"startTime\": \"15:30\",\n \"travelDate\": \"2026-01-21\",\n \"tickets\": [\n {\n \"type\": \"ADULT\",\n \"quantity\": 2\n },\n {\n \"type\": \"CHILD\",\n \"quantity\": 1\n }\n ],\n \"totalTravelers\": 3\n})\n});\nconst data = await response.json();\nconsole.log(data);\n" - lang: Python label: Python source: "import json\nimport requests\n\npayload = json.loads('''{\n \"supplierId\": 1004,\n \"productOptionId\": \"r1172330\",\n \"startTime\": \"15:30\",\n \"travelDate\": \"2026-01-21\",\n \"tickets\": [\n {\n \"type\": \"ADULT\",\n \"quantity\": 2\n },\n {\n \"type\": \"CHILD\",\n \"quantity\": 1\n }\n ],\n \"totalTravelers\": 3\n}''')\n\nresponse = requests.post(\n \"https://your-reservation-system.example.com/v2/reserve\",\n headers={\n \"X-Api-Key\": \"\",\n \"Content-Type\": \"application/json\",\n },\n json=payload,\n)\nprint(response.json())\n" - lang: PHP label: PHP source: "\",\n \"Content-Type: application/json\",\n]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, $payload);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n$response = curl_exec($ch);\ncurl_close($ch);\necho $response;\n" tags: - Reservation system APIs description: 'The Reserve endpoint enables Viator to request the reservation system to reserve (hold) the inventory and price an item for a specific date and one or more ticketTypes (adult, child, etc). This endpoint is used by Viator when customers have the intention to make a purchase. The reservation is made to allow time for the customer to complete the payment details. The reservation request expects inventory and pricing to be held for a **minimum of 15 minutes** from the time the request is made. The Reserve endpoint replaces the V1.0 [Real-time availability API](#tag/Deprecated/operation/availability) where the inventory reservation was requested previously. ' security: - ApiKeyHeader: [] x-badges: - name: New color: '#00876A' position: after requestBody: content: application/json: schema: $ref: '#/components/schemas/ReserveRequest' examples: reserveRequest: $ref: '#/components/examples/reserveRequest' responses: '200': description: Success content: application/json: schema: oneOf: - $ref: '#/components/schemas/ReservedResponse' - $ref: '#/components/schemas/NotReservedResponse' discriminator: propertyName: status mapping: RESERVED: '#/components/schemas/ReservedResponse' NOT_RESERVED: '#/components/schemas/NotReservedResponse' examples: reservedResponseWithPerPersonPrice: $ref: '#/components/examples/reservedResponseWithPerPersonPrice' reservedResponseWithPerUnitPrice: $ref: '#/components/examples/reservedResponseWithPerUnitPrice' reservedResponseWithUnsupportedPrice: $ref: '#/components/examples/reservedResponseWithUnsupportedPrice' notReservedResponse: $ref: '#/components/examples/notReservedResponse' '400': description: Bad Request '401': description: Unauthorized '408': description: Request Timeout '422': description: Unprocessable Content content: application/json: schema: $ref: '#/components/schemas/ReserveUnprocessableContentResponse' examples: error422: $ref: '#/components/examples/error422' '429': description: Too Many Requests '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/InternalErrorResponse' examples: error500: $ref: '#/components/examples/error500' '503': description: Service Unavailable /v2/product/special-offers: post: x-badges: - name: New color: '#00876A' position: after summary: Special Offers operationId: specialOffers x-codeSamples: - lang: curl label: cURL source: "curl -X POST \"https://your-reservation-system.example.com/v2/product/special-offers\" \\\n -H \"X-Api-Key: \" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"supplierId\": 3456,\n \"specialOfferIds\": [\n \"A Unique id\",\n \"A-unique-id-2\"\n ]\n}'\n" - lang: JavaScript label: Node.js source: "const response = await fetch(\"https://your-reservation-system.example.com/v2/product/special-offers\", {\n method: \"POST\",\n headers: {\n \"X-Api-Key\": \"\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n \"supplierId\": 3456,\n \"specialOfferIds\": [\n \"A Unique id\",\n \"A-unique-id-2\"\n ]\n})\n});\nconst data = await response.json();\nconsole.log(data);\n" - lang: Python label: Python source: "import json\nimport requests\n\npayload = json.loads('''{\n \"supplierId\": 3456,\n \"specialOfferIds\": [\n \"A Unique id\",\n \"A-unique-id-2\"\n ]\n}''')\n\nresponse = requests.post(\n \"https://your-reservation-system.example.com/v2/product/special-offers\",\n headers={\n \"X-Api-Key\": \"\",\n \"Content-Type\": \"application/json\",\n },\n json=payload,\n)\nprint(response.json())\n" - lang: PHP label: PHP source: "\",\n \"Content-Type: application/json\",\n]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, $payload);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n$response = curl_exec($ch);\ncurl_close($ch);\necho $response;\n" description: 'The Special Offers endpoint enables Viator to retrieve special offer metadata. The endpoint is used to retrieve information required to create and display special offer merchandising signals on discounted events returned by the [Calendar](#tag/Reservation-system-APIs/operation/calendar) or [Availability check](#tag/Reservation-system-APIs/operation/availabilityCheck) endpoints. A special offer merchandising signal does not change the RRP (Recommended Retail Price). It instead defines the criteria of when the merchandising signal is displayed. Special offer merchandising signals are surfaced to customers only if the special offer is in accordance with Viator''s policy. Additional details are available [here](https://help.supplier.viator.com/en/articles/177). ' security: - ApiKeyHeader: [] tags: - Reservation system APIs requestBody: content: application/json: schema: $ref: '#/components/schemas/SpecialOffersRequest' examples: specialOffersRequest: $ref: '#/components/examples/SpecialOffersRequest' responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/SpecialOffersResponse' examples: specialOffersResponse: $ref: '#/components/examples/SpecialOffersResponse' '400': description: Bad Request '401': description: Unauthorized '408': description: Request Timeout '422': description: Unprocessable Content content: application/json: schema: $ref: '#/components/schemas/ContentErrorResponse' examples: error422: $ref: '#/components/examples/error422' '429': description: Too Many Requests '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/InternalErrorResponse' examples: error500: $ref: '#/components/examples/error500' '503': description: Service Unavailable /tourlist: post: x-badges: - name: Update color: '#00876A' position: after summary: Tour list operationId: tourList x-codeSamples: - lang: curl label: cURL source: "curl -X POST \"https://your-reservation-system.example.com/tourlist\" \\\n -H \"X-Api-Key: \" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"requestType\": \"TourListRequest\",\n \"data\": {\n \"ApiKey\": \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\n \"ResellerId\": \"1000\",\n \"SupplierId\": 1004,\n \"ExternalReference\": \"10051374722994001\",\n \"Timestamp\": \"2013-12-10T13:30:54.616+10:00\"\n }\n}'\n" - lang: JavaScript label: Node.js source: "const response = await fetch(\"https://your-reservation-system.example.com/tourlist\", {\n method: \"POST\",\n headers: {\n \"X-Api-Key\": \"\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n \"requestType\": \"TourListRequest\",\n \"data\": {\n \"ApiKey\": \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\n \"ResellerId\": \"1000\",\n \"SupplierId\": 1004,\n \"ExternalReference\": \"10051374722994001\",\n \"Timestamp\": \"2013-12-10T13:30:54.616+10:00\"\n }\n})\n});\nconst data = await response.json();\nconsole.log(data);\n" - lang: Python label: Python source: "import json\nimport requests\n\npayload = json.loads('''{\n \"requestType\": \"TourListRequest\",\n \"data\": {\n \"ApiKey\": \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\n \"ResellerId\": \"1000\",\n \"SupplierId\": 1004,\n \"ExternalReference\": \"10051374722994001\",\n \"Timestamp\": \"2013-12-10T13:30:54.616+10:00\"\n }\n}''')\n\nresponse = requests.post(\n \"https://your-reservation-system.example.com/tourlist\",\n headers={\n \"X-Api-Key\": \"\",\n \"Content-Type\": \"application/json\",\n },\n json=payload,\n)\nprint(response.json())\n" - lang: PHP label: PHP source: "\",\n \"Content-Type: application/json\",\n]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, $payload);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n$response = curl_exec($ch);\ncurl_close($ch);\necho $response;\n" tags: - Reservation system APIs description: The Tour list API (v1.0) enables reservation systems to provide a list of available products (and product options). The Tour list response includes descriptive fields and identifiers that facilitate mapping between Viator products and the operator's reservation system products. security: - ApiKeyHeader: [] - {} requestBody: content: application/json: schema: allOf: - type: object properties: requestType: type: string description: '`TourListRequest`' - type: object properties: data: $ref: '#/components/schemas/TourListRequest' required: - requestType - data examples: tourListRequest: $ref: '#/components/examples/tourListRequestJson' application/xml: schema: allOf: - type: object properties: TourListRequest: $ref: '#/components/schemas/TourListRequest' required: - TourListRequest examples: tourListRequest: $ref: '#/components/examples/tourListRequestXml' responses: '200': description: Success content: application/json: schema: allOf: - type: object properties: responseType: type: string description: '`TourListResponse`' - type: object properties: data: $ref: '#/components/schemas/TourListResponse' required: - responseType - data examples: tourListResponse: $ref: '#/components/examples/tourListResponseJson' tourListResponseWithProductOptionId(v2): $ref: '#/components/examples/tourListResponseWithProductOptionIdJson' error: $ref: '#/components/examples/tourListResponseErrorJson' application/xml: schema: allOf: - type: object properties: TourListResponse: $ref: '#/components/schemas/TourListResponse' required: - TourListResponse examples: tourListResponse: $ref: '#/components/examples/tourListResponseXml' tourListResponseWithProductOptionId(v2): $ref: '#/components/examples/tourListResponseWithProductOptionIdXml' error: $ref: '#/components/examples/tourListResponseErrorXml' /booking: post: summary: Booking operationId: booking x-codeSamples: - lang: curl label: cURL source: "curl -X POST \"https://your-reservation-system.example.com/booking\" \\\n -H \"X-Api-Key: \" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"requestType\": \"BookingRequest\",\n \"data\": {\n \"ApiKey\": \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\n \"ResellerId\": \"1000\",\n \"SupplierId\": 1004,\n \"ExternalReference\": \"10051374722992645\",\n \"Timestamp\": \"2013-07-25T13:30:52.616+10:00\",\n \"BookingReference\": \"999999999\",\n \"TravelDate\": \"2014-10-31\",\n \"SupplierProductCode\": \"BLUE\",\n \"Location\": \"Sydney, Australia\",\n \"TourOptions\": {\n \"SupplierOptionCode\": \"BASIC\",\n \"SupplierOptionName\": \"Basic Shared Accommodation\",\n \"TourDepartureTime\": \"09:00:00\",\n \"Option\": [\n {\n \"Name\": \"Room\",\n \"Value\": \"dualocc\"\n }\n ]\n },\n \"Inclusions\": {\n \"Inclusion\": [\n \"Bottle of Champagne\",\n \"Hotel Pickup\"\n ]\n },\n \"CurrencyCode\": \"AUD\",\n \"Amount\": 550.0,\n \"Traveller\": [\n {\n \"TravellerIdentifier\": \"1\",\n \"GivenName\": \"Turonga\",\n \"Surname\": \"Leela\",\n \"AgeBand\": \"Adult\",\n \"LeadTraveller\": true\n },\n {\n \"TravellerIdentifier\": \"2\",\n \"GivenName\": \"Tamy\",\n \"Surname\": \"Leela\",\n \"AgeBand\": \"Child\",\n \"LeadTraveller\": false\n }\n ],\n \"TravellerMix\": {\n \"Adult\": \"1\",\n \"Child\": \"1\",\n \"Youth\": \"0\",\n \"Infant\": \"0\",\n \"Senior\": \"0\",\n \"Total\": \"2\"\n },\n \"RequiredInfo\": {\n \"Question\": [\n {\n \"QuestionText\": \"Passport No.\",\n \"QuestionAnswer\": \"L99999\"\n },\n {\n \"QuestionText\": \"Weight\",\n \"QuestionAnswer\": \"50 Kg\"\n }\n ]\n },\n \"SpecialRequirement\": \"Vegetarian Meal\",\n \"PickupPoint\": \"Hilton Sydney\",\n \"ContactDetail\": {\n \"ContactType\": \"ALTERNATE\",\n \"ContactName\": \"Turonga Leela\",\n \"ContactValue\": \"US+1 999999999\"\n },\n \"ContactEmail\": \"MSG-8b17fa92-7b35-4fdb-9f18-f8a69252e019+BR-999999999@expmessaging.tripadvisor.com\",\n \"AvailabilityHoldReference\": \"1K883383K2S12K883383K2S57K883383K2\"\n }\n}'\n" - lang: JavaScript label: Node.js source: "const response = await fetch(\"https://your-reservation-system.example.com/booking\", {\n method: \"POST\",\n headers: {\n \"X-Api-Key\": \"\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n \"requestType\": \"BookingRequest\",\n \"data\": {\n \"ApiKey\": \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\n \"ResellerId\": \"1000\",\n \"SupplierId\": 1004,\n \"ExternalReference\": \"10051374722992645\",\n \"Timestamp\": \"2013-07-25T13:30:52.616+10:00\",\n \"BookingReference\": \"999999999\",\n \"TravelDate\": \"2014-10-31\",\n \"SupplierProductCode\": \"BLUE\",\n \"Location\": \"Sydney, Australia\",\n \"TourOptions\": {\n \"SupplierOptionCode\": \"BASIC\",\n \"SupplierOptionName\": \"Basic Shared Accommodation\",\n \"TourDepartureTime\": \"09:00:00\",\n \"Option\": [\n {\n \"Name\": \"Room\",\n \"Value\": \"dualocc\"\n }\n ]\n },\n \"Inclusions\": {\n \"Inclusion\": [\n \"Bottle of Champagne\",\n \"Hotel Pickup\"\n ]\n },\n \"CurrencyCode\": \"AUD\",\n \"Amount\": 550.0,\n \"Traveller\": [\n {\n \"TravellerIdentifier\": \"1\",\n \"GivenName\": \"Turonga\",\n \"Surname\": \"Leela\",\n \"AgeBand\": \"Adult\",\n \"LeadTraveller\": true\n },\n {\n \"TravellerIdentifier\": \"2\",\n \"GivenName\": \"Tamy\",\n \"Surname\": \"Leela\",\n \"AgeBand\": \"Child\",\n \"LeadTraveller\": false\n }\n ],\n \"TravellerMix\": {\n \"Adult\": \"1\",\n \"Child\": \"1\",\n \"Youth\": \"0\",\n \"Infant\": \"0\",\n \"Senior\": \"0\",\n \"Total\": \"2\"\n },\n \"RequiredInfo\": {\n \"Question\": [\n {\n \"QuestionText\": \"Passport No.\",\n \"QuestionAnswer\": \"L99999\"\n },\n {\n \"QuestionText\": \"Weight\",\n \"QuestionAnswer\": \"50 Kg\"\n }\n ]\n },\n \"SpecialRequirement\": \"Vegetarian Meal\",\n \"PickupPoint\": \"Hilton Sydney\",\n \"ContactDetail\": {\n \"ContactType\": \"ALTERNATE\",\n \"ContactName\": \"Turonga Leela\",\n \"ContactValue\": \"US+1 999999999\"\n },\n \"ContactEmail\": \"MSG-8b17fa92-7b35-4fdb-9f18-f8a69252e019+BR-999999999@expmessaging.tripadvisor.com\",\n \"AvailabilityHoldReference\": \"1K883383K2S12K883383K2S57K883383K2\"\n }\n})\n});\nconst data = await response.json();\nconsole.log(data);\n" - lang: Python label: Python source: "import json\nimport requests\n\npayload = json.loads('''{\n \"requestType\": \"BookingRequest\",\n \"data\": {\n \"ApiKey\": \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\n \"ResellerId\": \"1000\",\n \"SupplierId\": 1004,\n \"ExternalReference\": \"10051374722992645\",\n \"Timestamp\": \"2013-07-25T13:30:52.616+10:00\",\n \"BookingReference\": \"999999999\",\n \"TravelDate\": \"2014-10-31\",\n \"SupplierProductCode\": \"BLUE\",\n \"Location\": \"Sydney, Australia\",\n \"TourOptions\": {\n \"SupplierOptionCode\": \"BASIC\",\n \"SupplierOptionName\": \"Basic Shared Accommodation\",\n \"TourDepartureTime\": \"09:00:00\",\n \"Option\": [\n {\n \"Name\": \"Room\",\n \"Value\": \"dualocc\"\n }\n ]\n },\n \"Inclusions\": {\n \"Inclusion\": [\n \"Bottle of Champagne\",\n \"Hotel Pickup\"\n ]\n },\n \"CurrencyCode\": \"AUD\",\n \"Amount\": 550.0,\n \"Traveller\": [\n {\n \"TravellerIdentifier\": \"1\",\n \"GivenName\": \"Turonga\",\n \"Surname\": \"Leela\",\n \"AgeBand\": \"Adult\",\n \"LeadTraveller\": true\n },\n {\n \"TravellerIdentifier\": \"2\",\n \"GivenName\": \"Tamy\",\n \"Surname\": \"Leela\",\n \"AgeBand\": \"Child\",\n \"LeadTraveller\": false\n }\n ],\n \"TravellerMix\": {\n \"Adult\": \"1\",\n \"Child\": \"1\",\n \"Youth\": \"0\",\n \"Infant\": \"0\",\n \"Senior\": \"0\",\n \"Total\": \"2\"\n },\n \"RequiredInfo\": {\n \"Question\": [\n {\n \"QuestionText\": \"Passport No.\",\n \"QuestionAnswer\": \"L99999\"\n },\n {\n \"QuestionText\": \"Weight\",\n \"QuestionAnswer\": \"50 Kg\"\n }\n ]\n },\n \"SpecialRequirement\": \"Vegetarian Meal\",\n \"PickupPoint\": \"Hilton Sydney\",\n \"ContactDetail\": {\n \"ContactType\": \"ALTERNATE\",\n \"ContactName\": \"Turonga Leela\",\n \"ContactValue\": \"US+1 999999999\"\n },\n \"ContactEmail\": \"MSG-8b17fa92-7b35-4fdb-9f18-f8a69252e019+BR-999999999@expmessaging.tripadvisor.com\",\n \"AvailabilityHoldReference\": \"1K883383K2S12K883383K2S57K883383K2\"\n }\n}''')\n\nresponse = requests.post(\n \"https://your-reservation-system.example.com/booking\",\n headers={\n \"X-Api-Key\": \"\",\n \"Content-Type\": \"application/json\",\n },\n json=payload,\n)\nprint(response.json())\n" - lang: PHP label: PHP source: "\",\n \"Content-Type: application/json\",\n]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, $payload);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n$response = curl_exec($ch);\ncurl_close($ch);\necho $response;\n" tags: - Reservation system APIs description: 'The Booking API (v1.0) enables reservation systems to receive Booking requests from Viator systems in real time. A successful request will create the booking in the reservation system and return a success message to Viator systems which will confirm the booking directly to the customer. Each API request is always for a single booking. Booking requests are sent in all cases unless Viator has successfully received an unavailable status. See [Availability and pricing](#tag/Connectivity-overview/Availability-and-Pricing) for more details. ' security: - ApiKeyHeader: [] - {} requestBody: content: application/json: schema: allOf: - type: object properties: requestType: type: string description: '`BookingRequest`' - type: object properties: data: $ref: '#/components/schemas/BookingRequest' required: - requestType - data examples: bookingRequest: $ref: '#/components/examples/bookingRequestJson' application/xml: schema: allOf: - type: object properties: BookingRequest: $ref: '#/components/schemas/BookingRequest' required: - BookingRequest examples: bookingRequest: $ref: '#/components/examples/bookingRequestXml' responses: '200': description: Success content: application/json: schema: allOf: - type: object properties: responseType: type: string description: '`BookingResponse`' - type: object properties: data: $ref: '#/components/schemas/BookingResponse' required: - responseType - data examples: bookingWithBarcode: $ref: '#/components/examples/bookingWithBarcodeResponseJson' bookingWithoutBarcode: $ref: '#/components/examples/bookingWithoutBarcodeResponseJson' error: $ref: '#/components/examples/bookingResponseErrorJson' application/xml: schema: allOf: - type: object properties: BookingResponse: $ref: '#/components/schemas/BookingResponse' required: - BookingResponse examples: bookingWithBarcode: $ref: '#/components/examples/bookingWithBarcodeResponseXml' bookingWithoutBarcode: $ref: '#/components/examples/bookingWithoutBarcodeResponseXml' error: $ref: '#/components/examples/bookingResponseErrorXml' /booking-amendment: post: summary: Booking Amendment operationId: bookingAmendment x-codeSamples: - lang: curl label: cURL source: "curl -X POST \"https://your-reservation-system.example.com/booking-amendment\" \\\n -H \"X-Api-Key: \" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"requestType\": \"BookingAmendmentRequest\",\n \"data\": {\n \"ApiKey\": \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\n \"ResellerId\": \"1000\",\n \"SupplierId\": 1004,\n \"ExternalReference\": \"10051374722992700\",\n \"Timestamp\": \"2013-07-26T13:30:52.616+10:00\",\n \"BookingReference\": \"999999999\",\n \"TravelDate\": \"2014-12-10\",\n \"SupplierProductCode\": \"BLUE\",\n \"Location\": \"Sydney, Australia\",\n \"TourOptions\": {\n \"SupplierOptionCode\": \"BASIC\",\n \"SupplierOptionName\": \"Basic Shared Accommodation\",\n \"TourDepartureTime\": \"09:00:00\",\n \"Option\": [\n {\n \"Name\": \"Room\",\n \"Value\": \"dualocc\"\n }\n ]\n },\n \"Inclusions\": {\n \"Inclusion\": [\n \"Bottle of Champagne\",\n \"Hotel Pickup\"\n ]\n },\n \"CurrencyCode\": \"AUD\",\n \"Amount\": 225.0,\n \"Traveller\": [\n {\n \"TravellerIdentifier\": \"1\",\n \"GivenName\": \"Turonga\",\n \"Surname\": \"Leela\",\n \"AgeBand\": \"Adult\",\n \"LeadTraveller\": true\n }\n ],\n \"TravellerMix\": {\n \"Adult\": \"1\",\n \"Child\": \"0\",\n \"Youth\": \"0\",\n \"Infant\": \"0\",\n \"Senior\": \"0\",\n \"Total\": \"1\"\n },\n \"RequiredInfo\": {\n \"Question\": [\n {\n \"QuestionText\": \"Passport No.\",\n \"QuestionAnswer\": \"L99999\"\n }\n ]\n },\n \"SpecialRequirement\": \"Vegetarian Meal\",\n \"PickupPoint\": \"Hilton Sydney\",\n \"SupplierNote\": \"Change to number of travellers. Customer reimbursed.\",\n \"AdditionalRemarks\": {\n \"Remark\": [\n \"Additional charges for large luggage may apply. To be advised at pickup.\"\n ]\n },\n \"ContactDetail\": {\n \"ContactType\": \"MOBILE\",\n \"ContactName\": \"Turonga Leela\",\n \"ContactValue\": \"US+1 999999999\"\n },\n \"SupplierConfirmationNumber\": \"CN123456\"\n }\n}'\n" - lang: JavaScript label: Node.js source: "const response = await fetch(\"https://your-reservation-system.example.com/booking-amendment\", {\n method: \"POST\",\n headers: {\n \"X-Api-Key\": \"\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n \"requestType\": \"BookingAmendmentRequest\",\n \"data\": {\n \"ApiKey\": \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\n \"ResellerId\": \"1000\",\n \"SupplierId\": 1004,\n \"ExternalReference\": \"10051374722992700\",\n \"Timestamp\": \"2013-07-26T13:30:52.616+10:00\",\n \"BookingReference\": \"999999999\",\n \"TravelDate\": \"2014-12-10\",\n \"SupplierProductCode\": \"BLUE\",\n \"Location\": \"Sydney, Australia\",\n \"TourOptions\": {\n \"SupplierOptionCode\": \"BASIC\",\n \"SupplierOptionName\": \"Basic Shared Accommodation\",\n \"TourDepartureTime\": \"09:00:00\",\n \"Option\": [\n {\n \"Name\": \"Room\",\n \"Value\": \"dualocc\"\n }\n ]\n },\n \"Inclusions\": {\n \"Inclusion\": [\n \"Bottle of Champagne\",\n \"Hotel Pickup\"\n ]\n },\n \"CurrencyCode\": \"AUD\",\n \"Amount\": 225.0,\n \"Traveller\": [\n {\n \"TravellerIdentifier\": \"1\",\n \"GivenName\": \"Turonga\",\n \"Surname\": \"Leela\",\n \"AgeBand\": \"Adult\",\n \"LeadTraveller\": true\n }\n ],\n \"TravellerMix\": {\n \"Adult\": \"1\",\n \"Child\": \"0\",\n \"Youth\": \"0\",\n \"Infant\": \"0\",\n \"Senior\": \"0\",\n \"Total\": \"1\"\n },\n \"RequiredInfo\": {\n \"Question\": [\n {\n \"QuestionText\": \"Passport No.\",\n \"QuestionAnswer\": \"L99999\"\n }\n ]\n },\n \"SpecialRequirement\": \"Vegetarian Meal\",\n \"PickupPoint\": \"Hilton Sydney\",\n \"SupplierNote\": \"Change to number of travellers. Customer reimbursed.\",\n \"AdditionalRemarks\": {\n \"Remark\": [\n \"Additional charges for large luggage may apply. To be advised at pickup.\"\n ]\n },\n \"ContactDetail\": {\n \"ContactType\": \"MOBILE\",\n \"ContactName\": \"Turonga Leela\",\n \"ContactValue\": \"US+1 999999999\"\n },\n \"SupplierConfirmationNumber\": \"CN123456\"\n }\n})\n});\nconst data = await response.json();\nconsole.log(data);\n" - lang: Python label: Python source: "import json\nimport requests\n\npayload = json.loads('''{\n \"requestType\": \"BookingAmendmentRequest\",\n \"data\": {\n \"ApiKey\": \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\n \"ResellerId\": \"1000\",\n \"SupplierId\": 1004,\n \"ExternalReference\": \"10051374722992700\",\n \"Timestamp\": \"2013-07-26T13:30:52.616+10:00\",\n \"BookingReference\": \"999999999\",\n \"TravelDate\": \"2014-12-10\",\n \"SupplierProductCode\": \"BLUE\",\n \"Location\": \"Sydney, Australia\",\n \"TourOptions\": {\n \"SupplierOptionCode\": \"BASIC\",\n \"SupplierOptionName\": \"Basic Shared Accommodation\",\n \"TourDepartureTime\": \"09:00:00\",\n \"Option\": [\n {\n \"Name\": \"Room\",\n \"Value\": \"dualocc\"\n }\n ]\n },\n \"Inclusions\": {\n \"Inclusion\": [\n \"Bottle of Champagne\",\n \"Hotel Pickup\"\n ]\n },\n \"CurrencyCode\": \"AUD\",\n \"Amount\": 225.0,\n \"Traveller\": [\n {\n \"TravellerIdentifier\": \"1\",\n \"GivenName\": \"Turonga\",\n \"Surname\": \"Leela\",\n \"AgeBand\": \"Adult\",\n \"LeadTraveller\": true\n }\n ],\n \"TravellerMix\": {\n \"Adult\": \"1\",\n \"Child\": \"0\",\n \"Youth\": \"0\",\n \"Infant\": \"0\",\n \"Senior\": \"0\",\n \"Total\": \"1\"\n },\n \"RequiredInfo\": {\n \"Question\": [\n {\n \"QuestionText\": \"Passport No.\",\n \"QuestionAnswer\": \"L99999\"\n }\n ]\n },\n \"SpecialRequirement\": \"Vegetarian Meal\",\n \"PickupPoint\": \"Hilton Sydney\",\n \"SupplierNote\": \"Change to number of travellers. Customer reimbursed.\",\n \"AdditionalRemarks\": {\n \"Remark\": [\n \"Additional charges for large luggage may apply. To be advised at pickup.\"\n ]\n },\n \"ContactDetail\": {\n \"ContactType\": \"MOBILE\",\n \"ContactName\": \"Turonga Leela\",\n \"ContactValue\": \"US+1 999999999\"\n },\n \"SupplierConfirmationNumber\": \"CN123456\"\n }\n}''')\n\nresponse = requests.post(\n \"https://your-reservation-system.example.com/booking-amendment\",\n headers={\n \"X-Api-Key\": \"\",\n \"Content-Type\": \"application/json\",\n },\n json=payload,\n)\nprint(response.json())\n" - lang: PHP label: PHP source: "\",\n \"Content-Type: application/json\",\n]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, $payload);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n$response = curl_exec($ch);\ncurl_close($ch);\necho $response;\n" tags: - Reservation system APIs description: 'The Booking Amendment API (v1.0) enables reservation systems to, in real time, receive from Viator amendments to previously confirmed bookings. A successful request will amend an existing confirmed booking in the reservation system. Each API request is always for the amendment of a single booking. ' security: - ApiKeyHeader: [] - {} requestBody: content: application/json: schema: allOf: - type: object properties: requestType: type: string description: '`BookingAmendmentRequest`' - type: object properties: data: $ref: '#/components/schemas/BookingAmendmentRequest' required: - requestType - data examples: bookingAmendment: $ref: '#/components/examples/bookingAmendmentRequestJson' application/xml: schema: allOf: - type: object properties: BookingAmendmentRequest: $ref: '#/components/schemas/BookingAmendmentRequest' required: - BookingAmendmentRequest examples: bookingAmendment: $ref: '#/components/examples/bookingAmendmentRequestXml' responses: '200': description: Success content: application/json: schema: allOf: - type: object properties: responseType: type: string description: '`BookingAmendmentResponse`' - type: object properties: data: $ref: '#/components/schemas/BookingAmendmentResponse' required: - responseType - data examples: bookingAmendment: $ref: '#/components/examples/bookingAmendmentResponseJson' error: $ref: '#/components/examples/bookingAmendmentResponseErrorJson' application/xml: schema: allOf: - type: object properties: BookingAmendmentResponse: $ref: '#/components/schemas/BookingAmendmentResponse' required: - BookingAmendmentResponse examples: bookingAmendment: $ref: '#/components/examples/bookingAmendmentResponseXml' error: $ref: '#/components/examples/bookingAmendmentResponseErrorXml' /booking-cancellation: post: summary: Booking Cancellation operationId: bookingCancellation x-codeSamples: - lang: curl label: cURL source: "curl -X POST \"https://your-reservation-system.example.com/booking-cancellation\" \\\n -H \"X-Api-Key: \" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"requestType\": \"BookingCancellationRequest\",\n \"data\": {\n \"ApiKey\": \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\n \"ResellerId\": \"1000\",\n \"SupplierId\": 1004,\n \"ExternalReference\": \"10051374722992850\",\n \"Timestamp\": \"2013-12-01T13:30:53.616+10:00\",\n \"BookingReference\": \"999999999\",\n \"SupplierConfirmationNumber\": \"CN123456\",\n \"CancelDate\": \"2013-12-01\",\n \"Author\": \"Customer Service\",\n \"Reason\": \"No longer traveling\",\n \"SupplierNote\": \"Refunded Customer\"\n }\n}'\n" - lang: JavaScript label: Node.js source: "const response = await fetch(\"https://your-reservation-system.example.com/booking-cancellation\", {\n method: \"POST\",\n headers: {\n \"X-Api-Key\": \"\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n \"requestType\": \"BookingCancellationRequest\",\n \"data\": {\n \"ApiKey\": \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\n \"ResellerId\": \"1000\",\n \"SupplierId\": 1004,\n \"ExternalReference\": \"10051374722992850\",\n \"Timestamp\": \"2013-12-01T13:30:53.616+10:00\",\n \"BookingReference\": \"999999999\",\n \"SupplierConfirmationNumber\": \"CN123456\",\n \"CancelDate\": \"2013-12-01\",\n \"Author\": \"Customer Service\",\n \"Reason\": \"No longer traveling\",\n \"SupplierNote\": \"Refunded Customer\"\n }\n})\n});\nconst data = await response.json();\nconsole.log(data);\n" - lang: Python label: Python source: "import json\nimport requests\n\npayload = json.loads('''{\n \"requestType\": \"BookingCancellationRequest\",\n \"data\": {\n \"ApiKey\": \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\n \"ResellerId\": \"1000\",\n \"SupplierId\": 1004,\n \"ExternalReference\": \"10051374722992850\",\n \"Timestamp\": \"2013-12-01T13:30:53.616+10:00\",\n \"BookingReference\": \"999999999\",\n \"SupplierConfirmationNumber\": \"CN123456\",\n \"CancelDate\": \"2013-12-01\",\n \"Author\": \"Customer Service\",\n \"Reason\": \"No longer traveling\",\n \"SupplierNote\": \"Refunded Customer\"\n }\n}''')\n\nresponse = requests.post(\n \"https://your-reservation-system.example.com/booking-cancellation\",\n headers={\n \"X-Api-Key\": \"\",\n \"Content-Type\": \"application/json\",\n },\n json=payload,\n)\nprint(response.json())\n" - lang: PHP label: PHP source: "\",\n \"Content-Type: application/json\",\n]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, $payload);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n$response = curl_exec($ch);\ncurl_close($ch);\necho $response;\n" tags: - Reservation system APIs description: 'The Booking Cancellation API (v1.0) is used by Viator to cancel a previously confirmed booking. The API cancellation does not include details regarding refunds; it focuses purely on the cancellation of the booking. ' security: - ApiKeyHeader: [] - {} requestBody: content: application/json: schema: allOf: - type: object properties: requestType: type: string description: '`BookingCancellationRequest`' - type: object properties: data: $ref: '#/components/schemas/BookingCancellationRequest' required: - requestType - data examples: bookingCancellation: $ref: '#/components/examples/bookingCancellationRequestJson' application/xml: schema: allOf: - type: object properties: BookingCancellationRequest: $ref: '#/components/schemas/BookingCancellationRequest' required: - BookingCancellationRequest examples: bookingCancellation: $ref: '#/components/examples/bookingCancellationRequestXml' responses: '200': description: Success content: application/json: schema: allOf: - type: object properties: responseType: type: string description: '`BookingCancellationResponse`' - type: object properties: data: $ref: '#/components/schemas/BookingCancellationResponse' required: - responseType - data examples: bookingCancellation: $ref: '#/components/examples/bookingCancellationResponseJson' error: $ref: '#/components/examples/bookingCancellationResponseErrorJson' application/xml: schema: allOf: - type: object properties: BookingCancellationResponse: $ref: '#/components/schemas/BookingCancellationResponse' required: - BookingCancellationResponse examples: bookingCancellation: $ref: '#/components/examples/bookingCancellationResponseXml' error: $ref: '#/components/examples/bookingCancellationResponseErrorXml' /redemption: post: summary: Redemption operationId: redemption x-codeSamples: - lang: curl label: cURL source: "curl -X POST \"https://your-reservation-system.example.com/redemption\" \\\n -H \"X-Api-Key: \" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"requestType\": \"RedemptionRequest\",\n \"data\": {\n \"ApiKey\": \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\n \"ResellerId\": \"1000\",\n \"SupplierId\": 1004,\n \"ExternalReference\": \"10051374722992645\",\n \"Timestamp\": \"2024-07-25T13:30:52.616+10:00\",\n \"BookingReference\": \"999999999\",\n \"SupplierConfirmationNumber\": \"123\",\n \"TravelDate\": \"2025-01-31\"\n }\n}'\n" - lang: JavaScript label: Node.js source: "const response = await fetch(\"https://your-reservation-system.example.com/redemption\", {\n method: \"POST\",\n headers: {\n \"X-Api-Key\": \"\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n \"requestType\": \"RedemptionRequest\",\n \"data\": {\n \"ApiKey\": \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\n \"ResellerId\": \"1000\",\n \"SupplierId\": 1004,\n \"ExternalReference\": \"10051374722992645\",\n \"Timestamp\": \"2024-07-25T13:30:52.616+10:00\",\n \"BookingReference\": \"999999999\",\n \"SupplierConfirmationNumber\": \"123\",\n \"TravelDate\": \"2025-01-31\"\n }\n})\n});\nconst data = await response.json();\nconsole.log(data);\n" - lang: Python label: Python source: "import json\nimport requests\n\npayload = json.loads('''{\n \"requestType\": \"RedemptionRequest\",\n \"data\": {\n \"ApiKey\": \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\n \"ResellerId\": \"1000\",\n \"SupplierId\": 1004,\n \"ExternalReference\": \"10051374722992645\",\n \"Timestamp\": \"2024-07-25T13:30:52.616+10:00\",\n \"BookingReference\": \"999999999\",\n \"SupplierConfirmationNumber\": \"123\",\n \"TravelDate\": \"2025-01-31\"\n }\n}''')\n\nresponse = requests.post(\n \"https://your-reservation-system.example.com/redemption\",\n headers={\n \"X-Api-Key\": \"\",\n \"Content-Type\": \"application/json\",\n },\n json=payload,\n)\nprint(response.json())\n" - lang: PHP label: PHP source: "\",\n \"Content-Type: application/json\",\n]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, $payload);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n$response = curl_exec($ch);\ncurl_close($ch);\necho $response;\n" tags: - Reservation system APIs description: "**Note**: If you are interested in supporting this API, please inform your API account manager before starting development. Viator must assess whether the reservation system is able to support the redemption model.\n\nThe Redemption API (v1.0) enables Viator to identify ticket redemption status at both booking and traveller levels. \n\nThe information returned allows Viator to determine if booking cancellations/refunds should be permitted.\n" security: - ApiKeyHeader: [] - {} requestBody: content: application/json: schema: allOf: - type: object properties: requestType: type: string description: '`RedemptionRequest`' - type: object properties: data: $ref: '#/components/schemas/RedemptionRequest' required: - requestType - data examples: redemptionRequest: $ref: '#/components/examples/redemptionRequestJson' application/xml: schema: allOf: - type: object properties: RedemptionRequest: $ref: '#/components/schemas/RedemptionRequest' required: - RedemptionRequest examples: redemptionRequest: $ref: '#/components/examples/redemptionRequestXml' responses: '200': description: Success content: application/json: schema: allOf: - type: object properties: responseType: type: string description: '`RedemptionResponse`' - type: object properties: data: $ref: '#/components/schemas/RedemptionResponse' required: - responseType - data examples: redemptionResponseWithTravellerInformation: $ref: '#/components/examples/redemptionResponseWithTravellerInformationJson' redemptionResponseWithoutTravellerInformation: $ref: '#/components/examples/redemptionResponseWithoutTravellerInformationJson' error: $ref: '#/components/examples/redemptionResponseErrorJson' application/xml: schema: allOf: - type: object properties: RedemptionResponse: $ref: '#/components/schemas/RedemptionResponse' required: - RedemptionResponse examples: redemptionResponseWithTravellerInformation: $ref: '#/components/examples/redemptionResponseWithTravellerInformationXml' redemptionResponseWithoutTravellerInformation: $ref: '#/components/examples/redemptionResponseWithoutTravellerInformationXml' error: $ref: '#/components/examples/redemptionResponseErrorXml' components: examples: bookingRequestJson: value: requestType: BookingRequest data: ApiKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ResellerId: '1000' SupplierId: 1004 ExternalReference: '10051374722992645' Timestamp: '2013-07-25T13:30:52.616+10:00' BookingReference: '999999999' TravelDate: '2014-10-31' SupplierProductCode: BLUE Location: Sydney, Australia TourOptions: SupplierOptionCode: BASIC SupplierOptionName: Basic Shared Accommodation TourDepartureTime: 09:00:00 Option: - Name: Room Value: dualocc Inclusions: Inclusion: - Bottle of Champagne - Hotel Pickup CurrencyCode: AUD Amount: 550 Traveller: - TravellerIdentifier: '1' GivenName: Turonga Surname: Leela AgeBand: Adult LeadTraveller: true - TravellerIdentifier: '2' GivenName: Tamy Surname: Leela AgeBand: Child LeadTraveller: false TravellerMix: Adult: 1 Child: 1 Youth: 0 Infant: 0 Senior: 0 Total: 2 RequiredInfo: Question: - QuestionText: Passport No. QuestionAnswer: L99999 - QuestionText: Weight QuestionAnswer: 50 Kg SpecialRequirement: Vegetarian Meal PickupPoint: Hilton Sydney ContactDetail: ContactType: ALTERNATE ContactName: Turonga Leela ContactValue: US+1 999999999 ContactEmail: MSG-8b17fa92-7b35-4fdb-9f18-f8a69252e019+BR-999999999@expmessaging.tripadvisor.com AvailabilityHoldReference: 1K883383K2S12K883383K2S57K883383K2 CalendarResponseAvailableTiered: summary: Event with Tiered Per-person price value: productOptions: - productOptionId: r1172330 currency: USD dates: - travelDate: '2026-01-21' events: - status: AVAILABLE startTime: '11:00' capacity: type: LIMITED vacancies: - types: - ADULT - CHILD quantity: 12 quantityType: SHARED original: 12 remaining: 12 bookingCutoff: '2026-01-20T18:00:00Z' price: type: TIERED_PER_PERSON_PRICE prices: - types: - ADULT - CHILD tiers: - min: 1 max: 6 retailPrice: 150 netPrice: 120 discount: originalRetailPrice: 200 specialOfferId: '123' - min: 7 max: 12 retailPrice: 125 netPrice: 60 discount: originalRetailPrice: 150 specialOfferId: '123' availabilityCheckResponseWithoutAvailabilities: summary: Availability check response for Sold Out event value: productOptions: - productOptionId: r1172330 currency: USD events: - status: UNAVAILABLE startTime: '17:15' unavailableReason: SOLD_OUT capacity: type: LIMITED vacancies: - types: - ADULT - CHILD quantity: 0 quantityType: PER_TYPE original: 200 remaining: 0 bookingCutoff: '2099-12-31T23:59:59.000Z' bookingWithBarcodeResponseJson: summary: Booking with traveller barcodes value: responseType: BookingResponse data: ApiKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ResellerId: '1000' SupplierId: 1004 ExternalReference: '10051374722992645' Timestamp: '2013-07-25T13:30:53.616+10:00' RequestStatus: Status: SUCCESS BookingReference: '999999999' SupplierCommentCustomer: Customer is advised that space for large luggage will cost and additional AUD20.00 Traveller: - TravellerIdentifier: '1' TravellerSupplierConfirmationNumber: '' TravellerSeat: '' TravellerBarcode: '9990009990009999000' - TravellerIdentifier: '2' TravellerSupplierConfirmationNumber: '' TravellerSeat: '' TravellerBarcode: '9990009990009999001' TransactionStatus: Status: CONFIRMED SupplierConfirmationNumber: CN123456 bookingResponseErrorXml: summary: Booking request error value: "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10051374722992645\n 2013-07-25T13:30:53.616+10:00\n \n ERROR\n \n TGDS0013\n The specified SupplierProductCode is not recognized.\n No product exists with SupplierProductCode 'BLUE' for SupplierId 1004.\n \n \n\n" tourListResponseXml: value: "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10051374722994001\n 2013-12-10T13:30:54.616+10:00\n \n SUCCESS\n \n \n BLUE\n Blue Mountains Adventure\n AU\n SYD\n Sydney\n Blue Mountains Adventure Tour\n \n BASIC\n Basic Shared Accommodation\n 09:00:00\n \n \n \n DELUXE\n Deluxe Shared Accommodation\n 09:00:00\n \n \n \n TWOROOMS\n Separate Rooms Accommodation\n 09:00:00\n \n \n \n DELUXE_HOTEL\n Deluxe Shared Accommodation w Hotel Pickup\n 09:00:00\n \n \n \n \n \n ROCKSHIST\n Rocks Historical Walking Tour\n AU\n SYD\n Sydney\n Rocks Historical Walking Tour\n \n \n 3 hour historical tour\n 09:00:00\n \n \n \n \n \n 3 hour historical tour in German\n 09:00:00\n \n \n \n \n \n 3 hour historical tour with lunch in German\n 09:00:00\n \n \n \n \n\n" notReservedResponse: summary: Not Reserved response value: status: NOT_RESERVED reason: SOLD_OUT tourListResponseWithProductOptionIdJson: value: responseType: TourListResponse data: ApiKey: '******' ResellerId: '1000' SupplierId: 99999 ExternalReference: '******' Timestamp: '******' RequestStatus: Status: SUCCESS Tour: - SupplierProductCode: '161616' SupplierProductName: Test product CountryCode: PT DestinationCode: Lisbon DestinationName: Lisbon TourDescription: Its all about testing TourOption: - SupplierOptionCode: '161616' SupplierOptionName: First option productOptionId: optionId1 TourDepartureTime: '12:00:00' Option: - Name: lang Value: eng - Name: Has_Pickup Value: Y - SupplierOptionCode: '181818' SupplierOptionName: Second option productOptionId: optionId2 TourDepartureTime: '13:00:00' Option: - Name: lang Value: eng - Name: Has_Pickup Value: n - SupplierOptionCode: '171717' SupplierOptionName: Third option productOptionId: '4558672' TourDepartureTime: '23:00:00' Option: - Name: lang Value: deu - Name: Has_Pickup Value: n redemptionRequestJson: value: requestType: RedemptionRequest data: ApiKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ResellerId: '1000' SupplierId: 1004 ExternalReference: '10051374722992645' Timestamp: '2024-07-25T13:30:52.616+10:00' BookingReference: '999999999' SupplierConfirmationNumber: '123' TravelDate: '2025-01-31' SpecialOffersResponse: value: specialOffers: - specialOfferId: A Unique id name: Valentine's Day type: STANDARD validFrom: '2025-02-14T00:00:00Z' validUntil: '2025-02-14T23:59:59Z' - specialOfferId: A-unique-id-2 name: Christmas Day type: STANDARD validFrom: '2025-12-24T00:00:00Z' CalendarResponseUnsupportedPrice: summary: Event with Unsupported price value: productOptions: - productOptionId: r1172330 currency: USD dates: - travelDate: '2026-01-21' events: - status: AVAILABLE startTime: '11:00' capacity: type: LIMITED vacancies: - types: - ADULT - CHILD quantity: 12 quantityType: SHARED original: 12 remaining: 12 bookingCutoff: '2026-01-20T18:00:00Z' price: type: UNSUPPORTED_PRICE reason: Pricing model is not supported redemptionResponseWithTravellerInformationXml: summary: Redemption with traveller information value: "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10051374722992617\n 2019-06-26T20:40:55.375Z\n \n SUCCESS\n \n true\n \n 1\n OFD52644\n \n \n 2\n OFD52645\n \n\n" SpecialOffersRequest: value: supplierId: 3456 specialOfferIds: - A Unique id - A-unique-id-2 bookingAmendmentRequestXml: value: "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10051374722992700\n 2013-07-26T13:30:52.616+10:00\n 999999999\n 2014-12-10\n BLUE\n Sydney, Australia\n \n BASIC\n Basic Shared Accommodation\n 09:00:00\n \n \n \n Bottle of Champagne\n Hotel Pickup\n \n AUD\n 225.00\n \n 1\n Turonga\n Leela\n Adult\n true\n \n \n 1\n 0\n 0\n 0\n 0\n 1\n \n \n \n Passport No.\n L99999\n \n \n Vegetarian Meal\n Hilton Sydney\n Change to number of travellers. Customer reimbursed.\n \n Additional charges for large luggage may apply. To be advised at pickup.\n \n \n MOBILE\n Turonga Leela\n US+1 999999999\n \n CN123456\n\n" bookingCancellationResponseErrorJson: summary: Booking cancellation request error value: responseType: BookingCancellationResponse data: ApiKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ResellerId: '1000' SupplierId: 1004 ExternalReference: '10051374722992850' Timestamp: '2013-12-01T13:30:54.616+10:00' RequestStatus: Status: ERROR Error: ErrorCode: TGDS0026 ErrorMessage: The specified BookingReference could not be found. ErrorDetails: No booking exists with BookingReference '999999999' for SupplierId 1004. tourListRequestXml: value: "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10051374722994001\n 2013-12-10T13:30:54.616+10:00\n\n" CalendarRequest: value: supplierId: 1004 productOptionIds: - r1172330 startDate: '2026-01-21' endDate: '2026-01-25' error422: summary: Unprocessable Content error value: error: INVALID_SUPPLIER message: Invalid supplier ID bookingAmendmentResponseJson: value: responseType: BookingAmendmentResponse data: ApiKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ResellerId: '1000' SupplierId: 1004 ExternalReference: '10051374722992700' Timestamp: '2013-07-26T13:30:53.616+10:00' RequestStatus: Status: SUCCESS BookingReference: '999999999' SupplierCommentCustomer: '' TourBarcode: '' Traveller: - TravellerIdentifier: '1' TravellerSupplierConfirmationNumber: '' TravellerSeat: '' TravellerBarcode: '9990009990009999000' TransactionStatus: Status: CONFIRMED SupplierConfirmationNumber: CN123456 bookingAmendmentResponseXml: value: "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10051374722992700\n 2013-07-26T13:30:53.616+10:00\n \n SUCCESS\n \n 999999999\n \n \n \n 1\n \n \n 9990009990009999000\n \n \n CONFIRMED\n \n CN123456\n\n" tourListRequestJson: value: requestType: TourListRequest data: ApiKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ResellerId: '1000' SupplierId: 1004 ExternalReference: '10051374722994001' Timestamp: '2013-12-10T13:30:54.616+10:00' tourListResponseJson: value: responseType: TourListResponse data: ApiKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ResellerId: '1000' SupplierId: 1004 ExternalReference: '10051374722994001' Timestamp: '2013-12-10T13:30:54.616+10:00' RequestStatus: Status: SUCCESS Tour: - SupplierProductCode: BLUE SupplierProductName: Blue Mountains Adventure CountryCode: AU DestinationCode: SYD DestinationName: Sydney TourDescription: Blue Mountains Adventure Tour TourOption: - SupplierOptionCode: BASIC SupplierOptionName: Basic Shared Accommodation TourDepartureTime: 09:00:00 Option: - Name: Room Value: dualocc - SupplierOptionCode: DELUXE SupplierOptionName: Deluxe Shared Accommodation TourDepartureTime: 09:00:00 Option: - Name: Room Value: dualocc - SupplierOptionCode: TWOROOMS SupplierOptionName: Separate Rooms Accommodation TourDepartureTime: 09:00:00 Option: - Name: Room Value: singleocc - SupplierOptionCode: DELUXE_HOTEL SupplierOptionName: Deluxe Shared Accommodation w Hotel Pickup TourDepartureTime: 09:00:00 Option: - Name: Room Value: dualocc - Name: Pickup Value: Y - SupplierProductCode: ROCKSHIST SupplierProductName: Rocks Historical Walking Tour CountryCode: AU DestinationCode: SYD DestinationName: Sydney TourDescription: Rocks Historical Walking Tour TourOption: - SupplierOptionCode: '' SupplierOptionName: 3 hour historical tour TourDepartureTime: 09:00:00 Option: - Name: lang Value: en - Name: lunch Value: 'no' - SupplierOptionCode: '' SupplierOptionName: 3 hour historical tour in German TourDepartureTime: 09:00:00 Option: - Name: lang Value: de - Name: lunch Value: 'no' - SupplierOptionCode: '' SupplierOptionName: 3 hour historical tour with lunch in German TourDepartureTime: 09:00:00 Option: - Name: lang Value: de - Name: lunch Value: 'yes' CalendarResponseUnavailable: summary: Unavailable Sold Out Event value: productOptions: - productOptionId: r1172330 currency: USD dates: - travelDate: '2026-01-21' events: - status: UNAVAILABLE startTime: '15:30' unavailableReason: SOLD_OUT capacity: type: LIMITED vacancies: - types: - ADULT quantity: 0 quantityType: PER_TYPE original: 10 remaining: 0 bookingCutoff: '2026-01-20T18:00:00Z' price: type: PER_PERSON_PRICE prices: - types: - ADULT retailPrice: 100 netPrice: 80 bookingRequestXml: value: "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10051374722992645\n 2013-07-25T13:30:52.616+10:00\n 999999999\n 2014-10-31\n BLUE\n Sydney, Australia\n \n BASIC\n Basic Shared Accommodation\n 09:00:00\n \n \n \n Bottle of Champagne\n Hotel Pickup\n \n AUD\n 550.00\n \n 1\n Turonga\n Leela\n Adult\n true\n \n \n 2\n Tamy\n Leela\n Child\n false\n \n \n 1\n 1\n 0\n 0\n 0\n 2\n \n \n \n Passport No.\n L99999\n \n \n Weight\n 50 Kg\n \n \n Vegetarian Meal\n Hilton Sydney\n \n ALTERNATE\n Turonga Leela\n US+1 999999999\n \n MSG-8b17fa92-7b35-4fdb-9f18-f8a69252e019+BR-999999999@expmessaging.tripadvisor.com\n 1K883383K2S12K883383K2S57K883383K2\n\n" CalendarResponseUnavailablePastCutoff: summary: Unavailable Event due to Booking Cutoff value: productOptions: - productOptionId: r1172330 currency: USD dates: - travelDate: '2026-01-23' events: - status: UNAVAILABLE startTime: '10:00' unavailableReason: PAST_BOOKING_CUTOFF openingHours: coordinateStartTimes: false hours: - from: 08:00 to: '16:00' capacity: type: UNLIMITED bookingCutoff: '2020-01-20T18:00:00Z' price: type: PER_PERSON_PRICE prices: - types: - ADULT retailPrice: 90 netPrice: 70 bookingWithoutBarcodeResponseJson: summary: Booking without traveller barcodes value: responseType: BookingResponse data: ApiKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ResellerId: '1000' SupplierId: 1004 ExternalReference: '10051374722992645' Timestamp: '2013-07-25T13:30:53.616+10:00' RequestStatus: Status: SUCCESS BookingReference: '999999999' SupplierCommentCustomer: Customer is advised that space for large luggage will cost and additional AUD20.00 Traveller: - TravellerIdentifier: '1' TravellerSupplierConfirmationNumber: '' TravellerSeat: '' - TravellerIdentifier: '2' TravellerSupplierConfirmationNumber: '' TravellerSeat: '' TransactionStatus: Status: CONFIRMED SupplierConfirmationNumber: CN123456 TourTicket: MimeType: application/pdf Url: http://example.org/9990009990009999000/ticket.pdf bookingAmendmentResponseErrorXml: summary: Booking amendment request error value: "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10051374722992700\n 2013-07-26T13:30:53.616+10:00\n \n ERROR\n \n TGDS0026\n The specified BookingReference could not be found.\n No booking exists with BookingReference '999999999' for SupplierId 1004.\n \n \n\n" bookingAmendmentRequestJson: value: requestType: BookingAmendmentRequest data: ApiKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ResellerId: '1000' SupplierId: 1004 ExternalReference: '10051374722992700' Timestamp: '2013-07-26T13:30:52.616+10:00' BookingReference: '999999999' TravelDate: '2014-12-10' SupplierProductCode: BLUE Location: Sydney, Australia TourOptions: SupplierOptionCode: BASIC SupplierOptionName: Basic Shared Accommodation TourDepartureTime: 09:00:00 Option: - Name: Room Value: dualocc Inclusions: Inclusion: - Bottle of Champagne - Hotel Pickup CurrencyCode: AUD Amount: 225 Traveller: - TravellerIdentifier: '1' GivenName: Turonga Surname: Leela AgeBand: Adult LeadTraveller: true TravellerMix: Adult: 1 Child: 0 Youth: 0 Infant: 0 Senior: 0 Total: 1 RequiredInfo: Question: - QuestionText: Passport No. QuestionAnswer: L99999 SpecialRequirement: Vegetarian Meal PickupPoint: Hilton Sydney SupplierNote: Change to number of travellers. Customer reimbursed. AdditionalRemarks: Remark: - Additional charges for large luggage may apply. To be advised at pickup. ContactDetail: ContactType: MOBILE ContactName: Turonga Leela ContactValue: US+1 999999999 SupplierConfirmationNumber: CN123456 bookingCancellationResponseJson: value: responseType: BookingCancellationResponse data: ApiKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ResellerId: '1000' SupplierId: 1004 ExternalReference: '10051374722992850' Timestamp: '2013-12-01T13:30:54.616+10:00' RequestStatus: Status: SUCCESS BookingReference: '999999999' SupplierConfirmationNumber: CN123456 SupplierCancellationNumber: CANCEL78910 TransactionStatus: Status: CONFIRMED CalendarResponseAvailableSimple: summary: Limited capacity Event with Per-person price value: productOptions: - productOptionId: r1172330 currency: USD dates: - travelDate: '2026-01-21' events: - status: AVAILABLE startTime: 09:00 capacity: type: LIMITED vacancies: - types: - ADULT quantity: 10 quantityType: PER_TYPE original: 10 remaining: 10 bookingCutoff: '2026-01-20T18:00:00Z' price: type: PER_PERSON_PRICE prices: - types: - ADULT retailPrice: 100 netPrice: 80 tourListResponseErrorJson: summary: Tour list request error value: responseType: TourListResponse data: ApiKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ResellerId: '1000' SupplierId: 1004 ExternalReference: '10051374722994001' Timestamp: '2013-12-10T13:30:54.616+10:00' RequestStatus: Status: ERROR Error: ErrorCode: TGDS0011 ErrorMessage: The requested supplier is not valid. ErrorDetails: No supplier exists with SupplierId 1004. availabilityCheckResponseWithUnlimitedCapacity: summary: Availability check response for Unlimited capacity value: productOptions: - productOptionId: UNLIM1 currency: EUR events: - status: AVAILABLE startTime: '12:00' capacity: type: UNLIMITED bookingCutoff: '2099-12-31T23:59:59.000Z' price: type: PER_PERSON_PRICE prices: - types: - ADULT - CHILD retailPrice: 80 netPrice: 65 availabilityCheckResponseWithPerUnitPrice: summary: Availability check response for Unit Price value: productOptions: - productOptionId: UNIT1 currency: USD events: - status: AVAILABLE startTime: '15:00' capacity: type: LIMITED vacancies: - types: - UNIT quantity: 50 quantityType: PER_TYPE original: 100 remaining: 50 bookingCutoff: '2025-12-31T23:59:59.000Z' price: type: PER_UNIT_PRICE retailPrice: 300 netPrice: 250 maxTravelers: 5 redemptionResponseWithoutTravellerInformationJson: summary: Redemption without traveller information value: responseType: RedemptionResponse data: ApiKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ResellerId: '1000' SupplierId: 1004 ExternalReference: '10051374722992645' Timestamp: '2024-07-25T13:30:52.616+10:00' RequestStatus: Status: SUCCESS RedemptionStatus: true redemptionResponseErrorXml: summary: Redemption request error value: "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10051374722992617\n 2019-06-26T20:40:55.375Z\n \n ERROR\n \n TGDS0026\n The specified BookingReference could not be found.\n No booking exists with BookingReference '999999999' for SupplierId 1004.\n \n \n\n" redemptionRequestXml: value: "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10051374722992617\n 2019-06-26T20:40:55.375Z\n 999999999\n 2014-10-31\n CN123456\n\n" bookingWithoutBarcodeResponseXml: summary: Booking without traveller barcodes value: "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10051374722992645\n 2013-07-25T13:30:53.616+10:00\n \n SUCCESS\n \n 999999999\n Customer is advised that space for large luggage will cost and additional AUD20.00\n \n \n 1\n \n \n \n \n 2\n \n \n \n \n CONFIRMED\n \n CN123456\n \n application/pdf\n http://example.org/9990009990009999000/ticket.pdf\n \n\n" redemptionResponseWithTravellerInformationJson: summary: Redemption with traveller information value: responseType: RedemptionResponse data: ApiKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ResellerId: '1000' SupplierId: 1004 ExternalReference: '10051374722992645' Timestamp: '2024-07-25T13:30:52.616+10:00' RequestStatus: Status: SUCCESS RedemptionStatus: true Traveller: - TravellerIdentifier: '1' TravellerSupplierConfirmationNumber: '1231' RedemptionStatus: true RedemptionDateTime: '2024-07-25T13:30:52.616+10:00' - TravellerIdentifier: '2' TravellerSupplierConfirmationNumber: '12312' RedemptionStatus: false CalendarResponseNoEvents: summary: No Events exist for the requested Product Option value: productOptions: - productOptionId: r1172330 currency: USD dates: - travelDate: '2026-01-22' events: [] CalendarResponseAvailableOpeningHours: summary: Unlimited capacity Event with flexible Opening Hours value: productOptions: - productOptionId: r1172330 currency: USD dates: - travelDate: '2026-01-21' events: - status: AVAILABLE openingHours: coordinateStartTimes: false hours: - from: 08:00 to: '16:00' capacity: type: UNLIMITED bookingCutoff: '2026-01-20T18:00:00Z' price: type: PER_PERSON_PRICE prices: - types: - ADULT retailPrice: 90 netPrice: 70 tourListResponseErrorXml: summary: Tour list request error value: "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10051374722994001\n 2013-12-10T13:30:54.616+10:00\n \n ERROR\n \n TGDS0011\n The requested supplier is not valid.\n No supplier exists with SupplierId 1004.\n \n \n \n" availabilityCheckResponseWithAvailabilities: summary: Availability check response with Available capacity value: productOptions: - productOptionId: TG7 currency: EUR events: - status: AVAILABLE startTime: '10:00' capacity: type: LIMITED vacancies: - types: - ADULT - CHILD quantity: 100 quantityType: SHARED original: 200 remaining: 100 bookingCutoff: '2099-12-31T23:59:59.000Z' price: type: PER_PERSON_PRICE prices: - types: - ADULT - CHILD retailPrice: 90 netPrice: 75 discount: originalRetailPrice: 100 specialOfferId: SPRING2025 redemptionResponseWithoutTravellerInformationXml: summary: Redemption without traveller information value: "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10051374722992617\n 2019-06-26T20:40:55.375Z\n \n SUCCESS\n \n true\n\n" availabilityCheckRequest: value: supplierId: 123 productOptions: - productOptionId: r1172330 startTimes: - 09:00 travelDate: '2025-04-29' tickets: - type: ADULT quantity: 2 totalTravelers: 2 bookingWithBarcodeResponseXml: summary: Booking with traveller barcodes value: "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10051374722992645\n 2013-07-25T13:30:53.616+10:00\n \n SUCCESS\n \n 999999999\n Customer is advised that space for large luggage will cost and additional AUD20.00\n \n \n 1\n \n \n 9990009990009999000\n \n \n 2\n \n \n 9990009990009999001\n \n \n CONFIRMED\n \n CN123456\n\n" bookingAmendmentResponseErrorJson: summary: Booking amendment request error value: responseType: BookingAmendmentResponse data: ApiKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ResellerId: '1000' SupplierId: 1004 ExternalReference: '10051374722992700' Timestamp: '2013-07-26T13:30:53.616+10:00' RequestStatus: Status: ERROR Error: ErrorCode: TGDS0026 ErrorMessage: The specified BookingReference could not be found. ErrorDetails: No booking exists with BookingReference '999999999' for SupplierId 1004. reservedResponseWithPerPersonPrice: summary: Reserved response for Per-person Price value: status: RESERVED expiration: '2026-01-21T12:00:00Z' reference: RES-9876543210 currency: USD price: type: PER_PERSON_PRICE prices: - types: - ADULT - CHILD retailPrice: 100 netPrice: 80 discount: originalRetailPrice: 120 specialOfferId: SO123 - types: - CHILD retailPrice: 60 netPrice: 50 bookingCancellationResponseErrorXml: summary: Booking cancellation request error value: "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10051374722992850\n 2013-12-01T13:30:54.616+10:00\n \n ERROR\n \n TGDS0026\n The specified BookingReference could not be found.\n No booking exists with BookingReference '999999999' for SupplierId 1004.\n \n \n\n" bookingCancellationRequestJson: value: requestType: BookingCancellationRequest data: ApiKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ResellerId: '1000' SupplierId: 1004 ExternalReference: '10051374722992850' Timestamp: '2013-12-01T13:30:53.616+10:00' BookingReference: '999999999' SupplierConfirmationNumber: CN123456 CancelDate: '2013-12-01' Author: Customer Service Reason: No longer traveling SupplierNote: Refunded Customer redemptionResponseErrorJson: summary: Redemption request error value: responseType: RedemptionResponse data: ApiKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ResellerId: '1000' SupplierId: 1004 ExternalReference: '10051374722992645' Timestamp: '2024-07-25T13:30:52.616+10:00' RequestStatus: Status: ERROR Error: ErrorCode: TGDS0026 ErrorMessage: The specified BookingReference could not be found. ErrorDetails: No booking exists with BookingReference '999999999' for SupplierId 1004. reservedResponseWithPerUnitPrice: summary: Reserved response for Unit price value: status: RESERVED expiration: '2026-01-21T12:00:00Z' reference: RES-9876543210 currency: USD price: type: PER_UNIT_PRICE retailPrice: 300 netPrice: 250 maxTravelers: 5 CalendarResponseUnitSimple: summary: Limited capacity Event with UNIT price value: productOptions: - productOptionId: r47702 currency: EUR dates: - travelDate: '2026-01-12' events: - startTime: '12:00' bookingCutoff: '2026-01-12T11:59:59.000Z' capacity: type: LIMITED vacancies: - types: - UNIT quantity: 2 quantityType: SHARED original: 2 remaining: 2 status: AVAILABLE price: type: PER_UNIT_PRICE maxTravelers: 5 netPrice: 90 retailPrice: 100 - startTime: '13:00' bookingCutoff: '2026-01-12T12:59:59.000Z' capacity: type: LIMITED vacancies: - types: - UNIT quantity: 2 quantityType: SHARED original: 2 remaining: 2 status: AVAILABLE price: type: PER_UNIT_PRICE maxTravelers: 5 netPrice: 90 retailPrice: 100 - travelDate: '2026-01-13' events: - startTime: '12:00' bookingCutoff: '2026-01-13T11:59:59.000Z' capacity: type: LIMITED vacancies: - types: - UNIT quantity: 0 quantityType: SHARED original: 2 remaining: 0 status: UNAVAILABLE unavailableReason: SOLD_OUT price: type: PER_UNIT_PRICE maxTravelers: 5 netPrice: 90 retailPrice: 100 - startTime: '13:00' bookingCutoff: '2026-01-13T12:59:59.000Z' capacity: type: LIMITED vacancies: - types: - UNIT quantity: 0 quantityType: SHARED original: 2 remaining: 0 status: UNAVAILABLE unavailableReason: SOLD_OUT price: type: PER_UNIT_PRICE maxTravelers: 5 netPrice: 90 retailPrice: 100 tourListResponseWithProductOptionIdXml: value: "\n\n ******\n 1000\n 99999\n ******\n ******\n \n SUCCESS\n \n \n 161616\n Test product\n PT\n Lisbon\n Lisbon\n Its all about testing\n \n 161616\n First option\n optionId1\n 12:00:00\n \n \n \n \n 181818\n Second option\n optionId2\n 13:00:00\n \n \n \n \n 171717\n Third option\n 4558672\n 23:00:00\n \n \n \n \n\n" error500: summary: Internal Server Error value: error: INTERNAL_ERROR message: Unknown internal error bookingResponseErrorJson: summary: Booking request error value: responseType: BookingResponse data: ApiKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ResellerId: '1000' SupplierId: 1004 ExternalReference: '10051374722992645' Timestamp: '2013-07-25T13:30:53.616+10:00' RequestStatus: Status: ERROR Error: ErrorCode: TGDS0013 ErrorMessage: The specified SupplierProductCode is not recognized. ErrorDetails: No product exists with SupplierProductCode 'BLUE' for SupplierId 1004. reservedResponseWithUnsupportedPrice: summary: Reserved response for Unsupported price value: status: RESERVED expiration: '2026-01-21T12:00:00Z' reference: RES-9876543210 currency: USD price: type: UNSUPPORTED_PRICE reason: Pricing model is not supported availabilityCheckResponseWithUnsupportedPrice: summary: Availability check response for Unsupported Price value: productOptions: - productOptionId: UNIT1 currency: USD events: - status: AVAILABLE startTime: '15:00' capacity: type: LIMITED vacancies: - types: - ADULT - CHILD quantity: 50 quantityType: SHARED original: 100 remaining: 50 bookingCutoff: '2025-12-31T23:59:59.000Z' price: type: UNSUPPORTED_PRICE reason: Pricing model is not supported bookingCancellationRequestXml: value: "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10051374722992850\n 2013-12-01T13:30:53.616+10:00\n 999999999\n CN123456\n 2013-12-01\n Customer Service\n No longer traveling\n Refunded Customer\n\n" bookingCancellationResponseXml: value: "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10051374722992850\n 2013-12-01T13:30:54.616+10:00\n \n SUCCESS\n \n 999999999\n CN123456\n CANCEL78910\n \n CONFIRMED\n \n\n" reserveRequest: value: supplierId: 1004 productOptionId: r1172330 startTime: '15:30' travelDate: '2026-01-21' tickets: - type: ADULT quantity: 2 - type: CHILD quantity: 1 totalTravelers: 3 schemas: UnavailableReason: type: string description: "Machine-interpretable value that specifies the reason why the event, or occurrence of the product option and (when applicable) associated startTime, is unavailable. \n\nOne of:\n - SOLD_OUT - There is no remaining capacity\n - PAST_BOOKING_CUTOFF - The booking cutoff date is in the past\n - UNSUPPORTED_TICKET_COMBINATION - At least one of the requested ticket types is invalid for the product option\n - LIMITED_AVAILABILITY - Insufficient capacity exists for at least one of the requested ticket types. \n Also applies when the total number of travelers requested (**totalTravelers**) exceeds the maximum number of travelers (**price.maxTravelers**) allowed for products where **price.type** is set to PER_UNIT_PRICE.\n" enum: - SOLD_OUT - PAST_BOOKING_CUTOFF - UNSUPPORTED_TICKET_COMBINATION - LIMITED_AVAILABILITY example: UNSUPPORTED_TICKET_COMBINATION LanguageOption: type: string enum: - GUIDE - AUDIO - WRITTEN example: GUIDE Discount: type: object description: Discount applicable to price of the Event. required: - originalRetailPrice properties: originalRetailPrice: type: number format: double description: The Recommended Retail Price (RRP) before any discount was applied that resulted in the current retailPrice. example: 40.32 specialOfferId: type: string description: The special offer identifier. Must be a valid identifier returned in the special offer endpoint. example: '123456789' ProductOptionId: type: string description: "Unique reservation system product option identifier. \nThis identifier is sourced from the [Tour List API](#operation/tourList) response.\n" example: r1172330 BookingRequest: description: Root element for Booking Request allOf: - $ref: '#/components/schemas/RequestResponseBase' - type: object required: - BookingReference - TravelDate - SupplierProductCode - Traveller properties: BookingReference: type: string description: Unique booking identifier within Viator's systems. TravelDate: type: string format: date description: "The date of travel for the itinerary item. Date should be in date format **YYYY-MM-DD**. \n\n**Example:** 2000-01-31\n" SupplierProductCode: type: string maxLength: 50 description: 'String representing the reservation system unique product (tour) identifier. ' Location: type: string description: 'City and country that the tour is in. **Example:** Sydney, Australia ' TourOptions: $ref: '#/components/schemas/TourOptionItem' Inclusions: type: object description: Root element for inclusions. Contains inclusions in the product (tour) / product option (tour option) offering. properties: Inclusion: type: array description: Inclusion of the product offering. items: type: string CurrencyCode: type: string description: "ISO 4217 three-letter currency code associated with the booking price. \nISO 4217 is the International Standard for currency codes. For more information visit [iso.org](https://www.iso.org/).\n" Amount: type: number description: 'Numeric value for the price (net) paid to the operator for the booking. **Example**: 550.00 ' Traveller: type: array description: Root element for traveler. Contains traveler information for the booking. items: title: Traveller required: - TravellerIdentifier - GivenName - Surname - AgeBand properties: TravellerIdentifier: type: string description: Unique identifier per traveler for the booking. GivenName: type: string description: Traveler's given name. Surname: type: string description: Traveler's surname AgeBand: type: string description: Age band of traveler. enum: - Adult - Child - Youth - Infant - Senior LeadTraveller: type: boolean description: Specifies whether this traveler should be considered the 'lead traveler'. TravellerMix: type: object description: 'Traveler mix root element. Holds the number of travelers at each age band for the requested booking. ' properties: Adult: type: string description: "Number of adults. \nWhen price.type is set to PER_UNIT_PRICE (v2.0 only), the number of Adults represents the number of travelers.\nViator currently books a maximum of one ticket UNIT per booking, but this is subject to change. Therefore, if the booking request:\n- includes an AvailabilityHoldReference, the number of units specified in the Reserve request should be booked.\n- does not include an AvailabilityHoldReference, calculate the number of units to be booked based on the number of travelers (i.e., if number of Adult <= (calendar) price.maxTravelers then book 1 unit).\n" default: 0 Child: type: string description: Number of children default: 0 Youth: type: string description: Number of youths default: 0 Infant: type: string description: Number of infants default: 0 Senior: type: string description: Number of seniors default: 0 Total: type: string description: Total number of travelers RequiredInfo: type: object description: Required information root element. Holds both booking questions and answers required by the operator when confirming a booking. properties: Question: type: array items: title: Question required: - QuestionText - QuestionAnswer properties: QuestionText: type: string description: Question asked to the customer to obtain required information. QuestionAnswer: type: string description: Customer's answer to the question. SpecialRequirement: type: string description: Special requirement from the customer. PickupPoint: type: string description: Customer pickup point for the Tour. Only pickup points previously agreed to with operator are allowed. ContactDetail: type: object description: Contact detail root element. Holds customer contact information. required: - ContactType - ContactName - ContactValue properties: ContactType: type: string description: Type of contact used for contacting customer while travelling. enum: - ALTERNATE ContactName: type: string description: Name of the contact. ContactValue: type: string description: Contact information (i.e phone number, email, etc) ContactEmail: type: string description: "Traveler-protected contact email address that expires 30 days after travel date; \n" AvailabilityHoldReference: type: string description: Availability hold reference returned by the reservation system in the availability response. To be used by the reservation system to 'consume' the availability that was held. Retry: type: boolean description: Whether the request is a retry of a previously erred attempt. If omitted should be considered false as a new booking request. NotReservedResponse: type: object description: Response object for the Reserve Operation (Not Reserved option). required: - status - reason properties: status: type: string description: 'Machine-interpretable value that specifies the status of the reservation; One of: - RESERVED - NOT_RESERVED ' enum: - NOT_RESERVED example: NOT_RESERVED reason: type: string description: "The reason why the reservation could not be made. \n\nOne of:\n- SOLD_OUT - There is no remaining capacity\n- PAST_BOOKING_CUTOFF - The booking cutoff date is in the past\n- UNSUPPORTED_TICKET_COMBINATION - At least one of the requested ticket types is invalid for the product option\n- LIMITED_AVAILABILITY - Insufficient capacity exists for at least one of the requested ticket types. \n Also applies when the total number of travelers requested (**totalTravelers**) exceeds the maximum number of travelers (**price.maxTravelers**) allowed for products where **price.type** is set to PER_UNIT_PRICE.\n- NO_EVENT - No such event, or occurrence of the product option and (where applicable) associated startTime\n" enum: - SOLD_OUT - PAST_BOOKING_CUTOFF - UNSUPPORTED_TICKET_COMBINATION - LIMITED_AVAILABILITY - NO_EVENT example: SOLD_OUT ContentErrorResponse: type: object description: Error response object required: - error properties: error: type: string description: "Code representing error reason. \n\nOne of:\n - INVALID_SUPPLIER - the requested supplier is not valid.\n - API_DISABLED - API endpoint is not enabled for the requested supplier.\n" example: INVALID_SUPPLIER message: type: string description: Human readable description of the error reason example: Wrong Supplier ID BookingCancellationRequest: description: Root element for Booking Cancellation Request allOf: - $ref: '#/components/schemas/RequestResponseBase' - type: object required: - BookingReference - SupplierConfirmationNumber - CancelDate - Author - Reason properties: BookingReference: type: string description: Unique booking identifier within Viator's systems. SupplierConfirmationNumber: type: string description: "Reservation system booking confirmation number per booking itinerary. Number is at itinerary level (single confirmation number irrespective of number of passengers). \nThe `SupplierConfirmationNumber` is used in all subsequent requests pertaining to the booking (i.e. amendments, cancellations, etc.) to identify the booking in the reservation system.\n" CancelDate: type: string format: date description: 'The date the cancellation was made. Date should be in date format. **Example**: 2000-01-31 ' Author: type: string description: Person (or group) responsible for the cancellation. Reason: type: string description: Reason for the cancellation. SupplierNote: type: string description: Message (note) to the operator. LimitedCapacity: type: object description: "Used when the product option is capacity limited. \n\nRepresents the availability (capacity) of one occurrence of the product option.\n\nMay be associated with a start time. \n\nMust return capacity for all ticket types (not limited to those listed in the request).\n" required: - type - vacancies - original - remaining properties: type: $ref: '#/components/schemas/CapacityType' description: "The type of capacity. Value must be “LIMITED”.\n\nUsed when the product option is capacity limited. Represents the availability (capacity) of one occurrence of the product option.\n\nMay be associated with a start time. \n\nMust return capacity for all ticket types (not limited to those listed in the request).\n" example: LIMITED vacancies: type: array description: List of ticket types for which availability (capacity) is being returned items: $ref: '#/components/schemas/CapacityTicketInformation' original: type: integer description: "The total original capacity. \n\nThis is the sum of the capacity available for sale across all applicable ticket types prior to any bookings.\n\nMust be greater than zero. Must be greater than or equal to remaining.\n\n**Note**: If product option is priced PerPersonPrice, the capacity is per person/traveler. If the product option is priced PerUnitPrice, the capacity is per unit/group.\n" remaining: type: integer description: 'The total remaining capacity. This is the maximum capacity currently available for sale across all applicable ticket types. **Note**: If product option is priced PerPersonPrice, the capacity is per person/traveler. If the product option is priced PerUnitPrice, the capacity is per unit/group. ' CalendarUnsupportedPrice: type: object description: Price element representing an unsupported pricing model. required: - type - reason properties: type: $ref: '#/components/schemas/CalendarPriceType' default: UNSUPPORTED_PRICE description: 'The type of Price. Value must be "UNSUPPORTED_PRICE". Used when the price model used in the Reservation System cannot be mapped to a Viator supported pricing model. Usage represents an inability to synchronize prices (Operators will manage pricing in the Viator supply center) whilst allowing availability information to be synchronized from Reservation System. ' reason: type: string description: Reason why the price model is unsupported. This must describe the type of price that is not supported. UnlimitedCapacity: type: object required: - type properties: type: $ref: '#/components/schemas/CapacityType' description: 'The type of capacity. Value must be “UNLIMITED”. Used when a product option has unlimited capacity. Represents the unlimited capacity of the occurrence of the product option. May be associated with a start time. ' example: UNLIMITED CalendarPerPersonPrice: type: object description: Price root element. Holds price information. required: - type - prices properties: type: $ref: '#/components/schemas/CalendarPriceType' default: PER_PERSON_PRICE description: 'The type of Price. Value must be “PER_PERSON_PRICE”. Used when price is applied per person/traveler. Represents the per person/traveler price of the product option and associated startTime (when applicable) on the requested travelDate. ' prices: type: array description: List of ticket types with relevant prices items: $ref: '#/components/schemas/PerPersonPriceDetails' BookingAmendmentRequest: description: Root element for Booking Amendment Request allOf: - $ref: '#/components/schemas/RequestResponseBase' - type: object required: - BookingReference - TravelDate - SupplierProductCode - Traveller - SupplierConfirmationNumber properties: BookingReference: type: string description: Unique booking identifier within Viator's systems. TravelDate: type: string format: date description: "The date of travel for the itinerary item. Date should be in date format **YYYY-MM-DD**. \n\n**Example:** 2000-01-31\n" SupplierProductCode: type: string maxLength: 50 description: 'String representing the operator''s reservation system unique product (tour) identifier. ' Location: type: string description: 'City and country that the tour is in. **Example:** Sydney, Australia ' TourOptions: $ref: '#/components/schemas/TourOptionItem' Inclusions: type: object description: Root element for inclusions. Contains inclusions in the product (tour) / product option (tour option) offering. properties: Inclusion: type: array description: Inclusion of the product offering. items: type: string CurrencyCode: type: string description: "ISO 4217 three-letter currency code associated with the booking price. \nISO 4217 is the International Standard for currency codes. For more information visit [iso.org](https://www.iso.org/).\n" Amount: type: number description: 'Numeric value for the price (net) paid to the operator for the booking. **Example**: 550.00 ' Traveller: type: array description: Root element for traveler. Contains traveler information for the booking. items: title: Traveller required: - TravellerIdentifier - GivenName - Surname - AgeBand properties: TravellerIdentifier: type: string description: Unique identifier per traveler for the booking. GivenName: type: string description: Traveler's given name. Surname: type: string description: Traveler's surname AgeBand: type: string description: Age band of traveler. enum: - Adult - Child - Youth - Infant - Senior LeadTraveller: type: boolean description: Specifies whether this traveler should be considered the 'lead traveler'. TravellerMix: type: object description: 'Traveler mix root element. Holds the number of travelers at each age band for the requested booking. ' properties: Adult: type: integer description: Number of adults default: 0 Child: type: integer description: Number of children default: 0 Youth: type: integer description: Number of youths default: 0 Infant: type: integer description: Number of infants default: 0 Senior: type: integer description: Number of seniors default: 0 Total: type: integer description: Total number of travelers RequiredInfo: type: object description: Required information root element. Holds both booking questions and answers required by the operator when confirming a booking. properties: Question: type: array items: title: Question required: - QuestionText - QuestionAnswer properties: QuestionText: type: string description: Question asked to the customer to obtain required information. QuestionAnswer: type: string description: Customer's answer to the question. SpecialRequirement: type: string description: Special requirement from the customer. PickupPoint: type: string description: Customer pickup point for the Tour. Only pickup points previously agreed to with the operator are allowed. SupplierNote: type: string description: Note (message) to the operator about the booking. AdditionalRemarks: type: object description: Additional remarks root element. Holds additional remarks to customers. properties: Remark: type: array description: 'Remarks related to the booking. i.e: pricing rule. ' items: type: string ContactDetail: type: object description: Contact detail root element. Holds customer contact information. required: - ContactType - ContactName - ContactValue properties: ContactType: type: string description: Type of contact used for contacting customer while travelling. enum: - MOBILE - ALTERNATE - EMAIL - NOT_CONTACTABLE ContactName: type: string description: Name of the contact. ContactValue: type: string description: Contact information (i.e phone number, email, etc) ContactEmail: type: string description: "Traveler-protected contact email address that expires 30 days after travel date; \n" SupplierConfirmationNumber: type: string description: "Reservation system booking confirmation number per booking itinerary. Number is at itinerary level (single confirmation number irrespective of number of passengers). \nThe `SupplierConfirmationNumber` is used in all subsequent requests pertaining to the booking (i.e. amendments, cancellations, etc.) to identify the booking in the reservation system. \n" SupplierId: type: integer description: Viator’s unique Supplier identifier. example: 3456 SpecialOfferType: type: string description: "Type of the special offer.\n\nOne of: \n - “STANDARD” - a special offer that is applicable for a specific date range. Additional details available [here](https://help.supplier.viator.com/en/articles/177). \n\nNote: Additional special offer types are expected in the future\n" enum: - STANDARD example: STANDARD AvailabilityCheckRequest: allOf: - $ref: '#/components/schemas/BaseRequest' - type: object description: Request object for the Real-time Availability check Operation. required: - productOptions - travelDate - tickets - totalTravelers properties: productOptions: type: array description: List of reservation system product options and associated start times for which availability and pricing is being requested. items: $ref: '#/components/schemas/ProductOptionRequest' travelDate: $ref: '#/components/schemas/TravelDate' tickets: type: array description: List of ticket types for which availability and pricing is being requested items: $ref: '#/components/schemas/TicketRequest' totalTravelers: $ref: '#/components/schemas/TotalTravelers' CapacityTicketInformation: type: object description: List of ticket types for which availability (capacity) is being returned required: - types - quantity - quantityType properties: types: type: array description: "Machine-interpretable value that specifies the ticket type; \n\nOne of:\n - ADULT\n - SENIOR\n - YOUTH\n - CHILD\n - INFANT\n - UNIT\n" items: type: string example: ADULT quantity: type: integer description: "The currently remaining available capacity for the ticket type. \n\nMust not be a negative integer.\n\n**Note**: If product option is priced PerPersonPrice, the capacity is per person/traveler. If the product option is priced PerUnitPrice, the capacity is per unit/group.\n" example: 10 quantityType: type: string title: LimitedCapacityQuantityType description: "Specifies whether capacity quantity is shared across ticket types or allocated per ticket type; \n\nOne of: \n- SHARED - the capacity quantity is shared across all the ticket types listed. \n- PER_TYPE - the capacity quantity is per each ticket type listed.\n" enum: - SHARED - PER_TYPE example: PER_TYPE StartTime: type: string format: time description: 'Start time or departure time for the event. Value is in time format **hh:mm**. ' example: '15:30' ReservedResponse: type: object description: Response object for the Reserve Operation (Reserved option only). required: - status - expiration - reference - currency - price properties: status: type: string description: 'Machine-interpretable value that specifies the status of the reservation; One of: - RESERVED - NOT_RESERVED ' enum: - RESERVED example: RESERVED expiration: type: string format: date-time description: "The time at which the reservation will expire. \n\nValue is in Timestamp (UTC) format. \n\nThe reservation request expects inventory and pricing to be held for a **minimum of 15 minutes** from the time the request is made.\n" example: '2020-06-11T09:16:39Z' reference: type: string description: "The unique reservation identifier in the reservation system. \n\nThis identifier will be passed in the AvailabilityHoldReference of the [Booking API](#tag/Reservation-system-APIs/operation/booking) when the booking for this reservation is made.\n" example: RES-1234567890 currency: $ref: '#/components/schemas/Currency' price: title: ReservePrice description: 'The type of price of an event along with the relevant amounts for requested ticket types. ' discriminator: propertyName: type mapping: PER_PERSON_PRICE: '#/components/schemas/PerPersonPrice' PER_UNIT_PRICE: '#/components/schemas/PerUnitPrice' UNSUPPORTED_PRICE: '#/components/schemas/UnsupportedPrice' oneOf: - $ref: '#/components/schemas/PerPersonPrice' - $ref: '#/components/schemas/PerUnitPrice' - $ref: '#/components/schemas/UnsupportedPrice' Hours: type: object required: - from - to properties: from: type: string format: time description: "The \"from time\" (start) of the operating hours range. \n \nValue is in time format **hh:mm**.\n" example: 09:00 to: type: string format: time description: 'The "to time" (end) of the operating hours range. Value is in time format **hh:mm**. ' example: '18:00' TravelerTypes: type: array description: "Machine-interpretable value that specifies the type of traveler.\nOne of:\n - ADULT\n - SENIOR\n - YOUTH\n - CHILD\n - INFANT\n" items: type: string example: ADULT ProductOption: type: object description: 'List of reservation system product option identifiers for which events (start time, capacity, pricing) are being returned. - If a requested product option is absent in the response, it is interpreted as being unavailable for purchase. - If a requested product option is invalid on the reservation system (i.e. non-existent), it must not be returned in the response. ' required: - productOptionId - currency - events properties: productOptionId: $ref: '#/components/schemas/ProductOptionId' currency: $ref: '#/components/schemas/Currency' events: type: array description: 'List of events (start time, capacity, pricing) for a product option. - If an event is absent in the response, it is interpreted as being unavailable for purchase. ' items: oneOf: - $ref: '#/components/schemas/Event' - $ref: '#/components/schemas/UnavailableEvent' discriminator: propertyName: status mapping: AVAILABLE: '#/components/schemas/Event' UNAVAILABLE: '#/components/schemas/UnavailableEvent' CalendarResponse: type: object description: 'Response object for the Calendar Operation. ' required: - productOptions properties: productOptions: type: array description: 'List of reservation system product option identifiers for which events (start time, capacity, pricing) are being returned. - If a requested product option is absent in the response, it is interpreted as being unavailable for purchase. - If a requested product option is invalid on the reservation system (i.e. non-existent), it must not be returned in the response. ' items: type: object required: - productOptionId - currency - dates properties: productOptionId: $ref: '#/components/schemas/ProductOptionId' currency: $ref: '#/components/schemas/Currency' dates: type: array description: 'List of travelDates for which availability is being returned. travelDates with no events must not be returned. ' items: type: object required: - travelDate - events properties: travelDate: type: string format: date description: "The date of travel. \n\nMust be within the requested date range. Value is in date format **YYYY-MM-DD**. \n" example: '2026-01-21' events: type: array description: 'List of calendar events (start time, capacity, pricing) for a product option. - If an event is absent in the response, it is interpreted as being unavailable for purchase. ' items: discriminator: propertyName: status mapping: AVAILABLE: '#/components/schemas/CalendarEvent' UNAVAILABLE: '#/components/schemas/UnavailableCalendarEvent' oneOf: - $ref: '#/components/schemas/CalendarEvent' - $ref: '#/components/schemas/UnavailableCalendarEvent' RequestStatus: description: Request status root element. Holds the status information for the requested transaction. required: - Status type: object properties: Status: enum: - SUCCESS - ERROR type: string description: 'Status of the request. Valid values are: - `"SUCCESS"` for a successful transaction, or - `"ERROR"` for an unsuccessful transaction. (`Error` node must be populated) ' Error: required: - ErrorCode type: object properties: ErrorCode: type: string description: Represents the error code. ErrorMessage: type: string description: Error message in a friendly format. ErrorDetails: type: string description: Technical error cause and details. description: Error root element. SpecialOffersResponse: type: object description: Response object for the Special Offers Operation. required: - specialOffers properties: specialOffers: type: array description: "List of VALID Special Offers. \nThe absence of details for a requested special offer will invalidate the special offer on Viator.\n" items: $ref: '#/components/schemas/SpecialOffer' BookingAmendmentResponse: description: Root element for Booking Amendment Response allOf: - $ref: '#/components/schemas/ResponseBase' - type: object properties: BookingReference: type: string description: Unique booking identifier within Viator's systems. SupplierCommentCustomer: type: string description: Supplier's comment for the customer. TourBarcode: type: string description: Represents the operator's barcode to be displayed on the customer's voucher. The code is printed as per prior agreement with the operator. Barcode is at itinerary level (single barcode irrespective of number of passengers). Traveller: type: array description: Traveler root element. Contains booking confirmation details at traveler level. items: title: Traveller required: - TravellerIdentifier properties: TravellerIdentifier: type: string description: Unique identifier per traveler for the booking. TravellerSupplierConfirmationNumber: type: string description: "Reservation system booking confirmation number per traveler. Number is at traveler level and is unique amongst travelers in the booking. \nThe `TravellerSupplierConfirmationNumber` value can be used to print per person barcodes on vouchers (if previously agreed with operator).\n" TravellerTicket: $ref: '#/components/schemas/TourTicket' TravellerBarcode: type: string description: 'String representing the operator''s barcode to be displayed on the customer''s voucher for a specific traveler. The code is printed as per prior agreement with the operator. Barcode is at itinerary/traveler level (each traveler will have an individual barcode). ' TravellerSeat: type: string description: 'Seat number assigned to the traveller. The full representation of the seat should be used, this includes any gate, row and seat information that must appear on the traveler''s voucher or ticket. This information should clearly instruct the traveler of the seat location. ' TransactionStatus: description: Transaction status root element. Holds information about the status of the transaction. type: object required: - Status properties: Status: type: string description: Status of the transaction enum: - CONFIRMED - REJECTED RejectionReason: type: string description: 'Reason transaction was rejected. **Mandatory** if status is `REJECTED`. Valid values are: * **NOT_OPERATING -** Tour is not operating on the date for which the booking was made. * **BOOKED_OUT_ALT_DATES -** Tour is booked out but alternative dates will be provided in the `RejectionReasonDetails` * **BOOKED_OUT_ALT_TIMES -** Tour is booked out but alternative times will be provided in the `RejectionReasonDetails` * **OTHER -** Any other reason. Details must be provided in `RejectionReasonDetails`. ' enum: - NOT_OPERATING - BOOKED_OUT_ALT_DATES - BOOKED_OUT_ALT_TIMES - OTHER RejectionReasonDetails: type: string description: 'Extended details pertaining to the reason the transaction was rejected and additional information (i.e. alternatives). **Mandatory** if status is `REJECTED`. ' SupplierConfirmationNumber: type: string description: "Reservation system booking confirmation number per booking itinerary. Number is at itinerary level (single confirmation number irrespective of number of passengers). \nThe `SupplierConfirmationNumber` is used in all subsequent requests pertaining to the booking (i.e. amendments, cancellations, etc.) to identify the booking in the reservation system.\n" TourTicket: $ref: '#/components/schemas/TourTicket' - oneOf: - title: Success description: When `RequestStatus.Status` is `SUCCESS`, `TransactionStatus` and `SupplierConfirmationNumber` must be populated. type: object properties: RequestStatus: type: object properties: Status: enum: - SUCCESS required: - TransactionStatus - SupplierConfirmationNumber - title: Error description: When `RequestStatus.Status` is `ERROR`, no transaction was created, so no further fields are required. type: object properties: RequestStatus: type: object properties: Status: enum: - ERROR BookingCancellationResponse: description: Root element for Booking Cancellation Response allOf: - $ref: '#/components/schemas/ResponseBase' - type: object properties: BookingReference: type: string description: Unique booking identifier within Viator's systems. SupplierConfirmationNumber: type: string description: "Reservation system booking confirmation number per booking itinerary. Number is at itinerary level (single confirmation number irrespective of number of passengers). \nThe `SupplierConfirmationNumber` is used in all subsequent requests pertaining to the booking (i.e. amendments, cancellations, etc.) to identify the booking in the reservation system.\n" SupplierCancellationNumber: type: string description: 'Reservation system unique cancellation confirmation number. Number is at itinerary level (single cancellation number irrespective of number of passengers) and serves as a reference to the cancellation in the reservation system. ' TransactionStatus: description: Transaction status root element. Holds information about the status of the transaction. type: object required: - Status properties: Status: type: string description: Status of the transaction enum: - CONFIRMED - REJECTED RejectionReason: type: string description: 'Reason transaction was rejected. **Mandatory** if status is `REJECTED`. Valid values are: * **PAST_CANCEL_DATE -** Allowed cancellation date is in the past. * **PAST_TOUR_DATE -** Tour date is in the past. * **TOUR_REDEEMED -** Tour has already been redeemed. * **OTHER -** Any other reason. Details must be provided in `RejectionReasonDetails`. ' enum: - PAST_CANCEL_DATE - PAST_TOUR_DATE - TOUR_REDEEMED - OTHER RejectionReasonDetails: type: string description: 'Extended details pertaining to the reason the transaction was rejected and additional information (i.e. alternatives). **Mandatory** if status is `REJECTED`. ' - oneOf: - title: Success description: When `RequestStatus.Status` is `SUCCESS`, `TransactionStatus` must be populated. type: object properties: RequestStatus: type: object properties: Status: enum: - SUCCESS required: - TransactionStatus - title: Error description: When `RequestStatus.Status` is `ERROR`, no transaction was created, so no further fields are required. type: object properties: RequestStatus: type: object properties: Status: enum: - ERROR ReserveRequest: allOf: - $ref: '#/components/schemas/BaseRequest' - type: object description: Request object for the Reserve Operation. required: - productOptionId - travelDate - tickets - totalTravelers properties: productOptionId: $ref: '#/components/schemas/ProductOptionId' startTime: $ref: '#/components/schemas/StartTime' travelDate: $ref: '#/components/schemas/TravelDate' tickets: type: array description: List of ticket types for which reservation is being requested. items: $ref: '#/components/schemas/TicketRequest' totalTravelers: $ref: '#/components/schemas/TotalTravelers' ResponseBase: allOf: - $ref: '#/components/schemas/RequestResponseBase' - required: - RequestStatus type: object properties: RequestStatus: $ref: '#/components/schemas/RequestStatus' PerUnitPrice: type: object description: Price element for the price per unit. required: - type - retailPrice - maxTravelers properties: type: $ref: '#/components/schemas/PriceType' default: PER_UNIT_PRICE description: "The type of Price. Value must be “PER_UNIT_PRICE”.\n\nUsed when price is applied per unit (i.e. per vehicle, boat, room, etc.) or per group of travelers. \n\nRepresents the per unit/group price of the product option and associated startTime (when applicable) on the requested travelDate.\n" netPrice: type: number format: double description: 'The price that may be paid to the operator for the booking (subject to explicit agreement with Viator) ' example: 120 retailPrice: $ref: '#/components/schemas/RetailPricePerUnit' discount: $ref: '#/components/schemas/Discount' maxTravelers: type: integer description: The maximum number of travelers for each unit/group. example: 10 SpecialOffersRequest: type: object description: Request object for the Special Offers Operation. required: - supplierId - specialOfferIds properties: supplierId: $ref: '#/components/schemas/SupplierId' specialOfferIds: type: array description: List of special offer identifiers for which metadata is being requested. items: type: string description: Unique identifier for the special offer. example: A Unique id CalendarPerUnitPrice: type: object description: Price element for the price per unit. required: - type - retailPrice - maxTravelers properties: type: $ref: '#/components/schemas/CalendarPriceType' default: PER_UNIT_PRICE description: 'The type of Price. Value must be "PER_UNIT_PRICE". Used when price is applied per unit (i.e. per vehicle, boat, room, etc.) or per group of travelers. Represents the per unit/group price of the product option and associated startTime (when applicable) on the requested travelDate. ' netPrice: type: number format: double description: 'The price that may be paid to the operator for the booking (subject to explicit agreement with Viator) ' example: 120 retailPrice: $ref: '#/components/schemas/RetailPricePerUnit' discount: $ref: '#/components/schemas/Discount' maxTravelers: type: integer description: The maximum number of travelers for each unit/group. example: 10 UnavailableCalendarEvent: type: object description: 'Represents the lack of availability of one occurrence of the product option. ' required: - status - unavailableReason - capacity - bookingCutoff - price properties: status: $ref: '#/components/schemas/EventStatus' description: 'Status of the event. Must be ''UNAVAILABLE''. ' example: UNAVAILABLE startTime: $ref: '#/components/schemas/StartTime' openingHours: $ref: '#/components/schemas/OpeningHours' unavailableReason: type: string description: "Machine-interpretable value that specifies the reason why the event is unavailable. \n\nOne of:\n- SOLD_OUT - There is no remaining capacity\n- PAST_BOOKING_CUTOFF - The booking cutoff date is in the past\n" enum: - SOLD_OUT - PAST_BOOKING_CUTOFF bookingCutoff: $ref: '#/components/schemas/BookingCutoff' capacity: $ref: '#/components/schemas/EventCapacity' price: description: 'The type of price of an event along with the relevant amounts for requested ticket types. ' oneOf: - $ref: '#/components/schemas/CalendarPerPersonPrice' - $ref: '#/components/schemas/CalendarPerUnitPrice' - $ref: '#/components/schemas/TieredPerPersonPrice' - $ref: '#/components/schemas/CalendarUnsupportedPrice' discriminator: propertyName: type mapping: PER_PERSON_PRICE: '#/components/schemas/CalendarPerPersonPrice' PER_UNIT_PRICE: '#/components/schemas/CalendarPerUnitPrice' TIERED_PER_PERSON_PRICE: '#/components/schemas/TieredPerPersonPrice' UNSUPPORTED_PRICE: '#/components/schemas/CalendarUnsupportedPrice' EventStatus: type: string description: "The availability status. Represents the availability or unavailability of capacity to allow a booking for the requested quantity of tickets.\n\nOne of: \n- AVAILABLE - Capacity is available to fulfill a booking to proceed for the requested parameters\n- UNAVAILABLE - Capacity is not available to allow a booking to proceed for the requested parameters. \n Also applies when the total number of travelers requested (**totalTravelers**) exceeds the maximum number of travelers (**price.maxTravelers**) allowed for products where **price.type** is set to PER_UNIT_PRICE.\n" enum: - AVAILABLE - UNAVAILABLE example: AVAILABLE PerPersonPriceDetails: type: object description: Price element that applies to one or various traveler types. For example, there can be a price for adults and children and another one for seniors. required: - retailPrice - types properties: types: $ref: '#/components/schemas/TravelerTypes' netPrice: type: number format: double description: 'The price that may be paid to the operator for the booking (subject to explicit agreement with Viator) ' example: 30.25 retailPrice: $ref: '#/components/schemas/RetailPricePerPerson' discount: description: Discount applicable to price of the Event. $ref: '#/components/schemas/Discount' PriceType: type: string description: "Machine-interpretable value that specifies the type of price. \n\nOne of:\n - PER_PERSON_PRICE - Product is priced per person/traveler. Price is the same per person irrespective of the number booked.\n - PER_UNIT_PRICE - Product is priced per Unit. Price is the same irrespective of the number of travelers within the maximum number of travelers allowed per unit.\n - UNSUPPORTED_PRICE - Used when the price model used in the Reservation System cannot be mapped to a Viator supported pricing model (listed above).\n" enum: - PER_PERSON_PRICE - PER_UNIT_PRICE - UNSUPPORTED_PRICE example: PER_PERSON_PRICE RetailPricePerPerson: type: number format: double description: The Recommended Retail Price (RRP) is the immediate effective price that customers will pay per traveler type. example: 40.32 UnsupportedPrice: type: object description: Price element representing an unsupported pricing model. required: - type - reason properties: type: $ref: '#/components/schemas/PriceType' default: UNSUPPORTED_PRICE description: 'The type of Price. Value must be “UNSUPPORTED_PRICE”. Used when the price model used in the Reservation System cannot be mapped to a Viator supported pricing model. Usage represents an inability to synchronize prices (Operators will manage pricing in the Viator supply center) whilst allowing availability information to be synchronized from Reservation System. ' reason: type: string description: Reason why the price model is unsupported. This must describe the type of price that is not supported. TourTicket: type: object description: The ticket for the tour required: - MimeType - Url properties: MimeType: type: string description: 'The MIME type for the ticket URL. Valid values are: * **application/pdf** ' enum: - application/pdf Url: type: string description: The URL for the ticket. TourListRequest: description: Root element for Tour List Request allOf: - $ref: '#/components/schemas/RequestResponseBase' - type: object RequestResponseBase: type: object required: - ApiKey - ResellerId - SupplierId - Timestamp properties: ApiKey: type: string description: Authentication key. ResellerId: type: string description: Unique identifier for Viator. SupplierId: type: integer description: Unique operator identifier within Viator's systems. ExternalReference: type: string description: Unique transaction identifier - unique across all transactions. Used in the response to identify the initial request. Timestamp: type: string description: 'The time of creation of the request. Date/time (timestamp) that requires timezone information along with date/time. The date should be in the following format: - yyyy-MM-ddTHH:mm:ss.SSSZ (in UTC time), or - yyyy-MM-ddTHH:mm:ss.SSS[+/-]hh:mm **Examples:** - 2013-04-28T13:10:12.120Z - 2013-04-28T13:10:12.120+10:00 ' format: date-time description: Request Response Base. Event: type: object description: Represents the presence of availability, along with pricing, of an occurrence of the product option on the requested travelDate. May be associated with a start time. required: - status - capacity - bookingCutoff - price properties: status: $ref: '#/components/schemas/EventStatus' startTime: $ref: '#/components/schemas/StartTime' capacity: $ref: '#/components/schemas/EventCapacity' bookingCutoff: $ref: '#/components/schemas/BookingCutoff' price: title: EventPrice description: 'The type of price of an event along with the relevant amounts for requested ticket types. ' oneOf: - $ref: '#/components/schemas/PerPersonPrice' - $ref: '#/components/schemas/PerUnitPrice' - $ref: '#/components/schemas/UnsupportedPrice' discriminator: propertyName: type mapping: PER_PERSON_PRICE: '#/components/schemas/PerPersonPrice' PER_UNIT_PRICE: '#/components/schemas/PerUnitPrice' UNSUPPORTED_PRICE: '#/components/schemas/UnsupportedPrice' TicketRequest: type: object description: List of ticket types for which availability and pricing is being requested required: - type - quantity properties: type: type: string description: "Machine-interpretable value that specifies the ticket type; \n\nOne of:\n - ADULT\n - SENIOR\n - YOUTH\n - CHILD\n - INFANT\n - UNIT\n" example: ADULT quantity: type: integer description: "Number of travelers/passengers if ticket type is **ADULT**, **SENIOR**, **YOUTH**, **CHILD** or **INFANT**. \n\nFor **UNIT** ticket type this is the number of units (not travelers).\n" example: 1 OpeningHours: type: object description: 'Lists the operating hours of the product option of the travelDate. ' required: - coordinateStartTimes - hours properties: coordinateStartTimes: type: boolean description: 'Specifies if start time is coordinated between tour operator and customer before travel. ' example: false hours: type: array description: "Lists the from and to operating hours.\n \nMultiple operation hour ranges can be specified. Ranges cannot overlap.\n" items: $ref: '#/components/schemas/Hours' Currency: type: string description: 'The ISO 4217 alphanumeric currency code in which prices are being returned. ISO 4217 is the International Standard for currency codes. For more information visit [iso.org](https://www.iso.org/). ' example: USD TourLanguage: type: object description: Holds the language of a tour. required: - LanguageCode - LanguageOption properties: LanguageCode: type: string description: 'ISO 639-1 two-letter code of the language used for the language option provided with the product (Tour) / product option (Tour Option). ISO 639 is a standardized nomenclature used to classify all known languages. For more information visit www.iso.org. ' example: en LanguageOption: type: array uniqueItems: true minItems: 1 maxItems: 3 items: $ref: '#/components/schemas/LanguageOption' TieredPerPersonPrice: type: object description: Price root element for tiered per-person pricing. required: - type - prices properties: type: $ref: '#/components/schemas/CalendarPriceType' description: The type of Price. Value must be “TIERED_PER_PERSON_PRICE”. default: TIERED_PER_PERSON_PRICE prices: type: array description: "List of ticket types with relevant prices. \n" items: type: object required: - types - tiers properties: types: $ref: '#/components/schemas/TravelerTypes' tiers: type: array description: "List of price tiers. \n\nEach pricing tier must have a unique min-max combination. Tiers must not overlap. For example: 0-3, 4-8, 9-15.\n\n**Note**: To reduce payload size, multiple types that have the same price tiers can be combined (i.e. ADULT, CHILD). Tiers will apply to each type individually, not combined. \n" items: type: object required: - min - max - retailPrice properties: min: type: integer description: "Minimum number of travelers to purchase for tier price to apply. \n\nA minimum of 0 should be used in at least one tier of each applicable traveler type unless the operator specifically requires a different minimum number of travelers to allow a booking. This is considered the first tier. Using zero as a minimum allows a customer to not book a specific ticket type. \n**For example**: If an infant needs not be booked together with an adult, then the minimum of the first tier for INFANT must be 0. \n\nIf the operator requires a specific number of travelers for a specific traveler type, then the minimum should be set to the desired value. \n**For example**: If an operator requires a minimum of two ADULTS and one CHILD to allow a booking, the minimum in the first ADULT tier must be 2 and the minimum in the first CHILD tier must be 1.\n\nThe minimum for each tier must be greater than the prior tier's maximum unless the value is 0 (first tier).\n" max: type: integer description: 'Maximum number of travelers that can be purchased for tier price to apply. The Maximum of a tier cannot be less than or equal to the prior tier''s minimum. ' retailPrice: $ref: '#/components/schemas/RetailPricePerPerson' netPrice: type: number format: double description: 'The price that may be paid to the operator for the booking (subject to explicit agreement with Viator). ' discount: $ref: '#/components/schemas/Discount' PerPersonPrice: type: object description: Price root element. Holds price information. required: - type - prices properties: type: $ref: '#/components/schemas/PriceType' default: PER_PERSON_PRICE description: 'The type of Price. Value must be “PER_PERSON_PRICE”. Used when price is applied per person/traveler. Represents the per person/traveler price of the product option and associated startTime (when applicable) on the requested travelDate. ' prices: type: array description: List of ticket types with relevant prices items: $ref: '#/components/schemas/PerPersonPriceDetails' TotalTravelers: type: integer description: Total number of travelers/passengers across all ticket types. example: 1 TourOptionItem: allOf: - $ref: '#/components/schemas/TourOptionBase' - type: object properties: Language: $ref: '#/components/schemas/TourLanguage' BookingResponse: description: Root element for Booking Response allOf: - $ref: '#/components/schemas/ResponseBase' - type: object properties: BookingReference: type: string description: Unique booking identifier within Viator's systems. SupplierCommentCustomer: type: string description: Operator's comment for the customer. TourBarcode: type: string description: Represents the operator's reservation system barcode to be displayed on the customer's voucher. The code is printed as per prior agreement with the operator. Barcode is at itinerary level (single barcode irrespective of number of passengers). Traveller: type: array description: Traveler root element. Contains booking confirmation details at traveler level. items: title: Traveller required: - TravellerIdentifier properties: TravellerIdentifier: type: string description: Unique identifier per traveler for the booking. TravellerSupplierConfirmationNumber: type: string description: "Reservation system booking confirmation number per traveler. Number is at traveler level and is unique amongst travelers in the booking. \nThe `TravellerSupplierConfirmationNumber` value can be used to print per person barcodes on vouchers (if previously agreed with operator).\n" TravellerTicket: $ref: '#/components/schemas/TourTicket' TravellerBarcode: type: string description: 'String representing the operator''s reservation system barcode to be displayed on the customer''s voucher for a specific traveler. The code is printed as per prior agreement with the operator. Barcode is at itinerary/traveler level (each traveler will have an individual barcode). ' TravellerSeat: type: string description: 'Seat number assigned to the traveler. The full representation of the seat should be used, this includes any gate, row and seat information that must appear on the traveler''s voucher or ticket. This information should clearly instruct the traveler of the seat location. ' TransactionStatus: description: Transaction status root element. Holds information about the status of the transaction. type: object required: - Status properties: Status: type: string description: Status of the transaction enum: - CONFIRMED - REJECTED RejectionReason: type: string description: 'Reason transaction was rejected. **Mandatory** if status is `REJECTED`. Valid values are: * **NOT_OPERATING -** Tour is not operating on the date for which the booking was made. * **BOOKED_OUT_ALT_DATES -** Tour is booked out but alternative dates will be provided in the `RejectionReasonDetails` * **BOOKED_OUT_ALT_TIMES -** Tour is booked out but alternative times will be provided in the `RejectionReasonDetails` * **OTHER -** Any other reason. Details must be provided in `RejectionReasonDetails`. ' enum: - NOT_OPERATING - BOOKED_OUT_ALT_DATES - BOOKED_OUT_ALT_TIMES - OTHER RejectionReasonDetails: type: string description: 'Extended details pertaining to the reason the transaction was rejected and additional information (i.e. alternatives). **Mandatory** if status is `REJECTED`. ' SupplierConfirmationNumber: type: string description: "Reservation system booking confirmation number per booking itinerary. Number is at itinerary level (single confirmation number irrespective of number of passengers). \nThe `SupplierConfirmationNumber` is used in all subsequent requests pertaining to the booking (i.e. amendments, cancellations, etc.) to identify the booking in the reservation system.\n" TourTicket: $ref: '#/components/schemas/TourTicket' - oneOf: - title: Success description: When `RequestStatus.Status` is `SUCCESS`, `TransactionStatus` and `SupplierConfirmationNumber` must be populated. type: object properties: RequestStatus: type: object properties: Status: enum: - SUCCESS required: - TransactionStatus - SupplierConfirmationNumber - title: Error description: When `RequestStatus.Status` is `ERROR`, no transaction was created, so no further fields are required. type: object properties: RequestStatus: type: object properties: Status: enum: - ERROR TravelDate: type: string format: date description: 'The date of travel. Value is in date format **YYYY-MM-DD**. ' example: '2000-01-21' SpecialOffer: type: object description: Details of a special offer. required: - specialOfferId - name - type - validFrom properties: specialOfferId: type: string description: The special offer identifier. example: A Unique id name: type: string description: "The name of the Special Offer. \nThis will be displayed to the operators on the Viator supply center.\n" example: Valentine's Day type: $ref: '#/components/schemas/SpecialOfferType' validFrom: type: string format: date-time description: "The booking date from which the special offer is valid. \nValue is in Timestamp (UTC) format.\n" example: '2025-02-14T23:59:59Z' validUntil: type: string format: date-time description: "The booking date until which the special offer is valid. \nValue is in Timestamp (UTC) format.\n" example: '2025-02-14T23:59:59Z' CalendarRequest: type: object description: Request object for the Calendar Operation. allOf: - $ref: '#/components/schemas/BaseRequest' - type: object required: - productOptionIds - startDate - endDate properties: productOptionIds: type: array description: "List of reservation system product option identifiers for which availability and pricing is being requested. This identifier is sourced from the [Tour List API](#operation/tourList) response. \n" items: $ref: '#/components/schemas/ProductOptionId' startDate: type: string format: date description: "The start date of the date range for which availability and pricing are requested. \n\nValue is in date format **YYYY-MM-DD**.\n" example: '2026-01-21' endDate: type: string format: date description: "The end date of the date range for which availability and pricing are requested. \n\nValue is in date format **YYYY-MM-DD**.\n" example: '2026-01-25' ReserveUnprocessableContentResponse: type: object description: Response object for Unprocessable Content Reserve Response required: - error properties: error: type: string description: "Code representing error reason. \n\nOne of:\n- INVALID_SUPPLIER - the requested supplier is not valid.\n- API_DISABLED - API endpoint is not enabled for the requested supplier.\n- INVALID_PRODUCT_OPTION - The productOptionID in the request is not valid or does not exist for the supplier.\n" enum: - INVALID_SUPPLIER - API_DISABLED - INVALID_PRODUCT_OPTION example: INVALID_PRODUCT_OPTION message: type: string description: Human readable description of the error reason example: Product option does not exist ProductOptionRequest: type: object description: List of reservation system product options and associated start times for which availability and pricing is being requested. required: - productOptionId properties: productOptionId: $ref: '#/components/schemas/ProductOptionId' startTimes: type: array description: 'Time of product option departure. If not specified, **ALL** startTimes that are valid for the productOptionID applicable to each date in the requested date range **must be returned** in the response. Values are in time format **hh:mm**. ' items: type: string format: time description: Time of product option departure. Values are in time format **hh:mm**. example: 09:00 BaseRequest: type: object description: Base request object. required: - supplierId properties: supplierId: $ref: '#/components/schemas/SupplierId' CalendarEvent: type: object description: 'Represents the presence of availability, along with pricing, of an occurrence of the product option on the travelDate. ' required: - status - capacity - bookingCutoff - price properties: status: $ref: '#/components/schemas/EventStatus' description: 'Status of the event. Must be ''AVAILABLE''. ' example: AVAILABLE startTime: $ref: '#/components/schemas/StartTime' openingHours: $ref: '#/components/schemas/OpeningHours' bookingCutoff: $ref: '#/components/schemas/BookingCutoff' capacity: $ref: '#/components/schemas/EventCapacity' price: description: 'The type of price of an event along with the relevant amounts for requested ticket types. ' oneOf: - $ref: '#/components/schemas/CalendarPerPersonPrice' - $ref: '#/components/schemas/CalendarPerUnitPrice' - $ref: '#/components/schemas/TieredPerPersonPrice' - $ref: '#/components/schemas/CalendarUnsupportedPrice' discriminator: propertyName: type mapping: PER_PERSON_PRICE: '#/components/schemas/CalendarPerPersonPrice' PER_UNIT_PRICE: '#/components/schemas/CalendarPerUnitPrice' TIERED_PER_PERSON_PRICE: '#/components/schemas/TieredPerPersonPrice' UNSUPPORTED_PRICE: '#/components/schemas/CalendarUnsupportedPrice' InternalErrorResponse: type: object description: Error response object required: - error properties: error: type: string description: "Code representing error reason. One of:\n - INTERNAL_ERROR\n" example: INTERNAL_ERROR message: type: string description: Human readable description of the error reason example: Unknown Error BookingCutoff: type: string format: date-time description: 'Booking cut-off represents the point in time after which the tour option may no longer be purchased for the travelDate. Value is in Timestamp (UTC) format. ' example: '2020-06-11T09:16:39Z' EventCapacity: description: "The type of capacity of an event along with the relevant amounts for all ticket types. \n\nUsed to determine if bookings should be permitted, and to drive merchandising decisions. \n\n**All ticket types** applicable to the product **must be returned** (this is irrespective of the types listed in the request).\n" oneOf: - $ref: '#/components/schemas/UnlimitedCapacity' - $ref: '#/components/schemas/LimitedCapacity' discriminator: propertyName: type mapping: UNLIMITED: '#/components/schemas/UnlimitedCapacity' LIMITED: '#/components/schemas/LimitedCapacity' RedemptionResponse: description: Root element for Redemption Response allOf: - $ref: '#/components/schemas/ResponseBase' - type: object properties: RedemptionStatus: type: boolean description: True if any of the booking tickets have been redeemed. Traveller: type: array description: Traveler root element. Contains redemption details at traveler level. items: title: Traveller required: - TravellerIdentifier properties: TravellerIdentifier: type: string description: Unique identifier per traveler for the booking. TravellerSupplierConfirmationNumber: type: string description: "Reservation system booking confirmation number per traveler. Number is at traveler level and is unique amongst travelers in the booking. \nThe `TravellerSupplierConfirmationNumber` value can be used to print per person barcodes on vouchers (if previously agreed with the operator).\n" RedemptionStatus: type: boolean description: True if the traveler ticket has been redeemed. RedemptionDateTime: type: string format: date-time description: The datetime of when the ticket has been redeemed. - oneOf: - title: Success description: When `RequestStatus.Status` is `SUCCESS`, `RedemptionStatus` must be populated. type: object properties: RequestStatus: type: object properties: Status: enum: - SUCCESS required: - RedemptionStatus - title: Error description: When `RequestStatus.Status` is `ERROR`, no redemption lookup was performed, so no further fields are required. type: object properties: RequestStatus: type: object properties: Status: enum: - ERROR RetailPricePerUnit: type: number format: double description: The Recommended Retail Price (RRP) is the total price a customer will pay for a unit or group, assuming the maximum number of travelers (maxTravelers). This price applies immediately and represents the full cost per unit or group. example: 150 TourListResponse: description: Root element for Tour List Response allOf: - $ref: '#/components/schemas/ResponseBase' - type: object properties: Tour: description: Tour root element. Holds product (tour) and product option (tour option) information. type: array items: title: TourItem type: object required: - SupplierProductCode - SupplierProductName - CountryCode - DestinationCode - DestinationName - TourDescription properties: SupplierProductCode: type: string maxLength: 50 description: Reservation system unique product (tour) identifier. SupplierProductName: type: string description: Product (Tour) name (name associated with reservation system product identifier). Language: type: array description: Holds the various languages of the Tour. items: $ref: '#/components/schemas/TourLanguage' CountryCode: pattern: '[a-zA-Z]{2}' type: string description: ISO 3166-1 two-letter code of the country where the Tour is held. ISO 3166 is the International Standard for country codes and codes for their subdivisions. For more information visit [iso.org](https://www.iso.org/). DestinationCode: type: string description: UN/LOCODE representing the city of the Tour. UN/LOCODE includes over 95,721 locations in 243 countries. It is used by most major shipping companies, by freight forwarders and in the manufacturing industry around the world. For more information visit [unece.org](https://unece.org/). DestinationName: type: string description: Location where the tour is being conducted. TourDescription: type: string description: Description of the Tour. TourOption: description: 'Root element for tour options. Holds tour option information. **Note**: For v2.0 endpoints, this is mandatory, as the `productOptionId` is also required. ' type: array items: title: AvailableTourOption type: object description: Details of the tour option. allOf: - type: object properties: productOptionId: type: string description: 'Unique identifier for the product option. Mandatory when integrating with v2.0 endpoints. For products that have no options, the productOptionId uniquely identifies the product (which is in itself a bookable option). ' - $ref: '#/components/schemas/TourOptionBase' - type: object properties: Language: type: array description: Holds the various languages of the Tour Option. items: $ref: '#/components/schemas/TourLanguage' CalendarPriceType: type: string description: "Machine-interpretable value that specifies the type of price in the Calendar API.\n\nOne of:\n - PER_PERSON_PRICE - Product is priced per person/traveler.\n - TIERED_PER_PERSON_PRICE - Product is priced per person/traveler with tiered pricing. Use when a minimum number of travelers is required.\n - PER_UNIT_PRICE - Product is priced per Unit.\n - UNSUPPORTED_PRICE - Used when the price model cannot be mapped to a Viator supported pricing model.\n" enum: - PER_PERSON_PRICE - TIERED_PER_PERSON_PRICE - PER_UNIT_PRICE - UNSUPPORTED_PRICE example: PER_PERSON_PRICE UnavailableEvent: type: object description: Represents the lack of availability of one occurrence of the product option. May be associated with a start time. required: - status - unavailableReason - capacity - bookingCutoff properties: status: $ref: '#/components/schemas/EventStatus' unavailableReason: $ref: '#/components/schemas/UnavailableReason' startTime: $ref: '#/components/schemas/StartTime' capacity: $ref: '#/components/schemas/EventCapacity' bookingCutoff: $ref: '#/components/schemas/BookingCutoff' CapacityType: type: string description: "The capacity type. Represents the type of capacity in an event.\n\nOne of: \n- UNLIMITED - Used when the capacity is unlimited. There is no restriction on the number of bookings.\n- LIMITED - Used when the capacity is limited. Bookings are restricted by capacity.\n" enum: - UNLIMITED - LIMITED example: UNLIMITED AvailabilityCheckResponse: type: object description: Response object for the Real-time Availability check Operation. required: - productOptions properties: productOptions: type: array description: 'List of reservation system product option identifiers for which events (start time, capacity, pricing) is being returned - If a requested product option is absent in the response, it is interpreted as being unavailable for purchase. - If a requested product option is invalid on the reservation system (i.e. non-existent), it must not be returned in the response. ' items: $ref: '#/components/schemas/ProductOption' TourOptionBase: title: TourOptionItem description: Tour option root element. Holds details pertaining to each of the product (tour) options (including default if no tour options exist). properties: SupplierOptionCode: type: string description: 'Reservation system product option (tour option) identifier. A product option is a version or variant of the tour and each option must have a unique code. **Examples:** - A tour that is conducted by a Spanish guide and also by an English guide has two options. - A tour that starts at three different times throughout the day may have three options. This could be because each start time is priced differently or because availability is limited for each starting time. - A Tour that has a luxurious version and a cheaper version is considered to have two options. A list of the operator''s Viator product options can be provided for mapping purposes. ' SupplierOptionName: type: string description: Product option (tour option) name (name associated with product option identifier). TourDepartureTime: type: string description: 'Time of tour option departure. Values should be in time format. **Example:** 09:00:00. ' format: time Option: type: array description: Option root element. Contains additional optional information used to uniquely identify product options. items: type: object required: - Name - Value properties: Name: type: string description: Option name Value: type: string description: Option value RedemptionRequest: description: Root element for Redemption Request allOf: - $ref: '#/components/schemas/RequestResponseBase' - type: object required: - BookingReference - TravelDate - SupplierConfirmationNumber properties: BookingReference: type: string description: Unique booking identifier within Viator's systems. TravelDate: type: string format: date description: "The date of travel for the itinerary item. Date should be in date format **YYYY-MM-DD**. \n**Example:** 2000-01-31\n" SupplierConfirmationNumber: type: string description: "Reservation system booking confirmation number per booking itinerary. Number is at itinerary level (single confirmation number irrespective of number of passengers). \nThe `SupplierConfirmationNumber` is used to identify the booking in the reservation system.\n" securitySchemes: ApiKeyHeader: type: apiKey in: header name: X-Api-Key x-tagGroups: - name: Getting started tags: - What's new - Implementation approach - API overview - Connectivity overview - API configurations - name: API reference tags: - Reservation system APIs - Viator APIs - Beta - name: Reliability & testing tags: - SLAs - Circuit breakers - Contract testing - name: Resources tags: - v2 migration guide - FAQs - Contact us - Appendices - name: Deprecated tags: - Deprecated