{
"openapi": "3.0.0",
"info": {
"title": "Viator Reservation System 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\u2019s 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\u2019t hesitate to [contact us here](#tag/Contact-us).\n"
},
"tags": [
{
"name": "What's new",
"description": "This section outlines the key updates and new features in the latest version of the Operator Connectivity API specifications:\n\n## Versioning System\nThe Operator Connectivity API now uses versioning for backward compatibility and smoother updates. Existing legacy endpoints are considered version 1.0, while versions of new endpoints begin with 2.0.\n\nTo allow early access and feedback on upcoming endpoints before release, a Beta program has been introduced. This allows partners to evaluate pre-production versions. Review the [Beta](#tag/Beta) section for newly introduced endpoints.\n\nAs new versions of the endpoints are introduced, older versions and endpoints that were replaced are set for deprecation. \n\nReview the [Deprecated](#tag/Deprecated) section for a list of endpoints scheduled for deprecation.\n\n## Authentication Header\nVersion 2.0 and above endpoints now expose the API key on the HTTP headers. Backward compatibility for legacy v1 endpoints continues to be supported, no changes required at this point, but header key authentication is also supported on v1 endpoints.\n\n## Content Type\nVersion 2.0 and above endpoints communicate using the JSON standard. Therefore, the headers \"Content-Type\" and \"Accept\" accept only \"application/json\".\n\nXML (`application/xml`), previously offered on v1.0 endpoints, is now **deprecated** and is not supported for new integrations \u2014 JSON is the only supported format going forward. Existing v1.0 XML integrations continue to work; see the [Deprecated](#tag/Deprecated) section.\n\n## Product Option identification\nA simplified product variant (aka product option) identifier has been introduced to allow reservation systems to define a unique single identifier to identify any product variant. This new identifier is applicable only to v2.0 APIs and **must be returned** in the [Tour List API](#tag/Reservation-system-APIs/operation/tourList). \n\n## Pricing Capabilities\nOne of the most impactful changes with the new version is the introduction of pricing capabilities that support all of Viator's existing pricing models, including per person price, tiered per person price and unit price.\n\n## Notification Webhooks\nVersion 2.0 introduces new Viator hosted endpoints that enable reservation systems to communicate updates to Viator regarding:\n- Salability (availability status)\n- Capacity (remaining seats or spaces)\n- Pricing (current rates)\n- Special Offers (discount merchandising)\n\nThese endpoints ensure that customers always see accurate, current, inventory and pricing as provided by operators through reservation systems. \n\n## Reservation\nVersion 2.0 introduces a new endpoint that allows Viator to request the reservation of inventory and price before the booking is made. In V1.0 inventory was held via the [Real-time Availability API](#operation/availability) request using the AvailabilityHold attribute. In V2.0, this process has moved to the new endpoint that now also expects pricing to be held. \n\n\n## Contract Testing\nFor version 2.0 APIs a contract testing tool is available to help ensure that services are performing according to specification. The tool provides multiple test cases, along with parameters required to perform the tests, for each API. For more information review the Contract Testing Tool section under [Contract Testing](#tag/Contract-testing)."
},
{
"name": "Implementation approach",
"description": "1. **Project Kick-off Meeting** - Scheduled by Viator technical resources after initial contact with the Supplier. The following should be discussed:\n- Determine Project Team Members\n- Scope of Implementation (capabilities to be supported)\n- Agree on Preliminary Time Lines\n- Determine Project Team Communication Method\n\n2. **Specification Review and Data Mapping** - Reservation systems review API specifications in preparation for development. This step includes:\n- Review of API specifications\n- Mapping API fields to reservation system fields\n- Mapping API product structure\n\n3. **Specification Clarifications** - Reservation system will raise clarifications with Viator. \n- This can be done via email or phone. \n\n4. **API Development** - Reservation system will commence development of the necessary APIs. This includes:\n- Development of reservation system services\n- Development of Viator service requests \n- Contract testing\n\n5. **Test Environment Configuration** - Viator will configure the test environment in preparation for certification testing. This step includes:\n- API configuration \n- Product mapping \n\n6. **Certification Testing** - Reservation system and Viator will conduct various certification tests to ensure APIs are working as expected. This step includes:\n- Agreeing on test products\n- Agreeing on a test schedule\n- Test Execution and reporting (typically over email)\n\n7. **Production Environment Configuration** - Viator will configure the production environment. This step includes:\n- API configuration \n- Product mapping\n\n8. **Go Live** - Viator and reservation system prepare for Go Live. This includes:\n- Schedule Go Live date\n- \"Switch On\" the API, initially for a small number of products\n- Transaction monitoring and issue resolution\n- Roll out all applicable products\n- Sign-off by reservation system and Viator"
},
{
"name": "API overview",
"description": "Integration with the Viator Reservation System API presents considerable strategic benefits for operators and reservation systems. It substantially enhances distribution and sales capabilities by furnishing Viator with a more comprehensive inventory and real-time transaction capabilities.\n\nAPI integration with Viator is essential for accommodating last-minute bookings, allowing operators to sell remaining inventory until their specified booking cutoff. Furthermore, the API automates availability and pricing synchronization and booking transactions that lead to higher accuracy and reduced operator overhead.\n\nThe API's primary functionalities encompass:\n- Pricing and availability synchronization with capacity administration\n- Departure time synchronization\n- Booking reservation and confirmation\n- Post-booking transaction automation \n\nAdditional advantages of API integration include:\n\n- Streamlined Reconciliation: The Viator booking confirmation number is sent to the operator's reservation system via API. This number, along with the operator's confirmation or order number, is displayed on Viator customer vouchers/tickets, allowing for booking reconciliation within the operator's reservation system.\n\n- Barcode Compatibility: The API allows reservation systems to generate barcodes that can be integrated into Viator customer paper or smartphone vouchers/tickets. This functionality is particularly important for operators who use barcode scanners for activity entry.\n\n- Product Identification: Viator customer vouchers display the operator's product identifiers, which are correlated with Viator's own identifiers. This correlation allows operators to have a clearer identification of the product purchased by the customer.\n\n\n## Introduction\nThis section provides details pertaining to the API supported business processes, security, communication, testing, and implementation.\nAchieving integration with Viator requires the use of both Viator and supplier built APIs:\n\n- [Reservation System APIs](#tag/Reservation-system-APIs): Services developed by the reservation system / booking software and consumed by Viator.\n- [Viator APIs](#tag/Viator-APIs): Services developed by Viator and consumed by reservation systems / booking software.\n\nThis document provides detailed specifications for each service along with testing tools and migration guides, establishing a standard for integration with Viator.\n\n## Supported processes\nThe Viator Reservation System APIs have been designed to support a number of business processes, these include:\n\n- **Product validation and mapping** - supported by the [Tour List API](#operation/tourList).\n- **Price and availability synchronization** - supported by the [Availability and pricing](#tag/Connectivity-overview/Availability-and-Pricing) APIs.\n- **Special Offer Merchandising** - supported by the [Special Offers API](#operation/specialOffers) and [Special Offers Notification Webhook](#operation/specialOffersNotification)\n- **Reservation and booking** - supported by the [Reserve](#operation/reserve) and [Booking](#operation/booking) APIs.\n- **Post booking transactions** - supported by the [Booking Amendment](#operation/bookingAmendment) and [Booking Cancellation](#operation/bookingCancellation) APIs.\n- **Redemption verification** - supported by the [Redemption API](#operation/redemption). \n\n## Security\n\nAll APIs will use the **Hypertext Transfer Protocol Secure** (HTTPS). \n\nAuthentication is achieved by the use of **API keys**, supplied within the header (v1.0 and v2.0 endpoints) or the payload (v1.0 endpoints only) of each request. A unique API Key is assigned for each Operator account. \n\n## Webservice architecture\n\nThe Viator Reservation System APIs support **RESTful** architecture. **JSON (`application/json`) is the only supported format for new integrations.** **XML (`application/xml`) is deprecated** \u2014 it remains available for existing v1.0 integrations only, will receive no further updates, and is scheduled for eventual retirement. All v2.0 endpoints are JSON-only. See the [Deprecated](#tag/Deprecated) section for details.\n\nAll RESTful APIs use **POST** methods only, **GET, DELETE, PUT, etc.** methods are NOT currently supported. The message body of the POST request/response will include the payload described in this document."
},
{
"name": "Connectivity overview",
"description": "The following sections detail the operational impact of integration and endpoints on overall connectivity, operator processes, and customer experience.\n\nThe API structure is organized into three primary categories:\n\n- [Catalog operations](#tag/Connectivity-overview/Catalog-operations)\n- [Availability and pricing](#tag/Connectivity-overview/Availability-and-Pricing)\n- [Booking operations](#tag/Connectivity-overview/Booking-operations)\n- [Booking redemption](#tag/Connectivity-overview/Booking-redemption)\n\n## Catalog operations\n### Tour list\n\nThe [Tour List API](#tag/Reservation-system-APIs/operation/tourList) streamlines the mapping of an operator's reservation system inventory (products and product options) to Viator's equivalent. These mapped values are then used in subsequent transaction requests, where Viator transmits requests using the reservation system's identifiers.\n\nThe details returned in the Tour List API are surfaced in the **Product Connection** tab of the Viator supply center to facilitate accurate inventory mapping between the two systems. \n\nMapped inventory **must** have capacity (available for sale). If a product cannot be mapped, there is likely a problem with the Tour List API response or with the inventory capacity (not available for sale, issue with availability API\u2019s response). The technical team at the reservation system is typically better equipped to resolve such scenarios. \n\n## Availability and Pricing\n**Support for the following APIs is a mandatory integration requirement**, highlighting their fundamental role in efficient inventory and pricing management for operators, and overall impact to the customer booking experience. \n\nIntegrating our comprehensive suite of availability and pricing APIs revolutionizes how operators manage availability and pricing of their inventory, significantly reducing the need for tedious manual updates within the management center. This powerful collection includes a set of distinct APIs, each tailored to streamline specific aspects of the operations and customer experience:\n\n- [Calendar API](#tag/Reservation-system-APIs/operation/calendar) (v2.0) - Empowers Viator to access and retrieve long term availability, pricing and special offer (promotions) information from the reservation system. This allows Viator customers to view available dates and prices on the product details page calendar. For operators, these APIs automate the regular updates of availability, pricing and special offers, eliminating the need for manual intervention through the Viator supply center. This API replaces both the Batch Availability and the Batch Pricing APIs (both of which are v1.0).\n\n- [Availability Check API](#tag/Reservation-system-APIs/operation/availabilityCheck) (v2.0) - Designed for real-time usage through the booking flow, this API enables Viator to verify capacity (availability for sale) in real-time throughout the customer\u2019s progression through the booking funnel. This ensures that customers always see the most current availability and pricing information, preventing overbookings, erroneous customer charges, encouraging last minute bookings and enhancing the overall customer experience. This capability is crucial for supporting operators' dynamic, fluctuating pricing strategies and responding instantly to market demands. This API replaces the Real-time Availability API (v1.0).\n\n- [Event Notifications](#tag/Viator-APIs/operation/eventNotification) (v2.0) - This critical endpoint hosted by Viator provides reservation systems the ability to notify Viator when changes are made to pricing, or when changes occur to capacity and availability. This not only ensures Viator\u2019s pricing always reflects the operator\u2019s desired price, it enables Viator to allow or prevent overbookings, and it is especially important to drive bookings for last minute availability. \n\n- [Special Offer Notifications](#tag/Viator-APIs/operation/specialOffersNotification) (v2.0) - This endpoint allows for the notification of new or updated Special Offers to Viator, ensuring that Viator accurately merchandises discounted inventory. The updates provide merchandising signals for customers, increasing the visibility of the offers and thereby boosting bookings.\n\n- [Special Offers API](#tag/Reservation-system-APIs/operation/specialOffers) (v2.0) - Retrieves the Special Offers metadata required for Viator to accurately apply special offer rules and provides operators with visibility into the merchandising signals associated with their inventory. \n\nBy leveraging these APIs, you can automate a significant portion of operational tasks, leading to improved accuracy, reduced operational overhead, and a more responsive and efficient system for managing availability, pricing and special offers. This automation not only streamlines operators\u2019 internal processes but also enhances the customer experience by providing up-to-date and reliable information.\n\n## Booking operations\nThe following booking operations APIs are available and, with the exception of the booking amendment API, **are mandatory to support**:\n\n### Reserve\nThe [Reserve API](#tag/Reservation-system-APIs/operation/reserve) (v2.0) is designed to hold inventory and price for a booking. \n\nThis API supersedes the InventoryHold function previously available in the Real-time Availability API (v1.0). Viator requires reservation systems to hold inventory for a specific duration, facilitating a seamless customer experience by allowing adequate time for payment completion during checkout. This mechanism helps operators avoid overbookings while also preventing inventory from being held unnecessarily. Reservation systems are encouraged to release previously reserved inventory if a booking is not confirmed within a predefined duration.\n\nThis API must only be used in combination with [Availability and Pricing](#tag/Connectivity-overview/Availability-and-Pricing) v2.0 APIs. \n\n### Booking\nThe [Booking API](#tag/Reservation-system-APIs/operation/booking) creates a booking in the operator's reservation system upon successful customer payment. This transmission finalizes the booking process.\n\nOperators are not notified via email when a booking is successfully transmitted by the API. However, if an API booking attempt is unsuccessful, the booking fallback process is initiated, which then notifies operators of bookings via email.\n\n### Booking Amendment\nThe [Booking Amendment API](#tag/Reservation-system-APIs/operation/bookingAmendment) allows changes to confirmed bookings to be sent to the operator\u2019s reservation systems. Customers can request booking amendments after payment and booking confirmation, but before travel.\n\nPermissible amendments:\n- Lead traveler's name\n- Traveler mix\n- Travel date\n- Hotel details\n- Tour option\n\nOperators will receive booking amendment email notifications only if an API booking amendment attempt is unsuccessful. Successful API booking amendments do not generate email notifications for operators.\n\n### Booking Cancellation\nThe [Booking Cancellation API](#tag/Reservation-system-APIs/operation/bookingCancellation) streamlines the cancellation and refund process for confirmed bookings. It automates the cancellation request by transmitting it directly to the operator's reservation system. This not only minimizes administrative tasks for operators but also guarantees precise inventory representation, facilitating the resale of tickets.\n\nOperators will receive booking cancellation email notifications only if an API booking cancellation attempt is unsuccessful. Successful API booking cancellations do not generate email notifications for operators.\n\n## Booking redemption\nThe [Booking Redemption API](#tag/Reservation-system-APIs/operation/redemption) provides Viator visibility into the redemption status of a confirmed booking at the time a customer makes a cancellation request to ensure refunds are processed accordingly. "
},
{
"name": "API configurations",
"description": "## Integration configuration\nConfigurations must be determined and applied to both Viator and reservation systems to enable communication via the APIs. The following configuration items must be determined during the project initiation phase:\n\n- **Integration capabilities** - provided by the reservation system, these are the APIs supported by the reservation system (including mandatory APIs).\n- **Reservation system endpoints** - provided by the reservation system for each of the services supported.\n- **Supplier ID** - provided by Viator in preparation for testing, the `SupplierId` uniquely identifies an operator in Viator systems\n- **Reseller ID** - provided by Viator (for v1.0 APIs only) in preparation for testing.\n- **API key** - provided by Viator in preparation for testing and Go Live. The API key is used for authentication\n\n## Product mapping\nViator systems will make API requests to the reservation systems using the reservation system\u2019s product identifiers. The reservation system\u2019s product identifiers are typically provided to Viator via the [Tour List API](#operation/tourList). These are mapped to Viator products so that subsequent transactions utilize the reservation system product identifiers.\n\nThe API supports multiple fields that can be used to identify products and product options (aka product variants), i.e., a product option typically has either different pricing or inventory levels from other options of the same product.\n\nIn the APIs the following fields can be used as identifiers of products and/or product options. The supplier determines which of the below fields it needs to use to correctly interpret what product or product option an API request is for.\n\n* `SupplierProductCode` \u2013 this is the only mandatory product identification field in Viator APIs. It is meant to be used for a code (key) that uniquely identifies a product.\n * **Note**: this field has a maximum length of 50 characters or less and must not include the pipe (`|`) character; product codes longer than this will fail.\n* `SupplierOptionCode` \u2013 this field is optional. It is used when a product has multiple options, it identifies an option (or a variant) of the product.\n* `Name/Value` - a max of four key/value pairs can optionally be used in conjunction with the `SupplierOptionCode` to uniquely identify a product variant. These appear under the `Option` element in the APIs. Similar to `SupplierOptionCode` they can be used to identify an option. \n* `productOptionId` - this field has been introduced with v2.0 and is applicable only to v2.0 APIs. It is a single identifier for the product variant. This identifier will in the future replace `SupplierOptionCode` and `Name/Value` fields.\n\n## Pricing rates mapping\n\nViator currently only supports a limited group of pricing rates: Adult, Child, Youth, Infant and Senior. Reservation Systems and operators may support other pricing rates.\n\nWe recommend the following mapping of various pricing rates to Viator supported options.\n\n| **Reservation System Price Rates** | **Viator Price Rates** |\n|----------------------------------------|--------------------------------------|\n| Adult | Adult |\n| Child | Child |\n| Youth | Youth |\n| Infant | Infant |\n| Senior | Senior |\n| Concession | Senior |\n| Veteran | Senior |\n| Pensioner | Senior |\n| Student | Youth |\n| Teenager | Youth |\n| Toddler | Infant |\n| Baby | Infant |\n| Everyone | Adult |\n| Other | Adult |\n| Family Price. | **Not Supported** |\n\nViator also supports the concept of unit pricing. For products priced in this manner the following is recommended:\n\n| **Reservation System Price Rates** | **Viator Price Rates** |\n|----------------------------------------|--------------------------------------|\n| Car | Unit |\n| Boat | Unit |\n| Vehicle | Unit |\n| Group | Unit |\n\n## Booking Cut-off\nThe booking cut-off value is a time, prior to a sellable item's start time, after which booking may no longer be accepted by the reservation system; for example, a particular tour might not accept bookings if it is less than 24 hours before the start time.\n\nFor connected products, this value is provided to Viator via the `bookingCutoff` element of the [Availability and pricing](#tag/Connectivity-overview/Availability-and-Pricing) API responses.\n\n#### BookingCutoff Usage\n\nThe `bookingCutoff` will be used to prevent bookings from taking place after the time specified in the `bookingCutoff`. It is also used to inform customers how long they have left before a booking cut-off restriction prevents them from booking. This aims to both drive customers to make a purchase and improve the customer experience by minimizing unexpected booking failures."
},
{
"name": "SLAs",
"description": "## Uptime\n**Viator** and integrated **reservation systems** must guarantee a target API availability of:\n\n- For critical, synchronous APIs like Real-Time Availability and Booking and also for Viator Inbound APIs expected target of **99.8%**. It will be an acceptable target of 99.5%.\n- For APIs where usage is asynchronous (e.g., batch data synchronization) and therefore the business impact of temporary availability loss is less severe compared to synchronous booking operations, a target of **99.5%**. It will be an acceptable target of 99%.\n\n## Latency\nViator's proposal acknowledges that APIs used in **real-time** are inherently more critical and thus require **stringent (tighter) latency targets**.\nConversely, **data-sync APIs** can be assigned **more relaxed latency targets**, reflecting their lower impact on immediate user interaction and conversion. \nThe following table presents the latency targets, broken down by APIs.\n\n| **APIs** | **Expected P90** (secs) | **Acceptable** (secs) | **Longest Allowed** (secs)|\n|-----------------------------------------------------------|-------------------------|-----------------------|---------------------------|\n| Availability Check | < 1 | 3 | 10 |\n| Reserve | < 1 | 3 | 28 |\n| Booking (includes amendment, redemption and cancellation) | < 5 | 10 | 28 |\n| Calendar | < 5 | 10 | 20 |\n| Tourlist | < 10 | 15 | 60 |\n\n\nFor Viator inbound APIs the latency targets are:\n\n| **APIs** | **Expected P90** (secs) | **Acceptable** (secs) |\n|-------------------------------------|-------------------------|-----------------------|\n|Event Notification API Beta | < 1 | 2 |\n|Special Offers Notification API Beta | < 1 | 2 |\n\n## Error Rate\nThe following table describes the API Types and the respective maximum error rates.\n\n| **API type** | **Maximum acceptable error rate** (Monthly) |\n|---------------------------------------------------------|---------------------------------------------|\n|Availability Check | < 1.5% |\n|Reserve | < 1.5% |\n|Booking(includes amendment, redemption and cancellation) | < 0.75% |\n|Calendar | < 1% |\n|Tourlist | < 0.5% |\n\nFor Viator inbound APIs the error targets are:\n\n| **API type** | **Maximum acceptable error rate** (Monthly) |\n|------------------------------------|---------------------------------------------|\n|Event Notification API Beta | < 0.5% |\n|Special Offers Notification API Beta| < 0.5% |\n\n\n## Throughput\nTo ensure system stability, Viator and the Integrated Reservation System agree to the following throughput limits. These are calculated based on the total number of connected products to ensure the infrastructure scales alongside the business.\n\n### Throughput Calculation Logic\nCapacity is determined by a **Product Multiplier (X)**, defined as:\n- X = Total number of connected products, divided by **10,000** (rounded up to the nearest ten thousand).\n- **Minimum Value**: For systems with fewer than 10,000 products, **X = 1**.\n\n\n| **API** | **RPS (Sustainable)** | **RPS (Peak)** |\n|--------------------------------------------------------|---------------------------|----------------|\n|Availability Check | X x 10 | X x 20 |\n|Reserve | X x 5 | X x 10 |\n|Booking(includes amendment, redemption and cancellation)| X x 5 | X x 10 |\n|Calendar | X x 30 | X x 60 |\n|Tourlist | X | X x 2 |\n\n\nFor Viator inbound APIs the throughput targets are:\n| **API** | **RPS (Sustainable)** | **RPS (Peak)** |\n|-------------------------------------|-----------------------|----------------|\n|Event Notification API Beta | X x 10 | X x 30 |\n|Special Offers Notification API Beta | X x 2 | X x 4 |\n\n\nExample for Availability Check: **RPS (sustainable)** = X x 10, **RPS (peak)** = X x 20\n\n\n| **Total Products** | **Multiplier (X)** | **RPS (Sustainable)** | **RPS (Peak)** |\n|--------------------|--------------------|-----------------------|----------------|\n| 1 - 10,000 | 1 | 10 | 20 |\n| 15,000 | 2 | 20 | 40 |\n| 42,000 | 5 | 50 | 100 |\n\n\n## Time to acknowledge and solve an issue\nBelow is the descriptive table outlining the Viator Proposal for Mean Time To Acknowledge (MTTA) and Mean Time To Recovery (MTTRs) for Reservation and Viator systems. The values presented are contingent upon the Severity Level and the resulting business impact.\n\n\n| **Severity Level** | **Reservation System** (Business Impact) | **Viator** (Business Impact) | **Target MTTA** (business days) | **Target MTTRs** (business days) |\n|------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------|---------------------------------|----------------------------------|\n|**S1 - Critical Outage** |**Reservation system unreachable** or core endpoints inaccessible to all the suppliers |**Endpoints unreachable**; Impact on all of the reservation systems | < 2 | < 5 |\n|**S2 - Major Disruption** |Supplier segment impacted; Real time capabilities impacted; Supplier Authentication issues; |Supplier segment impacted; Authentication issues; | < 3 | < 14 |\n|**S3 - Moderate/Low Impact** |Supplier segment impacted; Non real time capabilities impacted; Minor bug, SAPI API, or general question/request; minimal impact on core services.|Contract testing: Certification testing process; Minor API inconsistencies.| < 5 | < 90 |\n\n\n"
},
{
"name": "Circuit breakers",
"description": "Circuit breakers are implemented to preserve system stability by isolating reservation systems experiencing functional degradation. A circuit breaker will OPEN (stopping all requests) when a capability's performance crosses an unacceptable threshold. \n\nThe following outlines the rules and thresholds governing circuit breaker activation and deactivation:\n## Failure Criteria\nA transaction is classified as a failure if it meets either of the following conditions:\n- **Unexpected Error**: The reservation system returns an error that is not considered an expected, functional error. For example, INTERNAL_SERVER_ERROR is counted as a failure, whereas expected errors like INVALID_PRODUCT are not.\n- **Slow Response**: The request duration exceeds the defined Slow Call Duration threshold for the specific capability.\n## Activation Condition\nFailure rate and slow calls are only taken into consideration when the traffic volume for a given capability is above a defined minimum value. If the transaction rate does not meet this Minimum number of calls per minute, the circuit breaker remains CLOSED (allow all requests).\n## Deactivation Condition\nOnce the circuit is OPEN, it stays in this state for a defined \"Time Spent Open\" duration. After this duration, the system allows a limited \"Calls While Open\" number of requests to pass through as a test (HALF_OPEN). The success rate of these test requests is compared to the \"Failure Rate Threshold\". If the test failure rate is still above the threshold, the circuit remains OPEN, and the timer is reset. If the test failure rate is below the threshold, the circuit transitions to the CLOSED state, and normal service requests are resumed.\n## Operational Thresholds\nThe following table defines the current parameters used to determine when a circuit breaker opens for each capability:\n\n| **APIs** | **Failure Rate Threshold (%)**| **Slow Call Duration (secs)** | **Minimum Calls / Minute**|**Time Spent Open (secs)**|**Calls While Open**|\n|--------------------|-------------------------------|-------------------------------|---------------------------|--------------------------|--------------------|\n| Availability Check | 70 | 10 | 10 | 30 | 5 |\n| Calendar | 75 | 20 | 15 | 60 | 7 |\n| Special Offer | 80 | 10 | 5 | 30 | 2 |\n| Redemption | 80 | 10 | 8 | 30 | 4 |\n| Tour List | 70 | 60 | 5 | 30 | 3 |\n## Parameter Definitions\n| **Parameter** | **Description** | **Condition Type** |\n|-------------------------|---------------------------------------------------------------------------------------------|--------------------|\n|Failure Rate Threshold |Maximum acceptable failure rate percentage. |Activation |\n|Slow Call Duration |A predefined maximum time threshold for a response. |Activation |\n|Minimum Calls / Minute |Minimum traffic volume required for the failure rate to be considered for circuit activation.|Activation |\n|Time Spent Open |Duration the circuit remains in the OPEN state before transitioning to HALF_OPEN. |Deactivation |\n|Calls While Open |Number of test requests allowed during the HALF_OPEN state. |Deactivation |"
},
{
"name": "Beta",
"description": "The Beta section introduces new endpoint versions, offering our Beta partners early access to features for review and prototyping. Developers can use these Beta endpoints to speed up adoption and to provide feedback on API functionality and usability.\n\nWhilst intended for production release, these APIs may undergo modifications during the Beta phase if critical issues are identified. Developers may need to adjust their implementations if a change is deemed necessary. All changes to Beta endpoints will be communicated to Beta partners.\n\nPlease email the [API integrations team](mailto:SupplierAPI@viator.com) to provide feedback."
},
{
"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 \u2014 `ADULT`, `CHILD`, `INFANT`, `YOUTH`, `SENIOR` \u2014 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) \u2014 see that operation for the full field definitions."
},
{
"name": "Viator APIs",
"description": "This section describes the Viator built API(s) available for reservation system consumption.\n\n**Note**: For these APIs, the request is sent **to** Viator and the response is received **from** Viator."
},
{
"name": "Contract testing",
"description": "The Contract Testing Tool is a self-service tool provided by Viator to assist reservation systems in testing and validating their API integration for v2 APIs (v1 APIs are not supported).\n\nThis tool is a web application (meant to be executed locally) that includes a complete suite of contract tests that enables developers to test their endpoints. Endpoints need not be exposed externally for tests to run.\n\n### Configuration and Execution\n\nThe first step is to make sure you have [Docker desktop](https://www.docker.com/products/docker-desktop/) installed and running.\n\nThen, get the values of your API Key and SupplierID (provided by Viator after the Kick-off Meeting) and set them as environment variables as follows:\n\n```env\nexport API_KEY=\nexport SUPPLIER_ID= (e.g. 123456789)\n```\n\nFinally, run the Contract Testing Tool using the following commands:\n\n```bash\ndocker pull public.ecr.aws/viator/cica:latest\ndocker run -it --rm --name viator-contract-testing -p 5173:5173 -p 8989:8989 \\\n -e API_KEY=$API_KEY -e SUPPLIER_ID=$SUPPLIER_ID \\\n --add-host=host.docker.internal:host-gateway \\\n public.ecr.aws/viator/cica:latest\n```\n\n### Usage\nAccess the application at [http://localhost:5173](http://localhost:5173).\nThe tool is organized into a Configuration page for initial setup and dedicated Capability pages for executing test scenarios.\n\n#### 1. Pre-Execution Setup (Configuration Page)\n\nBefore running tests, use the Configuration page in the left panel to streamline your workflow:\n\n- Global Defaults: Parameter values used as a fallback when executing test cases if values are not provided elsewhere.\n \n- Test Product Option Mapping: Values provided here are used when executing any test case associated to the Test Product Option.\n\nConfiguration Priority: The tool resolves inputs in the following order: Test Case Input (highest) > Test Product Option Config > Global Defaults (fallback).\n\n#### 2. Test Execution (Capability Pages)\n\nIn the left panel, you will find a list of `capabilities` (e.g., AVAILABILITY). After selecting a capability, the main page will present a set of `scenarios` which are test cases that can be executed.\n\nTo execute a test case against a reservation system endpoint:\n\n - Expand the test case by clicking on it.\n \n - Fill the `Capability Endpoint` or the `Global Endpoint` (when the same endpoint serves all the capabilities) with the full URL of the API endpoint being tested.\n - Note: if you are running your API locally you must insert `http://host.docker.internal:/your-api-path` instead of `http://localhost:/your-api-path` as the contract testing tool is running on docker.\n \n - Fill the form inputs required by the scenario being tested.\n \n - Click on `Execute Test` and view the Test Report.\n\nTo execute a test case against a Viator endpoint (e.g. Event Notification):\n\n- Send a request to the endpoint displayed in the tool from your local/test system.\n\n- Expand the scenario to view the test result."
},
{
"name": "v2 migration guide",
"description": "The following outlines the essential steps and considerations for migrating to the v2 pricing and availability endpoints. Adhering to these requirements will ensure a smooth transition and maintain data integrity.\n\nThe following table describes the v1 endpoints that will be superseded by the respective v2 endpoints.\n\n| v1 | v2 |\n|--------|--------------------------------------------------------------------------------------------|\n|Real-time Availability API|Availability Check API & Reserve API|\n|Batch Availability API|Calendar API|\n|Batch Pricing API|Calendar API|\n|Availability Notifications (2) API|Event Notifications API|\n|N/A|Special Offers Notifications API|\n|N/A|Special Offers API|\n\n## Data Format Changes\nTraveler type values change casing convention between v1 and v2: v1's `AgeBand` uses Title Case (`Adult`, `Child`, `Youth`, `Infant`, `Senior`), while v2's equivalent traveler type values use UPPER_SNAKE_CASE (`ADULT`, `CHILD`, `YOUTH`, `INFANT`, `SENIOR`). v2 also introduces a new `UNIT` traveler type for products priced per unit/group rather than per person \u2014 see the Pricing Capabilities section of What's New for details.\n\n## Prerequisites\nBefore initiating the migration, ensure the following prerequisites are met:\n\n- **Development**: All v2 endpoints and call backs must have been developed according to the specifications and thoroughly tested, including successfully passing applicable contract tests. The productOptionId must be introduced in the [Tourlist API](#operation/tourList).\n\n- **Certification**: Your integration must have successfully passed certification testing. \n\n- **Notification Endpoints**: The new notification endpoints are accurately configured as documented in the specifications. \n\n- **Viator operator account configuration**: The operator accounts must be configured with the new endpoints for v2 access on Viator.\n\n- **Reservation System operator account configuration**: The operator account must be configured to utilize v2 endpoints in the reservation system.\n## Migration\nThe migration of operator accounts to v2 APIs will take place in two separate phases:\n\n1. Pilot accounts\n - Viator and the Reservation System will jointly select a small number of operator accounts for the initial migration.\n\n - The chosen accounts will first be configured in the Viator sandbox environment. This step is dedicated to verifying transactions, pricing, and availability to identify any potential inconsistencies and ensure a smooth subsequent production roll out \n\n - Following successful validation tests in the sandbox, the accounts will be configured in both Viator and the Reservation System to enable v2 functionality in the production environment.\n\n2. Main Rollout\n - After the successful pilot account rollout, Viator will determine and inform the size and sequence of operator account batches for production rollout.\n\n - A cooling-off period will be observed between each sequential batch to monitor system performance.\n\n - For each batch, Viator and the Reservation System will coordinate to configure accounts for v2 production enablement.\n## Operational Considerations\n- All superseded v1 endpoints (see \u201cDeprecation\u201d section for details) must remain operational throughout the migration period and until a future end-of-life procedure is agreed. This will ensure a smooth transition and facilitate a roll back should any issues be encountered. \n\n- v1 Availability (2) Notifications must continue to be sent in parallel to v2 Notifications until an account is fully migrated. Viator ignores notifications that do not apply.\n\n## Deprecation\nUpon completion of the migration of all Operator accounts to v2 endpoints, Viator will inform the reservation system to allow for deprecation procedures to commence. \n\nThe following steps can be completed once the confirmation is received:\n\n- Disable all notifications to [Availability Notifications (2) API](#operation/availabilityNotification2)\n\n- Disable the following endpoints: \n - [Real-time Availability API](#operation/availability)\n - [Batch Availability API](#operation/batchAvailability)\n - [Batch Pricing API](#operation/batchPricing)\n\nFor any questions or assistance during the migration, please contact the [API integrations team](mailto:SupplierAPI@viator.com) or refer to the FAQ section in these specifications."
},
{
"name": "FAQs",
"description": "**Q: If we use the API, how do suppliers control the inventory available to Viator?**\n\n**A**: Suppliers retain control of the inventory they expose to Viator. The API simply replaces the manual work of inserting bookings into your system and providing blockout information to Viator. Suppliers still control the inventory that they want to sell to Viator.\n\n\n\n**Q: Does the API contain pricing and payment information?**\n\n**A**: Viator is the credit card merchant of record for all transactions \u2013 no payment information needs to be processed by the supplier or supplier\u2019s system. We do not send credit card information via the API. The supplier net rate and pricing information is stored on Viator's side and can be updated via the [Availability and pricing APIs](#tag/Connectivity-overview/Availability-and-Pricing); or, through the regular process of updating the **Schedule and prices** tab in the [Supplier Extranet](https://supplier.viator.com/).\n\n\n\n**Q: How can non-Viator suppliers use the Viator API?**\n\n**A**: If you have suppliers that are not working with Viator today, please refer them to the [Supplier Sign Up](https://supplier.viator.com/sign-up-info) link on Viator.com. The Viator API will only work with current Viator suppliers, but we are always looking for new and exciting products to offer.\n\n\n\n**Q: How do we map our internal product codes to Viator\u2019s product codes?**\n\n**A**: At the commencement of the project, Viator will provide a list of the supplier's products and product options. Together, we can then define a mapping approach between Viator's and the supplier's systems. This is a critical part of the project, as we need to ensure that the mapping values correctly identify the variables that have an inventory concern.\n\nMapping is carried out either by the supplier or the administrator of the reservation system. Viator's mapping feature is available via the [Supplier Extranet](https://supplier.viator.com/). The mapping wizard utilizes data from the [Tour List](#operation/tourList) endpoint. \n\n#### Common questions regarding the booking information that is sent:\n\n**Q: Will I receive the customer\u2019s direct email address?**\n\nNo, due to company policy, we will never provide the customer's real email address. However, you have the option to have the same obfuscated email address that is currently hidden behind our **\u201cContact Customer\u201d** button in the management center to be sent to you.\n\nThis is an optional feature that your developers can accommodate, and it will place the obfuscated email address directly into your reservation system so your reservations team does not need to log into our management center to send the customer an email.\n\nThe added benefit is that communication between you and the customer is logged in the booking history notes, should you need it for future reference. This email address is valid for 30 days after the travel date.\n\n**Q: Will I receive the customer\u2019s direct phone number?**\n\nYes, if the customer completes the phone number field on our checkout page, it will be included in the booking information. Note, however, that not all partners support this field.\n\n**Q: Will I receive the customer's hotel information?**\n\nYes, if you currently have the hotel pick up box activated for your products, the customer will be able to select their hotel from the drop down menu and this information will be sent to you in the **\u201cPick up point\u201d** field.\n\nIf you are currently collecting this information from the special requirements field, the **\u201cSpecial Requirements\u201d** field will be populated with this information.\n\n**Q: Will I still receive the information that a customer enters during the booking process such as flight and cruise ship information?**\n\nYes, this information is passed in the question and answer fields of the booking request.\n\n**Q: How do I correctly handle the product's guide language when it is an inventory concern?**\n\nFor operating languages with limited capacity, such as a Portuguese guided tour, it is essential to accurately return the product option in the Tour List API. This facilitates the mapping of the equivalent Viator product option to the operator's system, allowing for capacity verification during booking.\n\nHowever, if the operator provides audio or written language guides without capacity limitations, including product options of language in the Tour List API is not necessary. The audio guide language chosen by the customer at checkout will be transmitted with the booking request.\n\n**Q: When should I use SupplierOptionCode and how does this affect the product set-up?**\n\nThe **SupplierOptionCode** serves as a unique identifier for various product options or variants. It can be paired with Name/value pairs to specify different versions of a product. For instance, a dinner cruise might offer \"window seat\" and \"best available\" as distinct options.\n\n\n\n**Q: Should I support barcode numbers or pass-through tickets?**\nThe answer is based on how operators expect customers to check-in to the tour or activity. There are two possible options:\n\nUsing Viator standard vouchers. These can include a per-traveler barcode (**TravellerBarcode**) or a per-booking barcode (**TourBarcode**) returned from the operator's reservation system in the Booking API. The use of per-traveler or per-booking is confirmed by product in Viator's supply center.\nUsing the operator\u2019s reservation system ticket, returned in the Booking API **TourTicket**. With this option, the Viator ticket will be suppressed, and customers will receive the provided ticket. This option cannot be controlled via Viator\u2019s supply center; please [contact us](#tag/Contact-us) if this is desired.\n\n**Q: What is the relationship between 'start times' and the API?**\n\nThe following is applicable to **legacy v1.0 Availability and Pricing APIs only**. \n\nOur management center provides you with different time options to accommodate different product types, such as opening hours and start times.\n\n\n\nHowever, for the API connection, if the starting time that the customer selects is important for you to know in the booking details; or, if there is an inventory concern, you must return the **TourDepartureTime** tag as a mapping value and do not include the start time as part of the **SupplierOptionCode**.\n\nIn the management center, you will then be restricted to using only the 'start times' option. The reason for this is that the starting time information in the management center synchronizes with the information in the **TourDepartureTime** field, and this information is then presented to the customer on our site.\n\nExample of start times syncing on the product connection tab:\n\n\n\nThis appears to the customer as:\n\n\n\nAll starting times listed on the **product connection** page that have been synchronized will be displayed to the customer. If a particular starting time is not available, that time will appear crossed-out.\n\nThe benefits of using the **TourDepartureTime** tag include:\n\n**Eliminating the need to identify each start time as a product option**\n\n- This saves your team time by obviating the need to create new product options in the management center. This also saves the **SupplierOptionCode** for when it is genuinely required to differentiate between the product options.\n\n- The availability for each individual time can be checked, and the customer will be able to select their preferred time during the booking process instead of contacting you directly to arrange a time post-booking (but prior to travel).\n\n**Note**: If there are any changes made to the **Time** option in the management center; for example, changing from **start times** to **opening hours**, this will break the API connection unless the **TourDepartureTime** is also removed from the API response."
},
{
"name": "Contact us",
"description": "Please email the [API integrations team](mailto:SupplierAPI@viator.com) with any questions or suggestions. A ticket will be logged with the team who will respond as quickly as possible.\n"
},
{
"name": "Deprecated",
"description": "This section lists endpoints that are no longer recommended for new or updated integrations. These endpoints remain available for existing connections only, will stop receiving new features or behavior improvements, and will eventually be retired once an end-of-life procedure is agreed with Viator (see the [v2 migration guide](#tag/v2-migration-guide) for details).\n\nFor all new development, use the current, fully supported endpoints documented in the main sections of this guide.\n\n### REST v1.0 endpoints \u2014 deprecated\n\n- [Real-time Availability API](#operation/availability) \u2014 superseded by the Availability Check API and Reserve API\n- [Batch Availability API](#operation/batchAvailability) \u2014 superseded by the Calendar API\n- [Batch Pricing API](#operation/batchPricing) \u2014 superseded by the Calendar API\n- [Availability Notifications (2) API](#operation/availabilityNotification2) \u2014 superseded by the Event Notifications API\n\n### Data format: XML \u2014 deprecated\n\nXML (`application/xml`) requests and responses are deprecated. **New integrations must use JSON (`application/json`) exclusively.** XML remains available for existing v1.0 integrations only and will receive no new features or behavior improvements. All v2.0 endpoints are JSON-only. XML will eventually be retired once an end-of-life procedure is agreed with Viator.\n\n### SOAP interface (WSDL/XSD) \u2014 deprecated\n\nThe legacy SOAP interface definitions are deprecated. SOAP is no longer supported for new or updated integrations; use the REST endpoints documented in the main sections of this guide instead.\n\nThe WSDL and XSD files are kept for historical reference only:\n\n- [Reseller-to-supplier WSDL](resources/api_specs/wsdl/tgds-reseller-to-supplier.wsdl)\n- [Supplier-to-reseller WSDL](resources/api_specs/wsdl/tgds-supplier-to-reseller.wsdl)\n- [API XSD](resources/api_specs/xsd/api.xsd)\n"
},
{
"name": "Appendices",
"description": "## Update history\n| Version | Comments | Date |\n|---------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------|\n| 2.0.0 | Deprecated the XML (`application/xml`) data format. JSON (`application/json`) is now the only supported format for new integrations; XML remains available for existing v1.0 integrations only. | 06 Jul, 2026 |\n| 2.0.0 | Deprecated v1 endpoints, graduated v2 Beta endpoints.|18 Feb, 2026|\n| 2.0.0 | Introduced v2.0 Migration Guide, added details pertaining to enablement and disablement of event notifications.| |\n| 2.0.0 | Update to v2.0 Beta endpoints: Introduced 'totalTravelers' in Availability Check and Reserve endpoints that surface traveler counts in all requests including UNIT priced products. Introduce new UNSUPPORTED_PRICE pricing model to allow availability sync without price in scenarios where Viator does not support the pricing model of the reservation system. Added INVALID_PRODUCT_OPTION to Reserve endpoint response | 01 Sep, 2025 |\n| 2.0.0 | Introduce v2.0 Beta endpoints: Special Offers, Event Notification and Special Offer Notification | 12 Aug, 2025 |\n| 2.0.0 | Introduce v2.0 Beta endpoints: Availability check, Calendar and Reserve. Introduce productOptionId in the [Tour List API](#operation/tourList) for v2.0 endpoints. | 30 Jun, 2025 |\n| 1.4.12 | Added `BookingCutoff` JSON example | 20 May, 2024 |\n| 1.4.11 | Added Redemption API | 27 Feb, 2024 |\n| 1.4.10 | Removed `Parameter` and `Extension` elements from all Requests/Responses schemas and examples | 31 Jan, 2024 |\n| 1.4.9 | Modified advice for pricing by removing `SupplierPrice` element from [Batch Pricing](#operation/batchPricing) and [Real Time Availability](#operation/availability) schemas and examples | 29 Jan, 2024 |\n| 1.4.8 | Added `TourTicket` element to [Booking Amendment response](#operation/bookingAmendment) and modified schemas regarding `Capacity` and `BookingCutoff` elements in the [Availability response](#operation/availability) from 'required' to 'optional' | 10 Jan, 2024 |\n| 1.4.7 | Restructured page sections in order to clean up documentation and have a richer integration with Redocly | 22 Dec, 2023 |\n| 1.4.6 | Returned Batch Pricing API section using RetailPrice. Added Suggested Price Option/Age Band Mapping. Availability notification API moved out of Beta | 02 Nov, 2023 |\n| 1.4.5 | Published new manual ported from Mkdocs to Redoc CMS | 19 May, 2023 |\n| 1.4.4 | Temporarily removed Batch Pricing API section and pricing details from real-time availability call for maintenance purposes | 15 Feb, 2023 |\n| 1.4.3 | Removed API Resources section | 5 Oct, 2022 |\n| 1.4.2 | Fixed error regarding capitalization of ageband designators regarding `Capacity.Simple.ConsumedBy` element | 5 Oct, 2022 |\n| 1.4.1 | Modified advice regarding requirement for `Capacity` and `BookingCutoff` elements in the [Availability response](#operation/availability) from 'optional' to 'mandatory' | 4 Oct, 2022 |\n| 1.4.0 | Corrected example VersionTag value in [Availability notification request sample 2](#operation/availabilityNotification2) | 12 July, 2022 |\n| 1.3.9 | Added link to up-to-date WSDL/XSD for supplier-built services [API resources section](#tag/Deprecated) (WSDL/XSD are now deprecated; see that section) | 10 March, 2022 |\n| 1.3.8 | Added [Periodic Availability Checking](#operation/availability) response sample to real-time availability and pricing endpoint | 23 Feb, 2022 |\n| 1.3.7 | Added Capacity element to the [Availability response](#operation/availability) and instructions on its use in [How to use the Capacity element](#tag/Reservation-system-APIs/BookingCutoff-and-Capacity-elements) | 3 Feb, 2022 |\n| 1.3.6 | Added information about new [BookingCutoff element](#tag/Reservation-system-APIs/BookingCutoff-and-Capacity-elements) | 25 Oct, 2021 |\n| 1.3.5 | Added [Viator-built services \u2013 Push Availability Notification API](#operation/availabilityNotification2) | 30 Apr, 2021 |\n| 1.3.4 | Added `VersionTag` element to [Availability response](#operation/availability) and [Batch availability response](#operation/batchAvailability) | 8 Apr, 2021 |\n| 1.3.3 | Updated wording in [Batch pricing API](#operation/batchPricing) | 18 Aug, 2020 |\n| 1.3.2 | Slight clarification of field descriptions | 26 Mar, 2020 | \n| 1.3.1 | Deprecated `TourDuration` | 7 Feb, 2019 |\n| 1.3 | Added ticket to booking response | 1 Nov, 2019 |\n| 1.2 | Added contact email to booking response. | 1 Nov, 2019 |\n| 1.1 | Added Real-time Pricing API | 1 Nov, 2019 |\n| 1.0.9 | Added Batch Pricing API | 1 Nov, 2019 |\n| 1.0.8 | Updated batch availability API samples to reflect appropriate XML structure | 6 Nov, 2015 |\n| 1.0.7 | Correct availability response, `TravellerMixAvailability`, `AvailabilityHold` and `AvailabilityStatus` parent tags in table and sample. Updated description of product mapping. Improved description for `UnavailabilityReason`. Added notes in API resources regarding WSDL and XSD usage. | 26 Oct, 2015 |\n| 1.0.6 | Corrected `TimeStamp` format / example and changed case of `SupplierId`, `ResellerId` elements to match XSD. | 5 May, 2014 |\n| 1.0.5 | Removed `TravelTime` from `AvailabilityRequest`. Document out of sync with XSD. | 13 Feb, 2014 |\n| 1.0.4 | XML samples updated to provide better end to end understanding of the various APIs | 25 Nov, 2013 |\n| 1.0.3 | Added Viator Supplier API Test Harness URL. | 15 Nov, 2013 |\n| 1.0.2 | `TourDuration` updated in `Samples` to reflect Spec. | 23 Sept, 2013 |\n| 1.0.1 | Batch Availability: Supplier Product Code is Optional. All except Tour List: Rename `TourOption` to `TourOptions`. | 27 Aug, 2013 |\n| 1.0 | Confirmed version. | 29 July, 2013 |\n## Error codes\nThe following is applicable to **legacy v1.0 APIs only**. \n\n| Code | Meaning |\n|----------|--------------------------------------------------------------------------------------------|\n| TGDS0001 | Malformed request |\n| TGDS0002 | Authentication error |\n| TGDS0003 | Invalid connector |\n| TGDS0004 | Request timed out |\n| TGDS0005 | Service not available |\n| TGDS0006 | Unknown internal error |\n| TGDS0007 | Unsupported API request |\n| TGDS0008 | Unsupported supplier API |\n| TGDS0009 | Unsupported protocol |\n| TGDS0010 | Malformed URL |\n| TGDS0011 | Invalid supplier |\n| TGDS0012 | Invalid product |\n| TGDS0013 | Invalid product option code |\n| TGDS0014 | Connection timed out |\n| TGDS0015 | Invalid reseller ID |\n| TGDS0016 | Inactive account |\n| TGDS0017 | Inactive supplier |\n| TGDS0018 | Inactive reseller |\n| TGDS0019 | Unsupported reseller API |\n| TGDS0020 | Field validation error |\n| TGDS0021 | XML schema validation error |\n| TGDS0022 | Missing API parameter key/value |\n| TGDS0023 | Invalid data; i.e., data is in incorrect format, non-parsable or otherwise invalid |\n| TGDS0024 | Supplier specific errors |\n| TGDS0025 | Unsupported request for endpoint |\n| TGDS0026 | Invalid request |\n| TGDS0027 | Availability data not available for the specified date range |\n| TGDS0028 | Data not available |\n| TGDS0029 | Malformed response message |\n| TGDS0030 | Malformed request message |\n| TGDS0031 | Unhandled internal error in supplier system |\n| TGDS0032 | Event has been removed or otherwise became unavailable for booking |\n| TGDS0033 | Invalid pickup option |\n| TGDS0034 | Supplier system has limitations, which prevents this operation from succeeding |\n| TGDS0035 | Unknown transaction status |\n| TGDS0036 | Event availability has been changed so that it is impossible to book for this traveler mix |\n| TGDS0037 | Connection closed by reseller before response could be dispatched |"
}
],
"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"
]
}
],
"servers": [
{
"url": "https://your-reservation-system.example.com",
"description": "Placeholder for the reservation system's own server \u2014 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)."
}
],
"components": {
"securitySchemes": {
"ApiKeyHeader": {
"type": "apiKey",
"in": "header",
"name": "X-Api-Key"
}
},
"schemas": {
"SupplierId": {
"type": "integer",
"description": "Viator\u2019s unique Supplier identifier.",
"example": 3456
},
"BaseRequest": {
"type": "object",
"description": "Base request object.",
"required": [
"supplierId"
],
"properties": {
"supplierId": {
"$ref": "#/components/schemas/SupplierId"
}
}
},
"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"
},
"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.\n\nIf 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.\n\nValues are in time format **hh:mm**.\n",
"items": {
"type": "string",
"format": "time",
"description": "Time of product option departure. Values are in time format **hh:mm**.",
"example": "09:00"
}
}
}
},
"TravelDate": {
"type": "string",
"format": "date",
"description": "The date of travel.\n\nValue is in date format **YYYY-MM-DD**.\n",
"example": "2000-01-21"
},
"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
}
}
},
"TotalTravelers": {
"type": "integer",
"description": "Total number of travelers/passengers across all ticket types.",
"example": 1
},
"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"
}
}
}
]
},
"Currency": {
"type": "string",
"description": "The ISO 4217 alphanumeric currency code in which prices are being returned.\n\nISO 4217 is the International Standard for currency codes. For more information visit [iso.org](https://www.iso.org/).\n",
"example": "USD"
},
"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"
},
"StartTime": {
"type": "string",
"format": "time",
"description": "Start time or departure time for the event.\n\nValue is in time format **hh:mm**.\n",
"example": "15:30"
},
"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"
},
"UnlimitedCapacity": {
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"$ref": "#/components/schemas/CapacityType",
"description": "The type of capacity. Value must be \u201cUNLIMITED\u201d.\n\nUsed when a product option has unlimited capacity.\n\nRepresents the unlimited capacity of the occurrence of the product option. May be associated with a start time.\n",
"example": "UNLIMITED"
}
}
},
"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"
}
}
},
"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 \u201cLIMITED\u201d.\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.\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"
}
}
},
"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"
}
}
},
"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.\n\nValue is in Timestamp (UTC) format.\n",
"example": "2020-06-11T09:16:39Z"
},
"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"
},
"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"
}
},
"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
},
"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"
}
}
},
"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)\n",
"example": 30.25
},
"retailPrice": {
"$ref": "#/components/schemas/RetailPricePerPerson"
},
"discount": {
"description": "Discount applicable to price of the Event.",
"$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 \u201cPER_PERSON_PRICE\u201d.\n\nUsed when price is applied per person/traveler.\n\nRepresents the per person/traveler price of the product option and associated startTime (when applicable) on the requested travelDate.\n"
},
"prices": {
"type": "array",
"description": "List of ticket types with relevant prices",
"items": {
"$ref": "#/components/schemas/PerPersonPriceDetails"
}
}
}
},
"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
},
"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 \u201cPER_UNIT_PRICE\u201d.\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)\n",
"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
}
}
},
"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 \u201cUNSUPPORTED_PRICE\u201d.\n\nUsed when the price model used in the Reservation System cannot be mapped to a Viator supported pricing model.\n\nUsage 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.\n"
},
"reason": {
"type": "string",
"description": "Reason why the price model is unsupported. This must describe the type of price that is not supported."
}
}
},
"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.\n",
"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"
}
}
}
}
},
"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"
},
"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"
}
}
},
"ProductOption": {
"type": "object",
"description": "List of reservation system product option identifiers for which events (start time, capacity, pricing) are being returned.\n\n- If a requested product option is absent in the response, it is interpreted as being unavailable for purchase.\n- If a requested product option is invalid on the reservation system (i.e. non-existent), it must not be returned in the response.\n",
"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.\n\n- If an event is absent in the response, it is interpreted as being unavailable for purchase.\n",
"items": {
"oneOf": [
{
"$ref": "#/components/schemas/Event"
},
{
"$ref": "#/components/schemas/UnavailableEvent"
}
],
"discriminator": {
"propertyName": "status",
"mapping": {
"AVAILABLE": "#/components/schemas/Event",
"UNAVAILABLE": "#/components/schemas/UnavailableEvent"
}
}
}
}
}
},
"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\n\n\n- If a requested product option is absent in the response, it is interpreted as being unavailable for purchase.\n- If a requested product option is invalid on the reservation system (i.e. non-existent), it must not be returned in the response.\n",
"items": {
"$ref": "#/components/schemas/ProductOption"
}
}
}
},
"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"
}
}
},
"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"
}
}
},
"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"
}
}
},
"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.\n\nValue is in time format **hh:mm**.\n",
"example": "18:00"
}
}
},
"OpeningHours": {
"type": "object",
"description": "Lists the operating hours of the product option of the travelDate.\n",
"required": [
"coordinateStartTimes",
"hours"
],
"properties": {
"coordinateStartTimes": {
"type": "boolean",
"description": "Specifies if start time is coordinated between tour operator and customer before travel.\n",
"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"
}
}
}
},
"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"
},
"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 \u201cPER_PERSON_PRICE\u201d.\n\nUsed when price is applied per person/traveler.\n\nRepresents the per person/traveler price of the product option and associated startTime (when applicable) on the requested travelDate.\n"
},
"prices": {
"type": "array",
"description": "List of ticket types with relevant prices",
"items": {
"$ref": "#/components/schemas/PerPersonPriceDetails"
}
}
}
},
"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\".\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)\n",
"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
}
}
},
"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 \u201cTIERED_PER_PERSON_PRICE\u201d.",
"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.\n\nThe Maximum of a tier cannot be less than or equal to the prior tier's minimum.\n"
},
"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).\n"
},
"discount": {
"$ref": "#/components/schemas/Discount"
}
}
}
}
}
}
}
}
},
"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\".\n\nUsed when the price model used in the Reservation System cannot be mapped to a Viator supported pricing model.\n\nUsage 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.\n"
},
"reason": {
"type": "string",
"description": "Reason why the price model is unsupported. This must describe the type of price that is not supported."
}
}
},
"CalendarEvent": {
"type": "object",
"description": "Represents the presence of availability, along with pricing, of an occurrence of the product option on the travelDate.\n",
"required": [
"status",
"capacity",
"bookingCutoff",
"price"
],
"properties": {
"status": {
"$ref": "#/components/schemas/EventStatus",
"description": "Status of the event. Must be 'AVAILABLE'.\n",
"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.\n",
"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"
}
}
}
}
},
"UnavailableCalendarEvent": {
"type": "object",
"description": "Represents the lack of availability of one occurrence of the product option.\n",
"required": [
"status",
"unavailableReason",
"capacity",
"bookingCutoff",
"price"
],
"properties": {
"status": {
"$ref": "#/components/schemas/EventStatus",
"description": "Status of the event. Must be 'UNAVAILABLE'.\n",
"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.\n",
"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"
}
}
}
}
},
"CalendarResponse": {
"type": "object",
"description": "Response object for the Calendar Operation.\n",
"required": [
"productOptions"
],
"properties": {
"productOptions": {
"type": "array",
"description": "List of reservation system product option identifiers for which events (start time, capacity, pricing) are being returned.\n\n- If a requested product option is absent in the response, it is interpreted as being unavailable for purchase.\n- If a requested product option is invalid on the reservation system (i.e. non-existent), it must not be returned in the response.\n",
"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.\n",
"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.\n\n- If an event is absent in the response, it is interpreted as being unavailable for purchase.\n",
"items": {
"discriminator": {
"propertyName": "status",
"mapping": {
"AVAILABLE": "#/components/schemas/CalendarEvent",
"UNAVAILABLE": "#/components/schemas/UnavailableCalendarEvent"
}
},
"oneOf": [
{
"$ref": "#/components/schemas/CalendarEvent"
},
{
"$ref": "#/components/schemas/UnavailableCalendarEvent"
}
]
}
}
}
}
}
}
}
}
}
},
"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"
}
}
}
]
},
"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;\n\nOne of:\n- RESERVED\n- NOT_RESERVED\n",
"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.\n",
"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"
}
]
}
}
},
"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;\n\nOne of:\n- RESERVED\n- NOT_RESERVED\n",
"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"
}
}
},
"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"
}
}
},
"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"
}
}
}
},
"SpecialOfferType": {
"type": "string",
"description": "Type of the special offer.\n\nOne of: \n - \u201cSTANDARD\u201d - 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"
},
"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"
}
}
},
"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"
}
}
}
},
"EventNotificationRequest": {
"allOf": [
{
"$ref": "#/components/schemas/BaseRequest"
},
{
"type": "object",
"description": "Request object for Event Notification",
"required": [
"updateType",
"productOptionIds",
"startDate",
"endDate"
],
"properties": {
"updateType": {
"type": "array",
"description": "List of Machine-interpretable values to specify notification types. \n\nOne of:\n- AVAILABILITY - Used when the remaining capacity for any ticket type associated to the event has either become:\n - **Unavailable** for sale from previously being available (i.e. ticket type capacity becomes 0). \n - **Available** for sale from previously being unavailable for sale. (i.e. ticket type capacity becomes greater than 0)\n- PRICING - Used when the retail price of any relevant ticket type for an event changes (inclusive of new special offers or discounts). For operators with a specific Viator agreement to use net price, a change to the net price also requires notification.\n- CAPACITY - Used when any capacity changes not covered by an \"AVAILABILITY\" update occur.\n",
"items": {
"type": "string",
"title": "EventUpdateType",
"enum": [
"AVAILABILITY",
"PRICING",
"CAPACITY"
]
}
},
"productOptionIds": {
"type": "array",
"description": "List of reservation system product option identifiers for which AVAILABILITY, PRICING, or CAPACITY changes are being notified.\n",
"items": {
"$ref": "#/components/schemas/ProductOptionId"
}
},
"startDate": {
"type": "string",
"format": "date",
"description": "The start date for the notification. Value is in date format **YYYY-MM-DD**.\n",
"example": "2026-01-21"
},
"endDate": {
"type": "string",
"format": "date",
"description": "The end date for the notification. Value is in date format **YYYY-MM-DD**.\n",
"example": "2026-01-25"
}
}
}
]
},
"EventNotificationResponse": {
"type": "object",
"description": "Response object for multi-status Event Notification",
"required": [
"results"
],
"properties": {
"results": {
"type": "array",
"description": "List of event notifications status",
"items": {
"type": "object",
"title": "EventNotificationResult",
"description": "List of requested event notification status.",
"required": [
"productOptionId",
"status"
],
"properties": {
"productOptionId": {
"$ref": "#/components/schemas/ProductOptionId"
},
"status": {
"type": "integer",
"description": "HTTP status of the event notification request for the product option",
"enum": [
200,
422
],
"example": 200
},
"error": {
"type": "string",
"description": "Code representing the error reason\nOne of:\n - INVALID_PRODUCT_OPTION - The productOptionID in the request is not valid or does not exist for the supplier.\n",
"enum": [
"INVALID_PRODUCT_OPTION"
],
"example": "INVALID_PRODUCT_OPTION"
}
}
}
}
}
},
"EventNotificationUnprocessableContentResponse": {
"type": "object",
"description": "Response object for Unprocessable Content Event Notification",
"required": [
"error"
],
"properties": {
"error": {
"type": "string",
"description": "Code representing error reason. \n\nOne of:\n- INVALID_SUPPLIER - The supplier in the request is not valid or does not exist.\n- API_DISABLED - API endpoint is not enabled for the requested supplier.\n- INVALID_PRODUCT_OPTION - All productOptionIds in the request are invalid or do not exist for the supplier.\n- INVALID_DATE_RANGE - The requested date range is invalid.\n",
"enum": [
"INVALID_SUPPLIER",
"API_DISABLED",
"INVALID_PRODUCT_OPTION",
"INVALID_DATE_RANGE"
],
"example": "INVALID_PRODUCT_OPTION"
},
"message": {
"type": "string",
"description": "Human readable description of the error reason",
"example": "All product options are invalid"
}
}
},
"SpecialOffersNotificationRequest": {
"type": "object",
"description": "Request object for the Special Offers Notification Operation.",
"required": [
"supplierId",
"specialOfferIds"
],
"properties": {
"supplierId": {
"$ref": "#/components/schemas/SupplierId"
},
"specialOfferIds": {
"type": "array",
"description": "List of reservation system special offer identifiers for which additions or changes are being notified.\n\nMust be valid identifiers returned in the special offers endpoint.\n",
"items": {
"type": "string",
"description": "Unique identifier for the special offer.",
"example": "A Unique id"
}
}
}
},
"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:\n\n- yyyy-MM-ddTHH:mm:ss.SSSZ (in UTC time), or\n- yyyy-MM-ddTHH:mm:ss.SSS[+/-]hh:mm\n\n**Examples:**\n- 2013-04-28T13:10:12.120Z\n- 2013-04-28T13:10:12.120+10:00\n",
"format": "date-time"
}
},
"description": "Request Response Base."
},
"TourListRequest": {
"description": "Root element for Tour List Request",
"allOf": [
{
"$ref": "#/components/schemas/RequestResponseBase"
},
{
"type": "object"
}
]
},
"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:\n- `\"SUCCESS\"` for a successful transaction, or\n- `\"ERROR\"` for an unsuccessful transaction. (`Error` node must be populated)\n"
},
"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."
}
}
},
"ResponseBase": {
"allOf": [
{
"$ref": "#/components/schemas/RequestResponseBase"
},
{
"required": [
"RequestStatus"
],
"type": "object",
"properties": {
"RequestStatus": {
"$ref": "#/components/schemas/RequestStatus"
}
}
}
]
},
"LanguageOption": {
"type": "string",
"enum": [
"GUIDE",
"AUDIO",
"WRITTEN"
],
"example": "GUIDE"
},
"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\n(Tour) / product option (Tour Option).\n\nISO 639 is a standardized nomenclature used to classify all known languages.\nFor more information visit www.iso.org.\n",
"example": "en"
},
"LanguageOption": {
"type": "array",
"uniqueItems": true,
"minItems": 1,
"maxItems": 3,
"items": {
"$ref": "#/components/schemas/LanguageOption"
}
}
}
},
"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.\n\n**Examples:**\n- A tour that is conducted by a Spanish guide and also by an English guide has two options.\n- 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.\n- A Tour that has a luxurious version and a cheaper version is considered to have two options.\n\nA list of the operator's Viator product options can be provided for mapping purposes.\n"
},
"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.\n\n**Example:** 09:00:00.\n",
"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"
}
}
}
}
}
},
"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.\n\n**Note**: For v2.0 endpoints, this is mandatory, as the `productOptionId` is also required.\n",
"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.\nFor products that have no options, the productOptionId uniquely identifies the product (which is in itself a bookable option).\n"
}
}
},
{
"$ref": "#/components/schemas/TourOptionBase"
},
{
"type": "object",
"properties": {
"Language": {
"type": "array",
"description": "Holds the various languages of the Tour Option.",
"items": {
"$ref": "#/components/schemas/TourLanguage"
}
}
}
}
]
}
}
}
}
}
}
}
]
},
"TourOptionItem": {
"allOf": [
{
"$ref": "#/components/schemas/TourOptionBase"
},
{
"type": "object",
"properties": {
"Language": {
"$ref": "#/components/schemas/TourLanguage"
}
}
}
]
},
"AvailabilityRequest": {
"description": "Root element for Real-time Availability Request",
"allOf": [
{
"$ref": "#/components/schemas/RequestResponseBase"
},
{
"type": "object",
"required": [
"StartDate",
"SupplierProductCode"
],
"properties": {
"StartDate": {
"type": "string",
"format": "date",
"description": "Date for which tour availability is being requested from the reservation system.\n* If supplied without an `EndDate`, then a single date availability request is being made.\n* If supplied with an `EndDate`, then availability request is for a date range.\n\nThe date should be in date format: **YYYY-MM-DD**.\n\n**Example:** 2000-01-31\n"
},
"EndDate": {
"type": "string",
"format": "date",
"description": "End date of date range for which tour availability is being requested from the reservation system. If this is empty, availability will be searched for the given `StartDate` only. \n\nThe date should be in date format: **YYYY-MM-DD**.\n\n**Example:** 2000-01-31\n"
},
"SupplierProductCode": {
"type": "string",
"maxLength": 50,
"description": "Operator's unique product (tour) identifier in the reservation system."
},
"TourOptions": {
"$ref": "#/components/schemas/TourOptionItem"
},
"AvailabilityHold": {
"type": "object",
"description": "Availability hold root element. Availability hold is sent with an availability request only if a Viator customer proceeds to checkout (high probability of confirmed sale).",
"required": [
"Expiry"
],
"properties": {
"Expiry": {
"type": "string",
"description": "Duration after which the availability hold should expire for the current request. \nThis is a suggested value, the reservation system can determine to define its own duration (which will be returned in the availability API response). \nExpiry value must be positive and provided in duration format: **PnYnMnDTnHnMnS**.\n\n**Example:**\n * PT300S (5 minutes)\n"
}
}
},
"TravellerMix": {
"type": "object",
"description": "Traveler mix root element. Holds the number of travelers at each age band for which availability is being requested. \nIf not specified, then overall availability is requested. Traveler age bands are based on age ranges provided by the operator in Viator's supply center.\n",
"properties": {
"Adult": {
"type": "integer",
"description": "Number of adults"
},
"Child": {
"type": "integer",
"description": "Number of children"
},
"Youth": {
"type": "integer",
"description": "Number of youths"
},
"Infant": {
"type": "integer",
"description": "Number of infants"
},
"Senior": {
"type": "integer",
"description": "Number of seniors"
},
"Total": {
"type": "integer",
"description": "Total number of travelers"
}
}
}
}
}
]
},
"Price": {
"title": "Price",
"description": "Holds the information regarding the price for the associated Tour that was retrieved from the API.",
"required": [
"CurrencyCode",
"Item"
],
"type": "object",
"properties": {
"CurrencyCode": {
"type": "string",
"description": "Holds the currency associated with prices returned."
},
"Item": {
"type": "array",
"description": "Single price information retrieved from the API.",
"items": {
"type": "object",
"required": [
"AgeBand",
"RetailPrice"
],
"properties": {
"RetailPrice": {
"type": "number",
"description": "Stores the price for which the booking should be made on the shop by the customer for the given age band."
},
"AgeBand": {
"type": "string",
"description": "Age band of traveler.",
"enum": [
"Adult",
"Child",
"Youth",
"Infant",
"Senior"
]
}
}
}
}
}
},
"VersionTag": {
"description": "Version tag root element. Specifies the version for each changed `DateAvailability`. Version tagging allows availability responses to be tagged with one of: a time-stamp, a text-string, or a numeric identifier. \n\nAttaching this tag will allow our systems to determine which availability response should be taken as the most recent in the event that multiple availability responses for the same product arrive with differing information. \nOur systems will consider the availability response with the most recent timestamp, or highest textual or numeric value as the authoritative response.\n",
"oneOf": [
{
"type": "object",
"title": "Timestamp",
"required": [
"Timestamp"
],
"properties": {
"Timestamp": {
"type": "string",
"description": "Timestamp to determine the order in which this availability response was generated; e.g. `2021-12-02T12:34:56.789012345Z`\n",
"format": "date-time"
}
}
},
{
"type": "object",
"title": "Textual",
"required": [
"Textual"
],
"properties": {
"Textual": {
"type": "string",
"description": "Text string of your choosing. Our systems will consider the highest-value string to be that which was sent most recently. E.g., `20121202-V000000231434`\n"
}
}
},
{
"type": "object",
"title": "Numeric",
"required": [
"Numeric"
],
"properties": {
"Numeric": {
"type": "integer",
"description": "Numeric value of your choosing. Our systems will consider the highest number to be that which was sent most recently. E.g., `553957349573498`\n"
}
}
}
]
},
"AvailabilityResponse": {
"description": "Root element for Real-time Availability Response",
"allOf": [
{
"$ref": "#/components/schemas/ResponseBase"
},
{
"type": "object",
"required": [
"SupplierProductCode",
"TourAvailability"
],
"properties": {
"SupplierProductCode": {
"type": "string",
"maxLength": 50,
"description": "Operator's unique product (tour) identifier in the reservation system."
},
"TourAvailability": {
"description": "Tour availability root element. Holds availability for each product (tour) or product option (tour option). \nFor products with more than one option, multiple TourAvailability elements will be provided in the response, one for each option. \nIf a product has no options, then a single TourAvailability element will be provided in the response with no `SupplierOptionCode`.\n",
"type": "array",
"items": {
"title": "TourAvailabilityItem",
"required": [
"Date",
"AvailabilityStatus"
],
"properties": {
"Date": {
"type": "string",
"format": "date",
"description": "Date for which tour availability is being supplied. \n\nThe date should be in date format: **YYYY-MM-DD.** \n\n**Example:** 2000-01-31\n"
},
"TourOptions": {
"$ref": "#/components/schemas/TourOptionItem"
},
"AvailabilityStatus": {
"type": "object",
"description": "Availability status root element. Holds the availability status for given product (tour) or product option (tour option).",
"required": [
"Status"
],
"properties": {
"Status": {
"type": "string",
"description": "Status of availability. Valid values include:\n * `AVAILABLE` - when product is available for the given `Date` and `TravellerMix`\n * `UNAVAILABLE` - when product is not available for the given `Date` and `TravellerMix`\n",
"enum": [
"AVAILABLE",
"UNAVAILABLE"
]
},
"UnavailabilityReason": {
"enum": [
"SOLD_OUT",
"BLOCKED_OUT",
"INACTIVE",
"PAST_CUTOFF_DATE",
"TRAVELLER_MISMATCH",
"NO_EVENT"
],
"type": "string",
"description": "Reason why product is not available; valid values include:\n- `SOLD_OUT` - when the product (tour) / product option (tour option) is sold out. When this reason code is received, the product or product option becomes unavailable for sale on Viator systems.\n- `BLOCKED_OUT` - when the product (tour) / product option (tour option) has been blocked out (not taking place on this date). When this reason code is received, the product or product option becomes unavailable for sale on Viator systems.\n- `INACTIVE` - when the product (tour) / product option (tour option) is no longer active. When this reason code is received, the product or product option becomes unavailable for sale on Viator systems.\n- `PAST_CUTOFF_DATE` - when the booking cut-off date has been reached for this product (tour) / product option (tour option). When this reason code is received, the product or product option becomes unavailable for sale on Viator systems.\n- `TRAVELLER_MISMATCH` - when the required combination of travelers for this product (tour) / product option (tour option) is not met or when the number of requested passengers cannot be fulfilled, but a lower number can (i.e. availability status for three people is unavailable, but availability status for two is available).\n- `NO_EVENT` - This event is no longer valid. When this reason code is received, the product or product option becomes unavailable for sale on Viator systems\n"
},
"TravellerMixAvailability": {
"description": "Holds availability information for each age band. `True` if the traveler mix is available, `false` if sold out",
"type": "object",
"properties": {
"Infant": {
"type": "boolean",
"description": "`True` if availability exists for the Infant age band.\n"
},
"Child": {
"type": "boolean",
"description": "`True` if availability exists for the Child age band.\n"
},
"Youth": {
"type": "boolean",
"description": "`True` if availability exists for the Youth age band.\n"
},
"Adult": {
"type": "boolean",
"description": "`True` if availability exists for the Adult age band.\n"
},
"Senior": {
"type": "boolean",
"description": "`True` if availability exists for the Senior age band.\n"
}
}
}
}
},
"AvailabilityHold": {
"type": "object",
"description": "Availability hold root element. Availability hold is sent with an availability request only if a Viator customer proceeds to checkout (high probability of confirmed sale).\n\n**Mandatory** if `AvailabilityHold` feature is supported by the reservation system.\n",
"required": [
"Expiry",
"Reference"
],
"properties": {
"Expiry": {
"type": "string",
"description": "Duration after which the availability hold should expire for the current request. \nThis is a suggested value, the reservation system can determine to define its own duration (which will be returned in the availability API response). \nExpiry value must be positive and provided in duration format: **PnYnMnDTnHnMnS**.\n\n**Example:**\n * PT300S (5 minutes)\n"
},
"Reference": {
"type": "string",
"description": "Availability hold reference assigned by the reservation system. \nThe reference will be used in a subsequent booking request to advise the reservation system that the booking is related to the prior availability hold request. Response scoped.\n"
}
}
},
"Price": {
"$ref": "#/components/schemas/Price"
},
"BookingCutoff": {
"type": "object",
"description": "Booking cut-off root element; contains information about the point in time after which the tour option may become unavailable, \nreferred to as the 'booking cut-off'. \n\nIt is **mandatory to provide one of the three child element options** listed below \u2013 `DateTime`, `ProductDateTime` or `NotApplicable`\n",
"oneOf": [
{
"title": "DateTime",
"type": "object",
"required": [
"DateTime"
],
"properties": {
"DateTime": {
"type": "string",
"format": "date-time",
"description": "Datetime string that must include the time-zone that describes absolutely when the booking cut-off is.\n\n**Examples:**\n* 2021-11-07T12:13:14+10:30\n* 2021-11-07T22:22:11.000-10:00\nWe would prefer that you provide a datetime adjusted to UTC; however, we will accept any legitimate time-zone offset; our systems will adjust accordingly.\n"
}
}
},
{
"title": "ProductDateTime",
"type": "object",
"required": [
"ProductDateTime"
],
"properties": {
"ProductDateTime": {
"type": "string",
"format": "date-time",
"description": "Datetime string that must not include a time-zone or 'Z' (UTC) offset that describes when the booking cut-off is **in the time-zone of the product.**\nUse this element instead of the `DateTime` element if you are unable to provide the full datetime string with time-zone included.\n\n**Examples:**\n* 2021-11-08T12:13:14\n* 2021-11-08T11:22:33.000\n"
}
}
},
{
"title": "NotApplicable",
"type": "object",
"required": [
"NotApplicable"
],
"properties": {
"NotApplicable": {
"type": "boolean",
"description": "'True' if a booking cut-off does not exist for this product option. \nIf set, our systems will attempt to make any sale until we receive an `AvailabilityStatus` of `UNAVAILABLE`; \nor, the present moment has advanced beyond the product's start time.\n"
}
}
}
]
},
"Capacity": {
"type": "object",
"description": "Capacity root element. Allows for capacity-management by communicating the remaining places available for Viator to book for this product.\nThe system allows for all or only certain age bands to draw down on the available places, to allow, for example, infants to be excluded and thereby not affect the remaining capacity.\nSee \"How to use the Capacity element\" section for more information.\n",
"required": [
"Simple"
],
"properties": {
"Simple": {
"type": "object",
"description": "Simple capacity root element. Contains elements for remaining places and which age band(s) (if applicable) consume these places.",
"properties": {
"Remaining": {
"type": "integer",
"description": "Numeric value representing number of remaining places"
},
"ConsumedBy": {
"type": "array",
"description": "Name of age band that can consume the remaining places; one of `ADULT`, `CHILD`, `INFANT`, `YOUTH`, `SENIOR`\n",
"items": {
"type": "string",
"enum": [
"ADULT",
"CHILD",
"INFANT",
"YOUTH",
"SENIOR"
]
}
}
}
}
}
},
"VersionTag": {
"$ref": "#/components/schemas/VersionTag"
}
}
}
}
}
}
]
},
"BatchAvailabilityRequest": {
"description": "Root element for Batch Availability Request",
"allOf": [
{
"$ref": "#/components/schemas/RequestResponseBase"
},
{
"type": "object",
"required": [
"StartDate",
"Mode"
],
"properties": {
"StartDate": {
"type": "string",
"format": "date",
"description": "Date for which tour availability is being requested from the reservation system.\n* If supplied without an `EndDate`, then a single date availability request is being made.\n* If supplied with an `EndDate`, then availability request is for a date range.\n\nThe date should be in date format: **YYYY-MM-DD**.\n\n**Example:** 2000-01-31\n"
},
"EndDate": {
"type": "string",
"format": "date",
"description": "End date of date range for which tour availability is being requested from the reservation system. If this is empty, availability will be searched for the given `StartDate` only. \n\nThe date should be in date format: **YYYY-MM-DD**.\n\n**Example:** 2000-01-31\n"
},
"Mode": {
"type": "string",
"enum": [
"ALL"
],
"description": "Availability request mode. Valid values include:\n\n* `\"ALL\"` - This mode requests that all dates are returned with appropriate availability status.\n"
}
}
}
]
},
"BatchAvailabilityResponse": {
"description": "Root element for Batch Availability Response",
"allOf": [
{
"$ref": "#/components/schemas/ResponseBase"
},
{
"type": "object",
"required": [
"BatchTourAvailability"
],
"properties": {
"BatchTourAvailability": {
"type": "array",
"description": "Batch availability root element. Holds availability for each product (tour) or product option (tour option). \nFor products with more than one option, multiple `TourAvailability` elements will be provided in the response, one for each option. \nIf a product has no options, then a single `BatchTourAvailability` element will be provided in the response with no `SupplierOptionCode`.\n",
"items": {
"type": "object",
"title": "BatchTourAvailabilityItem",
"required": [
"Date",
"SupplierProductCode",
"AvailabilityStatus"
],
"properties": {
"Date": {
"type": "string",
"format": "date",
"description": "Date for which tour availability is being supplied. \n\nThe date should be in date format: **YYYY-MM-DD.** \n\n**Example:** 2000-01-31\n"
},
"SupplierProductCode": {
"type": "string",
"maxLength": 50,
"description": "Operator's unique product (tour) identifier in the reservation system."
},
"TourOptions": {
"$ref": "#/components/schemas/TourOptionItem"
},
"AvailabilityStatus": {
"type": "object",
"description": "Availability status root element. Holds the availability status for given product (tour) or product option (tour option).",
"required": [
"Status"
],
"properties": {
"Status": {
"type": "string",
"description": "Status of availability. Valid values include:\n * `AVAILABLE` - when product is available for the given `Date`\n * `UNAVAILABLE` - when product is not available for the given `Date`\n",
"enum": [
"AVAILABLE",
"UNAVAILABLE"
]
},
"UnavailabilityReason": {
"enum": [
"SOLD_OUT",
"BLOCKED_OUT",
"INACTIVE",
"PAST_CUTOFF_DATE",
"NO_EVENT"
],
"type": "string",
"description": "Reason why product is not available; valid values include:\n- `SOLD_OUT` - when the product (tour) / product option (tour option) is sold out. When this reason code is received, the product or product option becomes unavailable for sale on Viator systems.\n- `BLOCKED_OUT` - when the product (tour) / product option (tour option) has been blocked out (not taking place on this date). When this reason code is received, the product or product option becomes unavailable for sale on Viator systems.\n- `INACTIVE` - when the product (tour) / product option (tour option) is no longer active. When this reason code is received, the product or product option becomes unavailable for sale on Viator systems.\n- `PAST_CUTOFF_DATE` - when the booking cut-off date has been reached for this product (tour) / product option (tour option). When this reason code is received, the product or product option becomes unavailable for sale on Viator systems.\n- `NO_EVENT` - This event is no longer valid. When this reason code is received, the product or product option becomes unavailable for sale on Viator systems\n"
},
"TravellerMixAvailability": {
"description": "Holds availability information for each age band. `True` if the traveler mix is available, `false` if sold out",
"type": "object",
"properties": {
"Infant": {
"type": "boolean",
"description": "`True` if availability exists for the Infant age band.\n"
},
"Child": {
"type": "boolean",
"description": "`True` if availability exists for the Child age band.\n"
},
"Youth": {
"type": "boolean",
"description": "`True` if availability exists for the Youth age band.\n"
},
"Adult": {
"type": "boolean",
"description": "`True` if availability exists for the Adult age band.\n"
},
"Senior": {
"type": "boolean",
"description": "`True` if availability exists for the Senior age band.\n"
}
}
}
}
},
"VersionTag": {
"$ref": "#/components/schemas/VersionTag"
}
}
}
}
}
}
]
},
"BatchPricingRequest": {
"description": "Root element for Batch Pricing Request",
"allOf": [
{
"$ref": "#/components/schemas/RequestResponseBase"
},
{
"type": "object",
"required": [
"StartDate",
"EndDate"
],
"properties": {
"StartDate": {
"type": "string",
"format": "date",
"description": "The date should be in date format: **YYYY-MM-DD**.\n"
},
"EndDate": {
"type": "string",
"format": "date",
"description": "The date should be in date format: **YYYY-MM-DD**.\n"
},
"SupplierProductCode": {
"type": "array",
"description": "Array of strings specifying the operator's reservation system unique product identifiers.",
"items": {
"type": "string",
"maxLength": 50
}
}
}
}
]
},
"BatchPricingResponse": {
"description": "Root element for Batch Pricing Response",
"allOf": [
{
"$ref": "#/components/schemas/ResponseBase"
},
{
"type": "object",
"required": [
"CurrencyCode"
],
"properties": {
"CurrencyCode": {
"type": "string",
"description": "Currency code for this pricing information. ISO 4217 three-letter currency code associated with the booking price. ISO 4217 is the International Standard for currency codes.\nFor more information visit [iso.org](https://www.iso.org/).\n"
},
"BatchTourPricing": {
"type": "array",
"description": "`BatchTourPricing` root element. Holds pricing information for the requested product for a specific date and tour option. \nEach date in the requested range must have at least one `BatchTourPricing` element.\n",
"items": {
"type": "object",
"title": "BatchTourPricingItem",
"required": [
"Date",
"SupplierProductCode",
"AvailabilityStatus"
],
"properties": {
"Date": {
"type": "string",
"format": "date",
"description": "Date for which tour availability is being supplied. \n\nThe date should be in date format: **YYYY-MM-DD.** \n\n**Example:** 2000-01-31\n"
},
"SupplierProductCode": {
"type": "string",
"maxLength": 50,
"description": "Reservation system unique product (tour) identifier. This code will be used across multiple API calls."
},
"TourOptions": {
"$ref": "#/components/schemas/TourOptionItem"
},
"AvailabilityStatus": {
"type": "object",
"description": "Availability status root element. Holds the availability status for given product (tour) or product option (tour option).",
"required": [
"Status"
],
"properties": {
"Status": {
"type": "string",
"description": "Status of availability. Valid values include:\n * `AVAILABLE` - when product is available for the given `Date`\n * `UNAVAILABLE` - when product is not available for the given `Date`\n",
"enum": [
"AVAILABLE",
"UNAVAILABLE"
]
},
"UnavailabilityReason": {
"enum": [
"SOLD_OUT",
"BLOCKED_OUT",
"INACTIVE",
"PAST_CUTOFF_DATE",
"NO_EVENT"
],
"type": "string",
"description": "Reason why product is not available; valid values include:\n- `SOLD_OUT` - when the product (tour) / product option (tour option) is sold out. When this reason code is received, the product or product option becomes unavailable for sale on Viator systems.\n- `BLOCKED_OUT` - when the product (tour) / product option (tour option) has been blocked out (not taking place on this date). When this reason code is received, the product or product option becomes unavailable for sale on Viator systems.\n- `INACTIVE` - when the product (tour) / product option (tour option) is no longer active. When this reason code is received, the product or product option becomes unavailable for sale on Viator systems.\n- `PAST_CUTOFF_DATE` - when the booking cut-off date has been reached for this product (tour) / product option (tour option). When this reason code is received, the product or product option becomes unavailable for sale on Viator systems.\n- `NO_EVENT` - This event is no longer valid. When this reason code is received, the product or product option becomes unavailable for sale on Viator systems\n"
},
"TravellerMixAvailability": {
"description": "Holds availability information for each age band. `True` if the traveler mix is available, `false` if sold out",
"type": "object",
"properties": {
"Infant": {
"type": "boolean",
"description": "`True` if availability exists for the Infant age band.\n"
},
"Child": {
"type": "boolean",
"description": "`True` if availability exists for the Child age band.\n"
},
"Youth": {
"type": "boolean",
"description": "`True` if availability exists for the Youth age band.\n"
},
"Adult": {
"type": "boolean",
"description": "`True` if availability exists for the Adult age band.\n"
},
"Senior": {
"type": "boolean",
"description": "`True` if availability exists for the Senior age band.\n"
}
}
}
}
},
"BatchPrice": {
"type": "object",
"description": "`BatchPrice` root element. Holds pricing information (operator and reseller prices) for each available age band of the given product (tour).\n",
"properties": {
"Item": {
"type": "array",
"description": "Single price information retrieved from the API.",
"items": {
"type": "object",
"required": [
"AgeBand",
"RetailPrice"
],
"properties": {
"RetailPrice": {
"type": "number",
"description": "Stores the price for which the booking should be made on the shop by the customer for the given age band."
},
"AgeBand": {
"type": "string",
"description": "Age band of traveler.",
"enum": [
"Adult",
"Child",
"Youth",
"Infant",
"Senior"
]
}
}
}
}
}
}
}
}
}
}
}
]
},
"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.\n"
},
"Location": {
"type": "string",
"description": "City and country that the tour is in.\n\n**Example:** Sydney, Australia\n"
},
"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.\n\n**Example**: 550.00\n"
},
"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.\n",
"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."
}
}
}
]
},
"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:\n* **application/pdf**\n",
"enum": [
"application/pdf"
]
},
"Url": {
"type": "string",
"description": "The URL for the ticket."
}
}
},
"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.\nThe code is printed as per prior agreement with the operator. Barcode is at itinerary/traveler level (each traveler will have an individual barcode).\n"
},
"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.\nThis information should clearly instruct the traveler of the seat location.\n"
}
}
}
},
"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`.\n\nValid values are:\n* **NOT_OPERATING -** Tour is not operating on the date for which the booking was made.\n* **BOOKED_OUT_ALT_DATES -** Tour is booked out but alternative dates will be provided in the `RejectionReasonDetails`\n* **BOOKED_OUT_ALT_TIMES -** Tour is booked out but alternative times will be provided in the `RejectionReasonDetails`\n* **OTHER -** Any other reason. Details must be provided in `RejectionReasonDetails`.\n",
"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`.\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"
},
"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"
]
}
}
}
}
}
]
}
]
},
"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.\n"
},
"Location": {
"type": "string",
"description": "City and country that the tour is in.\n\n**Example:** Sydney, Australia\n"
},
"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.\n\n**Example**: 550.00\n"
},
"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.\n",
"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.\n",
"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"
}
}
}
]
},
"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.\nThe code is printed as per prior agreement with the operator. Barcode is at itinerary/traveler level (each traveler will have an individual barcode).\n"
},
"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.\nThis information should clearly instruct the traveler of the seat location.\n"
}
}
}
},
"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`.\n\nValid values are:\n* **NOT_OPERATING -** Tour is not operating on the date for which the booking was made.\n* **BOOKED_OUT_ALT_DATES -** Tour is booked out but alternative dates will be provided in the `RejectionReasonDetails`\n* **BOOKED_OUT_ALT_TIMES -** Tour is booked out but alternative times will be provided in the `RejectionReasonDetails`\n* **OTHER -** Any other reason. Details must be provided in `RejectionReasonDetails`.\n",
"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`.\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"
},
"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"
]
}
}
}
}
}
]
}
]
},
"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.\n\n**Example**: 2000-01-31\n"
},
"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."
}
}
}
]
},
"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.\n"
},
"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`.\n\nValid values are:\n* **PAST_CANCEL_DATE -** Allowed cancellation date is in the past.\n* **PAST_TOUR_DATE -** Tour date is in the past.\n* **TOUR_REDEEMED -** Tour has already been redeemed.\n* **OTHER -** Any other reason. Details must be provided in `RejectionReasonDetails`.\n",
"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`.\n"
}
}
}
}
},
{
"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"
]
}
}
}
}
}
]
}
]
},
"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"
}
}
}
]
},
"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"
]
}
}
}
}
}
]
}
]
},
"AvailabilityNotification2Request": {
"description": "Root element for Availability Notification 2 Request",
"allOf": [
{
"$ref": "#/components/schemas/RequestResponseBase"
},
{
"type": "object",
"required": [
"VariantAvailability"
],
"properties": {
"VariantAvailability": {
"type": "object",
"description": "Changed availability root element. This element contains a `SupplierProductCode`, associated `TourOptions` and a list of `DateAvailability` items.\n",
"required": [
"SupplierProductCode",
"DateAvailability"
],
"properties": {
"SupplierProductCode": {
"type": "string",
"maxLength": 50,
"description": "String representing the operator's unique product (tour) identifier in the reservation system. This code will be used across multiple API calls.\n"
},
"TourOptions": {
"type": "object",
"description": "Tour option (product option) root element. \nThis should be the same `TourOptions` as given in your `TourListResponse`. This is used to identify one sellable item\n",
"properties": {
"SupplierOptionCode": {
"type": "string",
"description": "The operator's product option (tour option) identifier in the reservation system. A product option is a variant of the product and each option must have a unique identifier.\n\n**Examples:**\n- A tour that is conducted by a Spanish guide and also by an English guide has two options.\n- 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.\n- A Tour that has a luxurious version and a cheaper version is considered to have two options.\n"
},
"TourDepartureTime": {
"type": "string",
"description": "Time of product option departure. Values should be in time format.\n\n**Example:** 09:00:00.\n",
"format": "time"
},
"Option": {
"type": "array",
"description": "Option root element. Contains additional information used to uniquely identify a product option.",
"items": {
"type": "object",
"required": [
"Name",
"Value"
],
"properties": {
"Name": {
"type": "string",
"description": "Option name"
},
"Value": {
"type": "string",
"description": "Option value"
}
}
}
}
}
},
"DateAvailability": {
"type": "array",
"description": "Contains the list of updated dates and their associated updated availability statuses.",
"items": {
"title": "DateAvailability",
"required": [
"Date",
"AvailabilityStatus"
],
"properties": {
"Date": {
"type": "string",
"format": "date",
"description": "The date for which the availability has changed. Date should be in date format.\n\n**Example:** 2000-01-31\n"
},
"AvailabilityStatus": {
"type": "object",
"description": "Availability status root element. Holds the availability status for given product (tour) or product option (tour option).",
"required": [
"Status"
],
"properties": {
"Status": {
"type": "string",
"description": "Status of availability. Valid values include:\n * `AVAILABLE` - when product is available\n * `UNAVAILABLE` - when product is not available\n",
"enum": [
"AVAILABLE",
"UNAVAILABLE"
]
},
"UnavailabilityReason": {
"enum": [
"SOLD_OUT",
"BLOCKED_OUT",
"INACTIVE",
"PAST_CUTOFF_DATE",
"NO_EVENT"
],
"type": "string",
"description": "Reason why product is not available; valid values include:\n- `SOLD_OUT` - when the product (tour) / product option (tour option) is sold out. When this reason code is received, the product or product option becomes unavailable for sale on Viator systems.\n- `BLOCKED_OUT` - when the product (tour) / product option (tour option) has been blocked out (not taking place on this date). When this reason code is received, the product or product option becomes unavailable for sale on Viator systems.\n- `INACTIVE` - when the product (tour) / product option (tour option) is no longer active. When this reason code is received, the product or product option becomes unavailable for sale on Viator systems.\n- `PAST_CUTOFF_DATE` - when the booking cut-off date has been reached for this product (tour) / product option (tour option). When this reason code is received, the product or product option becomes unavailable for sale on Viator systems.\n- `NO_EVENT` - This event is no longer valid. When this reason code is received, the product or product option becomes unavailable for sale on Viator systems\n"
}
}
},
"VersionTag": {
"$ref": "#/components/schemas/VersionTag"
}
}
}
}
}
}
}
}
]
},
"AvailabilityNotification2Response": {
"description": "Root element for Availability Notification 2 Response",
"allOf": [
{
"$ref": "#/components/schemas/ResponseBase"
},
{
"type": "object"
}
]
}
},
"examples": {
"availabilityCheckRequest": {
"value": {
"supplierId": 123,
"productOptions": [
{
"productOptionId": "r1172330",
"startTimes": [
"09:00"
]
}
],
"travelDate": "2025-04-29",
"tickets": [
{
"type": "ADULT",
"quantity": 2
}
],
"totalTravelers": 2
}
},
"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"
}
}
]
}
}
]
}
]
}
},
"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
}
]
}
}
]
}
]
}
},
"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"
}
]
}
]
}
},
"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
}
}
]
}
]
}
},
"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"
}
}
]
}
]
}
},
"error422": {
"summary": "Unprocessable Content error",
"value": {
"error": "INVALID_SUPPLIER",
"message": "Invalid supplier ID"
}
},
"error500": {
"summary": "Internal Server Error",
"value": {
"error": "INTERNAL_ERROR",
"message": "Unknown internal error"
}
},
"CalendarRequest": {
"value": {
"supplierId": 1004,
"productOptionIds": [
"r1172330"
],
"startDate": "2026-01-21",
"endDate": "2026-01-25"
}
},
"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
}
]
}
}
]
}
]
}
]
}
},
"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"
}
}
]
}
]
}
}
]
}
]
}
]
}
},
"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
}
}
]
}
]
}
]
}
},
"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"
}
}
]
}
]
}
]
}
},
"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
}
]
}
}
]
}
]
}
]
}
},
"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
}
]
}
}
]
}
]
}
]
}
},
"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
}
]
}
}
]
}
]
}
]
}
},
"CalendarResponseNoEvents": {
"summary": "No Events exist for the requested Product Option",
"value": {
"productOptions": [
{
"productOptionId": "r1172330",
"currency": "USD",
"dates": [
{
"travelDate": "2026-01-22",
"events": []
}
]
}
]
}
},
"reserveRequest": {
"value": {
"supplierId": 1004,
"productOptionId": "r1172330",
"startTime": "15:30",
"travelDate": "2026-01-21",
"tickets": [
{
"type": "ADULT",
"quantity": 2
},
{
"type": "CHILD",
"quantity": 1
}
],
"totalTravelers": 3
}
},
"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
}
]
}
}
},
"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
}
}
},
"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"
}
}
},
"notReservedResponse": {
"summary": "Not Reserved response",
"value": {
"status": "NOT_RESERVED",
"reason": "SOLD_OUT"
}
},
"SpecialOffersRequest": {
"value": {
"supplierId": 3456,
"specialOfferIds": [
"A Unique id",
"A-unique-id-2"
]
}
},
"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"
}
]
}
},
"eventNotificationRequest": {
"value": {
"supplierId": 123,
"updateType": [
"AVAILABILITY",
"PRICING"
],
"productOptionIds": [
"r1172330",
"r1172331"
],
"startDate": "2025-01-01",
"endDate": "2025-12-31"
}
},
"eventNotificationResponse": {
"value": {
"results": [
{
"productOptionId": "r1172330",
"status": 200
},
{
"productOptionId": "r1172331",
"status": 422,
"error": "INVALID_PRODUCT_OPTION"
}
]
}
},
"eventNotificationUnprocessableResponse": {
"value": {
"error": "INVALID_PRODUCT_OPTION",
"message": "All product options are invalid"
}
},
"tourListRequestJson": {
"value": {
"requestType": "TourListRequest",
"data": {
"ApiKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"ResellerId": "1000",
"SupplierId": 1004,
"ExternalReference": "10051374722994001",
"Timestamp": "2013-12-10T13:30:54.616+10:00"
}
}
},
"tourListRequestXml": {
"value": "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10051374722994001\n 2013-12-10T13:30:54.616+10:00\n\n"
},
"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"
}
]
}
]
}
]
}
}
},
"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"
}
]
}
]
}
]
}
}
},
"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."
}
}
}
}
},
"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"
},
"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"
},
"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"
},
"availabilityRequestWorkflow1Json": {
"summary": "Workflow stage 1 - Product and date selected",
"value": {
"requestType": "AvailabilityRequest",
"data": {
"ApiKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"ResellerId": "1000",
"SupplierId": 1004,
"ExternalReference": "10051374722992616",
"Timestamp": "2013-07-25T13:29:52.616+10:00",
"StartDate": "2014-10-31",
"SupplierProductCode": "BLUE",
"TravellerMix": {
"Adult": 1,
"Child": 1,
"Youth": 0,
"Infant": 0,
"Senior": 0,
"Total": 2
}
}
}
},
"availabilityRequestWorkflow2Json": {
"summary": "Workflow stage 2 - Product option selected",
"value": {
"requestType": "AvailabilityRequest",
"data": {
"ApiKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"ResellerId": "1000",
"SupplierId": 1004,
"ExternalReference": "10051374722992616",
"Timestamp": "2013-07-25T13:29:52.616+10:00",
"StartDate": "2014-10-31",
"SupplierProductCode": "BLUE",
"TourOptions": {
"SupplierOptionCode": "BASIC",
"SupplierOptionName": "Basic Shared Accommodation",
"TourDepartureTime": "09:00:00",
"Option": [
{
"Name": "Room",
"Value": "dualocc"
}
]
},
"TravellerMix": {
"Adult": 1,
"Child": 1,
"Youth": 0,
"Infant": 0,
"Senior": 0,
"Total": 2
}
}
}
},
"availabilityRequestWorkflow3Json": {
"summary": "Workflow stage 3 - Product checkout (with availability hold)",
"value": {
"requestType": "AvailabilityRequest",
"data": {
"ApiKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"ResellerId": "1000",
"SupplierId": 1004,
"ExternalReference": "10051374722992616",
"Timestamp": "2013-07-25T13:29:52.616+10:00",
"StartDate": "2014-10-31",
"SupplierProductCode": "BLUE",
"TourOptions": {
"SupplierOptionCode": "BASIC",
"SupplierOptionName": "Basic Shared Accommodation",
"TourDepartureTime": "09:00:00",
"Option": [
{
"Name": "Room",
"Value": "dualocc"
}
]
},
"AvailabilityHold": {
"Expiry": "PT300S"
},
"TravellerMix": {
"Adult": 1,
"Child": 1,
"Youth": 0,
"Infant": 0,
"Senior": 0,
"Total": 2
}
}
}
},
"availabilitySingleDateRequestJson": {
"summary": "Single-date request",
"value": {
"requestType": "AvailabilityRequest",
"data": {
"ApiKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"ResellerId": "1000",
"SupplierId": 1004,
"ExternalReference": "10051374722992616",
"Timestamp": "2013-07-25T13:29:52.616+10:00",
"StartDate": "2014-10-30",
"EndDate": "",
"SupplierProductCode": "BLUE",
"TourOptions": {
"SupplierOptionCode": "BASIC",
"SupplierOptionName": "Basic Shared Accommodation",
"TourDepartureTime": "09:00:00",
"Option": [
{
"Name": "Room",
"Value": "dualocc"
}
]
},
"AvailabilityHold": {
"Expiry": "PT300S"
},
"TravellerMix": {
"Adult": 1,
"Child": 1,
"Youth": 0,
"Infant": 1,
"Senior": 0,
"Total": 3
}
}
}
},
"availabilityDateRangeRequestJson": {
"summary": "Date-range request",
"value": {
"requestType": "AvailabilityRequest",
"data": {
"ApiKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"ResellerId": "1000",
"SupplierId": 1004,
"ExternalReference": "10051374722992616",
"Timestamp": "2013-07-25T13:29:52.616+10:00",
"StartDate": "2014-10-30",
"EndDate": "2014-10-31",
"SupplierProductCode": "BLUE",
"TourOptions": {
"SupplierOptionCode": "BASIC",
"Option": [
{
"Name": "Room",
"Value": "dualocc"
}
]
},
"TravellerMix": {
"Adult": 1,
"Child": 1,
"Youth": 0,
"Infant": 1,
"Senior": 0,
"Total": 3
}
}
}
},
"availabilityRequestWorkflow1Xml": {
"summary": "Workflow stage 1 - Product and date selected",
"value": "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10051374722992616\n 2013-07-25T13:29:52.616+10:00\n 2014-10-31\n BLUE\n \n 1\n 1\n 0\n 0\n 0\n 2\n \n\n"
},
"availabilityRequestWorkflow2Xml": {
"summary": "Workflow stage 2 - Product option selected",
"value": "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10051374722992616\n 2013-07-25T13:29:52.616+10:00\n 2014-10-31\n BLUE\n \n BASIC\n Basic Shared Accommodation\n 09:00:00\n \n \n \n 1\n 1\n 0\n 0\n 0\n 2\n \n\n"
},
"availabilityRequestWorkflow3Xml": {
"summary": "Workflow stage 3 - Product checkout (with availability hold)",
"value": "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10051374722992616\n 2013-07-25T13:29:52.616+10:00\n 2014-10-31\n BLUE\n \n BASIC\n Basic Shared Accommodation\n 09:00:00\n \n \n \n PT300S\n \n \n 1\n 1\n 0\n 0\n 0\n 2\n \n\n"
},
"availabilitySingleDateRequestXml": {
"summary": "Single-date request",
"value": "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10051374722992616\n 2013-07-25T13:29:52.616+10:00\n 2014-10-30\n \n BLUE\n \n BASIC\n Basic Shared Accommodation\n 09:00:00\n \n \n \n PT300S\n \n \n 1\n 1\n 0\n 1\n 0\n 3\n \n\n"
},
"availabilityDateRangeRequestXml": {
"summary": "Date-range request",
"value": "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10051374722992616\n 2013-07-25T13:29:52.616+10:00\n 2014-10-30\n 2014-10-31\n BLUE\n \n BASIC\n \n \n \n 1\n 1\n 0\n 1\n 0\n 3\n \n\n"
},
"availabilitySingleDateResponseJson": {
"summary": "Single-date response",
"value": {
"responseType": "AvailabilityResponse",
"data": {
"ApiKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"ResellerId": "1000",
"SupplierId": 1004,
"ExternalReference": "10051374722992616",
"Timestamp": "2013-07-25T13:29:52.616+10:00",
"RequestStatus": {
"Status": "SUCCESS"
},
"SupplierProductCode": "BLUE",
"TourAvailability": [
{
"Date": "2014-10-31",
"BookingCutoff": {
"ProductDateTime": "2014-10-29T12:13:14"
},
"TourOptions": {
"SupplierOptionCode": "BASIC",
"SupplierOptionName": "Basic Shared Accommodation",
"TourDepartureTime": "09:00:00",
"Option": [
{
"Name": "Room",
"Value": "dualocc"
}
]
},
"AvailabilityStatus": {
"Status": "AVAILABLE",
"TravellerMixAvailability": {
"Adult": true,
"Child": true,
"Youth": true,
"Infant": true,
"Senior": true
}
},
"Price": {
"CurrencyCode": "EUR",
"Item": [
{
"RetailPrice": 112,
"AgeBand": "Adult"
},
{
"RetailPrice": 90,
"AgeBand": "Child"
},
{
"RetailPrice": 50,
"AgeBand": "Infant"
}
]
},
"AvailabilityHold": {
"Expiry": "PT300S",
"Reference": "1K883383K2S12K883383K2S57K883383K2"
},
"Capacity": {
"Simple": {
"Remaining": 10,
"ConsumedBy": [
"ADULT",
"YOUTH"
]
}
},
"VersionTag": {
"Textual": "20130705-V000000231434"
}
}
]
}
}
},
"availabilityDateRangeResponseJson": {
"summary": "Date-range response",
"value": {
"responseType": "AvailabilityResponse",
"data": {
"ApiKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"ResellerId": "1000",
"SupplierId": 1004,
"ExternalReference": "10051374722992616",
"Timestamp": "2013-07-25T13:29:52.616+10:00",
"RequestStatus": {
"Status": "SUCCESS"
},
"SupplierProductCode": "BLUE",
"TourAvailability": [
{
"Date": "2014-10-30",
"BookingCutoff": {
"ProductDateTime": "2014-10-29T12:13:14"
},
"TourOptions": {
"SupplierOptionCode": "BASIC",
"SupplierOptionName": "Basic Shared Accommodation",
"TourDepartureTime": "",
"Option": [
{
"Name": "Room",
"Value": "dualocc"
}
]
},
"AvailabilityStatus": {
"Status": "AVAILABLE"
},
"Capacity": {
"Simple": {
"Remaining": 10,
"ConsumedBy": [
"ADULT",
"YOUTH"
]
}
},
"VersionTag": {
"Textual": "20130705-V000000231435"
}
},
{
"Date": "2014-10-31",
"BookingCutoff": {
"ProductDateTime": "2014-10-29T12:13:14"
},
"TourOptions": {
"SupplierOptionCode": "BASIC",
"SupplierOptionName": "Basic Shared Accommodation",
"TourDepartureTime": "",
"Option": [
{
"Name": "Room",
"Value": "dualocc"
}
]
},
"AvailabilityStatus": {
"Status": "UNAVAILABLE",
"UnavailabilityReason": "SOLD_OUT"
},
"VersionTag": {
"Textual": "20130705-V000000231436"
}
}
]
}
}
},
"availabilitySingleDateResponseXml": {
"summary": "Single-date response",
"value": "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10051374722992616\n 2013-07-25T13:29:52.616+10:00\n \n SUCCESS\n \n BLUE\n \n 2014-10-31\n \n 2014-10-29T12:13:14\n \n \n BASIC\n Basic Shared Accommodation\n 09:00:00\n \n \n \n AVAILABLE\n \n true\n true\n true\n true\n true\n \n \n \n PT300S\n 1K883383K2S12K883383K2S57K883383K2\n \n \n \n 10\n ADULT\n YOUTH\n \n \n \n 20130705-V000000231434\n \n \n\n"
},
"availabilityDateRangeResponseXml": {
"summary": "Range-date response",
"value": "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10051374722992616\n 2013-07-25T13:29:52.616+10:00\n \n SUCCESS\n \n BLUE\n \n 2014-10-30\n \n 2014-10-29T12:13:14\n \n \n BASIC\n Basic Shared Accommodation\n \n \n \n \n AVAILABLE\n \n \n \n 10\n ADULT\n YOUTH\n \n \n \n 20130705-V000000231435\n \n \n \n 2014-10-31\n \n 2014-10-29T12:13:14\n \n \n BASIC\n Basic Shared Accommodation\n \n \n \n \n UNAVAILABLE\n SOLD_OUT\n \n \n 20130705-V000000231436\n \n \n\n"
},
"batchAvailabilityRequestJson": {
"value": {
"requestType": "BatchAvailabilityRequest",
"data": {
"ApiKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"ResellerId": "1000",
"SupplierId": 1004,
"ExternalReference": "1023_2936275621425724",
"Timestamp": "2020-01-14T13:04:27.500Z",
"StartDate": "2020-01-14",
"EndDate": "2020-02-13",
"Mode": "ALL"
}
}
},
"batchAvailabilityRequestXml": {
"value": "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 1023_2936275621425724\n 2020-01-14T13:04:27.500Z\n 2020-01-14\n 2020-02-13\n ALL\n\n"
},
"batchAvailabilitySingleDateResponseJson": {
"summary": "Single date / multiple products response",
"value": {
"responseType": "BatchAvailabilityResponse",
"data": {
"ApiKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"ResellerId": "1000",
"SupplierId": 1004,
"ExternalReference": "10051374722992616",
"Timestamp": "2013-07-25T13:29:52.616+10:00",
"RequestStatus": {
"Status": "SUCCESS"
},
"BatchTourAvailability": [
{
"Date": "2014-10-01",
"TourOptions": {
"SupplierOptionCode": "BASIC",
"SupplierOptionName": "Basic Shared Accommodation",
"TourDepartureTime": "09:00:00",
"Option": [
{
"Name": "Room",
"Value": "dualocc"
}
]
},
"SupplierProductCode": "BLUE",
"AvailabilityStatus": {
"Status": "UNAVAILABLE",
"UnavailabilityReason": "SOLD_OUT"
},
"VersionTag": {
"Numeric": 553957349573497
}
},
{
"Date": "2014-10-01",
"TourOptions": {
"SupplierOptionCode": "9AM",
"SupplierOptionName": "Bondi Beach Private Lesson 9AM",
"TourDepartureTime": "09:00:00",
"Option": [
{
"Name": "",
"Value": ""
}
]
},
"SupplierProductCode": "BON_GRO",
"AvailabilityStatus": {
"Status": "AVAILABLE"
},
"VersionTag": {
"Numeric": 553957349573498
}
}
]
}
}
},
"batchAvailabilityDateRangeResponseJson": {
"summary": "Date range / single product response",
"value": {
"responseType": "BatchAvailabilityResponse",
"data": {
"ApiKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"ResellerId": "1000",
"SupplierId": 1004,
"ExternalReference": "10051374722992616",
"Timestamp": "2013-07-25T13:29:52.616+10:00",
"RequestStatus": {
"Status": "SUCCESS"
},
"BatchTourAvailability": [
{
"Date": "2014-10-30",
"TourOptions": {
"SupplierOptionCode": "BASIC",
"SupplierOptionName": "Basic Shared Accommodation",
"TourDepartureTime": "09:00:00",
"Option": [
{
"Name": "Room",
"Value": "dualocc"
}
]
},
"SupplierProductCode": "BLUE",
"AvailabilityStatus": {
"Status": "UNAVAILABLE",
"UnavailabilityReason": "SOLD_OUT"
},
"VersionTag": {
"Numeric": 5539573495734986
}
},
{
"Date": "2014-10-31",
"TourOptions": {
"SupplierOptionCode": "BASIC",
"SupplierOptionName": "Basic Shared Accommodation",
"TourDepartureTime": "09:00:00",
"Option": [
{
"Name": "Room",
"Value": "dualocc"
}
]
},
"SupplierProductCode": "BLUE",
"AvailabilityStatus": {
"Status": "UNAVAILABLE",
"UnavailabilityReason": "SOLD_OUT"
},
"VersionTag": {
"Numeric": 5539573495734987
}
}
]
}
}
},
"batchAvailabilitySingleDateResponseXml": {
"summary": "Single date / multiple products response",
"value": "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10051374722992616\n 2013-07-25T13:29:52.616+10:00\n \n SUCCESS\n \n \n 2014-10-01\n \n BASIC\n Basic Shared Accommodation\n 09:00:00\n \n \n BLUE\n \n UNAVAILABLE\n SOLD_OUT\n \n \n 553957349573497\n \n \n \n 2014-10-01\n \n 9AM\n Bondi Beach Private Lesson 9AM\n 09:00:00\n \n \n BON_GRO\n \n AVAILABLE\n \n \n 553957349573498\n \n \n\n"
},
"batchAvailabilityDateRangeResponseXml": {
"summary": "Date range / single product response",
"value": "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10051374722992616\n 2013-07-25T13:29:52.616+10:00\n \n SUCCESS\n \n \n 2014-10-30\n \n BASIC\n Basic Shared Accommodation\n 09:00:00\n \n \n BLUE\n \n UNAVAILABLE\n SOLD_OUT\n \n \n 5539573495734986\n \n \n \n 2014-10-31\n \n BASIC\n Basic Shared Accommodation\n 09:00:00\n \n \n BLUE\n \n UNAVAILABLE\n SOLD_OUT\n \n \n 5539573495734987\n \n \n\n"
},
"batchPricingRequestJson": {
"value": {
"requestType": "BatchPricingRequest",
"data": {
"ApiKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"ResellerId": "1000",
"SupplierId": 1004,
"ExternalReference": "10051374722992617",
"Timestamp": "2019-06-26T20:40:55.375Z",
"StartDate": "2020-06-20",
"EndDate": "2020-06-21",
"SupplierProductCode": [
"BLUE"
]
}
}
},
"batchPricingRequestXml": {
"value": "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10051374722992617\n 2019-06-26T20:40:55.375Z\n 2020-06-20\n 2020-06-21\n BLUE\n\n"
},
"batchPricingResponseJson": {
"value": {
"responseType": "BatchPricingResponse",
"data": {
"ApiKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"ResellerId": "1000",
"SupplierId": 1004,
"ExternalReference": "10051374722992617",
"Timestamp": "2019-06-26T20:40:55.375Z",
"RequestStatus": {
"Status": "SUCCESS"
},
"CurrencyCode": "USD",
"BatchTourPricing": [
{
"Date": "2020-06-20",
"SupplierProductCode": "BLUE",
"TourOptions": {
"SupplierOptionCode": "BASIC",
"SupplierOptionName": "Basic Shared Accommodation",
"TourDepartureTime": "17:00:00"
},
"BatchPrice": {
"Item": [
{
"RetailPrice": 10,
"AgeBand": "Infant"
},
{
"RetailPrice": 10,
"AgeBand": "Child"
},
{
"RetailPrice": 10,
"AgeBand": "Youth"
},
{
"RetailPrice": 10,
"AgeBand": "Adult"
},
{
"RetailPrice": 10,
"AgeBand": "Senior"
}
]
},
"AvailabilityStatus": {
"Status": "AVAILABLE"
}
},
{
"Date": "2020-06-21",
"SupplierProductCode": "BLUE",
"TourOptions": {
"SupplierOptionCode": "BASIC",
"SupplierOptionName": "Basic Shared Accommodation",
"TourDepartureTime": "17:00:00"
},
"BatchPrice": {
"Item": [
{
"RetailPrice": 45.99,
"AgeBand": "Infant"
},
{
"RetailPrice": 45.99,
"AgeBand": "Child"
},
{
"RetailPrice": 45.99,
"AgeBand": "Youth"
},
{
"RetailPrice": 45.99,
"AgeBand": "Adult"
},
{
"RetailPrice": 45.99,
"AgeBand": "Senior"
}
]
},
"AvailabilityStatus": {
"Status": "AVAILABLE"
}
}
]
}
}
},
"batchPricingResponseXml": {
"value": "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10051374722992617\n 2019-06-26T20:40:55.375Z\n \n SUCCESS\n \n USD\n \n 2020-06-20\n BLUE\n \n BASIC\n Basic Shared Accommodation\n 17:00:00\n \n \n \n 10.0\n Infant\n \n \n 10.0\n Child\n \n \n 10.0\n Youth\n \n \n 10.0\n Adult\n \n \n 10.0\n Senior\n \n \n \n AVAILABLE\n \n \n \n 2020-06-21\n BLUE\n \n BASIC\n Basic Shared Accommodation\n 17:00:00\n \n \n \n 45.99\n Infant\n \n \n 45.99\n Child\n \n \n 45.99\n Youth\n \n \n 45.99\n Adult\n \n \n 45.99\n Senior\n \n \n \n AVAILABLE\n \n \n \n\n"
},
"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"
}
}
},
"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"
},
"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"
}
}
},
"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"
}
}
}
},
"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."
}
}
}
}
},
"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"
},
"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"
},
"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"
},
"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"
}
}
},
"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"
},
"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"
}
}
},
"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."
}
}
}
}
},
"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"
},
"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"
},
"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"
}
}
},
"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"
},
"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"
}
}
}
},
"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."
}
}
}
}
},
"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"
},
"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"
},
"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"
}
}
},
"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"
},
"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
}
]
}
}
},
"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
}
}
},
"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."
}
}
}
}
},
"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"
},
"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"
},
"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"
},
"availabilityNotification2RequestJson": {
"value": {
"requestType": "AvailabilityNotification2Request",
"data": {
"ApiKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"ResellerId": "1000",
"SupplierId": 1004,
"ExternalReference": "10051374722992850",
"Timestamp": "2021-03-15T10:14:37.682Z",
"VariantAvailability": {
"SupplierProductCode": "6482",
"TourOptions": {
"SupplierOptionCode": "r11828",
"TourDepartureTime": "08:00:00",
"Option": [
{
"Name": "pickup",
"Value": "Y"
}
]
},
"DateAvailability": [
{
"Date": "2021-03-15",
"AvailabilityStatus": {
"Status": "UNAVAILABLE",
"UnavailabilityReason": "SOLD_OUT"
},
"VersionTag": {
"Textual": "2021-03-15T10:14:37.682Z"
}
}
]
}
}
}
},
"availabilityNotification2RequestXml": {
"value": "\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10061374722913835\n 2021-04-06T10:14:37.682Z\n \n 6470\n \n r11811\n 09:00:00\n \n \n \n 2021-04-06\n \n UNAVAILABLE\n SOLD_OUT\n \n \n 2021-04-06T10:14:37.682Z\n \n \n \n\n"
},
"availabilityNotification2ResponseJson": {
"value": {
"responseType": "AvailabilityNotification2Response",
"data": {
"ApiKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"ResellerId": "1000",
"SupplierId": 1004,
"ExternalReference": "10061374722913835",
"Timestamp": "2021-04-06T10:14:37.682Z",
"RequestStatus": {
"Status": "SUCCESS"
}
}
}
},
"availabilityNotification2ResponseXml": {
"value": "\n\n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n 1000\n 1004\n 10061374722913835\n 2021-04-06T10:14:37.682Z\n \n SUCCESS\n \n\n"
}
}
},
"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).\n\nThis 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.\n\nThe Availability check endpoint supersedes the existing V1.0 [Real-time availability API](#tag/Deprecated/operation/availability).\n",
"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).\n\nThis endpoint is used by Viator to populate availability in the calendars and to create the pricing structure required to accurately price products.\n\nThe Calendar endpoint supersedes both the existing V1.0 [Batch Availability availability API](#tag/Deprecated/operation/batchAvailability) and [Batch Pricing API](#tag/Deprecated/operation/batchPricing).\n",
"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).\n\nThis 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.\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\nThe Reserve endpoint replaces the V1.0 [Real-time availability API](#tag/Deprecated/operation/availability) where the inventory reservation was requested previously.\n",
"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.\n\nThe 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.\n\nA 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).\n",
"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"
}
}
}
},
"/v2/notification/events": {
"post": {
"summary": "Event Notification",
"operationId": "eventNotification",
"x-codeSamples": [
{
"lang": "curl",
"label": "cURL",
"source": "curl -X POST \"https://api.viator.com/v2/notification/events\" \\\n -H \"X-Api-Key: \" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"supplierId\": 123,\n \"updateType\": [\n \"AVAILABILITY\",\n \"PRICING\"\n ],\n \"productOptionIds\": [\n \"r1172330\",\n \"r1172331\"\n ],\n \"startDate\": \"2025-01-01\",\n \"endDate\": \"2025-12-31\"\n}'\n"
},
{
"lang": "JavaScript",
"label": "Node.js",
"source": "const response = await fetch(\"https://api.viator.com/v2/notification/events\", {\n method: \"POST\",\n headers: {\n \"X-Api-Key\": \"\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n \"supplierId\": 123,\n \"updateType\": [\n \"AVAILABILITY\",\n \"PRICING\"\n ],\n \"productOptionIds\": [\n \"r1172330\",\n \"r1172331\"\n ],\n \"startDate\": \"2025-01-01\",\n \"endDate\": \"2025-12-31\"\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 \"updateType\": [\n \"AVAILABILITY\",\n \"PRICING\"\n ],\n \"productOptionIds\": [\n \"r1172330\",\n \"r1172331\"\n ],\n \"startDate\": \"2025-01-01\",\n \"endDate\": \"2025-12-31\"\n}''')\n\nresponse = requests.post(\n \"https://api.viator.com/v2/notification/events\",\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": [
"Viator APIs"
],
"description": "The event notifications endpoint allows reservation systems to inform Viator of changes to events that affect salability, pricing, or capacity for a given date range. This endpoint ensures rapid synchronization of event updates with Viator.\n\nViator prioritizes callbacks for Event notifications based on the `updateType`. \n- \"AVAILABILITY\" and \"PRICING\" notifications receive the highest priority. \n- \"CAPACITY\" notifications are prioritized using several factors, including the proximity to the travel date.\n\nNOTE: If both \"AVAILABILITY\" and \"CAPACITY\" types are received in the same notification, the \"CAPACITY\" priority is used. \n\n**Automated Event Notification Enablement**\n\nNotifications must be sent only for **already connected product options**. Therefore, Event Notifications **must be enabled** for a product option immediately after a [Calendar API](#tag/Reservation-system-APIs/operation/calendar) request is received for that product option.\n\n**Automated Event Notification Disablement** \n\nNotifications for a product option must be disabled if a **422 Unprocessable Content** or **207 Multiple-status response** HTTP status code is received with any of the following errors:\n- INVALID_SUPPLIER\n- INVALID_PRODUCT_OPTION\n\nDisabling event notifications for affected product options will prevent further failed requests and increased error rates.\n\n**NOTE**: If a calendar request is subsequently received for a previously disabled product option, notifications **must be re-enabled**.\n\nThe event notifications endpoint replaces the existing V1.0 [Availability Notification 2 API](#tag/Deprecated/operation/availabilityNotification2).\n",
"security": [
{
"ApiKeyHeader": []
}
],
"servers": [
{
"url": "https://api.viator.com",
"description": "Placeholder for Viator's API host. This operation is sent by the reservation system to Viator, unlike most other operations, which use the reservation system's own host above."
}
],
"x-badges": [
{
"name": "New",
"color": "#00876A",
"position": "after"
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/EventNotificationRequest"
},
"examples": {
"eventNotificationRequest": {
"$ref": "#/components/examples/eventNotificationRequest"
}
}
}
}
},
"responses": {
"204": {
"description": "Success"
},
"207": {
"description": "Multi-status response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/EventNotificationResponse"
},
"examples": {
"eventNotificationResponse": {
"$ref": "#/components/examples/eventNotificationResponse"
}
}
}
}
},
"400": {
"description": "Bad Request"
},
"401": {
"description": "Unauthorized"
},
"408": {
"description": "Request Timeout"
},
"415": {
"description": "Unsupported Media Type"
},
"422": {
"description": "Unprocessable Content",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/EventNotificationUnprocessableContentResponse"
},
"examples": {
"eventNotificationUnprocessableResponse": {
"$ref": "#/components/examples/eventNotificationUnprocessableResponse"
}
}
}
}
},
"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/notification/special-offers": {
"post": {
"x-badges": [
{
"name": "New",
"color": "#00876A",
"position": "after"
}
],
"summary": "Special Offers Notification",
"operationId": "specialOffersNotification",
"x-codeSamples": [
{
"lang": "curl",
"label": "cURL",
"source": "curl -X POST \"https://api.viator.com/v2/notification/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://api.viator.com/v2/notification/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://api.viator.com/v2/notification/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 notifications endpoint allows reservation systems to inform Viator of new or updated special offers for a given date range. This endpoint ensures rapid synchronization of special offers details with Viator.\n\nSpecial Offers notification triggers Viator to request additional details via the [Special Offers](#tag/Reservation-system-APIs/operation/specialOffers) endpoint **if the special offer is associated with an already connected product option**. This association is determined via the [Calendar](#tag/Reservation-system-APIs/operation/calendar) or [Availability check](#tag/Reservation-system-APIs/operation/availabilityCheck) endpoints.\n\n**Automated Special Offers Notification Enablement**\n\nNotifications must be sent only for **already connected product options**. Therefore, Special Offers notifications **must be enabled** for a product option immediately after a [Calendar API](#tag/Reservation-system-APIs/operation/calendar) request is received for that product option.\n\n**Automated Special Offers Notification Disablement** \n\nNotifications for a product option must be disabled if a **422 Unprocessable Content** HTTP status code is received with any of the following errors:\n- INVALID_SUPPLIER\n\nDisabling Special Offers notifications for affected product options will prevent further failed requests and increased error rates.\n\n**NOTE**: If a calendar request is subsequently received for a previously disabled product option, notifications **must be re-enabled**.\n",
"security": [
{
"ApiKeyHeader": []
}
],
"servers": [
{
"url": "https://api.viator.com",
"description": "Placeholder for Viator's API host. This operation is sent by the reservation system to Viator, unlike most other operations, which use the reservation system's own host above."
}
],
"tags": [
"Viator APIs"
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SpecialOffersNotificationRequest"
},
"examples": {
"specialOffersRequest": {
"$ref": "#/components/examples/SpecialOffersRequest"
}
}
}
}
},
"responses": {
"204": {
"description": "No Content"
},
"400": {
"description": "Bad Request"
},
"401": {
"description": "Unauthorized"
},
"408": {
"description": "Request Timeout"
},
"415": {
"description": "Unsupported Media Type"
},
"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"
}
}
}
}
}
}
}
},
"/availability": {
"post": {
"summary": "Real-time Availability",
"operationId": "availability",
"tags": [
"Deprecated"
],
"description": "The Real-time Availability API (v1.0) enables Viator to instantly verify the capacity and availability of a product or product option for a specified number of passengers. \n\nThis versatile API allows reservation systems to provide tour availability data for single dates or a range of dates. Viator then uses this information to either allow (if available) or prevent (if unavailable) customer bookings.\n\nWhen used for a **single date**, the API's main purpose is to confirm real-time availability during a customer's booking process for a specific date and passenger count. If the reservation system confirms availability, the customer can complete their booking. This direct check with the reservation system is expected to decrease booking rejections and increase last-minute reservations.\n\nTo reduce latency, Viator also conducts periodic single-date availability checks, though these do not include traveler mix information as they are not tied to user activity. \n\nIn contrast, when the Availability API is used with a **date range**, its aim is to determine future availability. This data is stored within Viator's systems, allowing for caching of availability information. This cached data is crucial in situations where the reservation system cannot be accessed for real-time availability checks (e.g., due to a communication line disruption).\n\n### Supported customer booking flows\nAs the customer progresses through their workflow, real-time availability requests are made at three distinct stages. Below lists key information in requests and responses:\n1. **Product and Date Selection**: When the traveler chooses a product, a specific travel date, and their desired traveler mix.\n - Requests include: `StartDate`, `SupplierProductCode`, and `TravellerMix`.\n - Response returns: All available `TourOptions` for customer selection.\n2. **Product option selection and adding to Cart**: After the traveler selects a product option and adds the product to their shopping cart.\n - Requests include: `StartDate`, `SupplierProductCode`, `TourOptions` and `TravellerMix`.\n - Response returns: Availability status for the requested product variant defined by `SupplierProductCode` and `TourOptions` and `TravellerMix`. \n3. **Checkout**: When the traveler proceeds to the checkout process.\n - Requests include: `StartDate`, `SupplierProductCode`, `TravellerMix`, `TourOptions`, and `AvailabilityHold`.\n - Response returns: Availability and inventory hold status for the requested product variant defined by `SupplierProductCode` and `TourOptions` and `TravellerMix`.\n",
"requestBody": {
"content": {
"application/json": {
"schema": {
"allOf": [
{
"type": "object",
"properties": {
"requestType": {
"type": "string",
"description": "`AvailabilityRequest`"
}
}
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/components/schemas/AvailabilityRequest"
}
},
"required": [
"requestType",
"data"
]
}
]
},
"examples": {
"workflow1": {
"$ref": "#/components/examples/availabilityRequestWorkflow1Json"
},
"workflow2": {
"$ref": "#/components/examples/availabilityRequestWorkflow2Json"
},
"workflow3": {
"$ref": "#/components/examples/availabilityRequestWorkflow3Json"
},
"singleDate": {
"$ref": "#/components/examples/availabilitySingleDateRequestJson"
},
"dateRange": {
"$ref": "#/components/examples/availabilityDateRangeRequestJson"
}
}
},
"application/xml": {
"schema": {
"allOf": [
{
"type": "object",
"properties": {
"AvailabilityRequest": {
"$ref": "#/components/schemas/AvailabilityRequest"
}
},
"required": [
"AvailabilityRequest"
]
}
]
},
"examples": {
"workflow1": {
"$ref": "#/components/examples/availabilityRequestWorkflow1Xml"
},
"workflow2": {
"$ref": "#/components/examples/availabilityRequestWorkflow2Xml"
},
"workflow3": {
"$ref": "#/components/examples/availabilityRequestWorkflow3Xml"
},
"singleDate": {
"$ref": "#/components/examples/availabilitySingleDateRequestXml"
},
"dateRange": {
"$ref": "#/components/examples/availabilityDateRangeRequestXml"
}
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"allOf": [
{
"type": "object",
"properties": {
"responseType": {
"type": "string",
"description": "`AvailabilityResponse`"
}
}
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/components/schemas/AvailabilityResponse"
}
},
"required": [
"responseType",
"data"
]
}
]
},
"examples": {
"singleDate": {
"$ref": "#/components/examples/availabilitySingleDateResponseJson"
},
"dateRange": {
"$ref": "#/components/examples/availabilityDateRangeResponseJson"
}
}
},
"application/xml": {
"schema": {
"allOf": [
{
"type": "object",
"properties": {
"AvailabilityResponse": {
"$ref": "#/components/schemas/AvailabilityResponse"
}
},
"required": [
"AvailabilityResponse"
]
}
]
},
"examples": {
"singleDate": {
"$ref": "#/components/examples/availabilitySingleDateResponseXml"
},
"dateRange": {
"$ref": "#/components/examples/availabilityDateRangeResponseXml"
}
}
}
}
}
}
}
},
"/batch-availability": {
"post": {
"summary": "Batch Availability",
"operationId": "batchAvailability",
"tags": [
"Deprecated"
],
"description": "The Batch Availability API (v1.0) enables Viator to efficiently determine capacity/availability for a future date range using a pull-based method. \n\nReservation systems share availability/capacity of all operator products and associated options across a specified future date range through this API. Upon receiving this information, Viator's systems are updated to either permit (available) or prohibit (unavailable) bookings. \n\nThis proactive approach provides operators control over future bookings and helps drive customers to remaining available dates according to the capacity returned by the reservation system.\n",
"requestBody": {
"content": {
"application/json": {
"schema": {
"allOf": [
{
"type": "object",
"properties": {
"requestType": {
"type": "string",
"description": "`BatchAvailabilityRequest`"
}
}
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/components/schemas/BatchAvailabilityRequest"
}
},
"required": [
"requestType",
"data"
]
}
]
},
"examples": {
"batchAvailabilityRequest": {
"$ref": "#/components/examples/batchAvailabilityRequestJson"
}
}
},
"application/xml": {
"schema": {
"allOf": [
{
"type": "object",
"properties": {
"BatchAvailabilityRequest": {
"$ref": "#/components/schemas/BatchAvailabilityRequest"
}
},
"required": [
"BatchAvailabilityRequest"
]
}
]
},
"examples": {
"batchAvailabilityRequest": {
"$ref": "#/components/examples/batchAvailabilityRequestXml"
}
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"allOf": [
{
"type": "object",
"properties": {
"responseType": {
"type": "string",
"description": "`BatchAvailabilityResponse`"
}
}
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/components/schemas/BatchAvailabilityResponse"
}
},
"required": [
"responseType",
"data"
]
}
]
},
"examples": {
"singleDate": {
"$ref": "#/components/examples/batchAvailabilitySingleDateResponseJson"
},
"dateRange": {
"$ref": "#/components/examples/batchAvailabilityDateRangeResponseJson"
}
}
},
"application/xml": {
"schema": {
"allOf": [
{
"type": "object",
"properties": {
"BatchAvailabilityResponse": {
"$ref": "#/components/schemas/BatchAvailabilityResponse"
}
},
"required": [
"BatchAvailabilityResponse"
]
}
]
},
"examples": {
"singleDate": {
"$ref": "#/components/examples/batchAvailabilitySingleDateResponseXml"
},
"dateRange": {
"$ref": "#/components/examples/batchAvailabilityDateRangeResponseXml"
}
}
}
}
}
}
}
},
"/batch-pricing": {
"post": {
"summary": "Batch Pricing",
"operationId": "batchPricing",
"tags": [
"Deprecated"
],
"description": "**Note**: The Batch Pricing API must only be implemented after agreement with Viator. If you wish to use this API, inform your Viator API account manager before any development begins.\n\nThe Batch Pricing API (v1.0) enables reservation systems to provide Viator with bulk pricing information for operators' products.\n\nFor guidance on mapping Viator Pricing Rates (Age Bands) to external pricing rates, refer to the [Pricing rates mapping](#tag/API-configurations/Pricing-rates-mapping).\n",
"requestBody": {
"content": {
"application/json": {
"schema": {
"allOf": [
{
"type": "object",
"properties": {
"requestType": {
"type": "string",
"description": "`BatchPricingRequest`"
}
}
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/components/schemas/BatchPricingRequest"
}
},
"required": [
"requestType",
"data"
]
}
]
},
"examples": {
"batchPricingRequest": {
"$ref": "#/components/examples/batchPricingRequestJson"
}
}
},
"application/xml": {
"schema": {
"allOf": [
{
"type": "object",
"properties": {
"BatchPricingRequest": {
"$ref": "#/components/schemas/BatchPricingRequest"
}
},
"required": [
"BatchPricingRequest"
]
}
]
},
"examples": {
"batchPricingRequest": {
"$ref": "#/components/examples/batchPricingRequestXml"
}
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"allOf": [
{
"type": "object",
"properties": {
"responseType": {
"type": "string",
"description": "`BatchPricingResponse`"
}
}
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/components/schemas/BatchPricingResponse"
}
},
"required": [
"responseType",
"data"
]
}
]
},
"examples": {
"batchPricingResponse": {
"$ref": "#/components/examples/batchPricingResponseJson"
}
}
},
"application/xml": {
"schema": {
"allOf": [
{
"type": "object",
"properties": {
"BatchPricingResponse": {
"$ref": "#/components/schemas/BatchPricingResponse"
}
},
"required": [
"BatchPricingResponse"
]
}
]
},
"examples": {
"batchPricingResponse": {
"$ref": "#/components/examples/batchPricingResponseXml"
}
}
}
}
}
}
}
},
"/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.\n\nBooking 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.\n",
"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.\n\nA successful request will amend an existing confirmed booking in the reservation system. Each API request is always for the amendment of a single booking.\n",
"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.\n\nThe API cancellation does not include details regarding refunds; it focuses purely on the cancellation of the booking.\n",
"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"
}
}
}
}
}
}
}
},
"/availabilitynotification2": {
"post": {
"summary": "Availability Notification 2",
"operationId": "availabilityNotification2",
"tags": [
"Deprecated"
],
"description": "The Availability Notification 2 API (v1.0) provides reservation systems with the ability to notify Viator when changes to the availability of products occur. \n\nThis allows Viator to immediately either permit or prohibit bookings on dates that have either been made available or unavailable respectively.\n",
"requestBody": {
"content": {
"application/json": {
"schema": {
"allOf": [
{
"type": "object",
"properties": {
"requestType": {
"type": "string",
"description": "`AvailabilityNotification2Request`"
}
}
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/components/schemas/AvailabilityNotification2Request"
}
},
"required": [
"requestType",
"data"
]
}
]
},
"examples": {
"availabilityNotification": {
"$ref": "#/components/examples/availabilityNotification2RequestJson"
}
}
},
"application/xml": {
"schema": {
"allOf": [
{
"type": "object",
"properties": {
"AvailabilityNotification2Request": {
"$ref": "#/components/schemas/AvailabilityNotification2Request"
}
},
"required": [
"AvailabilityNotification2Request"
]
}
]
},
"examples": {
"availabilityNotification": {
"$ref": "#/components/examples/availabilityNotification2RequestXml"
}
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"allOf": [
{
"type": "object",
"properties": {
"responseType": {
"type": "string",
"description": "`AvailabilityNotification2Response`"
}
}
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/components/schemas/AvailabilityNotification2Response"
}
},
"required": [
"responseType",
"data"
]
}
]
},
"examples": {
"availabilityNotification2ResponseRequest": {
"$ref": "#/components/examples/availabilityNotification2ResponseJson"
}
}
},
"application/xml": {
"schema": {
"allOf": [
{
"type": "object",
"properties": {
"AvailabilityNotification2Response": {
"$ref": "#/components/schemas/AvailabilityNotification2Response"
}
},
"required": [
"AvailabilityNotification2Response"
]
}
]
},
"examples": {
"availabilityNotification2ResponseRequest": {
"$ref": "#/components/examples/availabilityNotification2ResponseXml"
}
}
}
}
}
}
}
}
}
}