Viator Reservation system APIs API

This section describes all the possible services, some of which are mandatory, that reservation systems can develop to integrate with Viator. All 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. ### Authentication These 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. ### BookingCutoff and Capacity elements The [Availability response](#tag/Reservation-system-APIs/operation/availability) includes two elements used to determine whether a booking can proceed: - **`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). - **`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. Both elements are part of the [Availability response schema](#tag/Reservation-system-APIs/operation/availability) — see that operation for the full field definitions.

Operations 9

POST /v2/availability/check Availability Check #
POST /v2/availability/calendar Calendar #
POST /v2/reserve Reserve #
POST /v2/product/special-offers Special Offers #
POST /tourlist Tour list #
POST /booking Booking #
POST /booking-amendment Booking Amendment #
POST /booking-cancellation Booking Cancellation #
POST /redemption Redemption #

Documentation

Specifications

Other Resources

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/viator-reservation-system-apis-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

viator-reservation-system-apis-api-openapi.yml Raw ↑
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