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