Every API here is available over the APIs.io API and to AI agents over MCP.
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: "<style>\n/* ----------------------------------------------------------------------\n Stripe-inspired look & feel for the Viator Reservation System API docs.\n Layout (3-panel nav/content/code) is provided by Redoc; this layer adds\n typography, spacing and accent polish using Viator brand colors.\n Accent teal #00876A · dark code rail #0a2a2e · light sidebar #f6f8f8\n Type matches Stripe's scale (16px/400 body, weight-500 headings) and\n uses Stripe's own font stack (Söhne -> system fallback) set in redocly.yaml.\n ---------------------------------------------------------------------- */\n\n/* Logo: Viator wordmark, top-left of the sidebar (Stripe-style placement) */\nimg[alt=\"Viator\"] {\n height: 30px;\n width: auto;\n max-width: 80%;\n margin: 16px 0 10px 16px;\n display: block;\n}\n\n/* Smoother text rendering, closer to Stripe's docs */\nbody,\n.redoc-wrap,\n[data-component-id] {\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n text-rendering: optimizeLegibility;\n}\n\n/* Headings: match Stripe's type scale (weight 500, generous sizes, tight\n tracking). Scoped to .api-content with !important to win over Redoc's\n built-in heading sizes. */\n.api-content h1, .api-content h2, .api-content h3,\n.api-content h4, .api-content h5 {\n font-weight: 500 !important;\n}\n.api-content h1 {\n font-size: 38px !important;\n line-height: 48px !important;\n letter-spacing: -0.02em !important;\n}\n.api-content h2 {\n font-size: 28px !important;\n line-height: 36px !important;\n letter-spacing: -0.018em !important;\n}\n.api-content h3 {\n font-size: 20px !important;\n line-height: 28px !important;\n letter-spacing: -0.012em !important;\n}\n.api-content h4, .api-content h5 {\n font-weight: 600 !important;\n letter-spacing: -0.006em !important;\n}\n\n/* Links: teal with a subtle hover underline */\na, a:visited {\n color: #00876A;\n text-decoration: none;\n}\na:hover {\n color: #00694f;\n text-decoration: underline;\n}\n\n/* Sidebar: light, airy, Stripe-like with a thin divider */\n.menu-content {\n border-right: 1px solid #e3eae9;\n}\n.menu-content label[role=\"menuitem\"]:hover,\n.menu-content li[role=\"menuitem\"]:hover {\n background-color: #eef3f2;\n}\n\n/* Active nav item: teal accent bar */\n.menu-content label.active,\n.menu-content li.active > label {\n color: #00876A;\n box-shadow: inset 3px 0 0 0 #00876A;\n}\n\n/* Search box: rounded, soft border to match Stripe's input style */\n[role=\"search\"] input,\n.search-input {\n border: 1px solid #d7e0df !important;\n border-radius: 8px !important;\n}\n\n/* Center and add border to all images (preserved from original) */\np img {\n border-radius: 4px;\n border: 1px solid #ddd;\n margin-left: auto;\n margin-right: auto;\n display: block;\n margin-bottom: 28px;\n}\n</style>\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: <YOUR_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\": \"<YOUR_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\": \"<YOUR_API_KEY>\",\n \"Content-Type\": \"application/json\",\n },\n json=payload,\n)\nprint(response.json())\n"
- lang: PHP
label: PHP
source: "<?php\n$payload = <<<'JSON'\n{\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}\nJSON;\n\n$ch = curl_init(\"https://your-reservation-system.example.com/v2/availability/check\");\ncurl_setopt($ch, CURLOPT_POST, true);\ncurl_setopt($ch, CURLOPT_HTTPHEADER, [\n \"X-Api-Key: <YOUR_API_KEY>\",\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: <YOUR_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\": \"<YOUR_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\": \"<YOUR_API_KEY>\",\n \"Content-Type\": \"application/json\",\n },\n json=payload,\n)\nprint(response.json())\n"
- lang: PHP
label: PHP
source: "<?php\n$payload = <<<'JSON'\n{\n \"supplierId\": 1004,\n \"productOptionIds\": [\n \"r1172330\"\n ],\n \"startDate\": \"2026-01-21\",\n \"endDate\": \"2026-01-25\"\n}\nJSON;\n\n$ch = curl_init(\"https://your-reservation-system.example.com/v2/availability/calendar\");\ncurl_setopt($ch, CURLOPT_POST, true);\ncurl_setopt($ch, CURLOPT_HTTPHEADER, [\n \"X-Api-Key: <YOUR_API_KEY>\",\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: <YOUR_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\": \"<YOUR_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\": \"<YOUR_API_KEY>\",\n \"Content-Type\": \"application/json\",\n },\n json=payload,\n)\nprint(response.json())\n"
- lang: PHP
label: PHP
source: "<?php\n$payload = <<<'JSON'\n{\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}\nJSON;\n\n$ch = curl_init(\"https://your-reservation-system.example.com/v2/reserve\");\ncurl_setopt($ch, CURLOPT_POST, true);\ncurl_setopt($ch, CURLOPT_HTTPHEADER, [\n \"X-Api-Key: <YOUR_API_KEY>\",\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: <YOUR_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\": \"<YOUR_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\": \"<YOUR_API_KEY>\",\n \"Content-Type\": \"application/json\",\n },\n json=payload,\n)\nprint(response.json())\n"
- lang: PHP
label: PHP
source: "<?php\n$payload = <<<'JSON'\n{\n \"supplierId\": 3456,\n \"specialOfferIds\": [\n \"A Unique id\",\n \"A-unique-id-2\"\n ]\n}\nJSON;\n\n$ch = curl_init(\"https://your-reservation-system.example.com/v2/product/special-offers\");\ncurl_setopt($ch, CURLOPT_POST, true);\ncurl_setopt($ch, CURLOPT_HTTPHEADER, [\n \"X-Api-Key: <YOUR_API_KEY>\",\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: <YOUR_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\": \"<YOUR_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\": \"<YOUR_API_KEY>\",\n \"Content-Type\": \"application/json\",\n },\n json=payload,\n)\nprint(response.json())\n"
- lang: PHP
label: PHP
source: "<?php\n$payload = <<<'JSON'\n{\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}\nJSON;\n\n$ch = curl_init(\"https://your-reservation-system.example.com/tourlist\");\ncurl_setopt($ch, CURLOPT_POST, true);\ncurl_setopt($ch, CURLOPT_HTTPHEADER, [\n \"X-Api-Key: <YOUR_API_KEY>\",\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:
# --- truncated at 32 KB (209 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/viator/refs/heads/main/openapi/viator-reservation-system-apis-api-openapi.yml