Download OpenAPI specification:
The API specifications herein outline the steps and requisites for integrating operator reservation systems with Viator. This documentation serves as the definitive guide for developers and technical teams responsible for implementing and maintaining this critical integration.
The specifications are for the exclusive use of operators registered with Viator and their respective reservation system providers.
Integration with a reservation system may only commence after any one operator on the reservation system has registered with Viator. To learn more about joining Viator, visit the supplier sign-up page.
To begin, please review the following sections:
Adherence to these specifications is crucial for successful integration, guaranteeing optimal performance, data integrity, and a superior user experience for both operators and Viator customers.
If at any point you need clarification or help, please don’t hesitate to contact us here.
This section outlines the key updates and new features in the latest version of the Operator Connectivity API specifications:
The 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.
To 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 section for newly introduced endpoints.
As new versions of the endpoints are introduced, older versions and endpoints that were replaced are set for deprecation.
Review the Deprecated section for a list of endpoints scheduled for deprecation.
Version 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.
Version 2.0 and above endpoints communicate using the JSON standard. Therefore, the headers "Content-Type" and "Accept" accept only "application/json".
A 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 API's and must be returned in the Tour List API.
One 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.
Version 2.0 introduces new Viator hosted endpoints that enable reservation systems to communicate updates to Viator regarding:
These endpoints ensure that customers always see accurate, current, inventory and pricing as provided by operators through reservation systems.
Version 2.0 introduces a new endpoint that allows Viator to request for the reservation of inventory and price before the booking is made. In V1.0 inventory was held via the Real-time Availability API request using the AvailabilityHold attribute. In V2.0, this process has moved to the new endpoint that now also expects pricing to be held.
For 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.
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.
API 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 transactionsto that lead to higher accuracy and reduced operator overhead.
The API's primary functionalities encompass:
Additional advantages of API integration include:
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.
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.
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.
This section provides details pertaining to the API supported business processes, security, communication, testing, and implementation. Achieving integration with Viator the use of both Viator and supplier built APIs:
This document provides detailed specifications for each service along with testing tools and migration guides, establishing a standard for integration with Viator.
The Viator Reservation System APIs have been designed to support a number of business processes, these include:
All APIs will use the Hypertext Transfer Protocol Secure (HTTPS).
Authentication 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.
The Viator Reservation System APIs support RESTful architecture. JSON and XML (for v1.0 APIs only - scheduled for deprecation) formats are supported.
All 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.
The following sections detail the operational impact of integration and endpoints on overall connectivity, operator processes, and customer experience.
The API structure is organized into three primary categories:
The Tour List API 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.
The 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.
Mapped 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’s response). The technical team at the reservation system is typically better equipped to resolve such scenarios.
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.
Integrating 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:
Calendar API (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).
Availability Check API (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 customers 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).
Event Notifications (v2.0) - This critical endpoint hosted by Viator provides reservaton systems the ability to notify Viator when changes are made to pricing, or when changes occur to capacity and availability. This not only ensures Viators pricing always reflects the operators desired price, it enables Viator to allow or prevent over bookings and is expecially important to drive bookings for last minute availabilty.
Special Offer Notifications (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.
Special Offers API (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.
By 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 internal processes but also enhances the customer experience by providing up-to-date and reliable information.
The following booking operations APIs are available and, with the exception of the booking amendment API, are mandatory to support:
The Reserve API (v2.0) is designed to hold inventory and price for a booking.
This 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.
This API must only be used in combination with Availability and Pricing v2.0 APIs.
The Booking API creates a booking in the operator's reservation system upon successful customer payment. This transmission finalizes the booking process.
Operators are not notified via email when a booking is successfully transmitted by the API. However, if an API booking attempt in unsuccessful, the booking fallback process is initiated, which then notifies operators of bookings via email.
The Booking Amendment API allows changes to confirmed bookings to be sent to the operator’s reservation systems. Customers can request booking amendments after payment and booking confirmation, but before travel.
Permissible amendments:
Operators 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.
The Booking Cancellation API 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.
Operators 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.
The Booking Redemption API 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.
Configurations 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:
SupplierId uniquely identifies an operator in Viator systemsViator systems will make API requests to the reservation systems using the reservation systems product identifiers. The reservation system product identifiers are typically provided to Viator via the Tour List API. These are mapped to Viator products so that subsequent transactions utilize the reservation system product identifiers.
The 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.
In 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.
SupplierProductCode – 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.|) character; product codes longer than this will fail.SupplierOptionCode – this field is optional. It is used when a product has multiple options, it identifies an option (or a variant) of the product.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. productOptionId - this field has been introduced with v2.0 and is applicable only to v2.0 APIs. It is a singled identifier for the product variant. This identifier will in the future replace SupplierOptionCode and Name/Value fields.Viator currently only supports a limited group of pricing rates: Adult, Child, Youth, Infant and Senior. Reservation Systems and operators may support other pricing rates.
We recommend the following mapping of various pricing rates to Viator supported options.
| Reservation System Price Rates | Viator Price Rates |
|---|---|
| Adult | Adult |
| Child | Child |
| Youth | Youth |
| Infant | Infant |
| Senior | Senior |
| Concession | Senior |
| Veteran | Senior |
| Pensioner | Senior |
| Student | Youth |
| Teenager | Youth |
| Toddler | Infant |
| Baby | Infant |
| Everyone | Adult |
| Other | Adult |
| Family Price. | Not Supported |
Viator alse supports the concept of unit pricing. For products priced in this manner the following is recommended:
| Reservation System Price Rates | Viator Price Rates (Age Bands) |
|---|---|
| Car | Unit |
| Boat | Unit |
| Vehicle | Unit |
| Group | Unit |
The 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 reservaon system; for example, a particular tour might not accept bookings if it is less than 24 hours before the start time.
For connected products, this value is provided to Viator via the bookingCutoff element of the Availability and pricing API responses.
The bookingCutoff will be used to prevent bookings from take place after the time specificed 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.
Viator and integrated reservation systems must guarantee a target API availability of:
Viator's proposal acknowledges that APIs used in real-time are inherently more critical and thus require stringent (tighter) latency targets. Conversely, data-sync APIs can be assigned more relaxed latency targets, reflecting their lower impact on immediate user interaction and conversion. The following table presents the latency targets, broken down by APIs.
| APIs | Expected P90 (secs) | Acceptable (secs) | Longest Allowed (secs) |
|---|---|---|---|
| Availability Check | < 1 | 3 | 10 |
| Reserve | < 1 | 3 | 28 |
| Booking (includes amendment, redemption and cancellation) | < 5 | 10 | 28 |
| Calendar | < 5 | 10 | 20 |
| Tourlist | < 10 | 15 | 60 |
For Viator inbound APIs the latency targets are:
| APIs | Expected P90 (secs) | Acceptable (secs) |
|---|---|---|
| Event Notification API Beta | < 1 | 2 |
| Special Offers Notification API Beta | < 1 | 2 |
The following table describes the API Types and the respective maximum error rates.
| API type | Maximum acceptable error rate (Monthly) |
|---|---|
| Availability Check | < 1.5% |
| Reserve | < 1.5% |
| Booking(includes amendment, redemption and cancellation) | < 0.75% |
| Calendar | < 1% |
| Tourlist | < 0.5% |
For Viator inbound APIs the error targets are:
| API type | Maximum acceptable error rate (Monthly) |
|---|---|
| Event Notification API Beta | < 0.5% |
| Special Offers Notification API Beta | < 0.5% |
To 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.
Capacity is determined by a Product Multiplier (𝑿), defined as:
| API | RPS (Sustainable) | RPS (Peak) |
|---|---|---|
| Availability Check | 𝑿 x 10 | 𝑿 x 20 |
| Reserve | 𝑿 x 5 | 𝑿 x 10 |
| Booking(includes amendment, redemption and cancellation) | 𝑿 x 5 | 𝑿 x 10 |
| Calendar | 𝑿 x 30 | 𝑿 x 60 |
| Tourlist | 𝑿 | 𝑿 x 2 |
For Viator inbound APIs the throughput targets are:
| API | RPS (Sustainable) | RPS (Peak) |
|---|---|---|
| Event Notification API Beta | 𝑿 x 10 | 𝑿 x 30 |
| Special Offers Notification API Beta | 𝑿 x 2 | 𝑿 x 4 |
Example for Availability Check: RPS (sustainable) = 𝑿 x 10, RPS (peak) = 𝑿 x 20
| Total Products | Multiplier (𝑿) | RPS (Sustainable) | RPS (Peak) |
|---|---|---|---|
| 1 - 10,000 | 1 | 10 | 20 |
| 15,000 | 2 | 20 | 30 |
| 42,000 | 5 | 50 | 100 |
Below 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.
| Severity Level | Reservation System (Business Impact) | Viator (Business Impact) | Target MTTA (business days) | Target MTTRs (business days) |
|---|---|---|---|---|
| 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 |
| S2 - Major Disruption | Supplier segment impacted; Real time capabilities impacted; Supplier Authentication issues; | Supplier segment impacted; Authentication issues; | < 3 | < 14 |
| 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 |
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.
Whilst 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.
Please email the API integrations team to provide feedback.
This section describes all of the possible services, some of which are mandatory, that reservation systems can developed to integrate with Viator.
All API requests made by Viator to the reservation system are specified. The reservation system will response 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.
The Availability check endpoint enables Viator to retrieve capacity and pricing information of one or more items for a specific date and one or more ticket types (adult, child, etc).
This endpoint is used by Viator when customers have chosen a specific product or a specific item for which capacity and pricing is required to determine the ability for the customers to proceed with the purchase.
The Availability check endpoint supersedes the existing V1.0 Real-time availability API.
| supplierId required | integer (SupplierId) Viator’s unique Supplier identifier. |
required | Array of objects (ProductOptionRequest) List of reservation system product options and associated start times for which availability and pricing is being requested. |
| travelDate required | string <date> (TravelDate) The date of travel. Value is in date format YYYY-MM-DD. |
required | Array of objects (TicketRequest) List of ticket types for which availability and pricing is being requested |
| totalTravelers required | integer (TotalTravelers) Total number of travelers/passengers across all ticket types. |
required | Array of objects (ProductOption) List of reservation system product option identifiers for which events (start time, capacity, pricing) is being returned
|
{- "supplierId": 123,
- "productOptions": [
- {
- "productOptionId": "r1172330",
- "startTimes": [
- "09:00"
]
}
], - "travelDate": "2025-04-29",
- "tickets": [
- {
- "type": "ADULT",
- "quantity": 2
}
], - "totalTravelers": 2
}{- "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"
}
}
]
}
}
]
}
]
}The Calendar endpoint enables Viator to retrieve capacity and pricing information of one or more items for a date range across all ticket types (adult, child, unit, etc).
This endpoint is used by Viator to populate availability in the calendars and to create the pricing structure required to accurately price products.
The Calendar endpoint supersedes both the existing V1.0 Batch Availability availability API and Batch Pricing API.
| productOptionIds required | Array of strings (ProductOptionId) List of reservation system product option identifiers for which availability and pricing is being requested. This identifier is sourced from the Tour List API response. |
| startDate required | string <date> The start date of the date range for which availability and pricing are requested. Value is in date format YYYY-MM-DD. |
| endDate required | string <date> The end date of the date range for which availability and pricing are requested. Value is in date format YYYY-MM-DD. |
| supplierId required | integer (SupplierId) Viator’s unique Supplier identifier. |
required | Array of objects List of reservation system product option identifiers for which events (start time, capacity, pricing) are being returned.
|
{- "supplierId": 1004,
- "productOptionIds": [
- "r1172330"
], - "startDate": "2026-01-21",
- "endDate": "2026-01-25"
}{- "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
}
]
}
}
]
}
]
}
]
}The Reserve endpoint enables Viator to request the reservation system to reserve (hold) the inventory and price an item for a specific date and one or more ticketTypes (adult, child, etc).
This endpoint is used by Viator when customers have the intention to make a purchase. The reservation is made to allow time for the customer to complete the payment details.
The reservation request expects inventory and pricing to be held for a minimum of 15 minutes from the time the request is made.
The Reserve endpoint replaces the V1.0 Real-time availability API where the inventory reservation was requested previously.
| supplierId required | integer (SupplierId) Viator’s unique Supplier identifier. |
| productOptionId required | string (ProductOptionId) Unique reservation system product option identifier. This identifier is sourced from the Tour List API response. |
| startTime | string <time> (StartTime) Start time or departure time for the event. Value is in time format hh:mm. |
| travelDate required | string <date> (TravelDate) The date of travel. Value is in date format YYYY-MM-DD. |
required | Array of objects (TicketRequest) List of ticket types for which reservation is being requested. |
| totalTravelers required | integer (TotalTravelers) Total number of travelers/passengers across all ticket types. |
| status required | string Machine-interpretable value that specifies the status of the reservation; One of:
|
| expiration required | string <date-time> The time at which the reservation will expire. Value is in Timestamp (UTC) format. The reservation request expects inventory and pricing to be held for a minimum of 15 minutes from the time the request is made. |
| reference required | string The unique reservation identifier in the reservation system. This identifier will be passed in the AvailabilityHoldReference of the Booking API when the booking for this reservation is made. |
| currency required | string (Currency) The ISO 4217 alphanumeric currency code in which prices are being returned. ISO 4217 is the International Standard for currency codes. For more information visit iso.org. |
required | any (ReservePrice) The type of price of an event along with the relevant amounts for requested ticket types. |
{- "supplierId": 1004,
- "productOptionId": "r1172330",
- "startTime": "15:30",
- "travelDate": "2026-01-21",
- "tickets": [
- {
- "type": "ADULT",
- "quantity": 2
}, - {
- "type": "CHILD",
- "quantity": 1
}
], - "totalTravelers": 3
}{- "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"
}
}, - {
- "travelerTypes": [
- "CHILD"
], - "retailPrice": 60,
- "netPrice": 50
}
]
}
}The Special Offers endpoint enables Viator to retrieve special offer metadata.
The endpoint is used to retrieve information required to create and display special offer merchandising signals on discounted events returned by the Calendar or Availability check endpoints.
A special offer merchandising signal does not change the RRP (Recommended Retail Price). It instead defines the criteria of when the merchandising signal is displayed. Special offer merchandising signals are surfaced to customers only if the special offer is in accordance with Viator's policy. Additional details are available here.
| supplierId required | integer (SupplierId) Viator’s unique Supplier identifier. |
| specialOfferIds required | Array of strings List of special offer identifiers for which metadata is being requested. |
required | Array of objects (SpecialOffer) List of VALID Special Offers. |
{- "supplierId": 3456,
- "specialOfferIds": [
- "A Unique id",
- "A-unique-id-2"
]
}{- "specialOffers": [
- {
- "specialOfferId": "A Unique id",
- "name": "Valentine's Day",
- "type": "STANDARD",
- "validFrom": "2025-02-14T23:59:59Z",
- "validUntil": "2025-02-14T23:59:59Z"
}, - {
- "specialOfferId": "A-unique-id-2",
- "name": "Christmas Day",
- "type": "STANDARD",
- "validFrom": "2025-12-24T00:00:00Z"
}
]
}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 faciliated mapping between Viator products and the operators reservation system products.
| requestType required | string
|
required | object (TourListRequest) Root element for Tour List Request |
| responseType required | string
|
required | object (TourListResponse) Root element for Tour List Response |
{- "requestType": "TourListRequest",
- "data": {
- "ApiKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
- "ResellerId": "1000",
- "SupplierId": "1004",
- "ExternalReference": "10051374722994001",
- "Timestamp": "2013-12-10T13:30:54.616+10:00"
}
}{- "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"
}
]
}
]
}
]
}
}The Booking API (v1.0) enables reservations systems to receive Booking requests from Viator systems in real time. A successful request will create the booking in the reservaton system and return a success message to Viator systems which will confirm the booking directly to the customer. Each API request is always for a single booking.
Booking requests are sent in all cases unless Viator has successfully received an unavailable status. See Availability and pricing for more details.
| requestType required | string
|
required | object (BookingRequest) Root element for Booking Request |
| responseType required | string
|
required | object (BookingResponse) Root element for Booking Response |
{- "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"
}
}{- "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"
}
}The Booking Amendment API (v1.0) enables reservation systems to, in real time, receive from Viator amendments to previously confirmed bookings.
A successful request will amend an existing confirmed booking in the reservation system. Each API request is always for the amendment of a single booking.
| requestType required | string
|
required | object (BookingAmendmentRequest) Root element for Booking Amendment Request |
| responseType required | string
|
required | object (BookingAmendmentResponse) Root element for Booking Amendment Response |
{- "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"
}
}{- "responseType": "BookingAmendmentResponse",
- "data": {
- "ApiKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
- "ResellerId": "1000",
- "SupplierId": "9999",
- "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"
}
}The Booking Cancellation API (v1.0) is used by Viator to cancel a previously confirmed bookings.
The API cancellation does not include details regarding refunds, it is focuses purely on the cancellation of the booking.
| requestType required | string
|
required | object (BookingCancellationRequest) Root element for Booking Cancellation Request |
| responseType required | string
|
required | object (BookingCancellationResponse) Root element for Booking Cancellation Response |
{- "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"
}
}{- "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"
}
}
}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.
The Redemption API (v1.0) enables Viator to identify ticket redemption status at both booking and traveller levels.
The information returned allows Viator to determine if booking cancellations/refunds should be permitted.
| requestType required | string
|
required | object (RedemptionRequest) Root element for Redemption Request |
| responseType required | string
|
required | object (RedemptionResponse) Root element for Redemption Response |
{- "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"
}
}{- "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
}
]
}
}This section describes the Viator built API(s) available for reservation system consumption.
Note: For these APIs, the request is sent to Viator and the response is received from Viator.
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.
Viator prioritizes callbacks for Event notifications based on the updateType.
Automated Event Notification Enablement
Notifications must be sent only for already connected product options. Therefore, Event Notifications must be enabled for a product option immediately after a Calendar API request is received for that product option.
Automated Event Notification Disablement
Notifications 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:
Disabling event notifications for affected product options will prevent further failed requests and increased error rates.
NOTE: If a calendar request is subsequently received for a previously disabled product option, notifications must be re-enabled.
The event notifications endpoint replaces the existing V1.0 Availability Notification 2 API.
| supplierId required | integer (SupplierId) Viator’s unique Supplier identifier. |
| updateType required | Array of strings (EventUpdateType) Items Enum: "AVAILABILITY" "PRICING" "CAPACITY" List of Machine-interpretable values to specify notification types. One of:
|
| productOptionIds required | Array of strings (ProductOptionId) List of reservation system product option identifiers for which AVAILABILITY, PRICING, or CAPACITY changes are being notified. |
| startDate required | string <date> The start date for the notification. Value is in date format YYYY-MM-DD. |
| endDate required | string <date> The end date for the notification. Value is in date format YYYY-MM-DD. |
{- "supplierId": 123,
- "updateType": [
- "AVAILABILITY",
- "PRICING"
], - "productOptionIds": [
- "r1172330",
- "r1172331"
], - "startDate": "2025-01-01",
- "endDate": "2025-12-31"
}{- "results": [
- {
- "productOptionId": "r1172330",
- "status": 200
}, - {
- "productOptionId": "r1172331",
- "status": 422,
- "error": "INVALID_PRODUCT_OPTION"
}
]
}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.
Special Offers notification triggers Viator to request additional details via the Special Offers endpoint if the special offer is associated with an already connected product option. This association is determined via the Calendar or Availability check endpoints.
Automated Special Offers Notification Enablement
Notifications 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 request is received for that product option.
Automated Special Offers Notification Disablement
Notifications for a product option must be disabled if a 422 Unprocessable Content HTTP status code is received with any of the following errors:
Disabling Special Offers notifications for affected product options will prevent further failed requests and increased error rates.
NOTE: If a calendar request is subsequently received for a previously disabled product option, notifications must be re-enabled.
| supplierId required | integer (SupplierId) Viator’s unique Supplier identifier. |
| specialOfferIds required | Array of strings List of reservation system special offer identifiers for which additions or changes are being notified. Must be valid identifiers returned in the special offers endpoint. |
{- "supplierId": 3456,
- "specialOfferIds": [
- "A Unique id",
- "A-unique-id-2"
]
}{- "error": "INVALID_SUPPLIER",
- "message": "Invalid supplier ID"
}The Contract Testing Tool is a self-service tool provided by Viator to assist reservation systems testing and validating their API integration for v2 APIs (v1 APIs are not supported).
This 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.
The first step is to make sure you have Docker desktop installed and running.
Then, 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:
export API_KEY=<your-api-key>
export SUPPLIER_ID=<your-supplierId> (e.g. 123456789)
Finally, run the Contract Testing Tool using the following commands:
docker pull public.ecr.aws/viator/cica:latest
docker run -it --rm --name viator-contract-testing -p 5173:5173 -p 8989:8989 \
-e API_KEY=$API_KEY -e SUPPLIER_ID=$SUPPLIER_ID \
--add-host=host.docker.internal:host-gateway \
public.ecr.aws/viator/cica:latest
Access the application at http://localhost:5173. The tool is organized into a Configuration page for initial setup and dedicated Capability pages for executing test scenarios.
Before running tests, use the Configuration page in the left panel to streamline your workflow:
Global Defaults: Parameter values used as a fallback when executing test cases if values are not provided elsewhere.
Test Product Option Mapping: Values provided here are used when executing any test case associated to the Test Product Option.
Configuration Priority: The tool resolves inputs in the following order: Test Case Input (highest) > Test Product Option Config > Global Defaults (fallback).
In 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.
To execute a test case against a reservation system endpoint:
Expand the test case by clicking on it.
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.
http://host.docker.internal:<port>/your-api-path instead of http://localhost:<port>/your-api-path as the contract testing tool is running on docker.Fill the form inputs required by the scenario being tested.
Click on Execute Test and view the Test Report.
To execute a test case against a Viator endpoint (e.g. Event Notification):
Send a request to the endpoint displayed in the tool from your local/test system.
Expand the scenario to view the test result.
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.
The following table describes the v1 endpoints that will be superseded by the respective v2 endpoints.
| v1 | v2 |
|---|---|
| Real-time Availability API | Availability Check API |
| Batch Availability API | Calendar API |
| Batch Pricing API | Calendar API |
| Availability Notifications (2) API | Event Notifications API |
| N/A | Special Offers Notifications API |
| N/A | Special Offers API |
Before initiating the migration, ensure the following prerequisites are met:
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.
Certification: Your integration must have successfully passed certification testing.
Notification Endpoints: The new notification endpoints are accurately configured as documented in the specifications.
Viator operator account configuration: The operator accounts must be configured with the new endpoints for v2 access on Viator.
Reservation System operator account configuration: The operator account must be configured to utilize v2 endpoints in the reservation system.
The migration of operator accounts to v2 APIs will take place in two separate phases:
Pilot accounts
Viator and the Reservation System will jointly select a small number of operator accounts for the initial migration.
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
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.
Main Rollout
After the successful pilot account rollout, Viator will determine and inform the size and sequence of operator account batches for production rollout.
A cooling-off period will be observed between each sequential batch to monitor system performance.
For each batch, Viator and the Reservation System will coordinate to configure accounts for v2 production enablement.
All superseded v1 endpoints (see “Deprecation” 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.
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.
Upon completion of the migration of all Operator accounts to v2 endpoints, Viator will inform the reservation system to allow for deprecation procedures to commence.
The following steps can be completed once the confirmation is received:
Disable all notification to Availability Notifications (2) API
Disable the following endpoints:
For any questions or assistance during the migration, please contact the API integrations team or refer to the FAQ section in these specifications.
Q: If we use the API, how do suppliers control the inventory available to Viator?
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.
Q: Does the API contain pricing and payment information?
A: Viator is the credit card merchant of record for all transactions – no payment information needs to be processed by the supplier or supplier’s 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; or, through the regular process of updating the Schedule and prices tab in the Supplier Extranet.
Q: How can non-Viator suppliers use the Viator API?
A: If you have suppliers that are not working with Viator today, please refer them to the Supplier Sign Up 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.
Q: How do we map our internal product codes to Viator’s product codes?
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.
Mapping is carried out either by the supplier or the administrator of the reservation system. Viator's mapping feature is available via the Supplier Extranet. The mapping wizard utilizes data from the Tour List endpoint.
Q: Will I receive the customers direct email address?
No, 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 “Contact Customer” button in the management center to be sent to you.
This 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.
The 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.
Q: Will I receive the customers direct phone number?
Yes, if the customer completes the phone number field on our checkout page, tit will be included in the booking information. Note, however, that not all partners support this field.
Q: Will I receive the customer's hotel information?
Yes, 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 “Pick up point” field.
If you are currently collecting this information from the special requirements field, the “Special Requirements” field will be populated with this information.
Q: Will I still receive the information that a customer enters during the booking process such as flight and cruise ship information?
Yes, this information is passed in the question and answer fields of the booking request.
Q: How to do I correctly handle the product's guide language when it is an inventory concern?
For 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.
However, 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.
Q: When should I use SupplierOptionCode and how does this affect the product set-up?
The 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.

Q: Should I support barcode numbers or pass-through tickets? The answer is based on how operators expect customers to check-in to the tour or activity. There are two possible options:
Using Viator standard vouchers. These can include a per-traveller 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. Using the operator’s 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 Viators supply center; please contact us if this is desired.
Q: What is the relationship between 'start times' and the API?
The following is applicable to legacy v1.0 Availability and Pricing APIs only.
Our management center provides you with different time options to accommodate different product types, such as opening hours and start times.

However, 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.
In the management center, you will then be restricted to using only the 'start times' option. The reason for this 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.
Example of start times syncing on the product connection tab:

This appears to the customer as:

All 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.
The benefits of using the TourDepartureTime tag include:
Eliminating the need to identify each start time as a product option
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.
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).
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.
Please email the API integrations team with any questions or suggestions. A ticket will be logged with the team who will respond as quickly as possible.
This section lists endpoints that are no longer recommended for new or updated integrations and are scheduled for removal. These endpoints remain available for existing connections only and will stop receiving new features or behavior improvements at any time.
For all new development, use the current, fully supported endpoints documented in the main sections of this guide.
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.
This 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.
When 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.
To 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.
In 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).
As the customer progresses through their workflow, real-time availability requests are made at three distinct stages. Below lists key information in requests and responses:
StartDate, SupplierProductCode, and TravellerMix.TourOptions for customer selection.StartDate, SupplierProductCode, TourOptions and TravellerMix.SupplierProductCode and TourOptions and TravellerMix.StartDate, SupplierProductCode, TravellerMix, TourOptions, and AvailabilityHold.SupplierProductCode and TourOptions and TravellerMix.| requestType required | string
|
required | object (AvailabilityRequest) Root element for Real-time Availability Request |
| responseType required | string
|
required | object (AvailabilityResponse) Root element for Real-time Availability Response |
{- "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"
}
}
}{- "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.0",
- "AgeBand": "Adult"
}, - {
- "RetailPrice": "90.00",
- "AgeBand": "Child"
}, - {
- "RetailPrice": "50.0",
- "AgeBand": "Infant"
}
]
}, - "AvailabilityHold": {
- "Expiry": "PT300S",
- "Reference": "1K883383K2S12K883383K2S57K883383K2"
}, - "Capacity": {
- "Simple": {
- "Remaining": 10,
- "ConsumedBy": [
- "ADULT",
- "YOUTH"
]
}
}, - "VersionTag": {
- "Textual": "20130705-V000000231434"
}
}
]
}
}The Batch Availability API (v1.0) enables Viator to efficiently determine capacity/availability for a future date range using a pull-based method.
Reservation 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.
This 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.
| requestType required | string
|
required | object (BatchAvailabilityRequest) Root element for Batch Availability Request |
| responseType required | string
|
required | object (BatchAvailabilityResponse) Root element for Batch Availability Response |
{- "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"
}
}{- "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-1",
- "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-1",
- "TourOptions": {
- "SupplierOptionCode": "9AM",
- "SupplierOptionName": "Bondi Beach Private Lesson 9AM",
- "TourDepartureTime": "09:00:00",
- "Option": [
- { }
]
}, - "SupplierProductCode": "BON_GRO",
- "AvailabilityStatus": {
- "Status": "AVAILABLE"
}, - "VersionTag": {
- "Numeric": 553957349573498
}
}
]
}
}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.
The Batch Pricing API (v1.0) enables reservation systems to provide Viator with bulk pricing information for operators' products.
For guidance on mapping Viator Pricing Rates (Age Bands) to external pricing rates, refer to the Pricing rates mapping.
| requestType required | string
|
required | object (BatchPricingRequest) Root element for Batch Pricing Request |
| responseType required | string
|
required | object (BatchPricingResponse) Root element for Batch Pricing Response |
{- "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"
]
}
}{- "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.0",
- "AgeBand": "Infant"
}, - {
- "RetailPrice": "10.0",
- "AgeBand": "Child"
}, - {
- "RetailPrice": "10.0",
- "AgeBand": "Youth"
}, - {
- "RetailPrice": "10.0",
- "AgeBand": "Adult"
}, - {
- "RetailPrice": "10.0",
- "AgeBand": "Senior"
}
]
}, - "AvailabilityStatus": {
- "Status": "AVAILABLE"
}
}, - {
- "Date": "2020-06-20",
- "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"
}
}
]
}
}The Availability Notification 2 API (v1.0) provides reservation systems with the ability to notify Viator when changes to the availability of products occur.
This allows Viator to immediately either permit or prohibit bookings on dates that have either been made available or unavailable respectly.
| requestType required | string
|
required | object (AvailabilityNotification2Request) Root element for Availability Notification 2 Request |
| responseType required | string
|
required | object (AvailabilityNotification2Response) Root element for Availability Notification 2 Response |
{- "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"
}
}
]
}
]
}
}{- "responseType": "AvailabilityNotification2Response",
- "data": {
- "ApiKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
- "ResellerId": "1000",
- "SupplierId": "1004",
- "ExternalReference": "10061374722913835",
- "Timestamp": "2021-04-06T10:14:37.682Z",
- "RequestStatus": {
- "Status": "SUCCESS"
}
}
}| Version | Comments | Date |
|---|---|---|
| 2.0.0 | Deprecated v1 endpoints, graduated v2 Beta endpoints. | 18 Feb, 2026 |
| 2.0.0 | Introduced v2.0 Migration Guide, added details pertaining to enablement and disablement of event notifications. | |
| 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 UNSUPORTED_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 |
| 2.0.0 | Introduce v2.0 Beta endpoints: Special Offers, Event Notification and Special Offer Notification | 12 Aug, 2025 |
| 2.0.0 | Introduce v2.0 Beta endpoints: Availability check, Calendar and Reserve. Introduce productOptionId in the Tour List API for v2.0 endpoints. | 30 Jun, 2025 |
| 1.4.12 | Added BookingCutoff JSON example |
20 May, 2024 |
| 1.4.11 | Added Redemption API | 27 Feb, 2024 |
| 1.4.10 | Removed Parameter and Extension elements from all Requests/Responses schemas and examples |
31 Jan, 2024 |
| 1.4.9 | Modified advice for pricing by removing SupplierPrice element from Batch Pricing and Real Time Availability schemas and examples |
29 Jan, 2024 |
| 1.4.8 | Added TourTicket element to Booking Amendment response and modified schemas regarding Capacity and BookingCutoff elements in the Availability response from 'required' to 'optional' |
10 Jan, 2024 |
| 1.4.7 | Restructured page sections in order to clean up documentation and have a richer integration with Redocly | 22 Dec, 2023 |
| 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 |
| 1.4.5 | Published new manual ported from Mkdocs to Redoc CMS | 19 May, 2023 |
| 1.4.4 | Temporarily removed Batch Pricing API section and pricing details from real-time availability call for maintenance purposes | 15 Feb, 2023 |
| 1.4.3 | Removed API Resources section | 5 Oct, 2022 |
| 1.4.2 | Fixed error regarding capitalization of ageband designators regarding Capacity.Simple.ConsumedBy element |
5 Oct, 2022 |
| 1.4.1 | Modified advice regarding requirement for Capacity and BookingCutoff elements in the Availability response from 'optional' to 'mandatory' |
4 Oct, 2022 |
| 1.4.0 | Corrected example VersionTag value in Availability notification request sample 2 | 12 July, 2022 |
| 1.3.9 | Added link to up-to-date WSDL/XSD for supplier-built services API resources section | 10 March, 2022 |
| 1.3.8 | Added Periodic Availability Checking response sample to real-time availability and pricing endpoint | 23 Feb, 2022 |
| 1.3.7 | Added Capacity element to the Availability response and instructions on its use in How to use the Capacity element | 3 Feb, 2022 |
| 1.3.6 | Added information about new BookingCutoff element | 25 Oct, 2021 |
| 1.3.5 | Added Viator-built services – Push Availability Notification API | 30 Apr, 2021 |
| 1.3.4 | Added VersionTag element to Availability response and Batch availability response |
8 Apr, 2021 |
| 1.3.3 | Updated wording in Batch pricing API | 18 Aug, 2020 |
| 1.3.2 | Slight clarification of field descriptions | 26 Mar, 2020 |
| 1.3.1 | Deprecated TourDuration |
7 Feb, 2019 |
| 1.3 | Added ticket to booking response | 1 Nov, 2019 |
| 1.2 | Added contact email to booking response. | 1 Nov, 2019 |
| 1.1 | Added Real-time Pricing API | 1 Nov, 2019 |
| 1.0.9 | Added Batch Pricing API | 1 Nov, 2019 |
| 1.0.8 | Upentry batch availability API samples to reflect appropriate XML structure | 6 Nov, 2015 |
| 1.0.7 | Correct availability response, TravellerMixAvailability, AvailabilityHold and AvailabilityStatus parent tags in table and sample. Upentry description of product mapping. Improved description for UnavailabilityReason. Added notes in API resources regarding WSDL and XSD usage. |
26 Oct, 2015 |
| 1.0.6 | Corrected TimeStamp format / example and changed case of SupplierId, ResellerId elements to match XSD. |
5 May, 2014 |
| 1.0.5 | Removed TravelTime from AvailabilityRequest. Document out of sync with XSD. |
13 Feb, 2014 |
| 1.0.4 | XML samples upentry to provide better end to end understanding of the various APIs | 25 Nov, 2013 |
| 1.0.3 | Added Viator Supplier API Test Harness URL. | 15 Nov, 2013 |
| 1.0.2 | TourDuration upentryd in Samples to reflect Spec. |
23 Sept, 2013 |
| 1.0.1 | Batch Availability: Supplier Product Code is Optional. All except Tour List: Rename TourOption to TourOptions. |
27 Aug, 2013 |
| 1.0 | Confirmed version. | 29 July, 2013 |
The following is applicable to legacy v1.0 APIs only.
| Code | Meaning |
|---|---|
| TGDS0001 | Malformed request |
| TGDS0002 | Authentication error |
| TGDS0003 | Invalid connector |
| TGDS0004 | Request timed out |
| TGDS0005 | Service not available |
| TGDS0006 | Unknown internal error |
| TGDS0007 | Unsupported api request |
| TGDS0008 | Unsupported supplier API |
| TGDS0009 | Unsupported protocol |
| TGDS0010 | Malformed URL |
| TGDS0011 | Invalid supplier |
| TGDS0012 | Invalid product |
| TGDS0013 | Invalid product option code |
| TGDS0014 | Connection timed out |
| TGDS0015 | Invalid reseller ID |
| TGDS0016 | Inactive account |
| TGDS0017 | Inactive supplier |
| TGDS0018 | Inactive reseller |
| TGDS0019 | Unsupported reseller API |
| TGDS0020 | Field validation error |
| TGDS0021 | XML schema validation error |
| TGDS0022 | Missing API parameter key/value |
| TGDS0023 | Invalid data; i.e., data is in incorrect format, non-parsable or otherwise invalid |
| TGDS0024 | Supplier specific errors |
| TGDS0025 | Unsupported request for endpoint |
| TGDS0026 | Invalid request |
| TGDS0027 | Availability data not available for the specified date range |
| TGDS0028 | Data not available |
| TGDS0029 | Malformed response message |
| TGDS0030 | Malformed request message |
| TGDS0031 | Unhandled internal error in supplier system |
| TGDS0032 | Event has been removed or otherwise became unavailable for booking |
| TGDS0033 | Invalid pickup option |
| TGDS0034 | Supplier system has limitations, which prevents this operation from succeeding |
| TGDS0035 | Unknown transaction status |
| TGDS0036 | Event availability has been changed so that it is impossible to book for this traveler mix |
| TGDS0037 | Connection closed by reseller before response could be dispatched |