Download OpenAPI specification:Download
Date | Description |
---|---|
23 Feb 2023 | Modified 'Building in the sandbox environment' section of the Selling on-request products section |
16 Nov 2022 | Mentioned need to verify whether a particular tour grade offers pickup prior to booking |
15 July 2022 | Modified description of /booking/availability endpoint and added advice to country-code and full-detail phone number field descriptions to communicate that a plus (+ ) symbol must be included at the beginning of the string |
26 May 2022 | Added advice about review authenticity: Key concepts - Review authenticity |
5 Jan 2022 | Corrected travelDate format in example request in /booking/calculateprice |
30 Sep 2021 | Corrected data.ageBands specification in /booking/availability/tourgrades |
27 Sep 2021 | Added note about time-out recommendation to /booking/book |
6 Sep 2021 | Modified available options for sortOrder request parameter in /taxonomy/attractions endpoint |
3 Feb 2021 | Added Special offers and on-sale pricing section |
28 Oct 2020 | Updated FAQ section re booking questions, traveler names, and pricing |
16 Sep 2020 | Modified FAQ section re booking currencies, supplier name display and requesting additional reviews |
20 July 2020 | Added Booking references section |
Previous updates: See Update log
The Viator Partner API comprises a set of endpoints that can support the operation of a fully-featured tours and experiences booking website or application; or, it can be integrated with your existing travel-booking software.
The API exposes a variety of services that allow the retrieval of all product details, such as descriptions, pricing, terms and conditions, photos and reviews. This data can either be ingested periodically and managed on your local system, or calls can be made in real time to retrieve content in response to your users' activity on your systems.
The API allows product availability schedules to be retrieved in bulk or queried in real-time, and it can perform pricing calculations according to the number and type of traveler for the wide variety of product option combinations typically available in the tours and activities sales workflow.
The API provides booking and post-booking functionality, allowing booking requests, ticket purchase, and booking status updates.
Various utility services are available to map between yours and Viator's data taxonomy.
Please note: The API does not provide services for storing data, such as user accounts. We assume that merchant partners have their own systems for storing this data.
The Viator Partner API is designed for use by organizations and individuals partnered with Viator in one of the following capacities:
A merchant partner is one who operates as the merchant of record; i.e., takes full responsibility for all monetary transactions carried out by their users, as well as providing customer support with regard to providing help, processing cancellations and refunds, and liaising between suppliers and customers when the need to communicate information arises.
Merchant partners are invoiced periodically by Viator for all product sales. You will need to demonstrate that you have access to the appropriate infrastructure to effectively support the requisite business operations in order to become a merchant partner.
VBAs have full access to the areas of the API relating to content, but sales of Viator products must be carried out on the Viator site itself; therefore, access to the booking or transactional endpoints necessary to operate as the merchant of record (i.e., merchant partners) is restricted.
When a customer wishes to book a product from a VBA partner's site, they are instead redirected to viator.com in order to complete the purchase; whereas, merchant partners are able to process and manage bookings through the Viator API itself, allowing their customers to book products without leaving the partner's site.
Viator affiliates instead generate unique URLs that redirect their users to the Viator site, resulting in a cookie being set such that all transactions will accrue a commission for that partner until the cookie expires.
Purchases of products originating from the VBAs site are recorded and a commission on these sales is paid periodically.
VBAs also have the option of allowing their customers to process bookings directly from their site and via the API – similar to a merchant partner – without being redirected to viator.com to complete their transaction. This partner type sends customer details, product details and credit card payment information via the API, but Viator retains control of and responsibility for processing payments and customer support.
White label partners do not operate their own site infrastructure. Instead, Viator provides a white label site with full functionality that can be branded according to the partner’s wishes.
The Viator Partner API is used to carry out the following tasks:
Partners can use the product search endpoints to retrieve lists of products from Viator’s inventory relevant to their business. The available search criteria include:
Partners who prefer to download product details periodically (instead of performing all operations in real time in response to user behavior) do so by using the product search endpoints to compile a list of products that they wish to sell on their site. They then download comprehensive product details for each via the /product endpoint.
Endpoint | Use |
---|---|
/search/products | Allows searching for products according to: destination / location, relationship to a known tourist attraction; category and/or subcategory; date of operation |
/search/products/codes | Retrieves product details for products that match a list of product codes (unique identifiers for the product) |
/search/freetext | Retrieves product details for products that include the search terms in the product's description and details. |
/available/products | Retrieves products that are identified by specific product codes, operate during a specified day range and accept a certain number of adult travelers |
All information about a product that must be communicated to customers prior to purchase is available via /product and its auxiliary endpoints. This content is generally used to construct product display pages and for performing local searches.
Important information about a product includes:
The availability of a tour is communicated via the API's availability endpoints. The availability aspects of a product include:
Some partners choose to bulk-ingest availability information for their products in order to expedite this part of the customer workflow or to facilitate a local search functionality on their website; but, because this information changes very regularly, a final real-time call is generally recommended to ensure that when the booking request is submitted by the customer it is unlikely to fail on account of a change in availability.
Endpoint | Use |
---|---|
/booking/availability | Returns the product option with the lowest price that is available on each day |
/booking/availability/dates | Returns all available dates for a product (but without regard to product option) |
/booking/availability/tourgrades | Returns all product options for a product that are available on the specified day for the specified passenger mix |
/booking/availability/tourgrades/pricingmatrix | Returns a detailed matrix of product options, passenger mixes and the pricing applicable to each combination |
/booking/calculateprice | Provides a reconfirmation of a product's availability with respect to the product option and passenger mix provided and calculates a final price; used as a final availability check immediately prior to making a booking |
Merchant partners and VBAs with booking capabilities can use the Viator Partner API to purchase the product through the /booking/book endpoint.
The API also provides services to:
Endpoint | Use |
---|---|
/booking/book | Make a booking / purchase a product |
/booking/status | Retrieve multiple detailed booking statuses based on a range of specified criteria |
/booking/status/items | Similar to /booking/status, but provides slightly less detail and can be called more frequently |
Endpoint | Use |
---|---|
/bookings/{booking-reference}/cancel-quote | Returns the expected outcome of a booking cancellation request (taking into consideration the product's cancellation policy) were the cancellation request performed immediately |
/bookings/{booking-reference}/cancel | Cancels the booking and assigns a refund depending on the product’s cancellation policy |
Taxonomical data sets are required to interact meaningfully with the Viator Partner API; for example, mappings from destination (location of operation) to their respective identification codes. This information may occasionally change or be added to. Consequently, the API includes endpoints that return the most up-to-date versions of this information.
Endpoint | Use |
---|---|
/taxonomy/destinations | Retrieves a list of destination names, types and unique identifiers to be used when interacting with the Viator Partner API |
/taxonomy/categories | Retrieves a list of product categories for a destination that can be used as a means of filtering when searching for products using the /search/products endpoint |
/taxonomy/attractions | Retrieves a list of tourist attractions (e.g., the Eiffel Tower or Empire State Building) and their associated identification codes to be used as a means of searching for available products; for example, in the /search/products service |
/booking/hotels | Retrieves a list of hotels, including names and geographic locations, to be used when making booking requests |
Note:
The authentication mechanism for this API has been updated recently. Now, partners can also authenticate using a new style of API key that is included in each call as a header parameter. Previously, authentication was accomplished by including an API key as a query parameter.
Partners who are currently authenticating via the API key query parameter can continue to authenticate in this way; however, access to the new booking cancellation endpoints (/bookings/cancel-reasons, /bookings/cancel-quote and /bookings/cancel) does require the new-style of API key. All other endpoints remain compatible with both authentication methods.
If you would like to switch to the new style of key, please speak to your business development account manager.
Access to the API is managed using an API key that is included as a header parameter to every call made to all API endpoints described in this document.
Header parameter name | Example value |
---|---|
exp-api-key | bcac8986-4c33-4fa0-ad3f-75409487026c |
If you do not know the API key for your organization, please contact your business development account manager for these details.
Please note that language localization is now controlled on a per-call basis. Previously, language localization was controlled via API-key configuration, with one language available per API key. Under the present scheme, you can access any language enabled for your organization's point of sale via a single API key.
Language selection is accomplished by specifying the desired language as a header parameter (Accept-Language
). See Accept-Language header for available language codes. If you would like access to additional languages, please contact your business development account manager.
Previously, authenticating to this API was accomplished by passing an API-key as a query parameter appended to the URI for each call; e.g.:
GET https://viatorapi.sandbox.viator.com/service/taxonomy/destinations?apiKey=xxxxxxxxxxxxxxxxxx
This method of authentication remains available for backwards-compatibility with existing implementations. If you would like to upgrade to the new style of API key, please contact your business development account manager.
Much of the information you will need to retrieve from the Viator API – such as the taxonomy, product lists and product details – do not change frequently.
Therefore, we recommend implementing a caching strategy in order to eliminate unnecessary traffic to Viator’s servers and improve the operation of your site.
This section discusses the different strategies for retrieving and caching Viator’s product catalogue.
You will need to decide on how you will retrieve and manage content from Viator’s product catalogue. The two main options are as follows:
Partners retrieve content as-needed and cache responses on a service-by-service basis
If you do not need to store product details locally, we recommend performing caching of on a service-by-service basis; i.e., storing the entire response and applying a time-to-live (TTL) of less than 24 hours.
Caching should only be applied to services that yield infrequently changing data; i.e.:
Note: these services should be considered cacheable even though some are POST and none include a Cache-Control HTTP header in their response.
Partners download either the full product catalogue or a subset of the catalogue at regular intervals based on destination, linked attraction, or product category filters.
This approach may be preferable for partners whose requirements include:
We recommend that you perform an ingestion of the product catalogue once every 24 hours.
Make a call to one of the product search services:
destId
(destination), catId
(category), subCatId
(subcategory) or seoId
(attraction)To retrieve all products from the Viator catalogue:
destId
) from the /taxonomy/destinations servicedestId
s you retrieved in the previous step, and call /search/products for each destId
Note: As some products operate in multiple destinations, the same product code may be returned for a range of different destinations. Therefore, make sure your list of product codes only contains one copy of each code.
You may then iterate through this list of product codes to retrieve any other product details necessary in order to properly populate your local database with the information you require.
You may wish to retrieve only some of the products available in the Viator catalogue; for example, if your organization is only interested in selling products that operate locally.
Your top level search using /search/products is restricted to one of the three main categorization methods for products; i.e., destination, category/subcategory, or attraction-link; however, you may employ your own methods to filter the selection of products based on any attribute in the product data structure.
totalCount
and topX
Due to the large number of results that can be returned by the /search/products service, the request might exceed the 30-second time-out limitation on both sandbox and live servers. Therefore, you will need to make multiple requests to this service including pagination information in order to retrieve all products that match your search criteria.
This is accomplished by sequentially requesting successive segments of the results using the topX
request parameter together with the totalCount
response field; i.e.:
topX
of "1-100"
"topX": 1-100"
will yield the first 100 recordstotalCount
field in the response object; e.g.: "totalCount": 13843
topX
parameter of the request; e.g.:Due to the heavy load that pre-caching can place on Viator's servers and the downstream servers we connect to, we apply a rate limit of 150 requests per 10 second time window.
Request rates exceeding this limit will result in a HTTP 429 (Too Many Requests) status code being returned.
Note: The rate is calculated over a rolling 10-second time window
You can only submit a review or rating of an experience to Viator if you were the person who made the booking through Viator. Before publication, each review goes through an automated tracking system, which collects information for each of the following criteria: who, what, how, and when.
If the system detects something that contradicts our publication criteria, the review is not published. When the system detects a problem with a review, it may be automatically rejected, sent to the reviewer for validation, or manually reviewed by our team of content specialists who work 24/7 to maintain the quality of the reviews on our site. In some cases, we will also send Viator customers an email asking them to validate their review before it is published.
All Viator customers need to do is to click on the link provided in the email.
After publication, our team checks each review reported to it as not meeting our publication criteria. Tripadvisor reviews that appear on the Viator site are subject to the same checks and moderation processes as set out above. It is not necessary to have booked an experience through Viator (or Tripadvisor) to submit a review of an experience to the Tripadvisor site.
Bookings made with Viator can be either freesale (immediate confirmation) or on-request, which require us to confirm with our product supplier that the product has not sold out and is still available. This difference must be clearly communicated to the customer during the price check and on the order summary post-purchase page.
For freesale bookings, the voucher becomes available immediately, and the customer's credit card will be charged at the time of booking. For on-request bookings, confirmation will be sent to the customer within a timeframe supplied in the /booking/calculateprice and /booking service responses.
The customer's credit card will be charged once their on-request booking is confirmed.
bookingEngineId
is a field returned in the responses from several endpoints documented in this manual. It is a booking type specifier indicating whether, when the product in question is booked, the booking will be CONFIRMED
immediately or if it will remain PENDING
even after the booking has been made, indicating that it is an on-request product.
bookingEngineId
takes one of the following values:
"FreesaleBE"
– the product will be confirmed immediately and the supplier will be sent a notification.
"UnconditionalBE"
- the product will be confirmed immediately and the supplier will not be notified.
"DeferredCRMBE"
- the product is an on-request product and the booking will not be confirmed immediately. The booking will remain with a PENDING
status after it is made, to be confirmed by the supplier within the time specified in the hoursConfirmed
field available in the booking response and post-booking services.
"FreesaleOnRequestBE"
- The product is freesale up until a certain number of days before the travel date, after which it becomes on-request. It is then referred to as being within the on-request period. If a booking is made within the on-request period, the product can be considered to be an on-request product. Once the booking has been made, the bookingEngineId
will change to either "FreesaleOnRequestBE:OnRequest"
or "FreesaleOnRequestBE:Freesold"
depending on the travel date and the on-request period.
Products can have one or more tour grades. Each tour grade might represent a departure time or different tour option, such as additional meals, transport and so forth. If the tour grade code is "DEFAULT"
, do not display this to the customer, simply hide the product's tour grade information.
Many tours deliver a commentary in multiple languages using multilingual tour guides or with written or prerecorded information. Where available, the customer can preselect their preferred language option.
Some tour grades have defined traveler mixes used to price family passes; or, they might have special mixes for limited passenger tours, such as small buggies or weddings.
These traveler mixes are provided by the /booking/availability/tourgrades service. You may need to display these to your customers so that they are able to understand why they can or cannot select a particular tour grade if there is a traveler mix mismatch.
Some products have pick-up and return shuttle bus services. For these tours, you will need the customer to supply a pick-up hotel, or they must select live locally or hotel not yet booked options.
Viator maintains pick-up hotel lists for many popular destinations. These lists are available for customers to select their pick-up location for various tours. For destinations without hotel lists, customers can enter the name of their hotel. If a customer's hotel is not listed, they should be able to enter a hotel name; however, pick-up may not be possible for that hotel.
Each tour booking requires a lead traveler to be identified. To identify the lead traveler in your request, set the leadTraveller
flag to true
in the traveler class.
Some products have a list of one or more booking questions that need to be asked. Some are mandatory. The question, a description, etc are provided in the product details object. The answers need to be included with the booking request.
Calls to the /booking/book service must use a secure channel (https) as they contain credit card information.
Viator can create promotional (promo) codes for discounts and other purposes. As it's unlikely for you to wish to support this feature, we recommend supplying null
in the promoCode
field and not including any customer-entered fields during the checkout process.
Partners can also supply additional information for their own internal purposes. These are attached to booking reports and other materials for use in allocating commissions to agents and so forth.
Product availability information can be retrieved with the following services:
Multiple departures in a single day (each represented by a tour grade) and the language options (langServices).
This request is for 3 adults on a helicopter tour:
Request object (/booking/availability/tourgrades):
{
"productCode": "2280AAHT",
"bookingDate": "2013-05-11",
"currencyCode": "EUR",
"ageBands": [{
"bandId": 1,
"count": 3
}]
}
Response object (/booking/availability/tourgrades) :
{
"data": [{
"available": false,
"ageBands": null,
"langServices": null,
"gradeCode": "EARLYM",
"unavailableReason": "BOOKING_CUTOFF_EXPIRED",
"gradeTitle": "Early Morning Departure",
"gradeDepartureTime": "",
"gradeDescription": "Flight departs Las Vegas between 7am & 8am",
"defaultLanguageCode": "en",
"ageBandsRequired": null,
"currencyCode": "ERROR",
"retailPrice": 0,
"bookingDate": "2013-05-11",
"retailPriceFormatted": "",
"merchantNetPrice": 0,
"merchantNetPriceFormatted": "",
"sortOrder": 1
},
{
"available": false,
"ageBands": null,
"langServices": null,
"gradeCode": "LATEM",
"unavailableReason": "BOOKING_CUTOFF_EXPIRED",
"gradeTitle": "Late Morning Departure",
"gradeDepartureTime": "",
"gradeDescription": "Flight departs Las Vegas between 9:45am & 10:45am",
"defaultLanguageCode": "en",
"ageBandsRequired": null,
"currencyCode": "ERROR",
"retailPrice": 0,
"bookingDate": "2013-05-11",
"retailPriceFormatted": "",
"merchantNetPrice": 0,
"merchantNetPriceFormatted": "",
"sortOrder": 2
},
{
"available": false,
"ageBands": null,
"langServices": null,
"gradeCode": "EARLYA",
"unavailableReason": "BOOKING_CUTOFF_EXPIRED",
"gradeTitle": "Early Afternoon Departure",
"gradeDepartureTime": "2:50 PM",
"gradeDescription": "Flight departs Las Vegas between 12:30pm & 1:30pm",
"defaultLanguageCode": "en",
"ageBandsRequired": null,
"currencyCode": "ERROR",
"retailPrice": 0,
"bookingDate": "2013-05-11",
"retailPriceFormatted": "",
"merchantNetPrice": 0,
"merchantNetPriceFormatted": "",
"sortOrder": 3
},
{
"available": false,
"ageBands": null,
"langServices": null,
"gradeCode": "LATEA",
"unavailableReason": "BOOKING_CUTOFF_EXPIRED",
"gradeTitle": "Late Afternoon Departure",
"gradeDepartureTime": "",
"gradeDescription": "Flight departs Las Vegas between 3:15pm & 4:15pm; available Ap",
"defaultLanguageCode": "en",
"ageBandsRequired": null,
"currencyCode": "ERROR",
"retailPrice": 0,
"bookingDate": "2013-05-11",
"retailPriceFormatted": "",
"merchantNetPrice": 0,
"merchantNetPriceFormatted": "",
"sortOrder": 4
}],
"vmid": "221001",
"errorMessage": null,
"errorType": null,
"dateStamp": "2013-06-04T17:01:34+0000",
"totalCount": 1,
"errorReference": null,
"errorMessageText": null,
"success": true,
"errorName": null
}
The request is for five adults, but this product only support up to four adults.
Example request object (/booking/availability/tourgrades):
{
"productCode": "2280ULTWED",
"bookingDate": "2013-12-11",
"currencyCode": "EUR",
"ageBands": [{
"bandId": 1,
"count": 5
}]
}
Example response object
The response contains "TRAVELLER_MISMATCH"
and you can see the ageBandsRequired
values for the adult (1) age band in the available tour grade.
{
"data": [{
"available": false,
"ageBands": null,
"langServices": null,
"gradeCode": "DEFAULT",
"unavailableReason": "TRAVELLER_MISMATCH",
"gradeTitle": "DEFAULT",
"gradeDepartureTime": "12:00 AM",
"gradeDescription": "DEFAULT",
"defaultLanguageCode": "en",
"ageBandsRequired": [
[{
"bandId": 1,
"minimumCountRequired": 2,
"maximumCountRequired": 2
}],
[{
"bandId": 1,
"minimumCountRequired": 3,
"maximumCountRequired": 3
}],
[{
"bandId": 1,
"minimumCountRequired": 4,
"maximumCountRequired": 4
}]],
"currencyCode": "ERROR",
"retailPrice": 0,
"bookingDate": "2013-12-11",
"retailPriceFormatted": "",
"merchantNetPrice": 0,
"merchantNetPriceFormatted": "",
"sortOrder": 1
}],
"vmid": "221001",
"errorMessage": null,
"errorType": null,
"dateStamp": "2013-06-04T17:02:35+0000",
"totalCount": 1,
"errorReference": null,
"errorMessageText": null,
"success": true,
"errorName": null
}
This section explains the meaning and function of the pricingUnit
field in the response object received from the /booking/availability/tourgrades/pricingmatrix service.
The /booking/availability/tourgrades/pricingmatrix service takes the following parameters as input in its request body:
Parameter | Type | Meaning |
---|---|---|
productCode |
string | unique alphanumeric identifier of the product to enquire about; e.g., 10040WORLD |
month |
string | month of the year by which to filter results |
year |
string | year by which to filter results |
currencyCode |
string | currency code for the currency in which to display pricing information |
Sending the following request body to the /booking/availability/tourgrades/pricingmatrix service will retrieve pricing information for "Skip the Line: World of Discoveries Entrance Ticket in Porto" (product code: 10040WORLD).
{
"productCode": "10040WORLD",
"currencyCode": "USD",
"month": "06",
"year": "2019"
}
Within each object item of the tourGrades
array – each of which gives the pricing details for a specific tour grade – is a pricingMatrix
array. Each object in this array details the per-age-band pricing for a specific pricing unit (pricingUnit
) associated with that product.
Using this information, you should be able to calculate the total cost of the booking – considering any booking options – with regard to the number of participants.
How to identify the fundamental unit prices for a booking, which are then summed in order to calculate a total price, is detailed below.
Note that in the response object received from the service, pricing schedules are organized hierarchically as follows:
bookingDate
--tourGrade
----ageBand
------price
There are two fundamental types of pricing unit – per-person and per-group.
If the pricing is per-person, then the total price of the booking will be directly proportional to the number of participants (passengers) of each type that are booking the product; i.e., a direct multiple of the per-person price.
The only pricing unit specifier for per-person pricing is “per person”, given in the pricingUnit
field; i.e.:
"pricingUnit": "per person"
Pricing unit | Example product | Meaning |
---|---|---|
"per person" |
10040WORLD | Per-person pricing – the unit price refers to the price for an individual participant. Some products have tiered pricing arrangements; i.e., a different per-person price can apply if certain numbers and combinations of participants in a particular age band are booking the product; e.g.:
Whether a range is available to be booked depends on whether the customer’s desired passenger mix satisfies the minimumCountRequired and maximumCountRequired fields in each item of the ageBandPrices array. |
If the pricing is per-group, then the total price of the booking will depend on the number of groups and types of group that ideally accommodate the participant mix.
The following pricing schedules follow “per-group” logic:
"pricingUnit": "per vehicle"
"pricingUnit": "per car"
"pricingUnit": "per group"
"pricingUnit": "per boat"
"pricingUnit": "per package"
"pricingUnit": "per jetski"
"pricingUnit": "per vessel"
"pricingUnit": "per helicopter"
"pricingUnit": "per room"
"pricingUnit": "per bike"
"pricingUnit": "per flight"
"pricingUnit": "per plane"
"pricingUnit": "per couple"
Eligibility for a certain individual pricing schedule; or, for inclusion in a particular group type, depends on the tour grade for the product, the type of participant (e.g., the age-band they fall into) and the date of the booking.
Pricing unit | Example product | Meaning |
---|---|---|
"per group" |
10847P42 | Per-group pricing – the unit price is calculated according to the number of groups the specified passenger will fit into rather than the exact number of participants. minimumCountRequired and maximumCountRequired must be considered as these fields relate to the available group sizes. |
"per room" |
6279P26 | Per-room pricing relates the room price, which depends on the number of participants making the booking. |
"per package" |
25941P70 | Per-package pricing refers to products that are sold as part of a package; for example a family package stipulating a passenger mix of two adults and two children |
"per vehicle" |
6154SHOP | Per-vehicle pricing is calculated according to the number of vehicles required for the specified passenger mix rather than the exact number of participants. minimumCountRequired and maximumCountRequired must be considered as these fields relate to the occupancy limitations for each vehicle. The minimum price will depend on the rate for a single vehicle. |
"per car" |
10175P10 | Per-car pricing – identical to "per vehicle", but refers specifically to vehicles that are cars. |
"per boat" |
11121P40 | Per-boat pricing – identical to "per vehicle", but refers specifically to vehicles that are boats. |
"per jetski" |
28965P127 | Per-jetski pricing – identical to "per vehicle", but refers specifically to vehicles that are jet-skis. |
"per vessel" |
17295P24 | Per-vessel pricing – identical to "per vehicle", but refers specifically to maritime vessels that are not strictly boats. |
"per helicopter" |
12189P23 | Per-helicopter pricing – identical to "per vehicle", but refers specifically to vehicles that are helicopters. |
"per bike" |
17448P8 | Per-bike pricing – identical to "per vehicle", but refers specifically to vehicles that are bikes. |
"per flight" |
28965P134 | Per-flight pricing – identical to "per vehicle", but refers specifically to the act of being aboard a flying vehicle. |
"per plane" |
14876P5 | Per-plane pricing – identical to "per vehicle", but refers specifically to vehicles that are aeroplanes. |
In this section, we’ll have a look at snippets from the response objects received from the /booking/availability/tourgrades/pricingmatrix service and interpret the results.
{
"productCode": "10040WORLD",
"currencyCode": "USD",
"month": "06",
"year": "2019"
}
Note: pricingMatrix
is an array of objects that detail the available pricing schedules for the product:
"pricingMatrix": [
{
"sortOrder": 1,
"pricingUnit": "per person",
"bookingDate": "2019-06-01",
"ageBandPrices": [
{
"bandId": 1,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 13.85,
"priceFormatted": "$13.85",
"merchantNetPrice": 11.05,
"merchantNetPriceFormatted": "$11.05",
"minNoOfTravellersRequiredForPrice": 1
}
],
"sortOrder": 1,
"minimumCountRequired": 0,
"maximumCountRequired": 15
},
{
"bandId": 2,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 6.92,
"priceFormatted": "$6.92",
"merchantNetPrice": 5.53,
"merchantNetPriceFormatted": "$5.53",
"minNoOfTravellersRequiredForPrice": 1
}
],
"sortOrder": 2,
"minimumCountRequired": 0,
"maximumCountRequired": 15
},
{
"bandId": 3,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 0,
"priceFormatted": "$0.00",
"merchantNetPrice": 0,
"merchantNetPriceFormatted": "$0.00",
"minNoOfTravellersRequiredForPrice": 1
}
],
"sortOrder": 3,
"minimumCountRequired": 0,
"maximumCountRequired": 15
},
{
"bandId": 5,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 10.39,
"priceFormatted": "$10.39",
"merchantNetPrice": 8.3,
"merchantNetPriceFormatted": "$8.30",
"minNoOfTravellersRequiredForPrice": 1
}
],
"sortOrder": 4,
"minimumCountRequired": 0,
"maximumCountRequired": 15
}
]
}
]
In this example, four age bands (1, 2, 3 and 5) have pricing information available. These numerically-identified age bands are the age bands allowed to book the product. Details of the age ranges that the product operator has defined are available from the /product service.
A call to /product regarding 10040WORLD
yields the following information:
"ageBands": [
{
"sortOrder": 1,
"ageFrom": 13,
"ageTo": 64,
"adult": true,
"bandId": 1,
"pluralDescription": "Adults",
"treatAsAdult": true,
"count": 0,
"description": "Adult"
},
{
"sortOrder": 2,
"ageFrom": 65,
"ageTo": 99,
"adult": false,
"bandId": 5,
"pluralDescription": "Seniors",
"treatAsAdult": true,
"count": 0,
"description": "Senior"
},
{
"sortOrder": 3,
"ageFrom": 4,
"ageTo": 12,
"adult": false,
"bandId": 2,
"pluralDescription": "Children",
"treatAsAdult": false,
"count": 0,
"description": "Child"
},
{
"sortOrder": 4,
"ageFrom": 0,
"ageTo": 3,
"adult": false,
"bandId": 3,
"pluralDescription": "Infants",
"treatAsAdult": false,
"count": 0,
"description": "Infant"
}
Product operators choose the age bands available for their product from the following five categories and define the age ranges that pertain to each band; i.e.:
bandId |
description |
---|---|
1 | Adult |
2 | Child |
3 | Infant |
4 | Youth |
5 | Senior |
For this product, the age bands have been defined as follows:
bandId |
description |
ageFrom |
ageTo |
---|---|---|---|
1 | Adult | 13 | 64 |
5 | Senior | 65 | 99 |
2 | Child | 4 | 12 |
3 | Infant | 0 | 3 |
Therefore, for this product, the following pricing applies:
Passenger type | Number | Price |
---|---|---|
Adult | 1-15 | $13.85 per person |
Senior | 1-15 | $10.39 per person |
Child | 1-15 | $6.92 per person |
Infant | 1-15 | free ($0) |
Per-person pricing might depend on the mix of passengers booking the tour. In the following example (5010SYDNEY
), a "48 Hour Family Pass Ticket" has a different price for children depending on how many are participating, which we'll see in the following snippet.
"tourGrades": [
{
"sortOrder": 1,
"gradeCode": "14HFAM",
"gradeTitle": "48 Hour Family Pass Ticket",
"pricingMatrix": [
{
"sortOrder": 1,
"pricingUnit": "per person",
"bookingDate": "2019-08-01",
"ageBandPrices": [
{
"bandId": 1,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 133.47,
"minNoOfTravellersRequiredForPrice": 1,
"priceFormatted": "$133.47",
"merchantNetPrice": 106.62,
"merchantNetPriceFormatted": "$106.62"
}
],
"sortOrder": 1,
"minimumCountRequired": 1,
"maximumCountRequired": 1
},
{
"bandId": 2,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 0,
"minNoOfTravellersRequiredForPrice": 1,
"priceFormatted": "$0.00",
"merchantNetPrice": 0,
"merchantNetPriceFormatted": "$0.00"
}
],
"sortOrder": 2,
"minimumCountRequired": 2,
"maximumCountRequired": 2
},
{
"bandId": 3,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 0,
"minNoOfTravellersRequiredForPrice": 1,
"priceFormatted": "$0.00",
"merchantNetPrice": 0,
"merchantNetPriceFormatted": "$0.00"
}
],
"sortOrder": 3,
"minimumCountRequired": 0,
"maximumCountRequired": null
}
]
},
{
"sortOrder": 2,
"pricingUnit": "per person",
"bookingDate": "2019-08-01",
"ageBandPrices": [
{
"bandId": 1,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 133.47,
"minNoOfTravellersRequiredForPrice": 1,
"priceFormatted": "$133.47",
"merchantNetPrice": 106.62,
"merchantNetPriceFormatted": "$106.62"
}
],
"sortOrder": 1,
"minimumCountRequired": 1,
"maximumCountRequired": 1
},
{
"bandId": 2,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 3.71,
"minNoOfTravellersRequiredForPrice": 1,
"priceFormatted": "$3.71",
"merchantNetPrice": 2.96,
"merchantNetPriceFormatted": "$2.96"
}
],
"sortOrder": 2,
"minimumCountRequired": 3,
"maximumCountRequired": 4
},
{
"bandId": 3,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 0,
"minNoOfTravellersRequiredForPrice": 1,
"priceFormatted": "$0.00",
"merchantNetPrice": 0,
"merchantNetPriceFormatted": "$0.00"
}
],
"sortOrder": 3,
"minimumCountRequired": 0,
"maximumCountRequired": null
}
]
}
]
},
…
]
To be eligible for a family pass ticket, the group must consist of an adult and at least two children.
Passenger mix | Adult price | Child price | Infant price |
---|---|---|---|
1 Adult + 1 Child |
N/A | N/A | N/A |
1 Adult + 2 Children + Any infants |
$133.47 | FREE | FREE |
1 Adult + 3-4 Children + Any infants |
$133.47 | $3.71 | FREE |
In this example, we see a per-person pricing schedule with a tiered arrangement, where the per-person price decreases depending on how many people are booking the tour, but the total price is still calculated as the sum of the individual per-person prices rather than an overall 'group' price.
{
"productCode": "17972P102",
"currencyCode": "USD",
"month": "08",
"year": "2019"
}
"tourGrades": [
{
"sortOrder": 1,
"gradeCode": "TG1",
"gradeTitle": "Arrival transfer",
"pricingMatrix": [
{
"sortOrder": 1,
"pricingUnit": "per person",
"bookingDate": "2019-08-01",
"ageBandPrices": [
{
"bandId": 1,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 52.45,
"priceFormatted": "$52.45",
"merchantNetPrice": 40.87,
"merchantNetPriceFormatted": "$40.87",
"minNoOfTravellersRequiredForPrice": 1
}
],
"sortOrder": 1,
"maximumCountRequired": 1,
"minimumCountRequired": 1
}
]
},
{
"sortOrder": 2,
"pricingUnit": "per person",
"bookingDate": "2019-08-01",
"ageBandPrices": [
{
"bandId": 1,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 26.22,
"priceFormatted": "$26.22",
"merchantNetPrice": 20.44,
"merchantNetPriceFormatted": "$20.44",
"minNoOfTravellersRequiredForPrice": 1
}
],
"sortOrder": 1,
"maximumCountRequired": 2,
"minimumCountRequired": 2
}
]
},
{
"sortOrder": 3,
"pricingUnit": "per person",
"bookingDate": "2019-08-01",
"ageBandPrices": [
{
"bandId": 1,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 17.91,
"priceFormatted": "$17.91",
"merchantNetPrice": 13.62,
"merchantNetPriceFormatted": "$13.62",
"minNoOfTravellersRequiredForPrice": 1
}
],
"sortOrder": 1,
"maximumCountRequired": 3,
"minimumCountRequired": 3
}
]
},
{
"sortOrder": 4,
"pricingUnit": "per person",
"bookingDate": "2019-08-01",
"ageBandPrices": [
{
"bandId": 1,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 19.19,
"priceFormatted": "$19.19",
"merchantNetPrice": 14.99,
"merchantNetPriceFormatted": "$14.99",
"minNoOfTravellersRequiredForPrice": 1
}
],
"sortOrder": 1,
"maximumCountRequired": 4,
"minimumCountRequired": 4
}
]
},
{
"sortOrder": 5,
"pricingUnit": "per person",
"bookingDate": "2019-08-01",
"ageBandPrices": [
{
"bandId": 1,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 15.35,
"priceFormatted": "$15.35",
"merchantNetPrice": 12.25,
"merchantNetPriceFormatted": "$12.25",
"minNoOfTravellersRequiredForPrice": 1
}
],
"sortOrder": 1,
"maximumCountRequired": 5,
"minimumCountRequired": 5
}
]
},
{
"sortOrder": 6,
"pricingUnit": "per person",
"bookingDate": "2019-08-01",
"ageBandPrices": [
{
"bandId": 1,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 12.66,
"priceFormatted": "$12.66",
"merchantNetPrice": 10.08,
"merchantNetPriceFormatted": "$10.08",
"minNoOfTravellersRequiredForPrice": 1
}
],
"sortOrder": 1,
"maximumCountRequired": 6,
"minimumCountRequired": 6
}
]
},
{
"sortOrder": 7,
"pricingUnit": "per person",
"bookingDate": "2019-08-01",
"ageBandPrices": [
{
"bandId": 1,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 10.94,
"priceFormatted": "$10.94",
"merchantNetPrice": 8.72,
"merchantNetPriceFormatted": "$8.72",
"minNoOfTravellersRequiredForPrice": 1
}
],
"sortOrder": 1,
"maximumCountRequired": 7,
"minimumCountRequired": 7
}
]
}
]
}
Travelers | Per-person price | Total price |
---|---|---|
1 | $52.45 | $52.45 |
2 | $26.22 | $52.44 |
3 | $17.91 | $53.73 |
4 | $19.19 | $76.76 |
5 | $15.35 | $76.75 |
6 | $12.66 | $75.96 |
7 | $10.94 | $76.58 |
{
"productCode": "10847P42",
"currencyCode": "USD",
"month": "06",
"year": "2019"
}
"pricingMatrix": [
{
"sortOrder": 1,
"pricingUnit": "per group",
"bookingDate": "2019-06-01",
"ageBandPrices": [
{
"bandId": 1,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 390,
"minNoOfTravellersRequiredForPrice": 1,
"priceFormatted": "$390.00",
"merchantNetPrice": 339.74,
"merchantNetPriceFormatted": "$339.74"
},
{
"sortOrder": 2,
"currencyCode": "USD",
"price": 390,
"minNoOfTravellersRequiredForPrice": 2,
"priceFormatted": "$390.00",
"merchantNetPrice": 0,
"merchantNetPriceFormatted": "$0.00"
}
],
"sortOrder": 1,
"minimumCountRequired": 1,
"maximumCountRequired": 10
}
]
}
]
{
"productCode": "100245P40",
"currencyCode": "USD",
"month": "08",
"year": "2019"
}
"pricingMatrix": [
{
"sortOrder": 1,
"pricingUnit": "per room",
"bookingDate": "2019-08-01",
"ageBandPrices": [
{
"bandId": 1,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 110,
"minNoOfTravellersRequiredForPrice": 1,
"priceFormatted": "$110.00",
"merchantNetPrice": 95.85,
"merchantNetPriceFormatted": "$95.85"
},
{
"sortOrder": 2,
"currencyCode": "USD",
"price": 110,
"minNoOfTravellersRequiredForPrice": 2,
"priceFormatted": "$110.00",
"merchantNetPrice": 0,
"merchantNetPriceFormatted": "$0.00"
}
],
"sortOrder": 1,
"minimumCountRequired": 1,
"maximumCountRequired": 10
}
]
}
]
{
"productCode": "25941P70",
"currencyCode": "USD",
"month": "02",
"year": "2019"
}
"pricingMatrix": [
{
"sortOrder": 1,
"pricingUnit": "per package",
"bookingDate": "2019-02-01",
"ageBandPrices": [
{
"bandId": 1,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 87.7,
"minNoOfTravellersRequiredForPrice": 1,
"priceFormatted": "$87.70",
"merchantNetPrice": 67.23,
"merchantNetPriceFormatted": "$67.23"
},
{
"sortOrder": 2,
"currencyCode": "USD",
"price": 87.7,
"minNoOfTravellersRequiredForPrice": 2,
"priceFormatted": "$87.70",
"merchantNetPrice": 0,
"merchantNetPriceFormatted": "$0.00"
}
],
"sortOrder": 1,
"minimumCountRequired": 1,
"maximumCountRequired": 10
}
]
}
]
{
"productCode": "20190P4",
"currencyCode": "USD",
"month": "06",
"year": "2019"
}
"pricingMatrix": [
{
"sortOrder": 1,
"pricingUnit": "per vehicle",
"bookingDate": "2019-06-01",
"ageBandPrices": [
{
"bandId": 1,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 250,
"minNoOfTravellersRequiredForPrice": 1,
"priceFormatted": "$250.00",
"merchantNetPrice": 186.38,
"merchantNetPriceFormatted": "$186.38"
},
{
"sortOrder": 2,
"currencyCode": "USD",
"price": 250,
"minNoOfTravellersRequiredForPrice": 2,
"priceFormatted": "$250.00",
"merchantNetPrice": 0,
"merchantNetPriceFormatted": "$0.00"
}
],
"sortOrder": 1,
"minimumCountRequired": 1,
"maximumCountRequired": 7
}
]
}
]
{
"productCode": "10175P10",
"currencyCode": "USD",
"month": "06",
"year": "2019"
}
"pricingMatrix": [
{
"sortOrder": 1,
"pricingUnit": "per car",
"bookingDate": "2019-06-01",
"ageBandPrices": [
{
"bandId": 1,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 98.08,
"priceFormatted": "$98.08",
"merchantNetPrice": 78.34,
"merchantNetPriceFormatted": "$78.34",
"minNoOfTravellersRequiredForPrice": 1
},
{
"sortOrder": 2,
"currencyCode": "USD",
"price": 98.08,
"priceFormatted": "$98.08",
"merchantNetPrice": 0,
"merchantNetPriceFormatted": "$0.00",
"minNoOfTravellersRequiredForPrice": 2
}
],
"sortOrder": 1,
"minimumCountRequired": 1,
"maximumCountRequired": 3
}
]
}
]
{
"productCode": "11121P40",
"currencyCode": "USD",
"month": "08",
"year": "2018"
}
"pricingMatrix": [
{
"sortOrder": 1,
"pricingUnit": "per boat",
"bookingDate": "2018-06-01",
"ageBandPrices": [
{
"bandId": 1,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 266.21,
"merchantNetPrice": 226.81,
"merchantNetPriceFormatted": "$226.81",
"priceFormatted": "$266.21",
"minNoOfTravellersRequiredForPrice": 1
},
{
"sortOrder": 2,
"currencyCode": "USD",
"price": 266.21,
"merchantNetPrice": 0,
"merchantNetPriceFormatted": "$0.00",
"priceFormatted": "$266.21",
"minNoOfTravellersRequiredForPrice": 2
}
],
"sortOrder": 1,
"minimumCountRequired": 1,
"maximumCountRequired": 2
}
]
}
]
{
"productCode": "28965P127",
"currencyCode": "USD",
"month": "08",
"year": "2018"
}
"tourGrades": [
{
"sortOrder": 1,
"gradeCode": "TG1",
"gradeTitle": "20 minutes for 1 person",
"pricingMatrix": [
{
"sortOrder": 1,
"pricingUnit": "per jetski",
"bookingDate": "2018-06-01",
"ageBandPrices": [
{
"bandId": 1,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 55.46,
"minNoOfTravellersRequiredForPrice": 1,
"priceFormatted": "$55.46",
"merchantNetPrice": 47.25,
"merchantNetPriceFormatted": "$47.25"
}
],
"sortOrder": 1,
"minimumCountRequired": 1,
"maximumCountRequired": 1
}
]
}
]
},
{
"sortOrder": 2,
"gradeCode": "TG3",
"gradeTitle": "20 minutes for 2 persons",
"pricingMatrix": [
{
"sortOrder": 1,
"pricingUnit": "per jetski",
"bookingDate": "2018-06-01",
"ageBandPrices": [
{
"bandId": 1,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 66.55,
"minNoOfTravellersRequiredForPrice": 1,
"priceFormatted": "$66.55",
"merchantNetPrice": 56.7,
"merchantNetPriceFormatted": "$56.70"
},
{
"sortOrder": 2,
"currencyCode": "USD",
"price": 66.55,
"minNoOfTravellersRequiredForPrice": 2,
"priceFormatted": "$66.55",
"merchantNetPrice": 0,
"merchantNetPriceFormatted": "$0.00"
}
],
"sortOrder": 1,
"minimumCountRequired": 1,
"maximumCountRequired": 2
}
]
}
]
}
]
This example shows how group prices can differ according to the size of the group in question. In this case, two adults can ride together on a two-person jet ski, whereas a single adult requires his or her own jet ski, and therefore the unit price is slightly higher for the single adult.
Travelers | Vehicle type | Price per jet ski | Price per person |
---|---|---|---|
1 | Single-person jet ski | $55.46 | $55.46 |
2 | Two-person jet ski | $66.55 | $33.275 |
{
"productCode": "17295P24",
"currencyCode": "USD",
"month": "06",
"year": "2019"
}
"pricingMatrix": [
{
"sortOrder": 1,
"pricingUnit": "per vessel",
"bookingDate": "2019-06-01",
"ageBandPrices": [
{
"bandId": 1,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 799,
"priceFormatted": "$799.00",
"merchantNetPrice": 680.75,
"merchantNetPriceFormatted": "$680.75",
"minNoOfTravellersRequiredForPrice": 1
},
{
"sortOrder": 2,
"currencyCode": "USD",
"price": 799,
"priceFormatted": "$799.00",
"merchantNetPrice": 0,
"merchantNetPriceFormatted": "$0.00",
"minNoOfTravellersRequiredForPrice": 2
}
],
"sortOrder": 1,
"minimumCountRequired": 1,
"maximumCountRequired": 12
}
]
}
]
{
"productCode": "12189P23",
"currencyCode": "USD",
"month": "08",
"year": "2018"
}
"tourGrades": [
{
"sortOrder": 1,
"gradeCode": "TG1",
"gradeTitle": "Private Helicopter 1 to 2 Pax",
"pricingMatrix": [
{
"sortOrder": 1,
"pricingUnit": "per helicopter",
"bookingDate": "2018-06-01",
"ageBandPrices": [
{
"bandId": 1,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 1714.83,
"priceFormatted": "$1,714.83",
"merchantNetPrice": 1461.03,
"merchantNetPriceFormatted": "$1,461.03",
"minNoOfTravellersRequiredForPrice": 1
},
{
"sortOrder": 2,
"currencyCode": "USD",
"price": 1714.83,
"priceFormatted": "$1,714.83",
"merchantNetPrice": 0,
"merchantNetPriceFormatted": "$0.00",
"minNoOfTravellersRequiredForPrice": 2
}
],
"sortOrder": 1,
"minimumCountRequired": 1,
"maximumCountRequired": 2
}
]
}
]
},
{
"sortOrder": 2,
"gradeCode": "TG2",
"gradeTitle": "Private Helicopter 1 to 3 Pax",
"pricingMatrix": [
{
"sortOrder": 1,
"pricingUnit": "per helicopter",
"bookingDate": "2018-06-01",
"ageBandPrices": [
{
"bandId": 1,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 2047.41,
"priceFormatted": "$2,047.41",
"merchantNetPrice": 1744.4,
"merchantNetPriceFormatted": "$1,744.40",
"minNoOfTravellersRequiredForPrice": 1
},
{
"sortOrder": 2,
"currencyCode": "USD",
"price": 2047.41,
"priceFormatted": "$2,047.41",
"merchantNetPrice": 0,
"merchantNetPriceFormatted": "$0.00",
"minNoOfTravellersRequiredForPrice": 2
}
],
"sortOrder": 1,
"minimumCountRequired": 1,
"maximumCountRequired": 3
}
]
}
]
}
]
Travelers | Vehicle type | Price per helicopter | Price per person |
---|---|---|---|
1 | 1-2-person helicopter | $1,714.83 | $1,714.83 |
2 | 1-2-person helicopter | $1,714.83 | $857.415 |
3 | 1-3-person helicopter | $2,047.41 | $682.47 |
{
"productCode": "17448P8",
"currencyCode": "USD",
"month": "08",
"year": "2018"
}
"pricingMatrix": [
{
"sortOrder": 1,
"pricingUnit": "per bike",
"bookingDate": "2018-06-01",
"ageBandPrices": [
{
"bandId": 1,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 208.53,
"priceFormatted": "$208.53",
"merchantNetPrice": 177.67,
"merchantNetPriceFormatted": "$177.67",
"minNoOfTravellersRequiredForPrice": 1
},
{
"sortOrder": 2,
"currencyCode": "USD",
"price": 208.53,
"priceFormatted": "$208.53",
"merchantNetPrice": 0,
"merchantNetPriceFormatted": "$0.00",
"minNoOfTravellersRequiredForPrice": 2
}
],
"sortOrder": 1,
"minimumCountRequired": 1,
"maximumCountRequired": 2
}
]
}
]
{
"productCode": "28965P134",
"currencyCode": "USD",
"month": "08",
"year": "2018"
}
"tourGrades": [
{
"sortOrder": 1,
"gradeCode": "TG1",
"gradeTitle": "Individual flight",
"pricingMatrix": [
{
"sortOrder": 1,
"pricingUnit": "per flight",
"bookingDate": "2018-06-01",
"ageBandPrices": [
{
"bandId": 1,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 61.01,
"merchantNetPrice": 51.98,
"merchantNetPriceFormatted": "$51.98",
"priceFormatted": "$61.01",
"minNoOfTravellersRequiredForPrice": 1
}
],
"sortOrder": 1,
"minimumCountRequired": 1,
"maximumCountRequired": 1
}
]
}
]
},
{
"sortOrder": 2,
"gradeCode": "TG2",
"gradeTitle": "Double",
"pricingMatrix": [
{
"sortOrder": 1,
"pricingUnit": "per flight",
"bookingDate": "2018-06-01",
"ageBandPrices": [
{
"bandId": 1,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 94.28,
"merchantNetPrice": 80.33,
"merchantNetPriceFormatted": "$80.33",
"priceFormatted": "$94.28",
"minNoOfTravellersRequiredForPrice": 1
},
{
"sortOrder": 2,
"currencyCode": "USD",
"price": 94.28,
"merchantNetPrice": 0,
"merchantNetPriceFormatted": "$0.00",
"priceFormatted": "$94.28",
"minNoOfTravellersRequiredForPrice": 2
}
],
"sortOrder": 1,
"minimumCountRequired": 1,
"maximumCountRequired": 2
}
]
}
]
}
]
Travelers | gradeTitle |
Price per flight | Price per person |
---|---|---|---|
1 | Individual flight | $61.01 | $61.01 |
2 | Double | $94.28 | $47.14 |
{
"productCode": "14876P5",
"currencyCode": "USD",
"month": "06",
"year": "2019"
}
"pricingMatrix": [
{
"sortOrder": 1,
"pricingUnit": "per plane",
"bookingDate": "2019-01-02",
"ageBandPrices": [
{
"bandId": 1,
"prices": [
{
"sortOrder": 1,
"currencyCode": "USD",
"price": 433.03,
"priceFormatted": "$433.03",
"merchantNetPrice": 391.99,
"merchantNetPriceFormatted": "$391.99",
"minNoOfTravellersRequiredForPrice": 1
},
{
"sortOrder": 2,
"currencyCode": "USD",
"price": 433.03,
"priceFormatted": "$433.03",
"merchantNetPrice": 0,
"merchantNetPriceFormatted": "$0.00",
"minNoOfTravellersRequiredForPrice": 2
}
],
"sortOrder": 1,
"minimumCountRequired": 1,
"maximumCountRequired": 3
}
]
}
]
The available age bands for a product, such as adult, child, infant, etc., are returned by the /product service. The customer can select a different number of people from each age band during the price check and checkout process.
Tour and experience product suppliers can set different prices for (and impose different rules on) those wishing to make a booking for their product according to how old they are.
For example, suppliers might choose to charge people 18 years and older ('adults') the full ticket price, while 'children' can book at a lower price.
Or, the tour operator may only allow children to make a group booking for the tour so long as the group contains 'at least one adult'.
Viator provides five categories (age bands) that product suppliers can use to segregate travelers into age groups (the limits of which they also define) in order to set pricing and traveler-count participation rules for their product according to the age band categories.
The age bands supported by the Viator API are as follows:
bandId |
Description |
---|---|
1 | Adult |
2 | Child |
3 | Infant |
4 | Youth |
5 | Senior |
The names and corresponding numeric identifiers of these categories are fixed as in the table above (i.e., 1
is always Adult
); however, the exact age range to which each category pertains must be defined manually by the supplier.
The maximum and minimum ages that each age band describes for each product can be retrieved from the /product service.
For example, a call to /product regarding 10040WORLD
yields the following ageBands
array within its response object:
"ageBands": [
{
"sortOrder": 1,
"ageFrom": 13,
"ageTo": 64,
"adult": true,
"bandId": 1,
"pluralDescription": "Adults",
"treatAsAdult": true,
"count": 0,
"description": "Adult"
},
{
"sortOrder": 2,
"ageFrom": 65,
"ageTo": 99,
"adult": false,
"bandId": 5,
"pluralDescription": "Seniors",
"treatAsAdult": true,
"count": 0,
"description": "Senior"
},
{
"sortOrder": 3,
"ageFrom": 4,
"ageTo": 12,
"adult": false,
"bandId": 2,
"pluralDescription": "Children",
"treatAsAdult": false,
"count": 0,
"description": "Child"
},
{
"sortOrder": 4,
"ageFrom": 0,
"ageTo": 3,
"adult": false,
"bandId": 3,
"pluralDescription": "Infants",
"treatAsAdult": false,
"count": 0,
"description": "Infant"
}
For this product, the age bands have been defined as follows:
bandId |
description |
ageFrom |
ageTo |
---|---|---|---|
1 | Adult | 13 | 64 |
5 | Senior | 65 | 99 |
2 | Child | 4 | 12 |
3 | Infant | 0 | 3 |
Product operators must define at least one age band for their tour, and there are no 'default' age ranges. Therefore, if the product operator has only specified a single 'adult' age band covering ages 18-99, it must be assumed that only people aged 18-99 are eligible to book the tour, essentially excluding children and centenarians in this case.
Field | Type | Definition |
---|---|---|
sortOrder |
integer | the sort order for this age band |
adult |
boolean | true if this age band is the 'adult' age band |
treatAsAdult |
boolean | true if this age band can book the tour without the need for adult accompaniment |
Note: bandId
must be supplied in the request body of the following services:
Age bands are referenced by their bandId
in the responses from the following services:
Occasionally, a product schema in the Viator database will contain incorrect or invalid information. Usually, this occurs due to a mistake made by the supplier of the product when creating the product or updating its details.
Nonetheless, it's in all our best interests for product information to be accurate and up-to-date; therefore, if you discover a problem with a product, we would greatly appreciate it if you could report the error through our product issue reporting form.
Field | How to fill it in | Example |
---|---|---|
Reporter | Enter your email address for tracking or correspondence | you@emailserver.com |
Supplier ID | Enter the value returned in the supplierCode field by the /product service for the product in question. |
3072 |
Product Code | Enter the value returned in the code field by the /product service for the product in question. |
3072LASALL |
Booking ID | Leave this field blank |
Category | Included issues |
---|---|
Additional Info | clauses in the additionalInfo array in the response from /product; e.g., departure time or hotel pick-up information |
Availability & Blockouts | N/A |
Booking Details | N/A |
Highlights | highlights array items in the response from /product |
Inclusions / Exclusions | inclusions or exclusions array items in the response from /product |
Images | productPhotos and userPhotos returned by /product or /product/photos |
Product Title | title in the response from /product, /search/products, /search/products/codes and /search/products/freetext |
Product Descriptions | description and shortDescription in the response from /product |
SAPI | N/A |
Tour Options & Pricing | pricing issues; e.g. when the value of merchantNetPrice is 0 ; or, if merchantNetPrice > price |
Taxonomy |
|
Translation Incorrect | mistakes in any natural-language field in the response from any service where translationLevel is non-zero |
TVRM | N/A |
VUC incorrect | N/A |
Once your report has been submitted, a member of our Supplier Support Team will contact the supplier of the product in question to resolve any problems with their listing.
This section explains what merchant API partners need to do in order to be granted access to (and, ultimately, sell) the many on-request products available in Viator's product catalogue.
Among the products in our inventory, a major differentiating feature is whether they are 'freesale' or 'on-request':
By default, you will only have access to the freesale product range; access to the on-request product range is restricted on account of the extra complexities involved with handling this kind of booking.
While the majority of products in our inventory are 'freesale', a significant proportion remain 'on-request'. Upgrading your booking platform to support on-request products can lead to an increase in revenue of between 5% and 13%, depending on the locale(s) in which you operate.
Locale | Revenue increase % |
---|---|
en | 8% |
es | 8% |
fr | 11% |
de | 10% |
pt | 5% |
nl | 12% |
it | 10% |
ja | 10% |
sv | 8% |
no | 8% |
da | 13% |
tw | 13% |
zh | 6% |
Having a wider range of products on offer can be a key differentiator with respect to your competitors.
Customers often purchase multiple products in the same session – if the product they're looking for isn't available on your platform, they are likely to seek a competitor with a more complete range of products for sale.
In order to sell on-request products, you will need to:
However, as the on-request booking confirmation process is fully automated, you will not need to:
Instead, checking the status of bookings (whether confirmed or not) can be accomplished using the /booking/status and /booking/status/items services. These services can be polled periodically to determine the confirmation status of your bookings.
Note: We recommend using the /booking/status/items service to poll for booking statuses, as it is both faster and can be polled more frequently than /booking/status, which can only be polled once every thirty minutes.
Managing customer expectations is a key factor in supporting on-request products on your booking platform.
Make clear mention that this is a product for which confirmation will not be received immediately, but rather within 72 hours of making the booking and at least 24 hours prior to the activity start time.
This fact, as well as other pertinent tidbits, can be found in the additionalInfo
array in the response from /product. It is mandatory that all clauses in the additionalInfo
array are clearly displayed on your product detail page.
As you will only charge the customer's credit card once the on-request booking is confirmed (i.e., after we have received confirmation of the booking from the product supplier) it's best to display a message to this effect at a prominent point of the check-out flow for all on-request products.
In this way, customers can be reassured that they are not being charged for a booking that may never be confirmed, thereby minimizing needless calls to your customer service team.
If a single booking includes both freesale (instantly confirmed) and on-request products, only the amount for the freesale product should be charged immediately; the portion corresponding to the on-request booking should only be charged once confirmation is received.
Until that time, a pre-authorization should be held against the customer’s credit card until confirmation is received.
It is important that you clearly differentiate between products that are confirmed and those that are pending confirmation, and communicate the status of each and that the pre-authorization will only finalize once the on-request products are confirmed.
Changes will need to be made to your confirmation page because it will not be possible for your customer to download a voucher after completing an on-request booking.
Vouchers for freesale products, however, must be made available immediately following the completion of the booking process.
You will need to create email templates for all the following scenarios:
Note: When a booking is declined, it is useful to mention that the customer's card was not charged.
As mentioned above, once a booking for an on-request product is made, it remains in a 'pending' state, awaiting confirmation by the supplier. The supplier has the option of 'confirming' or 'rejecting' the booking.
Such bookings will not remain 'pending' indefinitely, however. If the supplier has not confirmed the booking within 72 hours – or if they have not confirmed the booking by the time it reaches 24 hours from departure – our systems will automatically reject the booking, and this will be reflected in the response from the /booking/status/items and /booking/status services.
There will be no indication that the rejection occurred on account of the supplier being unable to perform their duties. Therefore, you should simply inform the customer that, for reasons out of your control, this on-request tour was unavailable.
As it is a testing environment, the sandbox server is not connected to any external suppliers. No booking requests are made to real external suppliers, so you will not be able to conduct a fully-realistic test for the above-mentioned situation (where the booking's status remains 'pending' until actioned (confirmed or rejected) by the supplier.
Instead, you can model the scenarios using the sandbox server as follows:
Make an on-request booking on the sandbox server with the exp-demo
header parameter set to false
to have the booking behave like a on-request product; i.e., the bookingStatus.type
will only proceeded to the "PENDING"
status. However, as no actual booking requests are made with the supplier when using a sandbox-only API-key, you will need to contact our API tech support team at apitechsupport@viator.com and request that the booking's status be updated to either "CONFIRMED"
or "REJECTED"
, as you require, for testing purposes. Please note that because this is a manual process, we'd genuinely appreciate your effort in keeping the number of these requests to a minimum.
Make an on-request booking on the sandbox server with the exp-demo
header parameter set to true
to have the booking behave as if your were booking a freesale product; i.e., the bookingStatus.type
will have proceeded to the "CONFIRMED"
status immediately.
Once you have completed all tasks mentioned here and sent your Viator account manager the email copy for the different scenarios described above, we will change the status of your product API-key to include on-request products.
The products available through the Viator API have been created in a variety of languages, often by the suppliers of those products themselves.
Although the majority of these have been created in English, many have been created in other languages. For example, a tour that operates in Paris might have been created in French.
Viator provides translation services to localize product descriptions to the language of the locale in which they are being presented. In this way, products with descriptions – for example, in French – can be displayed in English on English-language websites. Conversely, products with English-language-descriptions can be displayed in French on French-language websites.
Accept-Language
header parameter in the request to each endpoint.Some products have been translated by actual humans – 'human translated' – while others have been automatically translated using Google Translate – 'machine translated'.
The type of translation that has been applied to a product (if any) is indicated by its translationLevel
, a numeric specifer with meanings as follows:
translationLevel |
Meaning |
---|---|
0 |
The product was created by the supplier in the language you specifed using the Accept-Language header parameter in the request; i.e., the natural-language text in this response has not been translated |
80 |
All product information has been machine translated |
90 or 100 |
All product information has been human translated |
Therefore, any product with a non-zero translationLevel
has been translated either by a human or via an automatic process.
The translationLevel
field is returned in the response objects from the following services:
When performing a product search using any of these services, you will receive - by default - products with a translationLevel
of:
0
(products that are in the language you specified in Accept-Language
and are configured for your API-keys), and90
or 100
(products that have been fully human translated)If your implementation can support the large number of products available that are machine translated, you can.
However, access to the considerable volume of machine-translated products (level 80
), is not granted by default.
To access machine-translated products, you will need to:
Many of the endpoints in the Viator API return pricing information. Due to the necessity of supporting legacy implementations, some pricing fields may not be named in an intuitive way.
This section seeks to clarify what each of the pricing fields returned by each endpoint actually refer to and how you need to use this information in your implementation.
Category | Meaning |
---|---|
Suggested retail price | The recommended retail price for the product and the price that the product is sold at on the Viator site |
Merchant net rate | The amount that Viator will invoice the merchant for this sale, excluding the transaction fee |
Merchant total price | The total amount that Viator will invoice the merchant for this sale, including the transaction fee |
Service | Suggested retail price | Merchant net rate |
---|---|---|
/search/products | price , priceFormatted |
merchantNetPriceFrom , merchantNetPriceFromFormatted |
/product | price , priceFormatted , priceFrom , priceFromFormatted |
merchantNetPriceFrom , merchantNetPriceFromFormatted |
/booking/availability | retailPrice , retailPriceFormatted |
merchantNetPrice , merchantNetPriceFormatted |
/booking/availability/tourgrades | retailPrice , retailPriceFormatted |
merchantNetPrice , merchantNetPriceFormatted , pricePerTraveler , pricePerTravelerFormatted |
/booking/availability/tourgrades/pricingmatrix | price , priceFormatted |
merchantNetPrice , merchantNetPriceFormatted |
/booking/book | N/A | merchantNetPrice , merchantNetPriceFormatted , lastRetailPrice , lastRetailPriceFormatted |
/booking/pricingmatrix | price , priceFormatted |
merchantNetPrice , merchantNetPriceFormatted |
/booking/calculateprice | N/A | merchantNetPrice , merchantNetPriceFormatted , lastRetailPrice , lastRetailPriceFormatted , itineraryFromPrice , itineraryFromPriceFormatted , itineraryNewPrice , itineraryNewPriceFormatted |
/booking/pastbooking | N/A | merchantNetPrice , merchantNetPriceFormatted , lastRetailPrice , lastRetailPriceFormatted , |
/booking/mybookings | N/A | merchantNetPrice , merchantNetPriceFormatted , lastRetailPrice , lastRetailPriceFormatted |
The following services return the merchant total price (i.e., the merchant net rate + transaction fee) in the fields shown:
Service | Merchant total price fields |
---|---|
/booking/book | price , priceFormatted , totalPrice , totalPriceFormatted , priceUSD , totalPriceUSD |
/booking/calculateprice | price , priceFormatted , priceUSD , totalPrice , totalPriceFormatted , totalPriceUSD |
/booking/pastbooking | price , priceFormatted , totalPrice , totalPriceFormatted , priceUSD , totalPriceUSD , |
/booking/mybookings | price , priceFormatted , priceUSD , totalPrice , totalPriceFormatted , totalPriceUSD |
Let's have a look at the various pricing fields for a specific product - the Grand Canyon All-American Helicopter Tour (product code: 2280AAHT).
A search for this product (at the time of writing) on the Viator.com site gives the 'from' price of the tour as $601.11:
This value comes from the price
or priceFormatted
fields in the response from /product for this tour; i.e.,:
{
...,
"price": 601.11,
"priceFormatted": "$601.11",
...
}
Essentially, this value is the price that the product is sold at on the viator site, and is therefore the suggested retail price; i.e., the price at which we recommend you advertise and sell the product for.
It is also the price of the tour grade with the lowest price; in this case, the "Earlybird A-Star" tour grade detailed here:
{
"sortOrder": 5,
"currencyCode": "AUD",
"langServices": {
"en/SERVICE_AUDIO": "English - Audio"
},
"gradeCode": "EB_ASTAR_SP",
"merchantNetPriceFrom": 555.37,
"priceFrom": 601.11,
"priceFromFormatted": "$601.11",
"merchantNetPriceFromFormatted": "$555.37",
"gradeTitle": "Special: Earlybird A-Star",
"gradeDepartureTime": "",
"gradeDescription": "Special Offer: Receive a discounted seat for the Grand Canyon All American Helicopter Tour departing between 6:45am and 7am on an A-Star helicopter",
"defaultLanguageCode": "en"
},
As you can see, the "suggested retail price" is given in the priceFrom
field.
When setting the retail price at which you sell products on your site, it’s important to remember that the “suggested sell price” is the price at which the product is currently advertised on the Viator site and reflects the current standard industry price for the product. It does not take into consideration the merchant net price (i.e., the price at which you as a merchant partner will be invoiced for the sale) and, in the case of discounting scenarios, may in fact be less than the merchant net price.
Therefore, to ensure that you sell the product at a price which guarantees that you receive at least as much as you will be invoiced for, as well as any extra profit margin that you desire to generate, we recommend you include a check in your implementation that these requirements are satisfied by comparing the suggested retail and merchant net prices and adjusting the retail price at which you advertise the product accordingly.
For example, if the merchant net price for a product is $100, the suggested sell price is $101, and your requirement for a minimum margin is 5%, you should adjust the price at which you advertise the product to $105.
While we recommend that you charge your customers this amount, it is ultimately up to you as to the price you set for the product, bearing in mind that Viator will then invoice you for the merchant net rate (merchantNetPriceFrom
) of $555.37 plus a transaction fee calculated as a percentage of the net rate; i.e., the merchant total price.
The exact value of this transaction fee is detailed in your contract with Viator.
Suppliers have the option of setting special pricing deals for their products. When a product is 'on sale'; i.e., has a temporarily lowered price, it will be reflected in the product content response, as follows:
Field name | Standard pricing | Special offer / on-sale pricing |
---|---|---|
specialOfferAvailable |
false |
true |
specialOffer |
"" (empty string) |
e.g.: "Book by February 28 to save 10%" |
rrp |
0.0 |
pre-discount price |
rrpFormatted |
"" (empty string) |
currency-formatted pre-discount price |
price |
standard price | special offer price |
priceFormatted |
currency-formatted standard price | currency-formatted special-offer price |
merchantNetPriceFrom |
standard merchant net rate | special offer merchant net rate |
merchantNetPriceFromFormatted |
currency formatted standard merchant net rate | currency formatted special offer merchant net rate |
priceFormatted |
currency-formatted standard price | currency-formatted special-offer price |
priceFrom (in tourgrades ) |
standard price | special offer price |
priceFromFormatted (in tourgrades ) |
currency-formatted standard price | currency-formatted special-offer price |
You can use this information to highlight which products are on special and provide details to the user about the special offer.
Suppliers occasionally need to reach out to customers for a variety of reasons, such as:
To allow suppliers to contact customers directly, Viator provides a Closed Loop Communication (CLC) system.
CLC is enabled per-booking and at the time of booking by supplying the customer’s email
and either homePhone
or [cellphone
+ cellPhoneCountryCode
] – or both – in the booker
object in the request body sent to the /booking/book service when making a booking.
This will allow suppliers to send CLC messages directly to the end customer.
You will receive a CC of each supplier message to your customer support email address in case further assistance is required, but no action from your support team will be necessary for suppliers to communicate with customers.
Merchants choosing this option should mention to their customers that they are purchasing a product from a third-party supplier, and that they may therefore receive communications regarding the purchase directly from that supplier.
{
...
"booker": {
"homePhone": "+61 2 66987564",
"firstname": "Homer Test",
"surname": "Simpson Test",
"title": "Mr",
"cellPhoneCountryCode": "+61",
"cellPhone": "431532778",
"email": "hsimpson@customeremail.com"
}
...
}
To have CLCs from the supplier sent only to your (the merchant's) customer support team:
cellPhone
, cellPhoneCountryCode
and homePhone
fields blank in the request to the /booking/book service when making a booking.Note: Utilizing this option requires merchants to manage the final loop of communication with the end customer to ensure that their tour/activity can be fulfilled successfully.
As well as making bookings, merchant partners are also able to cancel bookings through the Viator API using the /bookings/cancel-reasons, /bookings/{booking-ref}/cancel-quote and /bookings/{booking-ref}/cancel endpoints. Items cancelled via the /bookings/{booking-ref}/cancel endpoint will be cancelled in full, and only one booking can be cancelled at a time.
For more information about the content of the new merchantTermsAndConditions
object, see Cancellation policy.
All products can be cancelled by the merchant; however, the refund granted by the supplier to the customer differs depending on the cancellation policy for the product in question.
There are three cancellation policy categories, standard, custom and all sales final, represented by an integer in the merchantTermsAndConditionsType
field in the merchantTermsAndConditions
object returned by /product: 1
, 2
or 3
, respectively.
Note: These policies are those provided by Viator to our merchant partners. Merchants can choose whether to extend these terms to their customers unchanged or set their own cancellation terms. For example, the merchant partner can choose to make all products non-refundable; or, they might change the full-refund cancellation window to 72 hours instead of 24 hours, and so forth.
1
– Standard cancellation policyProducts in this category are cancellable up to 24 hours before the travel date (local supplier time) for a full refund. However, a 100% cancellation penalty applies for cancellations submitted less than 24 hours before the start time. Most products (about 85%) fall into this category.
5010SYDNEY
{
"data": {
"merchantTermsAndConditions": {
"termsAndConditions": "For a full refund, cancel at least 24 hours in advance of the start date of the experience.",
"merchantTermsAndConditionsType": 1,
"amountRefundable": null,
"cancellationFromTourDate": [
{
"dayRangeMin": 0,
"dayRangeMax": 1,
"percentageRefundable": 0,
"policyStartTimestamp": null,
"policyEndTimestamp": null
},
{
"dayRangeMin": 1,
"dayRangeMax": null,
"percentageRefundable": 100,
"policyStartTimestamp": null,
"policyEndTimestamp": null
}
]
},
"...": "..."
}
}
This product has the standard cancellation policy; i.e., when a booking is cancelled:
Policy | dayRangeMin | dayRangeMax | Logic | percentageRefundable |
---|---|---|---|---|
less than one day (24 hours) before the start time | 0 | 1 | (product_start_time - cancellation_time) >= 0 days && (product_start_time - cancellation_time) < 1 days | 0 |
more than one day (24 hours) before the start time | 1 | null | (product_start_time - cancellation_time) >= 1 day | 100 |
2
– Custom cancellation policyThe refund amount for products in this category varies depending on how long before its start time the product is cancelled. Many products on a custom policy are multi-day tours, which require more sophisticated planning on the supplier’s end. Only a small number of products (around 5%) fall into this category.
2264RJ410
"data": {
"merchantTermsAndConditions": {
"termsAndConditions": "If you cancel at least 30 day(s) in advance of the scheduled departure, there is no cancellation fee.<br>If you cancel between 10 and 29 day(s) in advance of the scheduled departure, there is a 50 percent cancellation fee.<br>If you cancel within 9 day(s) of the scheduled departure, there is a 100 percent cancellation fee.<br>",
"merchantTermsAndConditionsType": 2,
"amountRefundable": null,
"cancellationFromTourDate": [
{
"dayRangeMin": 10,
"dayRangeMax": 30,
"percentageRefundable": 50,
"policyStartTimestamp": null,
"policyEndTimestamp": null
},
{
"dayRangeMin": 30,
"dayRangeMax": null,
"percentageRefundable": 100,
"policyStartTimestamp": null,
"policyEndTimestamp": null
},
{
"dayRangeMin": 0,
"dayRangeMax": 10,
"percentageRefundable": 0,
"policyStartTimestamp": null,
"policyEndTimestamp": null
}
]
},
"...": "..."
}
This product has a complex cancellation policy; where cancellations processed:
Policy | dayRangeMin | dayRangeMax | Logic | percentageRefundable |
---|---|---|---|---|
30 days or more before the start time | 30 | null | (product_start_time - cancellation_time) >= 30 days | 100 |
10 days and less than 30 days (10 to 30 days) before the start time or more | 10 | 30 | (product_start_time - cancellation_time) >= 10 days && (product_start_time - cancellation_time) < 30 days | 50 |
less than 10 days before the start time | 0 | 10 | (product_start_time - cancellation_time) < 10 days | 0 |
Note: null
in the dateRangeMax
field means negative infinity; i.e., infinitely far in the past with respect to dateRangeMin
.
Additional clauses will be included in the termsAndConditions
field in natural language. This field is for human consumption and is not classically machine-interpretable.
3
– All sales final (100% cancellation penalty / no refund offered)Products in this category cannot be cancelled or amended without incurring a 100% penalty; i.e., the refund amount will be zero. Around 10% of products fall into this category.
5985P7
{
"data": {
"merchantTermsAndConditions": {
"termsAndConditions": "All sales are final and incur 100% cancellation penalties.<br>",
"merchantTermsAndConditionsType": 3,
"amountRefundable": null,
"cancellationFromTourDate": [
{
"dayRangeMin": 0,
"dayRangeMax": null,
"percentageRefundable": 0,
"policyStartTimestamp": null,
"policyEndTimestamp": null
}
]
},
"...": "..."
}
}
Products in this category can be cancelled, but no refund will be granted (in most cases...)
As alluded, there is an exception to this rule. Products with an 'on-request' booking type can still be cancelled when their booking status is "pending"
– i.e., before the supplier has confirmed the booking – and a full refund will be granted.
It is impossible to predict how long an 'on-request' booking will remain 'pending'. However, it is possible to check by enquiring about the booking using one of the post-booking services; i.e.:
An 'all sales final' product in a 'pending' state that can be cancelled and a refund granted will have the following characteristics:
bookingStatus
object returned from one of the services above will have a type
of "PENDING"
, and pending
will be true
.amountRefundable
field of the merchantTermsAndConditions
object will be non-zero and non-null. Rather, it will contain a currency-formatted string showing the amount that would be refunded if the cancellation were performed immediately; e.g., "USD 55.33".Within the merchantTermsAndConditions
object returned in the response from /booking/book, /booking/pastbooking and /booking/mybookings, the amountRefundable
field shows the amount of money in the selected currency that will be refunded if the cancellation is processed now, while the policyStartTimestamp
and policyEndTimestamp
fields indicate the exact times between which the different cancellation refund rates apply.
merchantTermsAndConditions
) from /booking/book5010SYDNEY
amountRefundable
, policyStartTimestamp
and policyEndTimestamp
are populated here."data": {
"merchantTermsAndConditions": {
"termsAndConditions": "For a full refund, cancel at least 24 hours in advance of the start date of the experience.",
"amountRefundable": "USD 55.33",
"cancellationFromTourDate": [
{
"dayRangeMin": 1,
"dayRangeMax": null,
"percentageRefundable": 100,
"policyStartTimestamp": null,
"policyEndTimestamp": 1551513600000
},
{
"dayRangeMin": 0,
"dayRangeMax": 1,
"percentageRefundable": 0,
"policyStartTimestamp": 1551340800000,
"policyEndTimestamp": 1551427200000
}
]
},
"...": "..."
}
Occasionally, customers seek a refund for a product after completing their travels.
The reason for this might be because they were unable to attend the tour due to the supplier having cancelled the tour due to bad weather or some other reason out of the customer's control; or, the customer might have been extremely dissatisfied with the tour itself, felt that it was misrepresented in its advertising, or some other serious complaint.
When this occurs, you will need to send a refund request by email to dpsupport and include both "CANCEL" and the booking reference number in the subject line.
For all post-travel cancellation requests, you will need to include a detailed description of the issue.
Except in cases of known service interruptions (e.g., due to extreme weather events), we will first verify the issue and seek authorization from the product supplier.
Once a decision regarding the refund has been made, we will notify your Customer Services Department with this information. You will then need to advise your customer directly and process the refund if granted.
policyStartTimestamp
and policyEndTimestamp
The integers that populate the policyStartTimestamp
and policyEndTimestamp
fields represent points in time that mark the boundaries of the policy time period in the Unix time format; i.e., the number of seconds that have elapsed since 00:00:00 Thursday, 1 January 1970, Coordinated Universal Time (UTC), minus leap seconds.
Unix timestamps can be easily read and interpreted using the 'time' (or similar) library of your favorite programming language. For human purposes, an online conversion tool can be used.
As per the example above, canceling this booking between the following times yields zero refund (because it is within the 24 hour window):
Field name | policyStartTimestamp |
policyEndTimestamp |
---|---|---|
Unix time | 1551340800000 | 1551427200000 |
Human readable time | GMT: Thursday, February 28, 2019 8:00:00 AM | GMT: Friday, March 1, 2019 8:00:00 AM |
policyStartTimestamp
and policyEndTimestamp
, rather than dayRangeMin
and dayRangeMax
, to determine which cancellation policy is in effect.While we recommend that you, as a merchant partner, support the processing of partial refunds for your customers, it is up to your whether you implement this functionality.
If you would prefer to only grant the full (100%) refund that is offered on most products so long as the cancellation is processed more than 24 hours prior to the product's start time, we recommend that you implement logic that checks whether a 100% refund is available for the product at the time the customer wishes to cancel their booking.
Type 1: Standard policy (merchantTermsAndConditionsType is 1 ) |
---|
The 100% refund is available so long as the cancellation is performed more than 24 hours prior to the product start time |
Type 2: Custom policy (merchantTermsAndConditionsType is 2 ) |
---|
You will need to check whether any of the object-items in the cancellationFromTourDate array have:
|
Type 3: All sales final (merchantTermsAndConditionsType is 3 ) |
---|
No refunds are available; therefore, granting a refund to your customer for this kind of product will be solely at your expense (i.e., you will still be invoiced for the cost of the tour by Viator). Therefore, we recommend that you do not allow refunds for products with this policy. |
When a booking is made successfully via the /booking/book endpoint, Viator assigns it a numeric identifier, now known as the booking reference.
This booking reference is returned in the service's response in the itemId
field; however, this itemId
is found in different locations depending on the endpoint used:
Endpoint | itemId element location |
---|---|
/booking/book | data.itemSummaries[].itemId |
/booking/status | data.itemSummaries[].itemId |
/booking/status/items | data[].itemId |
/booking/pastbooking | data.itemSummaries[].itemId |
/booking/mybookings | data[].itemSummaries[].itemId |
The booking reference can used in the request in the following endpoints as the value in the itemId
field or in the itemIds
array:
The new booking cancellation endpoints; i.e.:
...use this booking reference value as an in-URL request parameter, but its format is slightly different.
Essentially, it is the booking's numeric identifier (itemId
), but prepended with BR-
. For example, if the itemId
is 580254558
, the bookingId
value in the cancellation request should be BR-580254558
.
The booking cancellation endpoints confirm the booking reference in the response in the bookingId
field; e.g.:
{
"bookingId": "BR-580669678",
"refundDetails": {
"itemPrice": 412.04,
"refundAmount": 412.04,
"refundPercentage": 100,
"currencyCode": "USD"
},
"status": "CANCELLABLE"
}
Users of the API usually implement a booking process workflow. The common workflows are:
Because the Viator API is both stateless and does not include services for managing a customer's shopping cart, this functionality must be fully managed on the merchant's side.
Viator's servers can generate a price quote for one or several items, but this collection will not be saved by the server.
We recommend the following process:
From your view product details section, a button should be presented to check availability or book now or something similar. Use the /product service to retrieve product details and schedules.
Here, the customer is presented with the dates that remain available for the product. Available dates can be obtained via a request to /booking/availability/dates. The list of age bands (i.e.: 'adult', 'child'; and, each band's maximum and minimum age) is available from the /product service.
Validation – ensure that:
maxTravellerCount
field of the /product serviceOnce the date and traveler mix have been selected, the customer may need to select a tour grade. Products that do not have this information recorded in the Viator database are assigned a tour grade of "DEFAULT"
. For these products, it is unnecessary to select a tour grade.
Tour grade options must be displayed to the customer when the product has multiple tour grades, due to:
The tour grades for a product are retrieved with the /booking/availability/tourgrades service. If a tour grade is available (check the available
flag), an 'add to cart' button can be displayed. For unavailable tour grades (available
is false
), a reason (unavailableReason
) is provided, which will be one of:
"TRAVELLER_MISMATCH"
"BLOCKED_OUT"
, or"UNAVAILABLE"
You may choose to hide the blocked-out tour grades (if all tour grades are unavailable on a particular day, a day's tour grades are all "BLOCKED_OUT"
, or the product is not operating that day, the /booking/availability/dates service will not return that date).
You may also find that a product has no bookable tour grades on a day if the traveler mix does not meet that tour grade's traveler mix restrictions. For example, a honeymoon might require two adults as the only possible traveler mix.
You can choose to hide the "BLOCKED_OUT"
tour grades, but you will probably want to display the "TRAVELLER_MISMATCH"
grades with the traveler mix requirements listed so that the customer can elect to alter their traveler mix to suit (e.g., for family passes, etc.) You cannot allow the passenger to book with an incompatible traveler mix.
The return object includes information about tour grade restrictions:
ageBandsRequired
:
minimumCountRequired
: minimum number of travelers for an age bandmaximumCountRequired
: maximum number of travelers for an age band. If this field is null
, any number of travelers may be booked.You will need to present the ageBandsRequired
information as in the following examples:
In 'Adult' age band | Meaning |
---|---|
minimumCountRequired = 1maximumCountRequired = 3 |
From 1 to 3 adults |
minimumCountRequired = 0maximumCountRequired = 3 |
up to three adults |
minimumCountRequired = 3MaximumCountRequired = |
3 or more adults |
minimumCountRequired = 2MaximumCountRequired = 2 |
2 adults |
Note: There is a singular and plural version for each age band definition. We recommend automatically generating language that ensures the samples above are grammatically correct using this information.
The user can click back and change their traveler mix; or, they can try selecting another day.
Once the item has been added to the cart, you will need to preserve this information as part of the session data in your back-end, or as a browser cookie. In particular, you will need to store the product code and age band to quantity traveler mix.
Note: this is only an example and is implementation dependent. Alternatively, you could use the item class (as used in the API calls), but much of the information it contains does not need to be stored:
class shoppingCartItem {
var $productCode;
var $tourGrade;
var $date;
var $ageBandIdToQty; // assoc array
}
To obtain a price quote, you must call the /booking/calculateprice service. This service requires a currency code and an array of items to be specified. Each item contains the date, product code, tour grade code and an associative array of ageBandIds
-> quantity
.
Validation – the data must contain valid age bands, tour codes, dates, etc. acquired in previous requests to the API.
Note: A product's availability can change in the time between API calls as tour grades or products may be blocked out, or the booking window may close for upcoming dates.
The checkout process can be accomplished using the /booking/book service, but you may need to make requests to other services to calculate prices, display product information (age-band names, etc.) and list available pick-up hotels for user selection.
The Viator mobile website breaks the workflow down into three steps. For multiple items, some steps will need to be repeated, such as capturing the traveler names for each tour. In your implementation, you can reorganize/reorder the data collection to better suit your needs.
Example workflow:
The classes for the booking request are defined here in Booking Data Classes. You will need implement these in your chosen programming language and verify that the correct JSON objects are generated during serialization.
The traveler details are used to populate the booking->items[]->travellers[]
objects.
One passenger must be identified as the "lead traveler". A boolean field in the traveler object represents this flag. The lead traveler must be an adult or have the age band treatAsAdult
flag set to true
.
All other travelers must be included.
Validation
Ensure that:
bandId
is a valid age band ID for the productfirstname
is less than 16 charssurname
is less than 36 charstitle
is not included unnecessarily (it is optional)leadTraveller
is set to true
for one of the travelers who is in an age band that has the treatAsAdult
flag set to true
The travel details include the booking questions that are supplied in the /product service.
Sample question
Note: There may be more than one.
bookingQuestions: [{
"message": "For safety reasons you must enter the weight of <b>all</b> passengers",
"required": true,
"questionId": 23,
"title": "Passenger Weights",
"subTitle": "(e.g. 127 pounds, 145 kilos, etc)",
"sortOrder": 1
}]
The questions should be displayed with the title, message, subtitle and whether it is mandatory (required) or not.
Validation – if the question is mandatory, the user must enter at least one character.
'Special requirements' should be presented as a text input field so that customers can record whether they require wheelchair assistance, for example. It is not mandatory for the customer to enter any text.
The last thing that must be collected for each item being booked is the pick-up information. If the product includes pick-up, the hotelPickup
flag will be set to true
(in the product object). Some tour grades of the product, however, may not offer pick-up services. To determine which tour grades offer what, it is necessary to inspect the relevant tour grade's details in the tourGrades[]
array in the response from /product.
If pick-up is included for the tour grade, the phrase "Pickup included"
will be present in the tourGrades[].gradeDescription
field (as well as any other comments provided by the supplier).
If pick-up is included, you will need to make a request to /booking/hotels to determine if a hotel list exists. If it does, the list must be displayed so that the customer can make their selection. If not, a text input field should be displayed for hotel name collection.
Please note that the first three results in the list are not hotels; rather, these three are alternative selections, comprising:
If the customer selects 'hotel not listed', you must provide a hotel selection text input field. For the other two options, no hotel name is required. In all cases, the hotel ID must be updated with either a hotel ID or the IDs of the three items listed.
If no hotel list is available, you must provide a text input field for collecting the customer's hotel name. Please include instructions to enter 'live locally' or 'hotel not yet booked' if they cannot provide a hotel name.
Validation – if hotel list is available, the hotelId
must be supplied. If the hotelId
is notListed
the, pickupPoint
field must have at least one character.
If a hotel list is not available, then pickupPoint
must contain a value.
If the response from the /product service contains information in the languageServices
field, e.g.:
"langServices": {
"en/SERVICE_AUDIO": "English - Audio"
}
...you must specify which language option you wish to book for this tour in the languageOptionCode
field (see request body schema of the /booking/book service).
The object returned by the /booking/book service contains booking details that can be used to display an order summary to the customer.
Confirmed bookings of freesale products will return a voucherKey
and voucherURL
. The voucherURL
is accessible by the customer to view their voucher.
Pending bookings of on-request products will return null
in the voucherKey
/voucherURL
fields. These fields will only contain values once the booking is confirmed.
A bookingStatus
object is included in the response that contains the status of the booking.
"bookingStatus": {
"status": 1,
"text": "Paid & Confirmed",
"type": "CONFIRMED",
"level": "ITEM",
"failed": false,
"confirmed": true,
"amended": false,
"pending": false,
"cancelled": false
}
The status field corresponds to a number described in bookingStatus field values and meanings.
Boolean flags that you can inspect to determine the booking status of the item:
failed
cancelled
confirmed
amended
pending
A booking is considered pending if the booking process is 'in progress'. For example, an on-request booking would be pending until it is confirmed/rejected by the supplier.
If a customer has made an amendment to an on-request booking that is yet to be accepted by the supplier, the booking would then have a status of amended when the supplier or customer service accepts the amendment.
Example response object:
{
"errorReference": null,
"data": {
"sortOrder": 0,
"rulesApplied": [],
"bookingStatus": {
"status": 3,
"text": "Confirmed",
"type": "CONFIRMED",
"level": "ITINERARY",
"confirmed": true,
"pending": false,
"amended": false,
"cancelled": false,
"failed": false
},
"itemSummaries": [{
"sortOrder": 0,
"rulesApplied": [],
"bookingStatus": {
"status": 1,
"text": "Paid & Confirmed",
"type": "CONFIRMED",
"level": "ITEM",
"pending": false,
"failed": false,
"confirmed": true,
"amended": false,
"cancelled": false
},
"travellerAgeBands": [{
"sortOrder": 0,
"count": 1,
"pluralDescription": "Adults",
"description": "Adult",
"ageBandId": 1
}],
"voucherKey": "1005851866:4af44c13ecf3f1a7d3f9ef2fc00c2257e08fa42ae20f877f3039ff9b52aba24e:580669678",
"voucherURL": "https://viatorapi.live.rc.viator.com/service/merchant/voucher.jspa?code=1005851866:4af44c13ecf3f1a7d3f9ef2fc00c2257e08fa42ae20f877f3039ff9b52aba24e:580669678&embedResources=false",
"voucherRequirements": "You must present a paper voucher for this to",
"productPulledDown": false,
"merchantCancellable": true,
"productWidgetList": null,
"savingAmount": 0,
"passbooks": null,
"termsAndConditions": null,
"itineraryId": 1000024753,
"tourGradeCode": "1DAYBOAT",
"productCode": "2065CPT",
"leadTravellerSurname": "Test",
"distributorItemRef": "distroItemRefJDP1803151135",
"languageServicesLanguageCode": "en",
"travelDate": "2016-02-01",
"price": 3.72,
"bookingEngineId": "UF",
"merchantNetPrice": 3.51,
"merchantNetPriceFormatted": "$3.51",
"leadTravellerTitle": "Mr",
"leadTravellerFirstname": "Homer",
"lastRetailPrice": 3.51,
"destId": 318,
"voucherOption": "VOUCHER_PAPER_ONLY",
"productTitle": "Cape Town City Hop-on Hop-off Tour",
"itemId": 700025496,
"barcodeOption": "perperson",
"barcodeType": "code128",
"obfsId": 3696,
"priceFormatted": "$3.72",
"savingAmountFormated": "",
"priceUSD": 3.72,
"lastRetailPriceFormatted": "$3.51",
"departsFrom": "Cape Town, South Africa",
"hoursConfirmed": 0,
"currencyCode": "USD"
}],
"voucherKey": "1005851866:4af44c13ecf3f1a7d3f9ef2fc00c2257e08fa42ae20f877f3039ff9b52aba24e:580669678",
"voucherURL": "https://viatorapi.live.rc.viator.com/service/merchant/voucher.jspa?code=1005851866:4af44c13ecf3f1a7d3f9ef2fc00c2257e08fa42ae20f877f3039ff9b52aba24e:580669678&embedResources=false",
"bookerEmail": "apitest@viator.com",
"userId": null,
"itineraryId": 1000024753,
"exchangeRate": 1,
"totalPriceFormatted": "$3.51",
"totalPriceUSD": 3.51,
"bookingDate": "2015-03-17",
"distributorRef": "distroRefJDP1803151135",
"totalPrice": 3.51,
"hasVoucher": true,
"currencyCode": "USD"
},
"dateStamp": "2015-03-17T17:36:32+0000",
"errorType": null,
"errorMessage": null,
"errorName": null,
"success": true,
"totalCount": 1,
"vmid": "321003",
"errorMessageText": null
}
/booking/mybookings can be used to check the status of a booking after it has been purchased. This is useful for checking the status of a pending booking, particularly if there are multiple items within the booking.
It is recommended that you poll the service no more than once per hour.
This is useful for checking the status of recently-made, but still pending bookings, or those that will commence soon.
Note: You can only poll this service (successful calls) once every 30 minutes.
Upon receiving a successful response from /booking/book, merchant partners should confirm the booking with the customer via email. This email must be sent by the merchant partner (not Viator).
Dear Traveller, Thank you for booking with [PARTNER NAME] on [www.domain.com]. Your booking is confirmed. This is your booking notification and receipt. Please retain this email for your records. Please note: We offer three types of vouchers. Be sure to check below for what type of voucher your tour / activity requires. Voucher requirements vary by tour, so if you've booked more than one tour, be sure to check each one. See below for instructions. HOTEL/FLIGHT ITINERARY ----------------------------------------------------------------------- [Your standard reply here] TOURS ----------------------------------------------------------------------- 1. Name: Whale Watching Cruise e-Voucher or Paper Voucher Accepted You can present either a paper or an electronic voucher for this activity. Voucher: [VOUCHERURL] Please click on the above link, follow the directions, and print your voucher to present as per instructions on the voucher under 'Important Information'. 2. Name: Boston City Pass Paper Voucher Required You must present a paper voucher for this tour. Voucher: [VOUCHERURL] Please click on the above link, follow the directions, and print your voucher to present as per instructions on the voucher under 'Important Information'. 3. Name: SuperShuttle Airport Transfer Voucher Not Required You must present a paper voucher for this tour. Voucher: [VOUCHERURL] You can present a paper or electronic voucher for this activity, or you can simply present the Lead Traveller’s Photo ID. Our supplier has your reservation on file and only requires proof of identity on the day of travel. IMPORTANT INFORMATION ----------------------------------------------------------------------- [Your standard reply here] TERMS AND CONDITIONS ----------------------------------------------------------------------- [Your standard reply here]
In this section, we show a sample booking process flow using Viator API services.
destinationId
for the desired destination using the /taxonomy/destinations service.destinationId
, along with optional parameters like the date range (startDate
and endDate
), attraction link (seoId
), category (catId
) and subcategory (subCatId
).{
"startDate": "2018-12-25",
"endDate": "2018-12-28",
"topX": "1-15",
"destId": 684,
"currencyCode": "USD",
"sortOrder": "TOP_SELLERS"
}
Note: the startDate
and endDate
must be in the future.
code=5010SYDNEY¤cyCode=USD
Use the /booking/availability/dates service to retrieve a list of dates on which the product is operating. This list can be used to populate a calendar display of available dates.
productCode=5010SYDNEY
Because the product option (tour grade) availability check requires the desired passenger mix, the user will first need to select the number of travelers and the age band into which each can be classified.
Note: The exact ages to which each age band refers to differs between products. See Working with age bands for more information.
{
"productCode": "5010SYDNEY",
"bookingDate": "2018-12-05",
"currencyCode": "USD",
"ageBands": [
{
"bandId": 1,
"count": 2
}
]
}
{
"productCode": "5010SYDNEY",
"month": "12",
"year": "2018",
"currencyCode": "USD"
}
hotelPickup
is true
for the product and the gradeDescription
for the tour grade includes the phrase "Pickup included"
.hotelId
is the id
field in the response from the /booking/hotels service. This can be:'4119'
'local'
– if the customer resides near the location in which the product operates 'notBooked'
– if the customer's hotel is not yet booked'notListed'
– if the customer's hotel is not listed in the response from /booking/hotels. If this is the case, capture the customer’s hotel details in a text box and pass this information in the pickupPoint
field in the request body of the /booking/book service.{
"demo": true,
"currencyCode": "USD",
"partnerDetail": {
"distributorRef": "distributorRef1550616101308"
},
"booker": {
"firstname": "Homer Test",
"surname": "Simpson Test",
"title": "Mr",
"email": "apitest@viator.com",
"homePhone": "(02)66987564"
},
"items": [
{
"partnerItemDetail": {
"distributorItemRef": "distributorItemRef1550616101308"
},
"hotelId": null,
"pickupPoint": null,
"travelDate": "2019-03-19",
"productCode": "5010SYDNEY",
"tourGradeCode": "24HOUR",
"languageOptionCode": "en/SERVICE_GUIDE",
"bookingQuestionAnswers": [
{
"questionId": 100,
"answer": "120 kgs"
}
],
"specialRequirements": "",
"travellers": [
{
"bandId":1,
"firstname": "Homer",
"surname": "Simpson Test",
"title": "Mr",
"leadTraveller": true
}, {
"bandId": 1,
"firstname": "Marge",
"surname": "Merchant Viator Test",
"title": "Mrs"
}
]
}
]
}
productCode=5010SYDNEY
or
destId=684
'FreesaleBE'
), unconditional free-sale ('UnconditionalBE'
) and free-sale / on-request ('FreesaleOnRequestBE'
) - i.e., during the free-sale period, confirmation should occur instantly. 'FreesaleOnRequestBE'
status means that the product will only remain free-sale up until a certain number of days before the travel date, after which it becomes on-request. 'Pending'
.To display the voucher to your customer, direct them to the URL returned in the voucherURL
field in the response from the /booking/book service.
Note: the voucher will not be available until the booking is confirmed – the value of the hoursConfirmed
field in the response from the /booking/book service can be shown to the customer to indicate the time frame within which they are likely to be notified as to their booking confirmation.
To view the booking statuses for multiple items based on various criteria, use the /booking/status service.
Note that this service can only be polled once every five minutes. Ideally, this service should be used by your software implementation to perform bulk updates of pending itineraries. The maximum number of itinerary results returned is 1,000.
merchantNetPrice
and price
in the /search/products serviceThe difference between these fields is as follows:
merchantNetPrice
is the amount you, as the merchant partner will be invoiced for, excluding any fees.price
is the price at which Viator sells the productNote: these prices are also returned (per age band) by the following services:
If the booking shows prices converted to and formatted according to a different currency to that in which it was made, it is because each API partner has a particular 'base currency', and all bookings will be made in that currency.
The total price may be different to the merchantNetPrice
due to the fact that a booking fee – i.e., a transaction fee or commission – is added to all bookings.
This fee is a fixed percentage with a capped maximum. The exact percentage depends on your merchant partner agreement with Viator and can be found in your contract with Viator.
To make a demo booking, simply set the demo
field to true
in the /booking/book service.
While demo bookings are allowed on the live production environment, we recommend not doing so as it is possible that a notification could be sent to the supplier. Performing a cancellation of the demo booking is therefore recommended.
To cancel the booking, partners should use the /bookings/{id}/cancel service. For details on canceling a booking, see: Cancellation API workflow
On the Viator.com website, once the customer has made a booking, they are able to access the details of all their upcoming, past and cancelled bookings by navigating to the bookings section of the website.
You must communicate to the user the terms and conditions that pertain to canceling their booking; i.e., what to expect in terms of the refund they will receive if they were to cancel their booking now.
On the Viator website, this information is communicated in the cancellation button text. In the following example, the user has booked the "San Francisco City Tour with Alcatraz", and is viewing their bookings page.
In this way, the user is told that they can "cancel for free by Oct 22" – i.e., they will be issued a full refund if they cancel the product prior to October 22:
This text is programmatically generated by inspecting the product's cancellation policy, which is contained within the merchantTermsAndConditions
object, which is included in the response object from the following endpoints:
For details on how to interpret the merchantTermsAndConditions
object, see: Cancellation policy
Once the user clicks the button labelled: Cancel for free by Oct 22, they are brought to the cancellation confirmation page, where they are provided a more formal cancellation quote prior to confirming their intention to cancel the product.
As the merchant of record, the amount your customer was charged for the product was your decision; therefore, the amount that you elect to grant the customer as a refund is also up to you, so you will need to retrieve the amount the customer has paid for the product from your own records/databases.
The amount that Viator would have invoiced you for the booking – equivalent to the merchant net price at the time of booking plus the transaction fee – can be retrieved using the /bookings/{booking-ref}/cancel-quote endpoint. For more information see: Get a cancellation quote
Here, the customer is shown that they will receive a full refund if they cancel the product now:
At this point in the workflow, the user must select a reason for their cancellation. Viator's systems require that a reason for the cancellation be given in order to carry out the cancellation process.
As the set of acceptable reasons for canceling a booking are formally specified by the Viator Partner API and are not necessarily immutable (new reasons may be added at any time) you should retrieve the presently available cancellation reasons from the /bookings/cancel-reasons endpoint. We require you to present these to the customer for them to select.
Use the cancellationReasonText
fields in the response to populate the list from which the customer can select the most-appropriate match for why they are canceling, as on the Viator website:
For more information about getting cancellation reasons, see: Getting cancellation reasons
Note: As it is necessary for the user to provide a cancellation reason, it is required that the Cancel Booking button remain disabled until a reason has been selected by the customer.
Once the user has selected a reason, the Cancel Booking button can be activated:
Clicking the Cancel Booking button is the final action required of the customer to complete the cancellation.
At this point, you will want to cancel the booking using the /bookings/{booking-ref}/cancel API endpoint. For more information on using this service, see: Cancel the booking
On the Viator.com site, the following confirmation message is displayed on the page that loads after the Cancel Booking button is clicked:
Once the cancellation is accepted, a short, succinct email informing the customer that their booking has been successfully canceled is sent immediately:
Clicking on the View reservation details button in the cancellation confirmation email returns the customer to their bookings page, where the fact of the booking being canceled is communicated clearly:
When canceling a booking, you are required to submit a valid 'reason for the cancellation' to assist with Viator's internal processes. This is accomplished via the inclusion of a valid reason code in the body of the request. The reason codes can be retrieved from the /bookings/cancel-reasons endpoint.
As the acceptable reasons for cancellation may be extended at any point (existing reasons will not change or be removed), we recommend retrieving an up-to-date list from this endpoint at least weekly.
The output from the /bookings/cancel-reasons endpoint at the time of writing is as follows:
{
"reasons": [
{
"cancellationReasonCode": "Customer_Service.I_canceled_my_entire_trip",
"cancellationReasonText": "I canceled my entire trip"
},
{
"cancellationReasonCode": "Customer_Service.Booked_wrong_tour_date",
"cancellationReasonText": "Booked wrong tour/date"
},
{
"cancellationReasonCode": "Customer_Service.Duplicate_Booking",
"cancellationReasonText": "Duplicate Booking"
},
{
"cancellationReasonCode": "Customer_Service.Chose_a_different_cheaper_tour",
"cancellationReasonText": "Chose a different/cheaper tour"
},
{
"cancellationReasonCode": "Customer_Service.Weather",
"cancellationReasonText": "Weather"
},
{
"cancellationReasonCode": "Customer_Service.Unexpected_medical_circumstances",
"cancellationReasonText": "Unexpected/medical circumstances"
},
{
"cancellationReasonCode": "Customer_Service.Tour operator asked me to cancel",
"cancellationReasonText": "Tour operator asked me to cancel"
}
]
}
Before canceling the booking, call the /bookings/{booking-reference}/cancel-quote endpoint to get information about whether the booking can be canceled using this endpoint and what the refund will be, for example:
GET https://api.viator.com/partner/bookings/BR-580254558/cancel-quote
Note: For information about the {booking-reference} in URL parameter, see Key concepts: Booking references
You will receive a cancellation quote object, e.g.:
{
"bookingId": "BR-580254558",
"status": "CANCELLABLE",
"refundDetails": {
"itemPrice": 109.77,
"refundAmount": 109.77,
"currencyCode": "USD",
"refundPercentage": 100.00
}
}
Note: Bookings that have not been confirmed by the supplier and have a status of "PENDING"
will report an itemPrice
, refundAmount
and refundPercentage
of 0
, as no fees are charged until the booking's status is "CONFIRMED"
.
The data elements in this object have meanings as follows:
Element | Meaning | Example |
---|---|---|
bookingId |
the booking reference number prepended with BR- |
BR-580254556 |
status |
One of the following:
|
CANCELLABLE |
refundDetails |
object containing information about the refund | |
itemPrice |
the merchant net price + transaction fee for this product at the time of booking in the currency specified by currencyCode |
109.77 |
refundAmount |
the amount that will be deducted from your invoice if the booking is cancelled now | 109.77 |
currencyCode |
the currency code for the currency in which pricing information is displayed | USD |
refundPercentage |
the refund amount expressed as a percentage of the itemPrice |
100.00 |
If the status
field has a value of CANCELLABLE
and you are happy with the refundAmount
, call the /bookings/{booking-ref}/cancel endpoint to cancel the booking, e.g.:
POST https://api.viator.com/partner/bookings/BR-580254558/cancel
A reason code corresponding to the reason for cancellation must be included in the request body; e.g.:
{
"reasonCode":"Customer_Service.Chose_a_different_cheaper_tour"
}
You should receive a response indicating that the cancellation was successful, e.g.:
{
"bookingId": "BR-580254558",
"status": "ACCEPTED"
}
A status
of ACCEPTED
indicates that the booking was successfully canceled.
The /booking/calculateprice service is used to calculate a total price for one or more products, with the ability to specify the date and passenger mix for each product individually.
It also reconfirms the availability and pricing of the products for the requested dates and passenger mixes. We strongly recommended that you call this service prior to making a booking to establish that the booking will succeed once submitted.
This endpoint is useful when implementing a shopping cart, as multiple product bookings can be enquired about in a single call to this service.
{
"currencyCode": "USD",
"items": [{
"travelDate": "2015-03-01",
"productCode": "2916ROME",
"tourGradeCode":"24HR",
"travellers": [
{
"bandId": 1
},
{
"bandId": 1
}
]
}]
}
The quirky travellers
array is used to specify the number of travellers in each age band. Each member object of this array corresponds to a single traveller. The example above signifies "two adults from bandId: 1".
Another example might be "three travelers from bandId:1 and two travelers from bandId:2". That would be as follows:
"travellers": [
{
"bandId": 1
},
{
"bandId": 1
},
{
"bandId": 1
},
{
"bandId": 2
},
{
"bandId": 2
}
]
The total price (i.e., including the transaction fee) that you will be invoiced for the products to be booked is given in the following fields in the response from this service:
data.itemSummaries[].price
(numeric total price of item)data.itemSummaries[].priceFormatted
(currency formatted total price of item) data.itinerary.totalPrice
(numeric total price of item)data.itinerary.totalPriceFormatted
(currency-formatted total price of item)For more information about pricing fields and their meaning throughout this API, see: Merchant pricing.
You can determine whether the booking is freesale or on-request by examining the response from this endpoint. 'Freesale' bookings are those that are confirmed immediately (with a status of "CONFIRMED"
) when booked, while on-request bookings are instead confirmed by the supplier at a later time.
The approximate time window for confirmation is provided in the hoursConfirmed
(integer) field. This can be presented to the customer.
hoursConfirmed
of 0
means that the booking is freesale. hoursConfirmed
greater than 0
indicates that the booking is on-request.{
"vmid":"221002",
"errorMessage": null,
"errorType": null,
"dateStamp": "2012-04-12T13:48:27+0000",
"success": true,
"errorReference": null,
"errorMessageText": null,
"totalCount": 1,
"errorName": null
"data": [
{
"address": null,
"name": "I live locally / I'm staying with friends, relatives",
"id": "local",
"phone": null,
"productCodes": null,
"destinationId": 0,
"city": null,
"notes": null,
"latitude": null,
"longitude": null,
"postcode": null,
"brand": null,
"hotelString": "I live locally / I'm staying with friends, relatives",
"sortOrder": 1
},
{
"address": null,
"name": "My hotel is not yet booked",
"id": "notBooked",
"phone": null,
"productCodes": null,
"destinationId": 0,
"city": null,
"notes": null,
"latitude": null,
"longitude": null,
"postcode": null,
"brand": null,
"hotelString": "My hotel is not yet booked",
"sortOrder": 2
},
{
"address": null,
"name": "My hotel is not listed",
"id": "notListed",
"phone": null,
"productCodes": null,
"destinationId": 0,
"city": null,
"notes": null,
"latitude": null,
"longitude": null,
"postcode": null,
"brand": null,
"hotelString": "My hotel is not listed",
"sortOrder": 3
},
{
"address": "375 East Harmon Avenue",
"name": "Alexis Park Resort Hotel",
"id": "684_2",
"phone": "",
"productCodes": null,
"destinationId": 684,
"city": "Las Vegas",
"notes": null,
"latitude": 36.106258,
"longitude": -115.156146,
"postcode": "89169",
"brand": "",
"hotelString": null,
"sortOrder": 4
},
{
"address": "167 East Tropicana Avenue",
"name": "Americas Best Value Inn",
"id": "684_3",
"phone": "",
"productCodes": null,
"destinationId": 684,
"city": "Las Vegas",
"notes": null,
"latitude": 36.100778,
"longitude": -115.165522,
"postcode": "89109",
"brand": "",
"hotelString": null,
"sortOrder": 5
},
{
"address": "3131 Las Vegas Boulevard South",
"name": "Wynn Resort",
"id": "684_126",
"phone": "",
"productCodes": null,
"destinationId": 684,
"city": "Las Vegas",
"notes": null,
"latitude": 36.127563,
"longitude": -115.167704,
"postcode": "89109",
"brand": "",
"hotelString": null,
"sortOrder": 119
}
]
}
To make a booking, use the /booking/book service.
To make a real booking, ensure demo
is set to false
in the booking request.
Demo bookings will enter our system as a test booking and will not charge the merchant. To enable demo bookings, set demo
to true
in the booking request and pass "test"
as the traveler's first or last name.
Note: Avoid testing on Live, as the booking may be sent to the supplier (depending on the product). Any test bookings on live must be cancelled via the /bookings/{id}/cancel service; or, contact dpsupport@viator.com if you experience any other issues.
The distributorRef
and distrbutorItemRef
fields are the merchant partner's own reference for the booking. All merchant partners must pass a distributorRef
and a distributorItemRef
in all bookings.
It can be any alphanumeric string, and in for the distrbutorRef
, it must be unique to bookings made by the merchant.
If an existing distributorRef
is passed, the booking with the matching distributorRef
will be returned in the response, and a new booking will not be made.
Please see the description for these fields in the table below for more information.
Example request
{
"demo": true,
"currencyCode": "USD",
"partnerDetail": {
"distributorRef": "distroRef0412141435"
},
"booker": {
"email": "apitest@viator.com",
"firstname": "Homer Test",
"surname": "Simpson Test",
"title": "Mr"
},
"items": [{
"partnerItemDetail": {
"distributorItemRef": "distroItemRef0412141435_1"
},
"hotelId": null,
"pickupPoint": null,
"travelDate": "2015-03-31",
"productCode": "2916ROME",
"tourGradeCode": "24HR",
"languageOptionCode": "en/SERVICE_GUIDE",
"bookingQuestionAnswers": [{
"questionId": 100,
"answer": "120 kgs"
}],
"specialRequirements": "",
"travellers": [{
"bandId": 1,
"firstname": "Homer",
"surname": "Simpson Test",
"title": "Mr",
"leadTraveller": true
}]
}]
}
Description of JSON request parameters
Object name | Element name | Type | Comments | Mandatory |
---|---|---|---|---|
demo |
boolean | If this is set to True, then it is a demo booking only. Full demos do not send any notifications, are automatically confirmed and OnRequest products become freesale products. Default value is true. Production must have demo set to false . |
❌ | |
currencyCode |
string | The currency the booking will be submitted in. You will be billed in this currency. | ❌ | |
partnerDetail |
object | Applicable only for extra partner detail for either partner or merchant partner for sending partner specific information | ❌ | |
distributorRef |
string | Merchant API partners must pass a distributorRef at itinerary level in the partnerDetails object. The distributorRef passed must be alphanumeric and unique to bookings made by the merchant. Passing an existing distributorRef : If an existing distributorRef is passed, the booking with the matching distributorRef will be returned in the response and a new booking will not be made. The fields in the response are identical to the response for a new booking. |
✅ | |
partnerItemDetail |
object | For extra partner detail at an item level, for either partner or merchant partner. | ❌ | |
distributorItemRef |
string | Merchant API partners must pass a distributorItemRef into the partnerItemDetails object for each item in the items object. The distributorItemRef passed must be alphanumeric and unique to the itinerary. |
✅ | |
booker |
object | The information of the primary contact. This contact does not have to be a traveler. | ✅ | |
email |
string | Email address of the primary contact | ❌ | |
homePhone |
string | Home phone number of the primary contact | ❌ | |
firstname |
string | First name of the primary contact | ✅ | |
surname |
string | Surname of the primary contact | ✅ | |
title |
string | Title of the primary contact | ❌ | |
items |
Array of items in itinerary to be booked | ✅ | ||
productCode |
string | product code of the itinerary to be booked | ✅ | |
tourGradeCode |
string | tourGradeCode of the item to be booked. If tour grades are supplied in /product, you must allow the customer to select a tour grade code. If no tour grades are available for the product, pass "DEFAULT" . |
✅ | |
languageOptionCode |
string | The language service provided for this product that has been chosen for this booking. Usually in the format langcode/Service eg "en/SERVICE_GUIDE" . If the product details service /product for the product returns a langService, this must be provided. |
✅ (if languageServices are provided in /product) |
|
travelDate |
date | date of travel for the item (format is YYYY-MM-DD; e.g. 2013-12-25) | ✅ | |
hotelId |
string | If /product returns hotelPickup : true , the tour grade being booked contains "Pickup included" in its gradeDescription and a list of hotels is available for this product in /booking/hotels, a hotelId must be captured. The hotel id as per the hotel service (id field) should be used, or use one of these alternative hotel ids:local : customer lives locallynotBooked : Customer has not booked their hotel yetnotListed : Hotel not listed |
✅ (if /product returns hotelPickup : true for productCode , tour grade has "Pickup included" in gradeDescription and hotels are available) |
|
pickupPoint |
string | Pickup point information related to hotel pickup. Details of the hotel or pickup point must be provided if the hotelId selected by the user is "notListed" or if no hotels are returned for the product in /booking/hotels where hotelPickup : true |
✅ (if hotelId = "notListed" or no hotels returned) |
|
specialRequirements |
string | Capture any additional requirements for the booking, such as dietary requirements or if a wheelchair is required. Suggested workflow is if there are no bookingQuestionAnswers for the product, to collect specialRequirements . |
❌ | |
travellers |
Array of traveller names with a required lead traveller selected per item. | ✅ | ||
bandId |
integer | Age band id. Available age band details for the product is listed in /product. | ✅ | |
firstname |
string | First name of the traveller | ✅ | |
surname |
string | Surname of the traveller | ✅ | |
title |
string | Title of the traveller. Suggested options: Mr, Mrs, Ms, Miss, Mstr, Dr | ✅ | |
leadTraveller |
boolean | Each item must have one traveller assigned as the lead traveller for the tour. The lead traveller will have a value of true, all other travellers will have a value of false. The lead traveller can have a mobile phone number added to the booking. | ✅ | |
cellPhoneCountryCode |
string | Ideally only collect the phone number country code for the lead traveller. Alternatively, collect the phone number of the booker instead. | ❌ | |
cellPhone |
string | Ideally only collect the phone number country code for the lead traveller. Alternatively, collect the phone number of the booker instead. | ❌ | |
bookingQuestionAnswers |
object | Answers to booking questions for the particular item. If a booking question is available in the bookingQuestions array in /product for the product, the matching bookingQuestionAnswers must be passed. If a product does not have any bookingQuestion items, you can omit the bookingQuestionAnswers field completely. Any invalid or unnecessary bookingQuestionAnswers that are passed to /booking/book will be ignored (no exceptions will be raised) |
✅ (if /product returns bookingQuestions ) |
|
questionId |
integer | questionId (provided in /product) |
✅ | |
answer |
string | Answer to the question at the questionId listed. Recommended length for the answer is 500 characters. |
✅ |
JSON Response
The prices returned in the booking response represent the net rate, which is the amount merchant API partners will be invoiced for. See merchant pricing for more information.
A number of errors may be returned in the response to the /booking/book service. If any errors are reported, NO items will be booked, NO items/data will be returned in the response, and NO billing will occur.
There are two error types:
"VALIDATION"
- occurs if a required field is missing or a field is not formatted properly"EXCEPTION"
- occurs when there are issues with the booking date, product / tour grade code or the payment.Example of an error message:
{
"data": null,
"vmid": "221001",
"errorMessage": [ "Missing distributor reference" ],
"errorType": "EXCEPTION",
"dateStamp": "2013-04-24T15:50:05+0000",
"errorReference": "~3713624959841553334512668",
"errorMessageText": ["Missing distributor reference" ],
"success": false,
"totalCount": 1,
"errorName": "Exception"
}
Please see "Standard JSON fields" in the Appendix for an explanation of the fields.
Scenario | errorType |
Example error message text |
---|---|---|
Lead traveller is not specified | VALIDATION |
A traveler needs to be selected as lead traveler. Lead Traveler's name must match credit card name. |
Traveller names are not provided | VALIDATION |
First name of traveler 1 is required, Last name of traveler 1 is required |
No travellers provided | VALIDATION |
A traveler needs to be selected as lead traveler. Lead Traveler's name must match credit card name. |
Product code does not exist | EXCEPTION |
We're sorry, we cannot find the tour, activity or attraction you are looking for |
Product code exists, but tour grade code does not exist | EXCEPTION |
SICInvalidTourGrade |
Booking date is in the past | EXCEPTION |
We're sorry, the following tour you are trying to book is sold out and no longer available: Grand Canyon All American Helicopter Tour (2280AAHT) |
languageOptionCode is in the wrong format |
EXCEPTION |
languageOptionCode should be LangCode/LangServices |
Missing required answers for item | EXCEPTION |
Additional questions missing |
Unsupported currency | EXCEPTION |
Could not lookup SGD:java.lang.RuntimeException: Could not lookup SGDf:au.com.fim.v3.etravel.PiusRecordNotFoundException: No currency found: select * from CurrencyFormat where currencyID = 'SGD' |
distributorRef not provided in partnerDetail object |
EXCEPTION |
Missing distributor reference |
distributorItemRef not provided in partnerItemDetail object |
EXCEPTION |
Missing distributor item reference |
partnerItemDetail object not provided for the item |
EXCEPTION |
Missing partner item details! |
The /booking/status service retrieves the booking status for multiple items based on different criteria.
This service can only be polled every 30 minutes. This would ideally be used in software for bulk updates of pending itineraries.
The maximum number of results returned is 1,000 itineraries. Narrow your search if you expect results greater than this.
NOTE: This will return both live and test bookings.
Example request body
{
"bookingDateFrom": "2013-03-22",
"bookingDateTo": "2013-03-25",
"itineraryIds": null,
"itemIds": null,
"distributorRefs": ["Ref20132603_1","Ref20132603_5"],
"distributorItemRefs": null,
"leadFirstName": null,
"leadSurname": null,
"test": true
}
All fields are optional and can be omitted, however at least one needs to be provided.
Field | Meaning |
---|---|
bookingDateFrom |
The booking date is greater than or equal this date |
bookingDateTo |
The booking date is less than or equal this date |
itemIds |
Array of item ids (AKA Viator Item Reference) to check for; e.g., [1234657,2345267,3245154] |
distributorRefs |
Array of partner-defined distributor references; e.g., ["ref1","ref2","ref3"] |
distributorItemRefs |
Array of partner-defined distributor item references; e.g., ["refItem1","refItem2","refItem3"] |
leadFirstName |
The lead traveller's first name |
leadSurname |
The lead traveller's surname |
test |
Setting test to true will bypass the poll limit on the sandbox environment only. The default value for test is false . |
Example response object (/booking/status)
{
"data": [
{
"itineraryId": 3332064,
"bookingStatus": {
"type": "CONFIRMED",
"level": "ITINERARY",
"failed": false,
"text": "Confirmed",
"cancelled": false,
"status": 3,
"confirmed": true,
"amended": false,
"pending": false
},
"bookingDate": "2013-03-25",
"distributorRef": "Ref20132603_1",
"itemSummaries": [{
"itineraryId": 3332064,
"itemId": 600088886,
"bookingStatus": {
"type": "CONFIRMED",
"level": "ITEM",
"failed": false,
"text": "Paid & Confirmed",
"cancelled": false,
"status": 1,
"confirmed": true,
"amended": false,
"pending": false
},
"travelDate": "2013-12-03",
"distributorItemRef": "ItemRefA",
"sortOrder": 0
}],
"sortOrder": 1
},
{
"itineraryId": 3332076,
"bookingStatus": {
"type": "CONFIRMED",
"level": "ITINERARY",
"failed": false,
"text": "Confirmed",
"cancelled": false,
"status": 3,
"confirmed": true,
"amended": false,
"pending": false
},
"bookingDate": "2013-03-26",
"distributorRef": "Ref20132603_5",
"itemSummaries": [{
"itineraryId": 3332076,
"itemId": 600088907,
"bookingStatus": {
"type": "CONFIRMED",
"level": "ITEM",
"failed": false,
"text": "Paid & Confirmed",
"cancelled": false,
"status": 1,
"confirmed": true,
"amended": false,
"pending": false
},
"travelDate": "2013-12-03",
"distributorItemRef": "ItemRefA",
"sortOrder": 0
}],
"sortOrder": 2
}],
"vmid": "221002",
"errorMessage": null,
"errorType": null,
"dateStamp": "2013-03-26T10:25:57+0000",
"errorReference": null,
"errorMessageText": null,
"success": true,
"totalCount": 2,
"errorName": null
}
You will receive the following error if you exceed the number of calls allowed to the service within the timeframe:
{
"data": null,
"vmid": "221002",
"errorMessage": [
"Access allowed every 30 minutes"
],
"errorType": "EXCEPTION",
"dateStamp": "2013-03-26T10:28:51+0000",
"errorReference": "~55315512721712161381352771",
"errorMessageText": [
"Access allowed every 30 minutes"
],
"success": false,
"totalCount": 1,
"errorName": "PollingDeniedException"
}
The /booking/pricingmatrix service retrieves the pricing matrix for tour grades, product age bands and pax (passenger) mixes.
Example request object (/booking/pricingmatrix)
"productCode": "5261HTLAP",
"tourGradeCode": "Zone 1",
"bookingDate": "2013-12-01",
"currencyCode": "USD",
"specialReservation": false
bookingDate
: The date to check for pricing data. This is an optional parameter for a normal product.
If the date is not provided then the nearest available date is determined (i.e. not blocked out or unavailable for any reason)
Example response object (/booking/pricingmatrix)
{
"data": [{
"pricingUnit": "per person",
"bookingDate": "2013-12-01",
"sortOrder": 1,
"ageBandPrices": [{
"bandId": 1,
"prices": [{
"sortOrder": 1,
"currencyCode": "USD",
"price": 81.94,
"priceFormatted": "$81.94",
"merchantNetPrice": 65.44,
"merchantNetPriceFormatted": "$65.44",
"minNoOfTravellersRequiredForPrice": 1
}],
"sortOrder": 1,
"minimumCountRequired": 1,
"maximumCountRequired": 1
}]
},
{
"pricingUnit": "per person",
"bookingDate": "2013-12-01",
"sortOrder": 2,
"ageBandPrices": [{
"bandId": 1,
"prices": [{
"sortOrder": 1,
"currencyCode": "USD",
"price": 40.97,
"priceFormatted": "$40.97",
"merchantNetPrice": 32.73,
"merchantNetPriceFormatted": "$32.73",
"minNoOfTravellersRequiredForPrice": 1
}],
"sortOrder": 1,
"minimumCountRequired": 2,
"maximumCountRequired": 2
}]
},
{
"pricingUnit": "per person",
"bookingDate": "2013-12-01",
"sortOrder": 3,
"ageBandPrices": [{
"bandId": 1,
"prices": [{
"sortOrder": 1,
"currencyCode": "USD",
"price": 27.32,
"priceFormatted": "$27.32",
"merchantNetPrice": 21.81,
"merchantNetPriceFormatted": "$65.44",
"minNoOfTravellersRequiredForPrice": 1
}],
"sortOrder": 1,
"minimumCountRequired": 3,
"maximumCountRequired": 3
}]
}],
"errorReference": null,
"dateStamp": "2017-11-24T21:30:47+0000",
"errorType": null,
"errorCodes": null,
"errorMessage": null,
"errorName": null,
"success": true,
"totalCount": 3,
"errorMessageText": null,
"vmid": "321050"
}
Description of elements in JSON response object
Object | Element | Type | Comments | To be viewed by customer | Required field |
---|---|---|---|---|---|
data |
object | main response object | ❌ | ✅ | |
sortOrder |
integer | order in which to show the pricing | ✅ | ✅ | |
bookingDate |
date | booking date criteria | ✅ | ✅ | |
pricingUnit |
string | unit for pricing: currently, only "per person" is supported | ✅ | ✅ | |
ageBandPrices |
object | available age bands and their pricing | ❌ | ✅ | |
sortOrder |
integer | sort order for age band display | ✅ | ✅ | |
bandId |
integer | Note: the numeric bandId is associated with an age band description (e.g., "Adult" , "Infant" etc.) and a corresponding age range (e.g., from 12 to 99) - these details are available from the /product service. See Working with age bands |
❌ | ✅ | |
minimumCountRequired |
integer | minimum number of pricing units that apply to these prices | ✅ | ||
maximumCountRequired |
integer | maximum number of pricing units that apply to these prices | ✅ | ||
prices |
object | pricing available for the age band (based on the min and max count requirements) | ✅ | ✅ | |
currencyCode |
string | currency of the pricing | ✅ | ✅ | |
sortOrder |
integer | order the pricing is to be shown within the bandId |
✅ | ✅ | |
price |
number | price in decimal format (for merchant API partners, this is the 'suggested sell price') | ❌ | ✅ | |
priceFormatted |
string | suggested sell price formatted according to the currency selected (with two decimal places where applicable) | ✅ | ✅ | |
merchantNetPrice |
number | merchant net price in decimal format | ❌ | ✅ | |
merchantNetPriceFormatted |
string | merchant net price formatted according to the selected currency | ❌ | ✅ | |
minNoOfTravellersRequiredForPrice |
integer | number of units that the pricing applies to (e.g., a minNoOfTravellersRequiredForPrice of 3 means that the price is for three people) |
✅ | ✅ |
The /booking/voucher service retrieves details for a complete itinerary or a single itinerary item. The data is returned as HTML that can be wrapped in a header/footer.
leadLastName=DP&itemId=600033670
or
voucherKey=3299307:93c7f36a56b18ba1068787ba7fb7988da5c8ad08db77604110141ff21498603e:600033670
voucherKey
voucherKey
or the three separate parameters.voucherKey
is provided as well as other parameters, then the voucherKey
overrides the other parameters.voucherKey
is obtained from /booking/mybookings or in the /booking/book response object when a booking is made.fullHTML
This is an optional parameter:
true
, the full HTML (including <!DOCTYPE>
, <html>
and <head>
tags) will be returned.false
, an HTML <div>
element will be returned.false
mobileVoucher
true
. If true
, the mobile (cut down) voucher HTML is returned; otherwise, the full voucher HTML is returned and fullHTML
is ignoredvoucherOption
of "VOUCHER_E"
(electronic voucher). Do not enable mobileVouchers
for paper vouchers (voucherOption
of "VOUCHER_PAPER_ONLY"
) as no barcode is returned.Example response object (/booking/voucher)
{
"data": "<div style=\'line-height: 1.5;font-family:\'Arial\',\'Helvetica\',\'Verdana\',sans-serif; font-size: 12px; padding: 0 10px; border-bottom: 1pxsolid #CAE2EA;\'><h2 style=\'font-size:16px;font-weight:bold;margin:0.5em 0;padding:0;\'>San FranciscoBay Sunset Catamaran Cruise ®</h2><h2 style=\'font-size:16px;font-weight:bold;margin:0.5em0;padding:0;\'>SAMPLE ONLY</h2><ul style=\'margin:0 0 1em 1em; padding:0;\'> <li><strong>Date:</strong>Friday April 13, 2012 </li><li><strong>Time:</strong><strong>2011:</strong><br><ul><li><strong>Nov. 6 to Nov. 27</strong>: 4:00pm (Fri., Sat. & Sun)</li></ul><p><strong>2012:</strong></p><ul><li><strong>March 2 to March 10:</strong> 5:00 pm (Fri., Sat. & Sun)</li><li><strong>March 11 to April 15:</strong> 6:00pm Daily</li><li><strong>April 16 to May 20:</strong> 6:30 pm Daily</li><li><strong>May 21 to July 22:</strong> 7:00 pm Daily</li><li><strong>July 23 to Aug 26: </strong>6:30 pm Daily</li><li><strong>Aug 27 to Sept 23:</strong>6:00 pm Daily</li><li><strong>Sept. 24 to Nov. 3:</strong> 5:30 pm Daily</li><li><strong>Nov 4 to Dec 2:</strong> 4:00pm (Friday, Sat., & Sun.)</li></ul><p>Please arrive 30 minutes prior to cruise departure.</li></ul> <ul style=\'margin:0 0 1em 1em; padding:0;\'> <li><strong>Lead Traveler: </strong> jos dp</li><li><strong>Number of Travelers: </strong> 1 Adult</li> <li><strong>Booking Reference: </strong>VIATOR600033672</li><li><strong>Product Code: </strong>2316SUN</li><li><strong>Confirmation Details:</strong>SUN </li> <li><strong>Location </strong><div><p>Pier 39</p></div><div></div><div>When you get to Pier 39, stand on the sidewalk & look towards the water, do NOT go down the center wherethe shops are, but take the left OUTSIDE walkway. Go towards the sea lions & look for a gate with the letter J on it</div></li></ul><h3 style=\'font-size:14px;font-weight:bold;margin:0.5em 0;padding:0;\'> Redemption Info</h3><ul style=\'margin:0 0 1em 1em; padding:0;\'> <li>You can present either a paper or an electronic voucherfor this activity. </li> </ul> <h3 style=\'font-size:14px;font-weight:bold;margin:0.5em 0;padding:0;\'>Important</h3> <ul><li>Your local contact is Adventure Cat Sailing Charters on +1 800 498 4228.</li><li>Please note: You mustreconfirm directly with Adventure Cat Sailing Charters at <ul> <li>Locally on 415 777 1630</li></ul> at least 24 Hour(s)prior to your tour/activity date. If you are not arriving within the specified timeframe, please contact Adventure CatSailing Charters prior to your travels, or immediately upon arrival at your destination.</li></ul><ul><li>Duringthe months of March, April and November, the weather in San Francisco can be unpredictable and sailings are subject tocancellation or rescheduling. Please ensure that you call the operator 1 day prior to sailing to confirm your tour</li></ul><h3 style=\'font-size:14px;font-weight:bold;margin:0.5em 0;padding:0;\'>Inclusions</h3><ul><li>1.5-hour Sunset Cruise</li><li>Light hors d\'oeuvres</li><li>Two complimentary drinks</li></ul><h3 style=\'font-size:14px;font-weight:bold;margin:0.5em 0;padding:0;\'>Terms and Conditions </h3> Read our completeTerms & Conditions for information on cancellations, date changes and other modifications to this confirmed reservation. </div><!-- end of voucher_item --></div>",
"vmid": "221001",
"errorMessage": null,
"errorType": null,
"dateStamp": "2012-04-13T10:40:47+0000",
"success": true,
"errorReference": null,
"errorMessageText": null,
"totalCount": 1,
"errorName": null
}
The /booking/pastbooking service gets the details of a single specific past booking based on the voucherKey
or itemId
passed into it.
"email=john.doe@viator.com&itemId=600033670"
or
"voucherKey=3299307:93c7f36a56b18ba1068787ba7fb7988da5c8ad08db77604110141ff21498603e:600033670"
The email address passed must match the email address associated to the itinerary
Departure details, such as the departurePoint
, departurePointAddress
and departurePointDirections
, will be included in the response. These fields may contain HTML escape characters, such as &
and special characters that are escaped by a backslash. Ensure that these fields are parsed after receiving the response, or it may cause your JSON to be invalid.
Example response object (/booking/pastbooking):
{
"errorReference": null,
"data": {
"sortOrder": 0,
"rulesApplied": null,
"bookingStatus": {
"status": 3,
"text": "Confirmed",
"type": "CONFIRMED",
"level": "ITINERARY",
"confirmed": true,
"pending": false,
"amended": false,
"cancelled": false,
"failed": false
},
"itemSummaries": [{
"sortOrder": 0,
"rulesApplied": null,
"bookingStatus": {
"status": 1,
"text": "Paid & Confirmed", "type": "CONFIRMED",
"level": "ITEM",
"failed": false,
"confirmed": true,
"amended": false,
"pending": false,
"cancelled": false
},
"travellerAgeBands": [{
"sortOrder": 0,
"count": 2,
"pluralDescription": "Adults",
"description": "Adult",
"ageBandId": 1
}],
"voucherKey": "1000308214:899757cf8b419ed11f39045636b0b30af986d19126d04547097f4b9c05fb4b69:700179574",
"voucherURL": "https://viatorapi.sandbox.viator.com/service/merchant/voucher.jspa?code=1000308214:899757cf8b419ed11f39045636b0b30af986d19126d04547097f4b9c05fb4b69:700179574&embedResources=false",
"voucherRequirements": "You must present a paper voucher for this tour. We will email a link to access and print your voucher at the Lead Travelers email address.",
"productPulledDown": false,
"merchantCancellable": true,
"productWidgetList": null,
"savingAmount": 0,
"vouchers": null,
"passbooks": null,
"termsAndConditions": null,
"itineraryId": 1000308214,
"productCode": "2065CPT",
"tourGradeCode": "1DAY",
"distributorItemRef": "distroItemRefJDP1006151732",
"languageServicesLanguageCode": "en",
"travelDate": "2015-09-03",
"price": 26.28,
"leadTravellerSurname": "Test",
"barcodeOption": "tour",
"barcodeType": "code128",
"destId": 318,
"voucherOption": "VOUCHER_PAPER_ONLY",
"productTitle": "City Sightseeing Cape Town Hop-On Hop-Off Tour",
"itemId": 700179574,
"obfsId": 27643,
"departurePoint": "Tour starts at V&A Waterfront, outside the Two Oceans Aquarium, however you may board the bus at any one of the stops throughout the city (see the Itinerary section below for a list of stops)",
"departurePointAddress": "",
"departurePointDirections": "",
"leadTravellerTitle": "Mr",
"leadTravellerFirstname": "Homer",
"lastRetailPrice": 26.28,
"bookingEngineId": "UF",
"priceFormatted": "$26.28",
"savingAmountFormated": "",
"merchantNetPrice": 26.28,
"merchantNetPriceFormatted": "$26.28",
"currencyCode": "USD",
"lastRetailPriceFormatted": "$26.28",
"departsFrom": "Cape Town, South Africa",
"tourGradeDescription": "1-Day Bus Tour (1DAY)",
"hoursConfirmed": 0,
"priceUSD": 26.28
}],
"voucherURL": "https://viatorapi.sandbox.viator.com/service/merchant/voucher.jspa?code=1000308214:899757cf8b419ed11f39045636b0b30af986d19126d04547097f4b9c05fb4b69&embedResources=false",
"voucherKey": "1000308214:899757cf8b419ed11f39045636b0b30af986d19126d04547097f4b9c05fb4b69",
"bookerEmail": "jocelyn@viator.com",
"itineraryId": 1000308214,
"exchangeRate": 1,
"distributorRef": "distroRefJDP1006151732",
"totalPrice": 26.28,
"bookingDate": "2015-06-10",
"totalPriceFormatted": "$26.28",
"totalPriceUSD": 26.28,
"hasVoucher": true,
"userId": null,
"currencyCode": "USD"
}
}
The /booking/mybookings service gets a user's future bookings; i.e., those with travel dates in the future. This service can also be used to check the status of a booking.
"sessionId=xxx"
, or"voucherKey=xxx"
, or"email=terry.smith@viator.com&lastCCFourDigits=4242"
, or"email=terry.smith@viator.com&itineraryOrItemId=3299307"
Provide one of:
sessionId
for all bookings related to a user account, orvoucherKey
, oremail
) and the last four digits of the credit card number (lastCCFourDigits
) used to make the booking to get all associated bookings, oremail
) and itemId
...in that order
For "Failed"
items, display a message that communicates the following information to your customers:
"The booking has failed either because this tour or activity was not available or there was a technical issue. Please contact Customer Service if you need more information."
See also: Booking and item status list
Departure details, such as the departurePoint
, departurePointAddress
and departurePointDirections
will be included in the response. These fields may contain HTML escape characters, such as &
and special characters that are escaped using a backslash. Ensure that these fields are parsed after receiving the response or it may cause your JSON to be invalid.
Example response object (/booking/mybookings):
{
"errorReference": null,
"data": {
"sortOrder": 0,
"rulesApplied": null,
"bookingStatus": {
"status": 3,
"text": "Confirmed",
"type": "CONFIRMED",
"level": "ITINERARY",
"confirmed": true,
"pending": false,
"amended": false,
"cancelled": false,
"failed": false
},
"itemSummaries": [{
"sortOrder": 0,
"rulesApplied": null,
"bookingStatus": {
"status": 1,
"text": "Paid & Confirmed",
"type": "CONFIRMED",
"level": "ITEM",
"failed": false,
"confirmed": true,
"amended": false,
"pending": false,
"cancelled": false
},
"travellerAgeBands": [{
"sortOrder": 0,
"count": 2,
"pluralDescription": "Adults",
"description": "Adult",
"ageBandId": 1
}],
"voucherKey": "1000308214:899757cf8b419ed11f39045636b0b30af986d19126d04547097f4b9c05fb4b69:700179574",
"voucherURL": "https://viatorapi.sandbox.viator.com/service/merchant/voucher.jspa?code=1000308214:899757cf8b419ed11f39045636b0b30af986d19126d04547097f4b9c05fb4b69:700179574&embedResources=false",
"voucherRequirements": "You must present a paper voucher for this tour. We will email a link to access and print your voucher at the Lead Travelers email address.",
"productPulledDown": false,
"merchantCancellable": true,
"productWidgetList": null,
"savingAmount": 0,
"vouchers": null,
"passbooks": null,
"termsAndConditions": null,
"itineraryId": 1000308214,
"productCode": "2065CPT",
"tourGradeCode": "1DAY",
"distributorItemRef": "distroItemRefJDP1006151732",
"languageServicesLanguageCode": "en",
"travelDate": "2015-09-03",
"price": 26.28,
"leadTravellerSurname": "Test",
"barcodeOption": "tour",
"barcodeType": "code128",
"destId": 318,
"voucherOption": "VOUCHER_PAPER_ONLY",
"productTitle": "City Sightseeing Cape Town Hop-On Hop-Off Tour",
"itemId": 700179574,
"obfsId": 27643,
"departurePoint": "Tour starts at V&A Waterfront, outside the Two Oceans Aquarium, however you may board the bus at any one of the stops throughout the city (see the Itinerary section below for a list of stops)",
"departurePointAddress": "",
"departurePointDirections": "",
"leadTravellerTitle": "Mr",
"leadTravellerFirstname": "Homer",
"lastRetailPrice": 26.28,
"bookingEngineId": "UF",
"priceFormatted": "$26.28",
"savingAmountFormatted": "",
"merchantNetPrice": 26.28,
"merchantNetPriceFormatted": "$26.28",
"currencyCode": "USD",
"lastRetailPriceFormatted": "$26.28",
"departsFrom": "Cape Town, South Africa",
"tourGradeDescription": "1-Day Bus Tour (1DAY)",
"hoursConfirmed": 0,
"priceUSD": 26.28
}],
"voucherURL": "https://viatorapi.sandbox.viator.com/service/merchant/voucher.jspa?code=1000308214:899757cf8b419ed11f39045636b0b30af986d19126d04547097f4b9c05fb4b69&embedResources=false",
"voucherKey": "1000308214:899757cf8b419ed11f39045636b0b30af986d19126d04547097f4b9c05fb4b69",
"bookerEmail": "jocelyn@viator.com",
"itineraryId": 1000308214,
"exchangeRate": 1,
"distributorRef": "distroRefJDP1006151732",
"totalPrice": 26.28,
"bookingDate": "2015-06-10",
"totalPriceFormatted": "$26.28",
"totalPriceUSD": 26.28,
"hasVoucher": true,
"userId": null,
"currencyCode": "USD"
},
"dateStamp": "2015-06-10T00:33:24+0000", "errorType": null,
"errorMessage": null,
"errorName": null,
"success": true,
"totalCount": 1,
"vmid": "321004",
"errorMessageText": null
}
To facilitate your testing of the APIs functionality in the sandbox environment, please use the following file, which can be loaded into the Postman API development environment via its import function:
Before you start using the linked Postman collection for testing, you will need to set up the authorization method you wish to use. This can be either the new method (the exp-api-key
header parameter) or, the legacy method (the apiKey
query parameter).
While both methods remain available, we strongly recommend that you use the new method, as it:
Please speak to your account manager if you are still using the legacy apiKey and would like to switch to our new authentication mechanism.
exp-api-key
apiKey
Is a confirmation email sent to the customer or supplier when a booking is made in the sandbox environment?
How do I make a demo booking?
demo
to true
in your request to the /booking/book service.What should I do if I successfully create a test booking in the Live environment?
Which currencies can I use when making a booking?
{
"errorReference": "3D45567E:2D4A_0A5D033A:01BB_5F616D10_1FBBC9:7035",
"data": null,
"dateStamp": "2020-09-15T18:41:00+0000",
"errorType": "EXCEPTION",
"errorCodes": [
"UNKNOWN_ERROR"
],
"errorMessage": [
"Merchant API does not allow the specified currency"
],
"errorName": "RuntimeException",
"extraInfo": {},
"extraObject": null,
"success": false,
"totalCount": 1,
"errorMessageText": [
"Merchant API does not allow the specified currency"
],
"vmid": "331001"
}
Why am I having an SSL handshake issue?
What is the difference between merchantNetPrice
and price
in the response from the /search/products service?
merchantNetPrice
is the amount you, as the merchant partner, will be invoiced for, excluding any fees.price
is the price at which Viator sells the productWhy is a different price displayed in /booking/availability/tourgrades and /product
A destination is missing its latitude, longitude or time zone
How do I make a test booking?
To make a test booking, make sure you:
firstname
and/or surname
in the booker
object to 'test'
.demo
to true
Example:
{
"demo": true,
"currencyCode": "USD",
"partnerDetail": {
"distributorRef": "distroRef0412141435"
},
"booker": {
"email": "apitest@viator.com",
"firstname": "Test",
"surname": "Test",
"title": "Mr"
},
"items": [{
"partnerItemDetail": {
"distributorItemRef": "distroItemRef0412141435_1"
},
"hotelId": null,
"pickupPoint": null,
"travelDate": "2015-03-31",
"productCode": "2916ROME",
"tourGradeCode": "24HR",
"languageOptionCode": "en/SERVICE_GUIDE",
"bookingQuestionAnswers": [{
"questionId": 100,
"answer": "120 kgs"
}],
"specialRequirements": "",
"travellers": [{
"bandId": 1,
"firstname": "Homer",
"surname": "Simpson Test",
"title": "Mr",
"leadTraveller": true
}]
}]
}
Is it possible to use a custom value for distributorRef
and distributorItemRef
distributorRef
that has already been used, the API will return the previous booking made with that distributorRef
rather than creating a new booking.distributorRef
must be fewer than 40 charactersWhat are some common reasons for bookings to fail in the Viator API?
homePhone
or any phone field in the booking request contains spaces. The only acceptable non-numeric characters are: “-“, “+” , “(“, and “)”
distributorRef
has been re-used. When making a booking request, a distributorRef
and distributorItemRef
must be provided. This is the partner’s ID for the booking, and it must be unique. If a distributorRef
has been re-used, a booking will not be made and instead, the existing booking will be returned in the response.
distributorRef
exceeds 40 characters
No traveller or an incorrect traveller has been set as the lead traveller in the booking request;
leadTraveller
:true
must be set for one travellerleadTraveller
must be from an ageBand
that has treatAsAdult
set to true
. The data is available in the ageBands
object in the product details service.languageOptionCode
is invalid
langServices
object in the response from the /product service; e.g.,"langServices": {
"en/SERVICE_AUDIO": "English - Audio"
}
languageOptionCode
in the request to the /booking/book service is populated in the same way; i.e.,"languageOptionCode": "en/SERVICE_AUDIO"
What does it mean if I receive a "Section level access denied" error message?
What does it mean if I receive a "503 Service Unavailable" response?
Does API rate limiting apply to all services?
Can I cancel multiple bookings or items at the same time using the Viator API?
How many concurrent requests can be made of the API from the same IP address?
Will my API-key expire?
Why am I getting an empty response when checking booking details?
true
, as the booking status endpoints will ignore demo bookings. Please try making the booking again, ensuring the demo parameter is set to false
. If this also fails, please email affiliateapi@tripadvisor.com and include a copy of the request and response JSON objects.Must I always provide details for all travelers when booking a product where allTravellerNamesRequired
=true
?
Must I always provide answers to the required booking questions when making a booking?
Why is there such a big difference in price between that given in the product endpoints and the actual price at the time of booking?
Why doesn't the /taxonomy/destinations endpoint return continent-level information?
Will there ever be a discrepancy between the amount charged for a tour and the amount refunded due to currency exchange-rate fluctuations?
Date | Description |
---|---|
20 July 2020 | Added Booking references section |
14 July 2020 | Updated Calculating prices section |
2 June 2020 | Updated Postman collections and Testing section |
18 May 2020 | Added note regarding cancel codes to Legacy merchant cancellation section |
7 May 2020 | Upgraded search feature; enabled 'Try it Out' console |
10 Mar 2020 | Created new Overview section; removed 'Availability services' section, moving section contents into Key Concepts section |
The Accept-Language
header parameter controls which language the natural language fields in the response from each endpoint will be translated into.
Note that you can only specify languages that have been configured for your API-key. Therefore, if you wish to access additional languages, you will need to contact your business development account manager.
Language | Accept-Language parameter value |
---|---|
English | en , en-US |
Danish | da , da-DK |
Dutch | nl , nl-NL |
Norwegian | no , no-NO |
Spanish | es , es-ES |
Swedish | sv , sv-SE |
French | fr , fr-FR |
Italian | it , it-IT |
German | de , de-DE |
Portuguese | pt , pt-PT |
Japanese | ja , ja-JP |
Chinese (simplified) | zh-CN |
Chinese (traditional) | zh-TW |
Korean | ko , ko-KR |
Every service returns a standard set of JSON fields at the end of the JSON response, which indicates if it was processed successfully by the API.
In addition to the success
flag, you will also need to check the errorMessage
values for the status of the response.
An error-free response will have:
"success"
:true
"errorType"
:null
"errorMessage"
:null
{
"data": [],
"vmid": "321001",
"errorMessage": null,
"errorType": null,
"dateStamp": "2013-03-06T19:45:10+0000",
"errorReference": null,
"errorMessageText": null,
"success": true,
"totalCount": 114,
"errorName": null
}
{
"errorReference": "~5793740141815885188840666",
"data": null,
"dateStamp": "2013-09-09T11:29:48+0000",
"errorType": "EXCEPTION",
"errorMessage": ["* Additional questions missing\n"],
"errorName": "ValidationException",
"success": false,
"totalCount": 1,
"vmid": "221001",
"errorMessageText": ["* Additional questions missing" ]
}
Element | Type | Comments | To be viewed by customer | Required |
---|---|---|---|---|
vmid |
string | The server id that processed the service | ❌ | ✅ |
errorMessage |
string | The error message in HTML | ❌ | ✅ |
errorType |
string | Type of error: EXCEPTION | ❌ | ✅ |
dateStamp |
string | timestamp of the response | ❌ | ✅ |
errorReference |
string | The error reference is logged for future reference | ❌ | ✅ |
errorMessageText |
string | The textual version of the error message | ✅ (if an error has occurred) |
✅ |
success |
boolean |
|
❌ | ✅ |
totalCount |
integer | The number of results returned (minimum = 1 ) |
✅ (if displaying the number of results found in a search etc.) |
✅ |
errorName |
string | The name of the error type | ❌ | ✅ |
Country code | Country |
---|---|
AF | Afghanistan |
AL | Albania |
DZ | Algeria |
AS | American Samoa |
AD | Andorra |
AO | Angola |
AI | Anguilla |
AQ | Antarctica |
AG | Antigua and Barbuda |
AR | Argentina |
AM | Armenia |
AW | Aruba |
AU | Australia |
AT | Austria |
AZ | Azerbaijan |
BS | Bahamas |
BH | Bahrain |
BD | Bangladesh |
BB | Barbados |
BY | Belarus |
BE | Belgium |
BZ | Belize |
BJ | Benin |
BM | Bermuda |
BT | Bhutan |
BO | Bolivia |
BA | Bosnia Herzegovina |
BW | Botswana |
BR | Brazil |
BN | Brunei |
BG | Bulgaria |
BF | Burkina Faso |
BI | Burundi |
KH | Cambodia |
CM | Cameroon |
CA | Canada |
CV | Cape Verde |
KY | Cayman Islands |
CF | Central Africa |
TD | Chad |
CL | Chile |
CN | China |
CX | Christmas Island |
CC | Cocos (Keeling) Islands |
CO | Colombia |
KM | Comoros |
CK | Cook Islands |
CR | Costa Rica |
CI | Cote D'Ivoire |
HR | Croatia |
CY | Cyprus |
CZ | Czech Republic |
DK | Denmark |
DJ | Djibouti |
DM | Dominica |
DO | Dominican Republic |
EC | Ecuador |
EG | Egypt |
SV | El Salvador |
GQ | Equatorial Guinea |
ER | Eritrea |
EE | Estonia |
ET | Ethiopia |
FK | Falkland Island |
FO | Faroe Islands |
FJ | Fiji |
FI | Finland |
FR | France |
GF | French Guiana |
PF | French Polynesia |
GA | Gabon |
GM | Gambia |
GE | Georgia |
DE | Germany |
GH | Ghana |
GI | Gibraltar |
GR | Greece |
GL | Greenland |
GD | Grenada |
GP | Guadeloupe |
GU | Guam |
GT | Guatemala |
GN | Guinea |
GW | Guinea Bissau |
GY | Guyana |
HT | Haiti |
HN | Honduras |
HK | Hong Kong |
HU | Hungary |
IS | Iceland |
IN | India |
ID | Indonesia |
IQ | Iraq |
IE | Ireland |
IL | Israel |
IT | Italy |
JM | Jamaica |
JP | Japan |
JO | Jordan |
KZ | Kazakhstan |
KE | Kenya |
KI | Kiribati |
KW | Kuwait |
KG | Kyrgyzstan |
LA | Lao People's Democratic Republic |
LV | Latvia |
LB | Lebanon |
LS | Lesotho |
LR | Liberia |
LY | Libyan Arab Jamahiriya |
LI | Liechtenstein |
LT | Lithuania |
LU | Luxembourg |
MO | Macau |
MK | Macedonia |
MG | Madagascar |
MW | Malawi |
MY | Malaysia |
MV | Maldives |
ML | Mali |
MT | Malta |
MQ | Martinique |
MR | Mauritania |
MU | Mauritius |
YT | Mayotte |
MX | Mexico |
FM | Micronesia |
MD | Moldova |
MC | Monaco |
MN | Mongolia |
MS | Monserrat |
MA | Morocco |
MZ | Mozambique |
NA | Namibia |
NR | Nauru |
NP | Nepal |
NL | Netherlands |
AN | Netherlands Antilles |
KN | Nevis- St Kitts |
NC | New Caledonia |
NZ | New Zealand |
NI | Nicaragua |
NE | Niger |
NG | Nigeria |
NU | Niue |
NF | Norfolk Island |
KP | North Korea |
MP | Northern Mariana Islands |
NO | Norway |
OM | Oman |
PK | Pakistan |
PW | Palau |
PS | Palestinian Territory, Occupied |
PA | Panama |
PG | Papua New Guinea |
PY | Paraguay |
PE | Peru |
PH | Philippines |
PN | Pitcairn |
PL | Poland |
PT | Portugal |
PR | Puerto Rico |
QA | Qatar |
RE | Reunion |
RO | Romania |
RU | Russian Federation |
RW | Rwanda |
SH | Saint Helena |
LC | Saint Lucia |
SM | San Marino |
ST | Sao Tome and Principe |
SA | Saudi Arabia |
SN | Senegal |
YU | Serbia and Montenegro |
SC | Seychelles |
SL | Sierra Leone |
SG | Singapore |
SK | Slovakia |
SI | Slovenia |
SB | Solomon Islands |
SO | Somalia |
ZA | South Africa |
KR | South Korea |
ES | Spain |
LK | Sri Lanka |
PM | St Pierre Miquelon |
VC | St Vincent and Grenadines |
SR | Suriname |
SZ | Swaziland |
SE | Sweden |
CH | Switzerland |
SY | Syria |
TW | Taiwan |
TJ | Tajikistan |
TZ | Tanzania |
TH | Thailand |
TL | Timor-Leste |
TG | Togo |
TK | Tokelau |
TO | Tonga |
TT | Trinidad and Tobago |
TN | Tunisia |
TR | Turkey |
TM | Turkmenistan |
TC | Turks and Caicos Islands |
TV | Tuvalu |
UG | Uganda |
UA | Ukraine |
AE | United Arab Emirates |
GB | United Kingdom |
UY | Uruguay |
UM | US Minor Outlying Islands |
US | United States of America |
UZ | Uzbekistan |
VU | Vanuatu |
VE | Venezuela |
VN | Vietnam |
VG | Virgin Islands-British |
VI | Virgin Islands-US |
WF | Wallis and Futuna Islands |
WS | Western Samoa |
YE | Yemen Republic |
ZM | Zambia |
ZW | Zimbabwe |
State code | State |
---|---|
AL | Alabama |
AK | Alaska |
AZ | Arizona |
AR | Arkansas |
CA | California |
CO | Colorado |
CT | Connecticut |
DE | Delaware |
DC | District of Columbia |
FL | Florida |
GA | Georgia |
HI | Hawaii |
ID | Idaho |
IL | Illinois |
IN | Indiana |
IA | Iowa |
KS | Kansas |
KY | Kentucky |
LA | Louisiana |
ME | Maine |
MD | Maryland |
MA | Massachusetts |
MI | Michigan |
MN | Minnesota |
MS | Mississippi |
MO | Missouri |
MT | Montana |
NE | Nebraska |
NV | Nevada |
NH | New Hampshire |
NJ | New Jersey |
NM | New Mexico |
NY | New York |
NC | North Carolina |
ND | North Dakota |
OH | Ohio |
OK | Oklahoma |
OR | Oregon |
PA | Pennsylvania |
RI | Rhode Island |
SC | South Carolina |
SD | South Dakota |
TN | Tennessee |
TX | Texas |
UT | Utah |
VT | Vermont |
VA | Virginia |
WA | Washington |
WV | West Virginia |
WI | Wisconsin |
WY | Wyoming |
Code | Province |
---|---|
Alberta | Alberta |
British Columbia | British Columbia |
Manitoba | Manitoba |
New Brunswick | New Brunswick |
Newfoundland and Labrador | Newfoundland |
Northwest Territories | Northwest Territories |
Nova Scotia | Nova Scotia |
Nunavut | Nunavut |
Ontario | Ontario |
Prince Edward Island | Prince Edward Island |
Quebec | Quebec |
Saskatchewan | Saskatchewan |
Yukon | Yukon Territory |
Code | State |
---|---|
ACT | Australian Capital Territory |
NSW | New South Wales |
NT | Northern Territory |
QLD | Queensland |
SA | South Australia |
TAS | Tasmania |
VIC | Victoria |
WA | Western Australia |
Field: type |
Field: status |
Meaning |
---|---|---|
"WAITING" |
0 |
This item has not been booked. Part of an unfinished itinerary. |
"CONFIRMED" |
1 |
This item has been successfully booked |
"UNAVAILABLE" |
2 |
This item has been had an availability check, that came back false. |
"PENDING" |
3 |
This item has begun booking, but has paused in a deferred booking engine |
"FAILED" |
4 |
A merchant partner with a freesale-only API-key has attempted to book an on-request product |
"CANCELLED" |
5 |
This item has successfully been cancelled. |
"EXPIRED" |
6 |
This item is now expired. |
"AMENDED" |
7 |
This item has been amended after booking. |
"PENDING_AMEND" |
8 |
This item has a pending amendment which can be cancelled. |
"REJECTED" |
12 |
Viator only |
"ON_HOLD" |
13 |
Viator only |
Supported currency codes for merchant partners:
Currency code | Currency |
---|---|
USD | US dollar |
GBP | British pound |
EUR | Euro |
AUD | Australian dollar |
Note: Partners will be billed in the currency of the booking.
Error code | Services | Error message | Description |
---|---|---|---|
ADDRESS_REQUIRED | /booking/book | "You have not entered an address. Please enter your address information." | ccAddress1 was empty |
ADDRESS_SIZE_EXCEEDED | /booking/book | "Billing address is restricted to 50 characters long." | address field was longer than 51 characters |
ATTRIBUTE_NOT_FOUND | /product | ||
AGE_BAND_INVALID | /booking/book | a bandId has been submitted that does not correspond to any bandId available for the tour grade in question |
|
BOOKING_QUESTIONS_MISSING | /booking/book | "Additional questions missing" | one or more required booking questions are missing in the booking request |
CARD_EXPIRED | /booking/book | submitted credit card details corresponding to an expired card | |
CITY_REQUIRED | /booking/book | "You have not entered a city in the address section. Please enter your city." | address is required in the credit card section |
CITY_SIZE_EXCEEDED | /booking/book | "City is restricted to 40 characters long." | city name submitted was more than 40 characters long |
COUNTRY_REQUIRED | /booking/book | "You have not entered a country. Please enter your country." | no country was submitted in the booking request |
CREDIT_CARD_DECLINED | /booking/book | credit card used for booking was declined by the payment processor | |
CREDIT_CARD_EXPIRY_DATE_INVALID | /booking/book | "The expiration date for your credit card is not formatted properly. Please verify and re-enter the expiration date." | incorrectly-formatted credit card expiration date was submitted |
CREDIT_CARD_HOLDER_NAME_INVALID | /booking/book | credit card holder's name was invalid, perhaps due to the inclusion of invalid characters | |
CREDIT_CARD_NUMBER_INVALID | /booking/book | "Please verify and re-enter the credit card details, or use a different credit card" | invalid characters in credit card number |
CREDIT_CARD_NUMBER_REQUIRED | /booking/book | "Credit card number is required" | credit card number was omitted |
CREDIT_CARD_SECURITY_NUMBER_INVALID | /booking/book | "The card security number you entered for your credit card is invalid. It must contain 3 digits (or 4 with American Express cards). Please re-enter the card security number." | incorrect CCV code submitted |
CREDIT_CARD_SECURITY_NUMBER_REQUIRED | /booking/book | "Credit card security number is required" | CCV was not provided |
DEMO_BOOKING_WITH_REAL_CARD | /booking/pricingmatrix | demo is true , but credit card details are real |
|
DISTRIBUTOR_REFERENCE_MISMATCH | /booking/pastbooking; /booking/mybookings | "The distributor reference associated with this itinerary does not match the one provided." | attempt to retrieve a booking with an itineraryId or itemId and distributorRef , but the reference doesn't match the one saved in the itinerary |
EMAIL_ADDRESS_INVALID | /booking/book | "Your email address format is invalid" | email address is formatted incorrectly |
EMAIL_REQUIRED | /booking/book | "Email is required" | email address is missing in the booking request |
FIRST_NAME_INVALID | /booking/book | "You have entered a name for the credit-card holder that is not valid. Please verify and re-enter the name of the credit card holder." | first name is formatted incorrectly or contains invalid characters in the booking request - string length must be > 1 and must not contain the following characters: <>%;"(), |
FIRST_NAME_REQUIRED | /booking/book | "First name of credit card details is required" | no first name specified |
FIRST_NAME_SIZE_EXCEEDED | /booking/book | "First name of credit card details is restricted to 30 characters long" | first name exceeds 30 characters |
INTERNAL_ERROR | any | any | the API itself has experienced an unexpected error |
LAST_NAME_INVALID | /booking/book | "You have entered a name for the credit-card holder that is not valid. Please verify and re-enter the name of the credit card holder." | last name is formatted incorrectly in the booking request - string length must be > 1 and must not contain the following characters: <>%;"(), |
LAST_NAME_REQUIRED | /booking/book | "Last name of credit card details is required" | no last name supplied in the ccname field of the ccPayDetail object |
LAST_NAME_SIZE_EXCEEDED | /booking/book | "Last name of credit card details is restricted to 35 characters long" | the surname in the ccname field of the ccPayDetail object must not exceed 35 characters in length |
LEAD_TRAVELLER_REQUIRED | /booking/book | "A traveler needs to be selected as lead traveler." | one traveller object within the travellers array in the booking request needs to have leadTraveller set to true |
PAYMENT_AMOUNTS_CHANGED | /booking/book | e.g. "PAYMENT_AMOUNTS_CHANGED: HKD 2213.20 (was HKD 2210.26)" | This error indicates that the exchange rate was updated while the booking was being made. Refresh the product's pricing information and retry the booking. |
PAYMENT_CURRENCY_MISMATCH | /booking/book | ||
PAYMENT_ENCRYPTION_ERROR | /booking/book | Viator-only internal error - retry booking request | |
PAYMENT_INTERNAL_ERROR | /booking/book | Viator-only internal error - retry booking request | |
PAYMENT_LIMIT_REACHED | /booking/book | Viator-only internal error - retry booking request | |
PAYMENT_REJECTED | /booking/book | triggered when expiry: "01/2018" and card number: "4539791001730106" were submitted |
|
POSTCODE_REQUIRED | /booking/book | "You have not entered a zip code / post code. Please enter your zip code / post code.", | ccaddressZip was empty |
POSTCODE_SIZE_EXCEEDED | /booking/book | "Zip code / post code is restricted to 10 characters long." | ccaddressZip was more than 10 characters in length |
PRICING_DATA_MISSING | Viator-only internal error - retry booking request | ||
PRODUCT_TOUR_GRADE_UNKNOWN | /booking/pricingmatrix | Unknown tour grade: |
an invalid tour grade code was submitted |
PRODUCT_UNAVAILABLE | /booking/book | Viator-only internal error - retry booking request | |
REFUND_REJECTED | Viator-only internal error - retry booking request | ||
STATE_REQUIRED | /booking/book | ccaddressState is required for this billing request |
|
STATE_SIZE_EXCEEDED | /booking/book | ccaddressState must be fewer than 35 characters long |
|
TOUR_NOT_AVAILABLE | /booking/book | "We're sorry, the following tour you are trying to book is sold out and no longer available" | the tour is not available on the requested date |
TOUR_GONE | /product | "We're sorry, we cannot find the tour, activity or attraction you are looking for" | no product corresponding to the supplied details was found |
TOUR_NOT_AVAILABLE_BETWEEN_DATES | |||
TOUR_NOT_FOUND | /product | "We're sorry, we cannot find the tour, activity or attraction you are looking for" | no product corresponding to the supplied details was found |
TRAVELLER_COUNT_EXCEEDED_MAX_LIMIT | number of travellers in the booking request was greater than the limit for the product being booked | ||
TRAVELLER_FIRST_NAME_INVALID | /booking/book | "First name of traveler 1 must only contain alphabetical characters" | non-alphabetical characters were used in the traveller's first name |
TRAVELLER_FIRST_NAME_REQUIRED | /booking/book | "First name of traveler 1 is required" | firstname in the booker object was omitted |
TRAVELLER_LAST_NAME_INVALID | /booking/book | "Last name of traveler 1 should contain alphabet only" | surname in the booker object contained non-alphabetical characters |
TRAVELLER_LAST_NAME_REQUIRED | /booking/book | "Last name of traveler 1 is required" | surname in the booker object was omitted |
TRAVELLER_MISMATCH | /booking/availability/tourgrades | the bandId is not available for the selected tour grade; or, the product does not support the number of travelers requested |
|
UNKNOWN_ERROR | any | any | the API reports this error when the exception from the underlying system (e.g. booking server) is not recognized |
UNKNOWN_PAYMENT_METHOD | |||
UNSUPPORTED_CARD | cctype is not one of "Visa" , "Mastercard" or "Amex" |
Example product codes were valid at the time of writing. If you find that any of these product codes are invalid or do not include the relevant booking question, please inform us about it via email.
Id | stringQuestionId | title | subtitle | message | example product |
---|---|---|---|---|---|
1 | dateOfBirth_dob |
Date of Birth | (e.g. 20 October 1970) | Enter your date of birth. | 100009P2 |
2 | heights_passengerHeights |
Passenger Heights | (eg. 5'2, 158cm etc) | For safety reasons you must enter the height of all passengers. Please indicate inches or centimetres. | 100009P1 |
3 | passport_expiry |
Passport Expiry Date | (e.g. 15 September 2015. If multiple passengers, separate each entry e.g. 01 July 2012, 31 May 2014) | Enter passport expiry date for all passengers | 100014P10 |
4 | passport_nationality |
Passport Nationality | (e.g. United States of America. If multiple passengers, separate each entry e.g. Australia, China) | Enter country of issue of passport for all passengers | 100014P10 |
5 | passport_passportNo |
Passport Number | (e.g. 0123456789. If multiple passengers, separate each entry e.g. 0123456789, 9876543210) | Enter passport number for all passengers | 100014P10 |
6 | N/A | N/A | N/A | N/A | N/A |
7 | transfer_air_arrival_airline |
Arrival Airline | (e.g. United, British Airways, Qantas, etc) | Enter the name of your airline. | 100006P15 |
8 | transfer_air_arrival_flightNo |
Arrival Flight No | (e.g. UA 864, BA 923, QA 233, etc) | Enter your flight number. | 100006P15 |
9 | transfer_air_departure_airline |
Departure Airline | (e.g. United, British Airways, Qantas, etc) | Enter the name of your airline. | 100006P17 |
10 | transfer_air_departure_flightNo |
Departure Flight No | (e.g. UA 864, BA 923, QA 233, etc) | Enter your flight number. | 100006P17 |
11 | transfer_arrival_dropOff |
Drop Off Location | (e.g. 1234 Cedar Way, Brooklyn, NY 00123) | Enter the address for drop off. | 100006P15 |
12 | transfer_arrival_time |
Arrival Time | (eg. 8pm, 20:30 etc) | Enter your arrival time. Please indicate AM/PM or use the 24-hour clock. | 100006P15 |
13 | transfer_departure_date |
Departure date | (e.g. 15 September 2015) | Enter your departure date. | 100006P15 |
14 | transfer_departure_pickUp |
Pick up Location | (e.g. 1234 Cedar Way, Brooklyn, NY 00123) | Enter the address for pick up. | 100006P17 |
15 | transfer_departure_time |
Departure Time | (eg. 8pm, 20:30 etc) | Enter your departure time. Please indicate AM/PM or use the 24-hour clock. | 100006P17 |
16 | transfer_port_arrival_time |
Disembarkation Time | (eg. 8pm, 20:30 etc) | Enter your disembarkation time. Please indicate AM/PM or use the 24-hour clock. | 100014P14 |
17 | transfer_port_cruiseShip |
Cruise Ship | (e.g. Brilliance of the Seas, etc) | Enter your cruise ship. | 100014P14 |
18 | transfer_port_departure_time |
Boarding Time | (eg. 8pm, 20:30 etc) | Enter your boarding time. Please indicate AM/PM or use the 24-hour clock. | 100014P4 |
19 | transfer_rail_arrival_line |
Arrival Rail Line | (e.g. Amtrak, etc) | Enter the name of the rail provider. | 100006P15 |
20 | transfer_rail_arrival_station |
Arrival Rail Station | (e.g. Central Station, etc) | Enter name of arrival and/or departure station. | 100006P15 |
21 | transfer_rail_departure_line |
Departure Rail Line | (e.g. Amtrak, etc) | Enter the name of the rail provider. | 100014P10 |
22 | transfer_rail_departure_station |
Departure Rail Station | (e.g. Central Station, etc) | Enter name of arrival and/or departure station. | 100014P10 |
23 | weights_passengerWeights |
Passenger Weights | (e.g. 127 pounds, 145 kilos, etc) | For safety reasons you must enter the weight of all passengers. Please indicate pounds or kilos. | 100111P12 |
Note: This functionality has been replaced by the cancellationReasons, bookingQuote and cancelBooking endpoints.
To successfully cancel a booking via the /merchant/cancellation service, you must include the itinerary item to cancel (itemId
).
itineraryItemId
and itineraryId
need to match the distributorRef
and distributorItemRef
, so these four values must also be included in the request body.
You must also include a cancelCode
- a number corresponding to the reason for cancellation. You can use the suggested cancel codes shown in the table below.
Note: Post-travel cancellations will not be processed unless a cancel code of 62
or 66
is passed in the cancelCode
parameter.
Parameter | Type | Comments | Required |
---|---|---|---|
itineraryId |
integer | Viator itinerary reference number | ✅ |
distributorRef |
string | Merchant partner's itinerary reference for booking | ✅ |
cancelItems |
array | Array of item to cancel in itinerary | ✅ |
itemId |
integer | Viator itemId of item to cancel in itinerary |
✅ |
distributorItemRef |
string | Merchant partner's itinerary item (booking) reference | ✅ |
cancelCode |
string | A number indicating the reason for cancelling the booking. A list of suggested cancel codes is shown in the table below. | ✅ |
cancelDescription |
string | Natural-language reason for cancellation. A reason must be provided if a cancelCode of '62' or '66' is passed. |
✅ for cancelCode '62' or '66' ; otherwise ❌ |
In this request, we wish to cancel the booking identified by the following:
Parameter | Value |
---|---|
itneraryId |
12345655 |
distributorRef |
"Jdp122" |
itemId |
330056 |
distributorItemRef |
"JdpItin001" |
cancelCode |
"82" (Honest mistake - incorrect purchase) |
This is accomplished as follows:
API Service
POST /merchant/cancellation
Request body
{
"itineraryId": 1234655,
"distributorRef": "Jdp122",
"cancelItems": [
{
"itemId": 330056,
"distributorItemRef": "JdpItin001",
"cancelCode": "82"
}]
}
{
"data": {
"itineraryId": 1234655,
"cancelItems": [
{
"cancellationResponseStatusCode": "Confirmed",
"cancellationResponseDescription": "No further action required",
"itemId": 330056,
"distributorItemRef": "JdpItin001"
}],
"distributorRef": "Jdp122"
},
"vmid": "221002",
"errorMessage": null,
"errorType": null,
"dateStamp": "2013-03-21T14:28:08+0000",
"errorReference": null,
"errorMessageText": null,
"success": true,
"totalCount": 1,
"errorName": null
}
cancelcode | meaning |
---|---|
'00' |
Testing (use for test cancellations) |
'51' |
Flight cancellation affecting customer |
'52' |
Flight schedule change unacceptable to customer |
'53' |
Death of the customer or a member of their immediate family |
'54' |
Jury duty/court summons affecting customer |
'56' |
Medical emergency/hospitalization involving the customer or their immediate family |
'57' |
Customer is required for military service |
'58' |
National disaster (insurrection, terrorism, war) affecting the customer |
'59' |
Natural disaster (earthquake, fire, flood) affecting the customer |
'62' |
Post-travel cancellation: the product was cancelled by the supplier and the traveller was not given sufficient notice |
'63' |
Transport strike/labor dispute affecting customer |
'66' |
Post-travel cancellation: the product was not cancelled, but the customer was dissatisfied with the product |
'71' |
Credit card fraud |
'72' |
Car segment cancellation affecting customer |
'73' |
Package segment cancellation affecting customer |
'74' |
Hotel segment cancellation affecting customer |
'77' |
Re-book |
'78' |
Duplicate purchase |
'82' |
Honest mistake (incorrect purchase) |
'87' |
Non-refundable cancellation more than 24 hours prior to travel |
'88' |
Non-refundable cancellation less than 24 hours prior to travel |
'98' |
Customer service/technical support response outside time limit |
'99' |
Duplicate processing |
If the cancellation was not successful, you will receive an error response.
{
"data": {
"itineraryId": "3331605",
"cancelItems": [{
"cancellationResponseStatusCode": "Error.ItineraryUnknown",
"cancellationResponseDescription": "Please double check the details or contact..."
"itemId": "600088255",
"distributorItemRef": "ItinItemRef012"
}],
"distributorRef": null
},
"vmid": "221002",
"errorMessage": null,
"errorType": null,
"dateStamp": "2013-03-21T14:43:38+0000",
"errorReference": null,
"errorMessageText": null,
"success": true,
"totalCount": 1,
"errorName": null
}
cancellationResponseStatusCode |
Meaning | Action |
---|---|---|
"Confirmed" |
The request to cancel and refund the item has been accepted and processed | No further action is required. |
"Pending" |
Confirmation of the request to cancel and refund the item is pending. This only applies when a cancelCode is '62' or '66' was sent and the booking was in a 'pending' state. |
No action required. Partner will be contacted when a decision to confirm/reject has been made by the supplier. |
"Rejected" |
The cancellation request was denied | No action required. The item cannot be cancelled. |
"Error.ItemUnknown" |
Item not found | Double-check itemId . Contact Viator Customer Service for more information if required. |
"Error.ItineraryUnknown" |
Itinerary not found | Double-check itineraryId . Contact Viator Customer Service for more information if required. |
"Error.MultipleRequests" |
Cancellation request contains multiple requests | Submit only one item per cancellation request. |
"Error.NoCancellationCodeOrDescription" |
Invalid cancelCode |
cancelCode is invalid – ensure it is two digits long |
"Error.Unknown" |
An undefined error has occurred | Double-check the distributorRef and distributorItemRef . If the error is still occurring, contact the Viator partner support team. |
If the same cancellation request is sent more than once, Viator will respond with the last known response.
Health check Use this service to determine whether the Viator API is presently online and that your API key is valid. You should receive a response identical to the example shown. If you have not yet received an API key, please request one from your business development partner. If you have not yet signed up as a Viator merchant partner and would like to, please visit our distribution partner website."
Accept-Language required | string Example: en-US Specifies the language into which the natural-language fields in the response from this service will be translated (see Accept-Language header for available language codes) |
allGood | boolean or null indicator: |
dbOk | boolean or null indicator: |
memcachedOk | boolean or null indicator: |
capiOk | boolean or null indicator: |
message | string or null natural-language description of any issues regarding the health of the API |
{- "allGood": true,
- "dbOk": true,
- "memcachedOk": true,
- "capiOk": true,
- "message": null
}
Get details of all destinations supported by this API
Accept-Language required | string Example: en-US Specifies the language into which the natural-language fields in the response from this service will be translated (see Accept-Language header for available language codes) |
errorReference | string or null reference number of this error |
dateStamp | string or null timestamp of this response |
errorType | string or null code specifying the type of error |
errorCodes | Array of strings or null array of error codes pertaining to this error
|
errorMessage | Array of arrays or null or null array of error message strings |
errorName | string or null name of this type of error |
extraInfo | object or null ignore (Viator only) |
extraObject | object or null ignore (Viator only) |
success | boolean or null boolean indicator of this request's outcome
|
totalCount | integer or null number of results available for this service |
errorMessageText | string or null array of error message strings in plain text |
vmid | string or null unique numeric id of the server that processed this request |
Array of objects array of destination objects |
{- "errorReference": null,
- "data": [
- {
- "sortOrder": 1,
- "selectable": false,
- "destinationUrlName": "USA",
- "defaultCurrencyCode": "USD",
- "lookupId": "8.77",
- "parentId": 8,
- "timeZone": "America/New_York",
- "iataCode": null,
- "destinationName": "USA",
- "destinationType": "COUNTRY",
- "destinationId": 77,
- "latitude": 37.09024,
- "longitude": -95.712891
}, - {
- "sortOrder": 1,
- "selectable": true,
- "destinationUrlName": "Alabama",
- "defaultCurrencyCode": "USD",
- "lookupId": "8.77.22212",
- "parentId": 77,
- "timeZone": "",
- "iataCode": null,
- "destinationName": "Alabama",
- "destinationType": "REGION",
- "destinationId": 22212,
- "latitude": 32.34,
- "longitude": -86.26
}, - {
- "sortOrder": 2,
- "selectable": true,
- "destinationUrlName": "Alaska",
- "defaultCurrencyCode": "USD",
- "lookupId": "8.77.270",
- "parentId": 77,
- "timeZone": "America/Anchorage",
- "iataCode": null,
- "destinationName": "Alaska",
- "destinationType": "REGION",
- "destinationId": 270,
- "latitude": 63.588753,
- "longitude": -154.4930619
}, - {
- "sortOrder": 3,
- "selectable": true,
- "destinationUrlName": "Arizona",
- "defaultCurrencyCode": "USD",
- "lookupId": "8.77.271",
- "parentId": 77,
- "timeZone": "America/Phoenix",
- "iataCode": null,
- "destinationName": "Arizona",
- "destinationType": "REGION",
- "destinationId": 271,
- "latitude": 34.0489281,
- "longitude": -111.0937311
}
], - "dateStamp": "2020-02-06T19:43:09+0000",
- "errorType": null,
- "errorCodes": [ ],
- "errorMessage": null,
- "errorName": null,
- "extraInfo": { },
- "extraObject": null,
- "success": true,
- "totalCount": 1,
- "errorMessageText": null,
- "vmid": "331001"
}
Get all product categories
destId
, or you can omit the destId
to get a list of all categories and subcategoriesdestId
is passed, productCount
and thumbnailURL
will be null
as they are destination-specific fieldsdestId | integer Example: destId=684 unique numeric identifier of the destination to enquire about (optional)
|
Accept-Language required | string Example: en-US Specifies the language into which the natural-language fields in the response from this service will be translated (see Accept-Language header for available language codes) |
errorReference | string or null reference number of this error |
dateStamp | string or null timestamp of this response |
errorType | string or null code specifying the type of error |
errorCodes | Array of strings or null array of error codes pertaining to this error
|
errorMessage | Array of arrays or null or null array of error message strings |
errorName | string or null name of this type of error |
extraInfo | object or null ignore (Viator only) |
extraObject | object or null ignore (Viator only) |
success | boolean or null boolean indicator of this request's outcome
|
totalCount | integer or null number of results available for this service |
errorMessageText | string or null array of error message strings in plain text |
vmid | string or null unique numeric id of the server that processed this request |
Array of objects array of category data objects |
{- "errorReference": null,
- "data": [
- {
- "sortOrder": 1,
- "subcategories": [
- {
- "sortOrder": 1,
- "categoryId": 1,
- "subcategoryId": 2,
- "subcategoryName": "Helicopter Tours",
- "subcategoryUrlName": "Helicopter-Tours"
}, - {
- "sortOrder": 2,
- "categoryId": 1,
- "subcategoryId": 1,
- "subcategoryName": "Air Tours",
- "subcategoryUrlName": "Air-Tours"
}, - {
- "sortOrder": 3,
- "categoryId": 1,
- "subcategoryId": 3,
- "subcategoryName": "Balloon Rides",
- "subcategoryUrlName": "Balloon-Rides"
}
], - "thumbnailHiResURL": "https://hare-media-cdn.tripadvisor.com/media/attractions-splice-spp-674x446/07/71/7c/7d.jpg",
- "groupName": "Air, Helicopter & Balloon Tours",
- "productCount": 77,
- "groupUrlName": "Air-Helicopter-and-Balloon-Tours",
- "id": 1
}, - {
- "sortOrder": 2,
- "subcategories": [
- {
- "sortOrder": 1,
- "categoryId": 26051,
- "subcategoryId": 40290,
- "subcategoryName": "Language Classes",
- "subcategoryUrlName": "Language-Classes"
}, - {
- "sortOrder": 2,
- "categoryId": 26051,
- "subcategoryId": 40293,
- "subcategoryName": "Sports Lessons",
- "subcategoryUrlName": "Sports-Lessons"
}, - {
- "sortOrder": 3,
- "categoryId": 26051,
- "subcategoryId": 33939,
- "subcategoryName": "Craft Classes",
- "subcategoryUrlName": "Craft-Classes"
}, - {
- "sortOrder": 4,
- "categoryId": 26051,
- "subcategoryId": 26052,
- "subcategoryName": "Yoga Classes",
- "subcategoryUrlName": "Yoga-Classes"
}, - {
- "sortOrder": 5,
- "categoryId": 26051,
- "subcategoryId": 40286,
- "subcategoryName": "Art Classes",
- "subcategoryUrlName": "Art-Classes"
}
], - "thumbnailHiResURL": "https://hare-media-cdn.tripadvisor.com/media/attractions-splice-spp-674x446/0a/03/9e/ca.jpg",
- "groupName": "Classes & Workshops",
- "productCount": 12,
- "groupUrlName": "Classes-and-Workshops",
- "id": 26051
}, - {
- "sortOrder": 3,
- "subcategories": [
- {
- "sortOrder": 1,
- "categoryId": 3,
- "subcategoryId": 5640,
- "subcategoryName": "Dinner Cruises",
- "subcategoryUrlName": "Dinner-Cruises"
}, - {
- "sortOrder": 2,
- "categoryId": 3,
- "subcategoryId": 7,
- "subcategoryName": "Day Cruises",
- "subcategoryUrlName": "Day-Cruises"
}, - {
- "sortOrder": 3,
- "categoryId": 3,
- "subcategoryId": 40295,
- "subcategoryName": "Water Tours",
- "subcategoryUrlName": "Water-Tours"
}
], - "thumbnailHiResURL": "https://hare-media-cdn.tripadvisor.com/media/attractions-splice-spp-674x446/06/e5/a3/54.jpg",
- "groupName": "Cruises, Sailing & Water Tours",
- "productCount": 21,
- "groupUrlName": "Cruises-Sailing-and-Water-Tours",
- "id": 3
}, - {
- "sortOrder": 4,
- "subcategories": [
- {
- "sortOrder": 1,
- "categoryId": 4,
- "subcategoryId": 14,
- "subcategoryName": "Literary, Art & Music Tours",
- "subcategoryUrlName": "Literary-Art-and-Music-Tours"
}, - {
- "sortOrder": 2,
- "categoryId": 4,
- "subcategoryId": 118,
- "subcategoryName": "Ghost & Vampire Tours",
- "subcategoryUrlName": "Ghost-and-Vampire-Tours"
}, - {
- "sortOrder": 3,
- "categoryId": 4,
- "subcategoryId": 12,
- "subcategoryName": "Historical & Heritage Tours",
- "subcategoryUrlName": "Historical-and-Heritage-Tours"
}, - {
- "sortOrder": 4,
- "categoryId": 4,
- "subcategoryId": 11,
- "subcategoryName": "Cultural Tours",
- "subcategoryUrlName": "Cultural-Tours"
}, - {
- "sortOrder": 5,
- "categoryId": 4,
- "subcategoryId": 26967,
- "subcategoryName": "Architecture Tours",
- "subcategoryUrlName": "Architecture-Tours"
}, - {
- "sortOrder": 6,
- "categoryId": 4,
- "subcategoryId": 13,
- "subcategoryName": "Movie & TV Tours",
- "subcategoryUrlName": "Movie-and-TV-Tours"
}, - {
- "sortOrder": 7,
- "categoryId": 4,
- "subcategoryId": 40338,
- "subcategoryName": "LGBT Friendly Tours",
- "subcategoryUrlName": "LGBT-Friendly-Tours"
}, - {
- "sortOrder": 8,
- "categoryId": 4,
- "subcategoryId": 5332,
- "subcategoryName": "Archaeology Tours",
- "subcategoryUrlName": "Archaeology-Tours"
}
], - "thumbnailHiResURL": "https://hare-media-cdn.tripadvisor.com/media/attractions-splice-spp-674x446/06/73/48/34.jpg",
- "groupName": "Cultural & Theme Tours",
- "productCount": 94,
- "groupUrlName": "Cultural-and-Theme-Tours",
- "id": 4
}
], - "dateStamp": "2020-02-06T19:47:58+0000",
- "errorType": null,
- "errorCodes": [ ],
- "errorMessage": null,
- "errorName": null,
- "extraInfo": { },
- "extraObject": null,
- "success": true,
- "totalCount": 1,
- "errorMessageText": null,
- "vmid": "331001"
}
Get attractions
seoId
) can be used as a means of searching for available products; for example, in the /search/products service.Accept-Language required | string Example: en-US Specifies the language into which the natural-language fields in the response from this service will be translated (see Accept-Language header for available language codes) |
destId | integer unique numeric identifier of the destination in which to search for attractions |
topX | string (topX) start and end rows to return in the format {start}-{end}
Note:
|
sortOrder | string Sort order for the results; one of:
|
errorReference | string or null reference number of this error |
dateStamp | string or null timestamp of this response |
errorType | string or null code specifying the type of error |
errorCodes | Array of strings or null array of error codes pertaining to this error
|
errorMessage | Array of arrays or null or null array of error message strings |
errorName | string or null name of this type of error |
extraInfo | object or null ignore (Viator only) |
extraObject | object or null ignore (Viator only) |
success | boolean or null boolean indicator of this request's outcome
|
totalCount | integer or null number of results available for this service |
errorMessageText | string or null array of error message strings in plain text |
vmid | string or null unique numeric id of the server that processed this request |
Array of objects array of attraction objects |
{- "destId": 684,
- "topX": "1-3",
- "sortOrder": "RECOMMENDED"
}
{- "errorReference": null,
- "data": [
- {
- "sortOrder": 1,
- "webURL": null,
- "pageUrlName": "Grand-Canyon-West-Rim",
- "primaryDestinationUrlName": "Las-Vegas",
- "publishedDate": "2020-01-15",
- "attractionLatitude": 35.8808,
- "attractionLongitude": -113.97048,
- "attractionStreetAddress": "",
- "attractionCity": "",
- "attractionState": "",
- "destinationId": 684,
- "photoCount": 157,
- "primaryDestinationId": 684,
- "primaryDestinationName": "Las Vegas",
- "seoId": 1594,
- "productCount": 16,
- "rating": 4.5,
- "title": "Grand Canyon West Rim"
}, - {
- "sortOrder": 2,
- "webURL": null,
- "pageUrlName": "Graceland-Wedding-Chapel",
- "primaryDestinationUrlName": "Las-Vegas",
- "publishedDate": "2019-08-22",
- "attractionLatitude": 36.162683,
- "attractionLongitude": -115.144685,
- "attractionStreetAddress": "619 Las Vegas Boulevard South",
- "attractionCity": "Las Vegas",
- "attractionState": "",
- "destinationId": 684,
- "photoCount": 10,
- "primaryDestinationId": 684,
- "primaryDestinationName": "Las Vegas",
- "seoId": 1246,
- "productCount": 2,
- "rating": 4.5,
- "title": "Graceland Wedding Chapel"
}, - {
- "sortOrder": 3,
- "webURL": null,
- "pageUrlName": "Wynn-Las-Vegas",
- "primaryDestinationUrlName": "Las-Vegas",
- "publishedDate": "2019-07-30",
- "attractionLatitude": 36.126374,
- "attractionLongitude": -115.166749,
- "attractionStreetAddress": "3131 Las Vegas Blvd South",
- "attractionCity": "Las Vegas",
- "attractionState": "",
- "destinationId": 684,
- "photoCount": 5,
- "primaryDestinationId": 684,
- "primaryDestinationName": "Las Vegas",
- "seoId": 1266,
- "productCount": 2,
- "rating": 0,
- "title": "Wynn Las Vegas"
}
], - "dateStamp": "2020-02-06T19:55:25+0000",
- "errorType": null,
- "errorCodes": [ ],
- "errorMessage": null,
- "errorName": null,
- "extraInfo": { },
- "extraObject": null,
- "success": true,
- "totalCount": 72,
- "errorMessageText": null,
- "vmid": "331004"
}
Search for products
This service is used to search for products based on various criteria; such as:
the destination (locale) in which it operates
its association with a tourist attraction
its category and/or subcategory
the time period during which it operates
The fields you include in the request body for this service determine the kind of search that will be performed.
Note:
You can search EITHER by destination (destId
) OR by
attraction-link (seoId
), but not both.
The destination identifier (destId
) can be retrieved from the
/taxonomy/destinations
service.
The category (catId
) and subcategory (subCatId
) identifiers can be
retrieved from the
/taxonomy/categories
service.
The attraction identifier (seoId
) can be retrieved from the
/taxonomy/attractions
service.
Examples:
Search by destination:
{
"destId": 684,
"subCatId": 26052,
"sortOrder": "REVIEW_AVG_RATING_D",
"topX": "1-3"
}
Search by attraction-link:
{
"seoId": 1115,
"sortOrder": "PRICE_FROM_D",
"topX": "1-3"
}
'Freesale-only' merchants:
Merchants with a "freesale only" key must pass startDate
and endDate
to this service to retrieve a list of all available 'freesale' products (and
'freesale/on-request' products that are currently 'freesale') in the
destination.
E.g., the following request body will result in 'freesale/on-request' products within their on-request period not appearing in the results from this service.
{
"destId": 684,
"startDate": "2020-02-21",
"endDate": "2020-03-21",
"sortOrder": "PRICE_FROM_D",
"topX": "1-3"
}
startDate
and endDate
are omitted, 'freesale/on-request' products
that are presently within their on-request period may appear to be available
to customers, but won't be available at the time of booking.Accept-Language required | string Example: en-US Specifies the language into which the natural-language fields in the response from this service will be translated (see Accept-Language header for available language codes) |
destId | integer unique numeric identifier of the destination in which to search for products
|
seoId | string search restriction specifier for products associated with an attraction uniquely identified by
|
catId | integer unique numeric identifier of this product category to search within
|
subCatId | integer unique numeric identifier of this product subcategory to search within
|
startDate | string start date delimiter for the search (must be in the future)
Note: If the time period delimited by |
endDate | string end date delimiter for the search (must be in the future)
Note:
|
currencyCode | string currency in which to display product prices |
topX | string (topX) start and end rows to return in the format {start}-{end}
Note:
|
sortOrder | string Enum: "TOP_SELLERS" "REVIEW_AVG_RATING_A" "REVIEW_AVG_RATING_D" "PRICE_FROM_A" "PRICE_FROM_D" sort order in which to return the results that is one of:
|
errorReference | string or null reference number of this error |
dateStamp | string or null timestamp of this response |
errorType | string or null code specifying the type of error |
errorCodes | Array of strings or null array of error codes pertaining to this error
|
errorMessage | Array of arrays or null or null array of error message strings |
errorName | string or null name of this type of error |
extraInfo | object or null ignore (Viator only) |
extraObject | object or null ignore (Viator only) |
success | boolean or null boolean indicator of this request's outcome
|
totalCount | integer or null number of results available for this service |
errorMessageText | string or null array of error message strings in plain text |
vmid | string or null unique numeric id of the server that processed this request |
Array of objects array of product objects |
{- "destId": 684,
- "subCatId": 26052,
- "sortOrder": "REVIEW_AVG_RATING_D",
- "topX": "1-3"
}
{- "errorReference": null,
- "data": [
- {
- "sortOrder": 1,
- "supplierName": "MintnHoney",
- "currencyCode": "USD",
- "catIds": [
- 26051,
- 6,
- 50127
], - "subCatIds": [
- 50128,
- 19,
- 26052,
- 21,
- 40293
], - "webURL": null,
- "specialReservationDetails": null,
- "sslSupported": false,
- "panoramaCount": 0,
- "merchantCancellable": false,
- "bookingEngineId": "FreesaleBE",
- "onRequestPeriod": null,
- "primaryGroupId": 26051,
- "pas": null,
- "available": true,
- "productUrlName": "Viva-Las-Vinos-Wine-Yoga",
- "primaryDestinationUrlName": "Las-Vegas",
- "duration": "1 hour",
- "shortDescription": "Sip your wine and unwind with wine yoga! This gentle yoga class combines sipping your wine and practicing fun yoga basics in a rad environment. A tad unconventional, this class is filled with laughter, fun, and cheers-ing your neighbor.<br><br>Private parties are available upon request.<br><br>Ticket includes one glass of wine, a souvenir adult sippy (to help prevent the spillage of the wine!), and a gentle quirky yoga class.<br><br>",
- "price": 65,
- "shortTitle": "Yoga Uncorked at The Gramercy",
- "specialOfferAvailable": false,
- "supplierCode": "73492",
- "translationLevel": 0,
- "onSale": false,
- "photoCount": 0,
- "reviewCount": 0,
- "primaryDestinationId": 684,
- "merchantNetPriceFrom": 55.38,
- "thumbnailHiResURL": "https://hare-media-cdn.tripadvisor.com/media/attractions-splice-spp-674x446/09/27/7e/88.jpg",
- "primaryDestinationName": "Las Vegas",
- "priceFormatted": "$65.00",
- "rrp": 0,
- "rrpformatted": "",
- "videoCount": 0,
- "rating": 0,
- "specialReservation": false,
- "uniqueShortDescription": null,
- "merchantNetPriceFromFormatted": "$55.38",
- "savingAmount": 0,
- "savingAmountFormated": "",
- "essential": null,
- "admission": null,
- "title": "Yoga Uncorked at The Gramercy",
- "code": "73492P4"
}, - {
- "sortOrder": 2,
- "supplierName": "MintnHoney",
- "currencyCode": "USD",
- "catIds": [
- 26051,
- 6
], - "subCatIds": [
- 19,
- 26052,
- 21,
- 40293
], - "webURL": null,
- "specialReservationDetails": null,
- "sslSupported": false,
- "panoramaCount": 0,
- "merchantCancellable": true,
- "bookingEngineId": "FreesaleBE",
- "onRequestPeriod": null,
- "primaryGroupId": 6,
- "pas": null,
- "available": true,
- "productUrlName": "Yoga-Uncorked-Artisan-Hotel",
- "primaryDestinationUrlName": "Las-Vegas",
- "duration": "1 hour",
- "shortDescription": "Sip your wine and unwind with wine yoga! This gentle yoga class combines sipping your wine and practicing fun yoga basics in a rad environment. A tad unconventional, this class is filled with laughter, fun, and cheers-ing your neighbor.<br><br>Private parties are available upon request.<br><br>Ticket includes one glass of wine, a souvenir adult sippy (to help prevent the spillage of the wine!), and a gentle quirky yoga class.<br><br>",
- "price": 55,
- "shortTitle": "Yoga Uncorked-Artisan Hotel",
- "specialOfferAvailable": false,
- "supplierCode": "73492",
- "translationLevel": 0,
- "onSale": false,
- "photoCount": 0,
- "reviewCount": 0,
- "primaryDestinationId": 684,
- "merchantNetPriceFrom": 46.86,
- "thumbnailHiResURL": "https://hare-media-cdn.tripadvisor.com/media/attractions-splice-spp-674x446/09/ac/2b/2d.jpg",
- "primaryDestinationName": "Las Vegas",
- "priceFormatted": "$55.00",
- "rrp": 0,
- "rrpformatted": "",
- "videoCount": 0,
- "rating": 0,
- "specialReservation": false,
- "uniqueShortDescription": null,
- "merchantNetPriceFromFormatted": "$46.86",
- "savingAmount": 0,
- "savingAmountFormated": "",
- "essential": null,
- "admission": null,
- "title": "Yoga Uncorked-Artisan Hotel",
- "code": "73492P17"
}, - {
- "sortOrder": 3,
- "supplierName": "Jennifer Pierotti Yoga ",
- "currencyCode": "USD",
- "catIds": [
- 26051,
- 50127
], - "subCatIds": [
- 50128,
- 26052,
- 40293
], - "webURL": null,
- "specialReservationDetails": null,
- "sslSupported": false,
- "panoramaCount": 0,
- "merchantCancellable": true,
- "bookingEngineId": "DeferredCRMBE",
- "onRequestPeriod": null,
- "primaryGroupId": 26051,
- "pas": null,
- "available": true,
- "productUrlName": "Sunset-Yoga-in-Las-Vegas",
- "primaryDestinationUrlName": "Nevada",
- "duration": "1 to 2 hours",
- "shortDescription": "Enjoy a quiet, beautiful short walk to a secluded and breathtaking scene in Las Vegas. Travelers can choose to visit Calico Basin, Mt. Charleston, Wetlands, Seven Magic Mountains, or Lake Las Vegas for a private or group yoga session. Each session will provide the freedom from day-to-day distractions and allow you to immerse yourself in a unique and awe-inspiring locale. Each yoga session will be tailored to the individual and/or group in order to ensure the proper tone and intention is set. This is an all-inclusive experience. Guided walking tour, customized yoga session, yoga mats and water will be provided.",
- "price": 250,
- "shortTitle": "Explore the Beauty of Las Vegas with Private and Group Yoga Classes",
- "specialOfferAvailable": false,
- "supplierCode": "73458",
- "translationLevel": 0,
- "onSale": false,
- "photoCount": 0,
- "reviewCount": 0,
- "primaryDestinationId": 22171,
- "merchantNetPriceFrom": 213,
- "thumbnailHiResURL": "https://hare-media-cdn.tripadvisor.com/media/attractions-splice-spp-674x446/07/3b/bc/78.jpg",
- "primaryDestinationName": "Nevada",
- "priceFormatted": "$250.00",
- "rrp": 0,
- "rrpformatted": "",
- "videoCount": 0,
- "rating": 0,
- "specialReservation": false,
- "uniqueShortDescription": null,
- "merchantNetPriceFromFormatted": "$213.00",
- "savingAmount": 0,
- "savingAmountFormated": "",
- "essential": null,
- "admission": null,
- "title": "Explore the Beauty of Las Vegas with Private and Group Yoga Classes",
- "code": "73458P1"
}
], - "dateStamp": "2020-02-09T14:34:51+0000",
- "errorType": null,
- "errorCodes": [ ],
- "errorMessage": null,
- "errorName": null,
- "extraInfo": { },
- "extraObject": null,
- "success": true,
- "totalCount": 3,
- "errorMessageText": null,
- "vmid": "331005"
}
Search by product code
0
, null
and blank values (as per the 'invalid_product' example).Accept-Language required | string Example: en-US Specifies the language into which the natural-language fields in the response from this service will be translated (see Accept-Language header for available language codes) |
currencyCode | string currency code for the currency in which to display product pricing |
productCodes | Array of strings array of product codes to search for |
errorReference | string or null reference number of this error |
dateStamp | string or null timestamp of this response |
errorType | string or null code specifying the type of error |
errorCodes | Array of strings or null array of error codes pertaining to this error
|
errorMessage | Array of arrays or null or null array of error message strings |
errorName | string or null name of this type of error |
extraInfo | object or null ignore (Viator only) |
extraObject | object or null ignore (Viator only) |
success | boolean or null boolean indicator of this request's outcome
|
totalCount | integer or null number of results available for this service |
errorMessageText | string or null array of error message strings in plain text |
vmid | string or null unique numeric id of the server that processed this request |
Array of objects array of product objects |
{- "currencyCode": "EUR",
- "productCodes": [
- "2280SUN",
- "229016",
- "5010SYDNEY"
]
}
{- "errorReference": null,
- "data": [
- {
- "sortOrder": 1,
- "supplierName": "Big Bus Tours",
- "currencyCode": "EUR",
- "catIds": [
- 6,
- 12
], - "subCatIds": [
- 97,
- 98,
- 5330,
- 26963,
- 32024,
- 45
], - "webURL": null,
- "specialReservationDetails": null,
- "sslSupported": false,
- "panoramaCount": 0,
- "merchantCancellable": true,
- "bookingEngineId": "UnconditionalBE",
- "onRequestPeriod": null,
- "primaryGroupId": null,
- "pas": null,
- "available": true,
- "productUrlName": "Sydney-and-Bondi-Hop-on-Hop-off-Tour",
- "primaryDestinationUrlName": "Sydney",
- "duration": "2 hours",
- "shortDescription": "Explore Sydney and Bondi Beach on this hop-on hop-off sightseeing tour, which takes you by double-decker bus to 34 stops around the city including Sydney Opera House, Sydney Harbour Bridge, Darling Harbour, Bondi Beach and more. Enjoy unobstructed views and recorded commentary on board. Simply hop off to walk around and sightsee in depth. Your ticket is valid for 24 or 48 hours, so you can experience Sydney and Bondi's most noteworthy attractions, sights, and shopping and dining areas at your own pace.",
- "shortTitle": "Big Bus Sydney and Bondi Hop-on Hop-off Tour",
- "specialOfferAvailable": false,
- "price": 33.35,
- "supplierCode": "5010",
- "translationLevel": 0,
- "thumbnailHiResURL": "https://hare-media-cdn.tripadvisor.com/media/attractions-splice-spp-674x446/07/94/40/f3.jpg",
- "primaryDestinationName": "Sydney",
- "photoCount": 124,
- "reviewCount": 1605,
- "primaryDestinationId": 357,
- "merchantNetPriceFrom": 26.64,
- "priceFormatted": "€33,35",
- "rrp": 0,
- "rrpformatted": "",
- "onSale": false,
- "videoCount": 1,
- "rating": 4.5,
- "specialReservation": false,
- "uniqueShortDescription": null,
- "merchantNetPriceFromFormatted": "€26,64",
- "savingAmount": 0,
- "savingAmountFormated": "",
- "essential": null,
- "admission": null,
- "title": "Big Bus Sydney and Bondi Hop-on Hop-off Tour",
- "code": "5010SYDNEY"
}, - {
- "sortOrder": 2,
- "supplierName": "Sundance Helicopters",
- "currencyCode": "EUR",
- "catIds": [
- 1,
- 25,
- 12
], - "subCatIds": [
- 113,
- 2,
- 98,
- 26963,
- 45,
- 95
], - "webURL": null,
- "specialReservationDetails": null,
- "sslSupported": false,
- "panoramaCount": 0,
- "merchantCancellable": true,
- "bookingEngineId": "FreesaleOnRequestBE",
- "onRequestPeriod": 336,
- "primaryGroupId": null,
- "pas": null,
- "available": true,
- "productUrlName": "Grand-Canyon-West-Rim-Deluxe-Sunset-Helicopter-Tour",
- "primaryDestinationUrlName": "Las-Vegas",
- "duration": "3 hours 30 minutes",
- "shortDescription": "Take off from Las Vegas on a magical sunset helicopter tour to the Grand Canyon. You'll enjoy a 45-minute helicopter flight each way, land at the Grand Canyon for a glass of Champagne and snacks while you watch the sun start it's descent behind the walls of the canyon, then fly low over the famous neon-lit Las Vegas Strip on your return.",
- "shortTitle": "Grand Canyon from Las Vegas West Rim Sunset Helicopter Tour",
- "specialOfferAvailable": false,
- "price": 449.74,
- "supplierCode": "2280",
- "translationLevel": 0,
- "thumbnailHiResURL": "https://hare-media-cdn.tripadvisor.com/media/attractions-splice-spp-674x446/07/7a/ec/1c.jpg",
- "primaryDestinationName": "Las Vegas",
- "photoCount": 7,
- "reviewCount": 399,
- "primaryDestinationId": 684,
- "merchantNetPriceFrom": 386.11,
- "priceFormatted": "€449,74",
- "rrp": 0,
- "rrpformatted": "",
- "onSale": false,
- "videoCount": 1,
- "rating": 5,
- "specialReservation": false,
- "uniqueShortDescription": null,
- "merchantNetPriceFromFormatted": "€386,11",
- "savingAmount": 0,
- "savingAmountFormated": "",
- "essential": null,
- "admission": null,
- "title": "Grand Canyon West Rim Deluxe Sunset Helicopter Tour",
- "code": "2280SUN"
}
], - "dateStamp": "2020-02-09T16:07:17+0000",
- "errorType": null,
- "errorCodes": [ ],
- "errorMessage": null,
- "errorName": null,
- "extraInfo": { },
- "extraObject": null,
- "success": true,
- "totalCount": 2,
- "errorMessageText": null,
- "vmid": "331003"
}
Free text search
text
parameter is requiredtype
) that you can use to display each result appropriately based on its contentAccept-Language required | string Example: en-US Specifies the language into which the natural-language fields in the response from this service will be translated (see Accept-Language header for available language codes) |
destId | integer unique numeric identifier of the destination to search within
|
topX | string (topX) start and end rows to return in the format {start}-{end}
Note:
|
currencyCode | string currency code for the currency in which to display product pricing information |
text | string text to search for |
searchTypes | Array of strings Items Enum: "PRODUCT" "DESTINATION" "ATTRACTION" "RECOMMENDATION" array of search domain specifiers where each item is one of:
|
sortOrder | string (sortOrder) Enum: "TOP_SELLERS" "REVIEW_AVG_RATING_A" "REVIEW_AVG_RATING_D" "PRICE_FROM_A" "PRICE_FROM_D" sort order in which to return the results that is one of:
|
errorReference | string or null reference number of this error |
dateStamp | string or null timestamp of this response |
errorType | string or null code specifying the type of error |
errorCodes | Array of strings or null array of error codes pertaining to this error
|
errorMessage | Array of arrays or null or null array of error message strings |
errorName | string or null name of this type of error |
extraInfo | object or null ignore (Viator only) |
extraObject | object or null ignore (Viator only) |
success | boolean or null boolean indicator of this request's outcome
|
totalCount | integer or null number of results available for this service |
errorMessageText | string or null array of error message strings in plain text |
vmid | string or null unique numeric id of the server that processed this request |
Array of objects (SearchFreetextResponse) array of search results |
{- "destId": 684,
- "topX": "1-3",
- "currencyCode": "EUR",
- "text": "grand",
- "searchTypes": [
- "ATTRACTION",
- "RECOMMENDATION"
]
}
{- "errorReference": null,
- "data": [
- {
- "sortOrder": 1,
- "data": {
- "sortOrder": 1,
- "webURL": null,
- "pageUrlName": "Grand-Canyon-Skywalk",
- "primaryDestinationUrlName": "Las-Vegas",
- "publishedDate": null,
- "panoramaCount": 0,
- "userName": "",
- "tabTitle": "Grand Canyon Skywalk",
- "descriptionIntro": "Grand Canyon Skywalk",
- "keywords": [ ],
- "reviewCount": 1695,
- "seoType": "ATTRACTION",
- "pageTitle": "Grand Canyon Skywalk",
- "editorsPick": false,
- "showReviews": false,
- "descriptionText": "The Grand Canyon Skywalk is a glass, 70-foot long, open-air bridge suspended 4,000 feet above the canyon floor, providing 720-degree views. The Skywalk is operated by the Hualapai Tribe, which owns and protects more than one million acres of land throughout the Grand Canyon’s western rim. Even with its remote location some 120 miles from Las Vegas, you can easily experience the Grand Canyon Skywalk on a day trip or overnight excursion to the West Rim.",
- "showPhotos": false,
- "overviewSummary": "<div style=\"\">There’s no doubt that 4,000 feet (1,220 meters) is a long way down, especially when standing on a bridge made of glass—and you’re looking down toward the Grand Canyon floor. That’s the experience visitors find at the Grand Canyon Skywalk, a horseshoe-shaped, glass-bottomed bridge that juts out 70 feet (20 meters) above one of America’s most scenic sites. Travelers who step out onto the bridge are rewarded with panoramic West Rim and Colorado River views that extend 720 degrees, wrapping around, below, and behind. </div><div style=\"\"><br></div><div style=\"\"><b>The Basics</b></div><div style=\"\">Most tours to the Grand Canyon Skywalk begin in Las Vegas, where travelers head east to the Arizona desert by road, plane, or helicopter. A Skywalk ticket can be combined with a Hoover Dam trip or a scenic helicopter tour over the canyon, while other options include visits with Hualapai tribe members or a boat ride up the Colorado River. Those short on time can opt for a skip-the-line experience.</div><div style=\"\"><br></div><div style=\"\"><b>Things to Know Before You Go</b></div><div style=\"\"><ul><li>The Skywalk is a must-visit for thrill-seekers.<br></li><li>Cameras aren’t permitted on the Skywalk, but it is possible to purchase photos from Grand Canyon West’s professional photographers.<br></li><li>Outside food and drink are not permitted within Grand Canyon West or on the Skywalk.<br></li><li>Tours to the Skywalk can last upwards of nine hours depending on the option chosen.<br></li></ul></div><div style=\"\"><br></div><div style=\"\"><b>How to Get There</b></div><div style=\"\">McCarran International Airport in Las Vegas is the nearest commercial airport to the Skywalk bridge, about two hours away by road. Because the Grand Canyon Skywalk is a part of Grand Canyon West—a remote and rugged section of canyon managed by the Hualapai—entry to the bridge can only be purchased as part of a package excursion. While many visitors come on a guided tour, it’s also possible to drive yourself to Grand Canyon West, then take the hop-on, hop-off shuttle to the Skywalk and other attractions.</div><div style=\"\"><br></div><div style=\"\"><b>When to Get There</b></div><div style=\"\">Daytime temperatures at the Grand Canyon hover at or above 85°F (30°C) in summer, making fall and spring much more appealing times to visit. The glass bridge tends to be busiest around midday, so plan to arrive in the morning or later in the afternoon to ensure you have more elbow room.</div><div style=\"\"><b><br></b></div><div style=\"\"><b>Other Activities at Grand Canyon West</b></div><div style=\"\">The Grand Canyon West complex lies outside the national park and is operated by the Hualapai tribe. In addition to the Skywalk, visitors can explore an American Indian village at Eagle Point, cruise along the Colorado River, hike to the ruins of an old guano mine, or even rent a rustic cabin at Hualapai Ranch.</div>",
- "pagePrimaryLanguage": "en",
- "keywordCount": 0,
- "attractionLatitude": 36.011871,
- "attractionLongitude": -113.81094,
- "attractionStreetAddress": "Eagle Point Road",
- "attractionCity": "Peach Springs",
- "attractionState": "Arizona",
- "destinationId": 684,
- "seoId": 10,
- "productCount": 10,
- "photoCount": 110,
- "primaryDestinationId": 684,
- "rating": 4.5,
- "primaryDestinationName": "Las Vegas",
- "title": "Grand Canyon Skywalk"
}, - "searchType": "ATTRACTION"
}, - {
- "sortOrder": 2,
- "data": {
- "sortOrder": 2,
- "webURL": null,
- "pageUrlName": "Grand-Canyon-South-Rim",
- "primaryDestinationUrlName": "Las-Vegas",
- "publishedDate": null,
- "panoramaCount": 0,
- "userName": "",
- "tabTitle": "Grand Canyon South",
- "descriptionIntro": "Grand Canyon South Rim\n",
- "keywords": [ ],
- "reviewCount": 32,
- "seoType": "ATTRACTION",
- "pageTitle": "Grand Canyon South Rim",
- "editorsPick": true,
- "showReviews": false,
- "descriptionText": "<p>Of the two major rims of the Grand Canyon, many visitors choose the South Rim, which boasts easy access, the bulk of services, and the panoramic vistas for which the park is famous. Every summer, visitors throng the park's most popular rim, mainly to ogle its easily accessible dramatic, sweeping canyon views.</p><p>\n\nBut the Grand Canyon South Rim is more then those spectacular canyon views. The first stop for many is Grand Canyon Village, which is filled with many historic buildings. Other historic highlights in the South Rim is Desert View Watchtower, which has one of the few views of the bottom of the Canyon and the Colorado River; Grand Canyon Railway Depot, built in 1909; and Bright Angel Lodge, a rustic lodge built of logs and stones.</p><p>\n\nFor hikers, the Grand Canyon South Rim is where you'll find Bright Angel Trail, Rim Trail, and South Kaibab Trail - all of which offer the most dazzling views of the Grand Canyon.</p>",
- "showPhotos": false,
- "overviewSummary": "The South Rim is the most popular area of Grand Canyon National Park, boasting easy access to the canyon, the bulk of available amenities and services, and the panoramic vistas for which the natural wonder is famous. One of the most famous attractions in the American Southwest, the area offers breathtaking views over the Colorado River and the chance to immerse yourself in Native American culture.<div><br><b>The Basics<br></b>The South Rim of the Grand Canyon averages 7,000 feet (2,134 meters) above sea level, with natural wonders including Navajo Point, Hermit Road, and the Abyss. Grand Canyon Village is home to a variety of historic buildings, while other popular stops include the Grand Canyon Railway Depot, the Bright Angel Lodge, Kolb Studio, and the Desert View Watchtower, which features work by Hopi artists and incorporates Native American art and design.</div><div><br></div><div>Choosing a group bus tour, helicopter tour, air tour, or a self-drive tour makes the South Rim conveniently accessible from Las Vegas. Tours also leave from Sedona and Phoenix, and some combine the trip with a visit to the West Rim, the North Rim, or the Hoover Dam. A Grand Canyon helicopter tour is undoubtedly the fastest and most dramatic way to visit the canyon from Vegas.</div><div><br></div><div><b>Things to Know Before You Go</b><br><ul><li>The Canyon View Visitor Center, near the south entrance, stocks maps, books, and videos, while the Cameron Trading Post, outside the east entrance to the park, boasts a selection of souvenirs and supplies.<br></li><li>Stop by the Hopi House Gift Store and Art Gallery to see art and crafts from the local tribes.<br></li><li>If driving, be sure you have plenty of gas in your car before setting out for the canyon; there are few service stations in this remote part of Arizona.<br></li></ul><div><br></div><b>How to Get There<br></b>Located in the Arizona national park, the South Rim is a three-hour drive from Las Vegas or a short plane ride via Grand Canyon Airport. Driving from Flagstaff, take US 180 directly to the South Rim or US 89 to Arizona 64 and the east entrance to the park.</div><div><br><b>When to Get There<br></b>The South Rim gets quite crowded with visitors in the summertime. Consider visiting in the shoulder season, or booking a South Rim bus or jeep tour so you don't have to struggle with traffic and parking.</div><div><br><b>Hiking the Grand Canyon South Rim</b></div><div>The Grand Canyon South Rim is home to the Bright Angel Trail, Rim Trail, and South Kaibab Trail—all of which offer the most dazzling views of the canyon. Keep your eyes open for the regal California condors, which have recently returned to the area.</div>",
- "pagePrimaryLanguage": "en",
- "keywordCount": 0,
- "attractionLatitude": 36.059053,
- "attractionLongitude": -112.12825,
- "attractionStreetAddress": "",
- "attractionCity": "Grand Canyon National Park",
- "attractionState": "Arizona",
- "destinationId": 684,
- "seoId": 1249,
- "productCount": 11,
- "photoCount": 54,
- "primaryDestinationId": 684,
- "rating": 4,
- "primaryDestinationName": "Las Vegas",
- "title": "Grand Canyon South Rim"
}, - "searchType": "ATTRACTION"
}, - {
- "sortOrder": 3,
- "data": {
- "sortOrder": 3,
- "webURL": null,
- "pageUrlName": "Grand-Canyon-Helicopter-Tours-from-Las-Vegas",
- "primaryDestinationUrlName": "Las-Vegas",
- "publishedDate": null,
- "panoramaCount": 0,
- "userName": "",
- "descriptionText": "",
- "editorsPick": false,
- "showReviews": false,
- "keywords": [ ],
- "tabTitle": "",
- "descriptionIntro": "",
- "reviewCount": 2652,
- "seoType": "RECOMMENDATION",
- "pageTitle": "Grand Canyon Helicopter Tours from Las Vegas",
- "showPhotos": false,
- "keywordCount": 0,
- "overviewSummary": "<div>The Grand Canyon is an inspiring sight from any angle, but seeing it from the air is an unforgettable experience. With a helicopter tour from Las Vegas, you'll travel in style and enjoy incredible aerial views of the canyon. Here are your options.</div><div><br></div><div><b>Highlights</b></div><div><ul><li>Skip the tour bus and reach the Grand Canyon in just 45 minutes on a helicopter ride from Las Vegas.</li><li>Catch views of the famous Las Vegas Strip from above on your way in and out of the city.</li><li>Take in the natural beauty of the Grand Canyon and the Colorado River through expansive helicopter windows.</li><li>Enjoy easy access to the sights of your choices, from scenic overlooks to the Grand Canyon Skywalk.<br></li><li>Most tours also fly low over the Hoover Dam, affording more scenic views.</li></ul></div><div><br></div><div><b>VIP & Exclusive Tours</b></div><div>From pickup in a luxury vehicle to a multi-course gourmet meal in the canyon, VIP tours kick things up a notch. Choose a tour that pairs your helicopter ride with a below-the-rim landing, a seated meal, or a sunset champagne toast and picnic set at the canyon with table linens and fine china.</div><div><br></div><div><b>Combo Tours</b></div><div>If you have extra time, add to your Grand Canyon helicopter experience with a boat trip on the Colorado River, a stroll out on the Grand Canyon Skywalk, or some free time for hiking and exploring the national park's West Rim.</div>",
- "pagePrimaryLanguage": "en",
- "destinationId": 684,
- "attractionLatitude": null,
- "attractionLongitude": null,
- "attractionStreetAddress": "",
- "attractionCity": "",
- "attractionState": "",
- "seoId": 26043,
- "productCount": 6,
- "rating": 4.5,
- "primaryDestinationName": "Las Vegas",
- "photoCount": 229,
- "primaryDestinationId": 684,
- "title": "Grand Canyon Helicopter Tours from Las Vegas"
}, - "searchType": "RECOMMENDATION"
}
], - "dateStamp": "2021-02-01T18:35:40+0000",
- "errorType": null,
- "errorCodes": [ ],
- "errorMessage": null,
- "errorName": null,
- "extraInfo": { },
- "extraObject": null,
- "success": true,
- "totalCount": 54,
- "errorMessageText": null,
- "vmid": "331004"
}
Get product information This service provides all product details required for a product display page, as well as information required for price checks and booking, such as:
currencyCode (in query):
Product photos
Update 13 Feb 2020: All supplier-provided photos for the selected product are now available in the productPhotos
array in this endpoint's response. Previously, only two supplier-provided photos were available – one in the productPhotos
array and one in thumbnailHiResURL
.
Videos
currencyCode | string currency code for the currency in which pricing is displayed
|
sortOrder | string Enum: "REVIEW_RATING_A" "REVIEW_RATING_D" "REVIEW_RATING_SUBMISSION_DATE_D" specifier of the order in which to return reviews Sort order options:
|
voucherOption | string Enum: "VOUCHER_PAPER_ONLY" "VOUCHER_E"
|
code | string Example: code=5010SYDNEY unique alphanumeric identifier of the product |
showUnavailable | boolean specifier as to whether or not to show 'unavailable' products:
|
excludeTourGradeAvailability | boolean specifier:
|
Accept-Language required | string Example: en-US Specifies the language into which the natural-language fields in the response from this service will be translated (see Accept-Language header for available language codes) |
errorReference | string or null reference number of this error |
dateStamp | string or null timestamp of this response |
errorType | string or null code specifying the type of error |
errorCodes | Array of strings or null array of error codes pertaining to this error
|
errorMessage | Array of arrays or null or null array of error message strings |
errorName | string or null name of this type of error |
extraInfo | object or null ignore (Viator only) |
extraObject | object or null ignore (Viator only) |
success | boolean or null boolean indicator of this request's outcome
|
totalCount | integer or null number of results available for this service |
errorMessageText | string or null array of error message strings in plain text |
vmid | string or null unique numeric id of the server that processed this request |
object object containing product details |
{- "errorReference": null,
- "data": {
- "supplierName": "Big Bus Tours",
- "currencyCode": "USD",
- "catIds": [
- 6,
- 12
], - "subCatIds": [
- 97,
- 98,
- 5330,
- 26963,
- 32024,
- 45
], - "webURL": null,
- "specialReservationDetails": null,
- "sslSupported": false,
- "panoramaCount": 0,
- "merchantCancellable": true,
- "bookingEngineId": "UnconditionalBE",
- "onRequestPeriod": null,
- "primaryGroupId": null,
- "pas": null,
- "available": true,
- "productUrlName": "Sydney-and-Bondi-Hop-on-Hop-off-Tour",
- "primaryDestinationUrlName": "Sydney",
- "voucherRequirements": "You can present either a paper or an electronic voucher for this activity.",
- "tourGradesAvailable": true,
- "hotelPickup": false,
- "userPhotos": [
- {
- "sortOrder": 1,
- "ownerName": "Husker1k",
- "ownerCountry": null,
- "productTitle": "Big Bus Sydney and Bondi Hop-on Hop-off Tour",
- "productUrlName": "Sydney-and-Bondi-Hop-on-Hop-off-Tour",
- "ownerAvatarURL": null,
- "sslSupported": false,
- "productCode": "5010SYDNEY",
- "caption": "<p>Carl and Karen meeting a new friend at the Wildlife park.</p>",
- "ownerId": 1755909,
- "editorsPick": true,
- "timeUploaded": "2012-02-07",
- "photoId": 1909732,
- "photoMediumResURL": "http://cache-graphicslib.viator.com/graphicslib/media/e4/dsc00471-photo_1909732-260tall.jpg",
- "title": "DSC00471"
}, - {
- "sortOrder": 2,
- "ownerName": "Kylie G",
- "ownerCountry": "Australia",
- "productTitle": "Big Bus Sydney and Bondi Hop-on Hop-off Tour",
- "productUrlName": "Sydney-and-Bondi-Hop-on-Hop-off-Tour",
- "ownerAvatarURL": null,
- "sslSupported": false,
- "productCode": "5010SYDNEY",
- "caption": "Sydney Opera House",
- "ownerId": 288013,
- "editorsPick": true,
- "timeUploaded": "2009-07-22",
- "photoId": 997106,
- "title": "Sydney Opera House"
}
], - "reviews": [
- {
- "sortOrder": 1,
- "ownerName": "esperanza h",
- "ownerCountry": null,
- "productTitle": "Big Bus Sydney and Bondi Hop-on Hop-off Tour",
- "productUrlName": "Sydney-and-Bondi-Hop-on-Hop-off-Tour",
- "ownerAvatarURL": null,
- "sslSupported": false,
- "productCode": "5010SYDNEY",
- "submissionDate": "2020-01-16",
- "rating": 5,
- "review": "<p>Excellent way of visiting the city! It’s the only way to see atttactions in Sydney as I only have three days to stay . The next day I went back to Bondi beach to spend half of my day for the birthday of my son. Went to Iceberg Club overlooking the beach with surfers. It’s the best view you can get while having lunch! Walked along the coast to enjoy the magnificent view. I plan to go back again to this beautiful city. Spent sometime at the opera house area where there’s plenty of nice cafes to eat while admiring the view!</p>",
- "publishedDate": "2020-01-16",
- "ownerId": 32351278,
- "reviewId": 67907371
}, - {
- "sortOrder": 2,
- "ownerName": "tomzak21",
- "ownerCountry": null,
- "productTitle": "Big Bus Sydney and Bondi Hop-on Hop-off Tour",
- "productUrlName": "Sydney-and-Bondi-Hop-on-Hop-off-Tour",
- "sslSupported": false,
- "productCode": "5010SYDNEY",
- "submissionDate": "2020-01-09",
- "rating": 5,
- "review": "<p>Love The Big Bus, Hop On / Hop Off Tour Company! This is the way to see just about all the key areas and tourist attractions. You don't have to rent a car and they are actually comfortable. We also did a Hop On, Hop Off in Budapest, Hungary and that was great also, saw all the major attractions!</p>\n\n<p> They provide you with earbuds and there are 6+ languages that you can choose. Being in Sydney, there was Chinese, Korean, Japanese, along with French, Spanish, English and I believe German.</p>\n\n<p> There is also a \"package deal\" in which you can purchase a pass to other attractions along the route.. like Wildlife Sydney Zoo, Madame Tussaud's, Sydney Eye. You can buy a 2, 3 or 4 attraction pass in which The Big Bus is one of the attractions.</p>\n\n<p> Love The Big Bus! If you want a quick tour or spend a couples days of exploring, this is the way to go!</p>\n\n<p> Only complaint... the drop off and pick up spots could be better labeled. They should put there logo on a sign and make it noticeable. Some stops had some kind of sign, but there were a few stops that we weren't sure we were in the right spot. It wound up that we were in the correct spot. Addresses are listed in the provided in the pamphlet / flyer provided.</p>",
- "publishedDate": "2020-01-09",
- "ownerId": 47925237,
- "reviewId": 67480203
}
], - "videos": null,
- "tourGrades": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "langServices": {
- "en/SERVICE_AUDIO": "English - Audio",
- "de/SERVICE_AUDIO": "German - Audio",
- "fr/SERVICE_AUDIO": "French - Audio",
- "es/SERVICE_AUDIO": "Spanish - Audio",
- "ja/SERVICE_AUDIO": "Japanese - Audio",
- "ko/SERVICE_AUDIO": "Korean - Audio",
- "zh/SERVICE_AUDIO": "Chinese - Audio"
}, - "gradeCode": "24HOUR",
- "merchantNetPriceFrom": 29.52,
- "priceFrom": 36.97,
- "priceFromFormatted": "$36.97",
- "merchantNetPriceFromFormatted": "$29.52",
- "gradeTitle": "24 Hour Classic Ticket ",
- "gradeDepartureTime": "",
- "gradeDescription": "Unlimited use on Big Bus Sydney & Bondi Hop-on Hop-off Tour for 24 hours from time of first use",
- "defaultLanguageCode": "en"
}, - {
- "sortOrder": 2,
- "currencyCode": "USD",
- "langServices": {
- "en/SERVICE_AUDIO": "English - Audio",
- "de/SERVICE_AUDIO": "German - Audio",
- "fr/SERVICE_AUDIO": "French - Audio",
- "es/SERVICE_AUDIO": "Spanish - Audio",
- "ja/SERVICE_AUDIO": "Japanese - Audio",
- "ko/SERVICE_AUDIO": "Korean - Audio",
- "zh/SERVICE_AUDIO": "Chinese - Audio"
}, - "gradeCode": "48HOUR",
- "merchantNetPriceFrom": 39.53,
- "priceFrom": 49.5,
- "priceFromFormatted": "$49.50",
- "merchantNetPriceFromFormatted": "$39.53",
- "gradeTitle": "48 Hour Premium Ticket ",
- "gradeDepartureTime": "",
- "gradeDescription": "48 Hour Premium Ticket: Unlimited use on Big Bus Sydney & Bondi Tour for 48 hours from time of first use PLUS a guided walking tour of The Rocks, Syd",
- "defaultLanguageCode": "en"
}, - {
- "sortOrder": 3,
- "currencyCode": "USD",
- "langServices": {
- "en/SERVICE_AUDIO": "English - Audio",
- "de/SERVICE_AUDIO": "German - Audio",
- "fr/SERVICE_AUDIO": "French - Audio",
- "es/SERVICE_AUDIO": "Spanish - Audio",
- "ja/SERVICE_AUDIO": "Japanese - Audio",
- "ko/SERVICE_AUDIO": "Korean - Audio",
- "zh/SERVICE_AUDIO": "Chinese - Audio"
}, - "gradeCode": "DELUXE",
- "merchantNetPriceFrom": 55.05,
- "priceFrom": 68.93,
- "priceFromFormatted": "$68.93",
- "merchantNetPriceFromFormatted": "$55.05",
- "gradeTitle": "48 Hour Deluxe Bus and Cruise",
- "gradeDepartureTime": "",
- "gradeDescription": "Big Bus and Habour Cruise: Combine two great Sydney experiences into one with a hop-on hop off Big Bus Tours and a hop-on hop-off Sydney Harbour cruise <br/>Duration: 2 days: SPECIAL OFFER: EXTRA FREE DAY when you purchase a Deluxe ticket - have 3 days to explore Sydney not 2. Limited time only.\n<br/>Complimentary Walking Tour: Complimentary English-speaking 90-minute guided walking tour of “The Rocks” historic and harbourside precinct.",
- "defaultLanguageCode": "en"
}, - {
- "sortOrder": 4,
- "currencyCode": "USD",
- "langServices": {
- "en/SERVICE_AUDIO": "English - Audio",
- "de/SERVICE_AUDIO": "German - Audio",
- "fr/SERVICE_AUDIO": "French - Audio",
- "es/SERVICE_AUDIO": "Spanish - Audio",
- "ja/SERVICE_AUDIO": "Japanese - Audio",
- "ko/SERVICE_AUDIO": "Korean - Audio",
- "zh/SERVICE_AUDIO": "Chinese - Audio"
}, - "gradeCode": "TG1",
- "merchantNetPriceFrom": 71.74,
- "priceFrom": 89.81,
- "priceFromFormatted": "$89.81",
- "merchantNetPriceFromFormatted": "$71.74",
- "gradeTitle": "48Hour Deluxe PLUS Attractions",
- "gradeDepartureTime": "",
- "gradeDescription": "Hop-on Hop-Off and Attractions: 48hr Big Bus Tours, 1-day Hop-On Hop-Off Harbour Cruise, 4 Attractions: Tower Eye, Madame Tussauds, Wildlife Zoo, Aquarium<br/>Duration: 2 days: SPECIAL OFFER: EXTRA FREE DAY when you purchase a Deluxe ticket - have 3 days to explore Sydney not 2. Limited time only.\n<br/>Complimentary Walking Tours: Complimentary English-speaking guided walking tour of “The Rocks” historic and harbourside precinct.",
- "defaultLanguageCode": "en"
}
], - "ageBands": [
- {
- "sortOrder": 1,
- "ageFrom": 16,
- "ageTo": 99,
- "bandId": 1,
- "adult": true,
- "pluralDescription": "Adults",
- "treatAsAdult": true,
- "count": 0,
- "description": "Adult"
}, - {
- "sortOrder": 2,
- "ageFrom": 5,
- "ageTo": 15,
- "bandId": 2,
- "adult": false,
- "pluralDescription": "Children",
- "treatAsAdult": true,
- "count": 0,
- "description": "Child"
}, - {
- "sortOrder": 3,
- "ageFrom": 0,
- "ageTo": 4,
- "bandId": 3,
- "adult": false,
- "pluralDescription": "Infants",
- "treatAsAdult": false,
- "count": 0,
- "description": "Infant"
}
], - "bookingQuestions": [ ],
- "passengerAttributes": null,
- "highlights": null,
- "salesPoints": [ ],
- "ratingCounts": {
- "1": 38,
- "2": 99,
- "3": 198,
- "4": 500,
- "5": 770
}, - "termsAndConditions": null,
- "merchantTermsAndConditions": {
- "termsAndConditions": "For a full refund, cancel at least 24 hours in advance of the start date of the experience.",
- "merchantTermsAndConditionsType": 1,
- "amountRefundable": null,
- "cancellationFromTourDate": [
- {
- "dayRangeMin": 1,
- "dayRangeMax": null,
- "percentageRefundable": 100,
- "policyStartTimestamp": null,
- "policyEndTimestamp": null
}, - {
- "dayRangeMin": 0,
- "dayRangeMax": 1,
- "percentageRefundable": 0,
- "policyStartTimestamp": null,
- "policyEndTimestamp": null
}
]
}, - "maxTravellerCount": 9,
- "returnDetails": "You may disembark at any of the available stops.",
- "specialOffer": "",
- "itinerary": "",
- "destinationId": 357,
- "translationLevel": 0,
- "additionalInfo": [
- "Confirmation will be received at time of booking",
- "Wheelchair accessible",
- "When booking the 24 or 48 hour Family Pass, only the lead passenger name is required for a booking of up to 2 Adults and 2 children 16 years and under. At time of booking you only need to enter 1 adult to complete your booking",
- "Infants aged 0 to 4 years travel free of charge"
], - "voucherOption": "VOUCHER_E",
- "applePassSupported": true,
- "productPhotos": [
- {
- "caption": "Selfies at Bondi Beach",
- "path": "attractions-splice-spp-674x446/09/c5/d3/87.jpg",
- "supplier": "SUPPLIER"
}, - {
- "caption": "",
- "path": "attractions-splice-spp-674x446/09/c5/d2/d1.jpg",
- "supplier": "SUPPLIER"
}, - {
- "caption": "",
- "path": "attractions-splice-spp-674x446/07/94/40/f3.jpg",
- "supplier": "SUPPLIER"
}, - {
- "caption": "Sydney and Bondi Hop-On Hop-Off Tour",
- "path": "attractions-splice-spp-674x446/09/c5/d2/d4.jpg",
- "supplier": "SUPPLIER"
}, - {
- "caption": "Bondi Beach",
- "path": "attractions-splice-spp-674x446/09/c5/d2/c7.jpg",
- "supplier": "SUPPLIER"
}, - {
- "caption": "Visit icons",
- "path": "attractions-splice-spp-674x446/07/90/5a/68.jpg",
- "supplier": "SUPPLIER"
}, - {
- "caption": "Big Bus App provides live tracking",
- "path": "attractions-splice-spp-674x446/07/90/5a/6a.jpg",
- "supplier": "SUPPLIER"
}, - {
- "caption": "The Rocks",
- "path": "attractions-splice-spp-674x446/07/90/5a/7d.jpg",
- "supplier": "SUPPLIER"
}
], - "departureTime": "See itinerary",
- "departureTimeComments": "",
- "departurePoint": "You may start this tour at any of the stops listed.",
- "city": "Sydney",
- "mapURL": null,
- "allTravellerNamesRequired": true,
- "operates": "<p>Daily</p>",
- "exclusions": [
- "Food and drinks",
- "Admission"
], - "description": "<b>Itinerary</b><br><br><p><strong>Red Route - Sydney Icons</strong></p><p>Route Duration: 2 hours</p><div>Stops on the Red Route - Sydney Icons:</div><ul><li>T Galleria x Petal met Sugar - Circular Quay, George St, cnr Alfred St. (opp DFS Galleria)</li>\n<li>Martin Place Station, Elizabeth St, Stand E - Sydney Tower/ Westfield</li>\n<li>1 William St - Australian Museum</li>\n<li>William St at Palmer St - William St, Kings Cross</li>\n<li>121 Darlinghurst Rd - Kings Cross Train Station on Darlinghurst Rd.</li>\n<li>123-125 MacLeay St - El Alamein Fountain</li>\n<li>2 Bourke St - Cowper Wharf Rd, outside the Woollomooloo Hotel</li>\n<li>2A Macquarie St - Sydney Opera House</li>\n<li>Macquarie Street - Botanical Garden, Scenic Walk to Mrs Macquarie Chair</li>\n<li>State Library of New South Wales - State Library</li>\n<li>Prince Albert Rd opp College St - Hyde Park</li>\n<li>Greyhound Australia - Central Station, Pitt Street, Bus Bay 18</li>\n<li>Powerhouse Museum, Harris St - Powerhouse Museum</li>\n<li>Fish Market - Harris St, cnr Pyrmont Bridge Rd</li>\n<li>Marquee Sydney - The Star Casino</li>\n<li>Maritime Museum</li>\n<li>ICC Sydney</li>\n<li>Chinese Garden of Friendship</li>\n<li>SEA LIFE Sydney Aquarium</li>\n<li>ibis Sydney King Street Wharf - Kings Street Wharf</li>\n<li>Hickson Road</li>\n<li>Dawes Point - Sydney Harbour Bridge</li>\n<li>The Rocks</li></ul><div>Attractions on the Red Route - Sydney Icons:</div><p>Hyde Park Barracks / Australian Museum / Sea Life Sydney Aquarium / Darling Harbour / The Rocks / Bondi Beach / Sydney Harbour Bridge / Royal Botanic Garden Sydney / Sydney Town Hall / Hyde Park / Circular Quay / City Sightseeing Sydney / Madame Tussauds Sydney / Big Bus Sydney</p><p><i>Operates:</i> 1st bus departs from Stop 1 Circular Quay at 8.30am.\nFrequency every 20 minutes\nLast bus departs from stop 1 at 6.30pm</p><p><strong>Blue Route - Bondi Lifestyle</strong></p><p>Route Duration: 2 hours</p><div>Stops on the Blue Route - Bondi Lifestyle:</div><ul><li>492 Pitt St - Central Station, Pitt Street, Bus Bay 18</li>\n<li>1 William St - Australian Museum </li>\n<li>Paddington Town Hall, Oxford St</li>\n<li>Oxford St opp Moncur St</li>\n<li>Bondi Beach</li>\n<li>North Bondi Beach, Campbell Pde</li>\n<li>Rose Bay</li>\n<li>Double Bay</li></ul><div>Attractions on the Blue Route - Bondi Lifestyle:</div><p>Paddington Markets / Centennial Park / Bondi Beach / Rose Bay / Double Bay</p><p><i>Operates:</i> 1st bus departs from Stop 1 Circular Quay at 9.30am.\nFrequency every 30 minutes\nLast bus departs from stop 1 at 6.30pm</p>",
- "inclusions": [
- "Choice of 24 hour or 48 hour pass",
- "Pre-recorded commentary in English, French, Spanish, German, Italian, Mandarin, Japanese, Korean",
- "Free wifi onboard"
], - "location": "The Rocks, Australia",
- "country": "Australia",
- "region": "New South Wales",
- "shortTitle": "Big Bus Sydney and Bondi Hop-on Hop-off Tour",
- "specialOfferAvailable": false,
- "price": 36.97,
- "supplierCode": "5010",
- "thumbnailHiResURL": "https://hare-media-cdn.tripadvisor.com/media/attractions-splice-spp-674x446/07/94/40/f3.jpg",
- "primaryDestinationName": "Sydney",
- "onSale": false,
- "photoCount": 124,
- "reviewCount": 1605,
- "primaryDestinationId": 357,
- "merchantNetPriceFrom": 29.52,
- "priceFormatted": "$36.97",
- "rrp": 0,
- "rrpformatted": "",
- "videoCount": 1,
- "rating": 4.5,
- "savingAmountFormated": "",
- "specialReservation": false,
- "savingAmount": 0,
- "merchantNetPriceFromFormatted": "$29.52",
- "essential": null,
- "admission": null,
- "duration": "2 hours",
- "shortDescription": "Explore Sydney and Bondi Beach on this hop-on hop-off sightseeing tour, which takes you by double-decker bus to 34 stops around the city including Sydney Opera House, Sydney Harbour Bridge, Darling Harbour, Bondi Beach and more. Enjoy unobstructed views and recorded commentary on board. Simply hop off to walk around and sightsee in depth. Your ticket is valid for 24 or 48 hours, so you can experience Sydney and Bondi's most noteworthy attractions, sights, and shopping and dining areas at your own pace.",
- "title": "Big Bus Sydney and Bondi Hop-on Hop-off Tour",
- "code": "5010SYDNEY"
}, - "dateStamp": "2020-02-06T18:15:04+0000",
- "errorType": null,
- "errorCodes": [ ],
- "errorMessage": null,
- "errorName": null,
- "extraInfo": { },
- "extraObject": null,
- "success": true,
- "totalCount": 1,
- "errorMessageText": null,
- "vmid": "331001"
}
Get user-submitted reviews of a product
Note:
The number of reviews that you can obtain via this service will depend on whether your account is limited in terms of the number of reviews you are entitled to receive.
The number of reviews available through this service is given in the
reviewCount
element in the response from
/product
Please speak to your account manager if you wish to receive more reviews. If your account is not limited, you will be able to receive all available reviews for this product.
Only reviews in the language specified in the Accept-Language request header will be returned
Viator performs checks on reviews
Example: "Get the first three reviews for product 5010SYDNEY
sorted by
rating in ascending order":
https://viatorapi.sandbox.viator.com/service/product/reviews?sortOrder=REVIEW_RATING_A&topX=1-3&code=5010SYDNEY&showUnavailable=false
sortOrder | string Enum: "REVIEW_RATING_A" "REVIEW_RATING_D" "REVIEW_RATING_SUBMISSION_DATE_D" specifier of the order in which to return reviews Sort order options:
|
topX | string Example: topX=1-3 start and end rows to return in the format {start}-{end}
Note:
|
code | string Example: code=5010SYDNEY unique alphanumeric identifier of the product |
showUnavailable | boolean specifier as to whether or not to show 'unavailable' products:
|
Accept-Language required | string Example: en-US Specifies the language into which the natural-language fields in the response from this service will be translated (see Accept-Language header for available language codes) |
errorReference | string or null reference number of this error |
dateStamp | string or null timestamp of this response |
errorType | string or null code specifying the type of error |
errorCodes | Array of strings or null array of error codes pertaining to this error
|
errorMessage | Array of arrays or null or null array of error message strings |
errorName | string or null name of this type of error |
extraInfo | object or null ignore (Viator only) |
extraObject | object or null ignore (Viator only) |
success | boolean or null boolean indicator of this request's outcome
|
totalCount | integer or null number of results available for this service |
errorMessageText | string or null array of error message strings in plain text |
vmid | string or null unique numeric id of the server that processed this request |
Array of objects (reviewObject) array of review objects |
{- "errorReference": null,
- "data": [
- {
- "sortOrder": 1,
- "ownerName": "Lauren",
- "ownerCountry": null,
- "productTitle": "Big Bus Sydney and Bondi Hop-on Hop-off Tour",
- "productUrlName": "Sydney-and-Bondi-Hop-on-Hop-off-Tour",
- "ownerAvatarURL": null,
- "sslSupported": false,
- "publishedDate": "2019-12-31",
- "productCode": "5010SYDNEY",
- "reviewId": 63679157,
- "submissionDate": "2019-11-04",
- "rating": 1,
- "review": "<p>We did the hop on hop off bus for the second half of our day. The buses were supposed to stop running at 7:30 pm. At 6:58 our bus driver kicked everyone off the bus before the end time. We were almost 3 miles from our hotel. We all asked if we could get off at an actual stop which was 2 miles closer to our hotel and the driver said no. I want my money back because it was awful!!! I would give 0 stars if I could!</p>",
- "ownerId": 29510203
}, - {
- "sortOrder": 2,
- "ownerName": "Robin R",
- "ownerCountry": null,
- "productTitle": "Big Bus Sydney and Bondi Hop-on Hop-off Tour",
- "productUrlName": "Sydney-and-Bondi-Hop-on-Hop-off-Tour",
- "ownerAvatarURL": null,
- "sslSupported": false,
- "publishedDate": "2018-05-09",
- "productCode": "5010SYDNEY",
- "reviewId": 32425348,
- "submissionDate": "2018-05-09",
- "rating": 1,
- "review": "<p>The bus was so crowded people were standing in the aisle which made it very difficult to see the sights. I got the last available seat which was facing backwards, so what little I could see, was of no value. The audio system was unusable because the sound quality was terrible. </p>\n\n<p>When we finally got to Bondi Beach which was lovely, we opted to uber back to our hotel which was much more convenient, efficient and had unobstructed views.</p>",
- "ownerId": 30185188
}, - {
- "sortOrder": 3,
- "ownerName": "Nancy S",
- "ownerCountry": null,
- "productTitle": "Big Bus Sydney and Bondi Hop-on Hop-off Tour",
- "productUrlName": "Sydney-and-Bondi-Hop-on-Hop-off-Tour",
- "ownerAvatarURL": null,
- "sslSupported": false,
- "publishedDate": "2018-03-26",
- "productCode": "5010SYDNEY",
- "reviewId": 31322881,
- "submissionDate": "2018-03-26",
- "rating": 1,
- "review": "<p>There were not buses. At one stop we waited almost 30 minutes and then the bus was so crowded we had to stand. We had bought our tickets in advance to be sure to have a place on the bus but when we got on they were still selling tickets. Never again.</p>",
- "ownerId": 29062502
}
], - "dateStamp": "2020-02-09T19:05:03+0000",
- "errorType": null,
- "errorCodes": [ ],
- "errorMessage": null,
- "errorName": null,
- "extraInfo": { },
- "extraObject": null,
- "success": true,
- "totalCount": 1561,
- "errorMessageText": null,
- "vmid": "331004"
}
Get photos of a product submitted by users
topX | string Example: topX=1-3 start and end rows to return in the format {start}-{end}
Note:
|
code | string Example: code=5010SYDNEY unique alphanumeric identifier of the product |
showUnavailable | boolean specifier as to whether or not to show 'unavailable' products:
|
Accept-Language required | string Example: en-US Specifies the language into which the natural-language fields in the response from this service will be translated (see Accept-Language header for available language codes) |
errorReference | string or null reference number of this error |
dateStamp | string or null timestamp of this response |
errorType | string or null code specifying the type of error |
errorCodes | Array of strings or null array of error codes pertaining to this error
|
errorMessage | Array of arrays or null or null array of error message strings |
errorName | string or null name of this type of error |
extraInfo | object or null ignore (Viator only) |
extraObject | object or null ignore (Viator only) |
success | boolean or null boolean indicator of this request's outcome
|
totalCount | integer or null number of results available for this service |
errorMessageText | string or null array of error message strings in plain text |
vmid | string or null unique numeric id of the server that processed this request |
Array of objects (photoObject) array of photo objects |
{- "errorReference": null,
- "data": [
- {
- "sortOrder": 1,
- "ownerName": "Husker1k",
- "ownerCountry": null,
- "productTitle": "Big Bus Sydney and Bondi Hop-on Hop-off Tour",
- "productUrlName": "Sydney-and-Bondi-Hop-on-Hop-off-Tour",
- "ownerAvatarURL": null,
- "sslSupported": false,
- "productCode": "5010SYDNEY",
- "caption": "<p>Carl and Karen meeting a new friend at the Wildlife park.</p>",
- "timeUploaded": "2012-02-07",
- "photoId": 1909732,
- "photoMediumResURL": "http://cache-graphicslib.viator.com/graphicslib/media/e4/dsc00471-photo_1909732-260tall.jpg",
- "ownerId": 1755909,
- "editorsPick": true,
- "title": "DSC00471"
}, - {
- "sortOrder": 2,
- "ownerName": "Kylie G",
- "ownerCountry": "Australia",
- "productTitle": "Big Bus Sydney and Bondi Hop-on Hop-off Tour",
- "productUrlName": "Sydney-and-Bondi-Hop-on-Hop-off-Tour",
- "ownerAvatarURL": null,
- "sslSupported": false,
- "productCode": "5010SYDNEY",
- "caption": "Sydney Opera House",
- "timeUploaded": "2009-07-22",
- "photoId": 997106,
- "ownerId": 288013,
- "editorsPick": true,
- "title": "Sydney Opera House"
}, - {
- "sortOrder": 3,
- "ownerName": "Sheila T",
- "ownerCountry": null,
- "productTitle": "Big Bus Sydney and Bondi Hop-on Hop-off Tour",
- "productUrlName": "Sydney-and-Bondi-Hop-on-Hop-off-Tour",
- "sslSupported": false,
- "productCode": "5010SYDNEY",
- "caption": "<p>This was taken from a water taxi</p>",
- "timeUploaded": "2018-03-28",
- "photoId": 31376266,
- "photoMediumResURL": "http://cache-graphicslib.viator.com/graphicslib/media/8a/-photo_31376266-260tall.jpg",
- "ownerId": 1327319,
- "editorsPick": false,
- "title": ""
}
], - "dateStamp": "2020-02-10T15:32:59+0000",
- "errorType": null,
- "errorCodes": [ ],
- "errorMessage": null,
- "errorName": null,
- "extraInfo": { },
- "extraObject": null,
- "success": true,
- "totalCount": 118,
- "vmid": "331001",
- "errorMessageText": null
}
Find products that are available
This endpoint returns available products filtered by product code, date range or number of adult travelers
Accept-Language required | string Example: en-US Specifies the language into which the natural-language fields in the response from this service will be translated (see Accept-Language header for available language codes) |
currencyCode | string currency in which to display product pricing
|
startDate | string start date of the date range to search within (must be in the future) |
endDate | string end date of the date range to search within (must be in the future) |
numAdults | integer number of adult travelers who wish to participate
|
productCodes | Array of strings array of unique alphanumeric product identifiers specifying which products to find the availability of
|
errorReference | string or null reference number of this error |
dateStamp | string or null timestamp of this response |
errorType | string or null code specifying the type of error |
errorCodes | Array of strings or null array of error codes pertaining to this error
|
errorMessage | Array of arrays or null or null array of error message strings |
errorName | string or null name of this type of error |
extraInfo | object or null ignore (Viator only) |
extraObject | object or null ignore (Viator only) |
success | boolean or null boolean indicator of this request's outcome
|
totalCount | integer or null number of results available for this service |
errorMessageText | string or null array of error message strings in plain text |
vmid | string or null unique numeric id of the server that processed this request |
Array of objects array of product objects |
{- "currencyCode": "USD",
- "startDate": "2020-12-21",
- "endDate": "2020-12-31",
- "numAdults": 1,
- "productCodes": [
- "5010SYDNEY",
- "2280SUN",
- "9169P50"
]
}
{- "errorReference": null,
- "data": [
- {
- "sortOrder": 1,
- "supplierName": "Big Bus Tours",
- "currencyCode": "USD",
- "catIds": [
- 6,
- 12
], - "subCatIds": [
- 97,
- 98,
- 5330,
- 26963,
- 32024,
- 45
], - "webURL": null,
- "specialReservationDetails": null,
- "sslSupported": false,
- "panoramaCount": 0,
- "merchantCancellable": true,
- "bookingEngineId": "UnconditionalBE",
- "onRequestPeriod": null,
- "primaryGroupId": null,
- "pas": {
- "productCode": "5010SYDNEY",
- "travellerMix": "1A",
- "tourGrades": {
- "24HOUR": {
- "tourGradeCode": "24HOUR",
- "title": "24 Hour Classic Ticket ",
- "description": "Unlimited use on Big Bus Sydney & Bondi Hop-on Hop-off Tour for 24 hours from time of first use",
- "bookingEngine": "UNCONDITIONAL_FREESALE",
- "sapi": false,
- "languageServices": {
- "de": [
- "AUDIO"
], - "en": [
- "AUDIO"
], - "es": [
- "AUDIO"
], - "fr": [
- "AUDIO"
], - "ja": [
- "AUDIO"
], - "ko": [
- "AUDIO"
], - "zh": [
- "AUDIO"
]
}, - "availDates": [
- {
- "priceFrom": "USD 36.97",
- "priceQuote": {
- "retailPrice": "USD 36.97",
- "generalRetailPrice": "USD 36.97",
- "priceSource": "MANUAL",
- "merchantNetPrice": "USD 29.52"
}, - "dateList": "20200321 20200322 20200323 20200324 20200325 20200326 20200327 20200328 20200329 20200330 20200331 20200401 20200402 20200403 20200404 20200405 20200406 20200407 20200408 20200409 20200410 20200411 20200412 20200413 20200414 20200415 20200416 20200417 20200418 20200419 20200420 20200421 "
}
]
}, - "48HOUR": {
- "tourGradeCode": "48HOUR",
- "title": "48 Hour Premium Ticket ",
- "description": "48 Hour Premium Ticket: Unlimited use on Big Bus Sydney & Bondi Tour for 48 hours from time of first use PLUS a guided walking tour of The Rocks, Syd",
- "bookingEngine": "UNCONDITIONAL_FREESALE",
- "sapi": false,
- "languageServices": {
- "de": [
- "AUDIO"
], - "en": [
- "AUDIO"
], - "es": [
- "AUDIO"
], - "fr": [
- "AUDIO"
], - "ja": [
- "AUDIO"
], - "ko": [
- "AUDIO"
], - "zh": [
- "AUDIO"
]
}, - "availDates": [
- {
- "priceFrom": "USD 49.50",
- "priceQuote": {
- "retailPrice": "USD 49.50",
- "generalRetailPrice": "USD 49.50",
- "priceSource": "MANUAL",
- "merchantNetPrice": "USD 39.53"
}, - "dateList": "20200321 20200322 20200323 20200324 20200325 20200326 20200327 20200328 20200329 20200330 20200331 20200401 20200402 20200403 20200404 20200405 20200406 20200407 20200408 20200409 20200410 20200411 20200412 20200413 20200414 20200415 20200416 20200417 20200418 20200419 20200420 20200421 "
}
]
}, - "DELUXE": {
- "tourGradeCode": "DELUXE",
- "title": "48 Hour Deluxe Bus and Cruise",
- "description": "Big Bus and Habour Cruise: Combine two great Sydney experiences into one with a hop-on hop off Big Bus Tours and a hop-on hop-off Sydney Harbour cruise <br/>Duration: 2 days: SPECIAL OFFER: EXTRA FREE DAY when you purchase a Deluxe ticket - have 3 days to explore Sydney not 2. Limited time only.\n<br/>Complimentary Walking Tour: Complimentary English-speaking 90-minute guided walking tour of “The Rocks” historic and harbourside precinct.",
- "bookingEngine": "UNCONDITIONAL_FREESALE",
- "sapi": false,
- "languageServices": {
- "de": [
- "AUDIO"
], - "en": [
- "AUDIO"
], - "es": [
- "AUDIO"
], - "fr": [
- "AUDIO"
], - "ja": [
- "AUDIO"
], - "ko": [
- "AUDIO"
], - "zh": [
- "AUDIO"
]
}, - "availDates": [
- {
- "priceFrom": "USD 68.93",
- "priceQuote": {
- "retailPrice": "USD 68.93",
- "generalRetailPrice": "USD 68.93",
- "priceSource": "MANUAL",
- "merchantNetPrice": "USD 55.05"
}, - "dateList": "20200321 20200322 20200323 20200324 20200325 20200326 20200327 20200328 20200329 20200330 20200331 20200401 20200402 20200403 20200404 20200405 20200406 20200407 20200408 20200409 20200410 20200411 20200412 20200413 20200414 20200415 20200416 20200417 20200418 20200419 20200420 20200421 "
}
]
}, - "TG1": {
- "tourGradeCode": "TG1",
- "title": "48Hour Deluxe PLUS Attractions",
- "description": "Hop-on Hop-Off and Attractions: 48hr Big Bus Tours, 1-day Hop-On Hop-Off Harbour Cruise, 4 Attractions: Tower Eye, Madame Tussauds, Wildlife Zoo, Aquarium<br/>Duration: 2 days: SPECIAL OFFER: EXTRA FREE DAY when you purchase a Deluxe ticket - have 3 days to explore Sydney not 2. Limited time only.\n<br/>Complimentary Walking Tours: Complimentary English-speaking guided walking tour of “The Rocks” historic and harbourside precinct.",
- "bookingEngine": "UNCONDITIONAL_FREESALE",
- "sapi": false,
- "languageServices": {
- "de": [
- "AUDIO"
], - "en": [
- "AUDIO"
], - "es": [
- "AUDIO"
], - "fr": [
- "AUDIO"
], - "ja": [
- "AUDIO"
], - "ko": [
- "AUDIO"
], - "zh": [
- "AUDIO"
]
}, - "availDates": [
- {
- "priceFrom": "USD 89.81",
- "priceQuote": {
- "retailPrice": "USD 89.81",
- "generalRetailPrice": "USD 89.81",
- "priceSource": "MANUAL",
- "merchantNetPrice": "USD 71.74"
}, - "dateList": "20200321 20200322 20200323 20200324 20200325 20200326 20200327 20200328 20200329 20200330 20200331 20200401 20200402 20200403 20200404 20200405 20200406 20200407 20200408 20200409 20200410 20200411 20200412 20200413 20200414 20200415 20200416 20200417 20200418 20200419 20200420 20200421 "
}
]
}
}, - "incompleteQuote": false,
- "removedChildAges": [ ]
}, - "available": true,
- "productUrlName": "Sydney-and-Bondi-Hop-on-Hop-off-Tour",
- "primaryDestinationUrlName": "Sydney",
- "duration": "2 hours",
- "price": 36.97,
- "supplierCode": "5010",
- "translationLevel": 0,
- "thumbnailHiResURL": "https://hare-media-cdn.tripadvisor.com/media/attractions-splice-spp-674x446/07/94/40/f3.jpg",
- "primaryDestinationName": "Sydney",
- "priceFormatted": "$36.97",
- "rrp": 0,
- "rrpformatted": "",
- "photoCount": 124,
- "reviewCount": 1605,
- "primaryDestinationId": 357,
- "merchantNetPriceFrom": 29.52,
- "onSale": false,
- "videoCount": 1,
- "rating": 4.5,
- "shortTitle": "Big Bus Sydney and Bondi Hop-on Hop-off Tour",
- "specialOfferAvailable": false,
- "specialReservation": false,
- "uniqueShortDescription": null,
- "merchantNetPriceFromFormatted": "$29.52",
- "savingAmount": 0,
- "savingAmountFormated": "",
- "essential": null,
- "admission": null,
- "shortDescription": "Explore Sydney and Bondi Beach on this hop-on hop-off sightseeing tour, which takes you by double-decker bus to 34 stops around the city including Sydney Opera House, Sydney Harbour Bridge, Darling Harbour, Bondi Beach and more. Enjoy unobstructed views and recorded commentary on board. Simply hop off to walk around and sightsee in depth. Your ticket is valid for 24 or 48 hours, so you can experience Sydney and Bondi's most noteworthy attractions, sights, and shopping and dining areas at your own pace.",
- "title": "Big Bus Sydney and Bondi Hop-on Hop-off Tour",
- "code": "5010SYDNEY"
}, - {
- "sortOrder": 2,
- "supplierName": "Sundance Helicopters",
- "currencyCode": "USD",
- "catIds": [
- 1,
- 25,
- 12
], - "subCatIds": [
- 113,
- 2,
- 98,
- 26963,
- 45,
- 95
], - "webURL": null,
- "specialReservationDetails": null,
- "sslSupported": false,
- "panoramaCount": 0,
- "merchantCancellable": true,
- "bookingEngineId": "FreesaleOnRequestBE",
- "onRequestPeriod": 336,
- "primaryGroupId": null,
- "pas": {
- "productCode": "2280SUN",
- "travellerMix": "1A",
- "tourGrades": {
- "SUNSET_ASTAR": {
- "tourGradeCode": "SUNSET_ASTAR",
- "title": "A-Star Helicopter ",
- "description": "Grand Canyon West Rim Deluxe Sunset Tour by A-Star Helicopter",
- "bookingEngine": "FREESALE_ON_REQUEST",
- "sapi": false,
- "languageServices": {
- "de": [
- "AUDIO"
], - "en": [
- "AUDIO"
], - "es": [
- "AUDIO"
], - "fr": [
- "AUDIO"
], - "it": [
- "AUDIO"
], - "ja": [
- "AUDIO"
], - "ko": [
- "AUDIO"
], - "pt": [
- "AUDIO"
], - "ru": [
- "AUDIO"
], - "tw": [
- "AUDIO"
]
}, - "availDates": [
- {
- "priceFrom": "USD 490.00",
- "priceQuote": {
- "retailPrice": "USD 490.00",
- "generalRetailPrice": "USD 490.00",
- "priceSource": "MANUAL",
- "merchantNetPrice": "USD 420.68"
}, - "dateList": "20200321 20200322 20200323 20200324 20200325 20200326 20200327 20200328 20200329 20200330 20200331 20200401 20200402 20200403 20200404 20200405 20200406 20200407 20200408 20200409 20200410 20200411 20200412 20200413 20200414 20200415 20200416 20200417 20200418 20200419 20200420 20200421 "
}
]
}, - "SUNSET_EC130": {
- "tourGradeCode": "SUNSET_EC130",
- "title": "EC-130 Helicopter Upgrade",
- "description": "Grand Canyon West Rim Deluxe Sunset Tour by EC-130 Helicopter ",
- "bookingEngine": "FREESALE_ON_REQUEST",
- "sapi": false,
- "languageServices": {
- "de": [
- "AUDIO"
], - "en": [
- "AUDIO"
], - "es": [
- "AUDIO"
], - "fr": [
- "AUDIO"
], - "it": [
- "AUDIO"
], - "ja": [
- "AUDIO"
], - "ko": [
- "AUDIO"
], - "pt": [
- "AUDIO"
], - "ru": [
- "AUDIO"
], - "tw": [
- "AUDIO"
]
}, - "availDates": [
- {
- "priceFrom": "USD 515.00",
- "priceQuote": {
- "retailPrice": "USD 515.00",
- "generalRetailPrice": "USD 515.00",
- "priceSource": "MANUAL",
- "merchantNetPrice": "USD 441.98"
}, - "dateList": "20200321 20200322 20200323 20200324 20200325 20200326 20200327 20200328 20200329 20200330 20200331 20200401 20200402 20200403 20200404 20200405 20200406 20200407 20200408 20200409 20200410 20200411 20200412 20200413 20200414 20200415 20200416 20200417 20200418 20200419 20200420 20200421 "
}
]
}
}, - "incompleteQuote": false,
- "removedChildAges": [ ]
}, - "available": true,
- "productUrlName": "Grand-Canyon-West-Rim-Deluxe-Sunset-Helicopter-Tour",
- "primaryDestinationUrlName": "Las-Vegas",
- "duration": "3 hours 30 minutes",
- "price": 490,
- "supplierCode": "2280",
- "translationLevel": 0,
- "thumbnailHiResURL": "https://hare-media-cdn.tripadvisor.com/media/attractions-splice-spp-674x446/07/7a/ec/1c.jpg",
- "primaryDestinationName": "Las Vegas",
- "priceFormatted": "$490.00",
- "rrp": 0,
- "rrpformatted": "",
- "photoCount": 7,
- "reviewCount": 399,
- "primaryDestinationId": 684,
- "merchantNetPriceFrom": 420.68,
- "onSale": false,
- "videoCount": 1,
- "rating": 5,
- "shortTitle": "Grand Canyon from Las Vegas West Rim Sunset Helicopter Tour",
- "specialOfferAvailable": false,
- "specialReservation": false,
- "uniqueShortDescription": null,
- "merchantNetPriceFromFormatted": "$420.68",
- "savingAmount": 0,
- "savingAmountFormated": "",
- "essential": null,
- "admission": null,
- "shortDescription": "Take off from Las Vegas on a magical sunset helicopter tour to the Grand Canyon. You'll enjoy a 45-minute helicopter flight each way, land at the Grand Canyon for a glass of Champagne and snacks while you watch the sun start it's descent behind the walls of the canyon, then fly low over the famous neon-lit Las Vegas Strip on your return.",
- "title": "Grand Canyon West Rim Deluxe Sunset Helicopter Tour",
- "code": "2280SUN"
}
], - "dateStamp": "2020-02-10T15:41:53+0000",
- "errorType": null,
- "errorCodes": [ ],
- "errorMessage": null,
- "errorName": null,
- "extraInfo": { },
- "extraObject": null,
- "success": true,
- "totalCount": 1,
- "errorMessageText": null,
- "vmid": "331005"
}
Get the tour-grade with the lowest price that is available for a product on each day of the specified month
This service:
For more information, see: Availability services
Notes:
Accept-Language required | string Example: en-US Specifies the language into which the natural-language fields in the response from this service will be translated (see Accept-Language header for available language codes) |
productCode | string unique alphanumeric identifier of the product for which you wish to retrieve tour grade availability information |
currencyCode | string currency code for the currency in which to display tour grade pricing information |
month | string month component (text format) of the start of the date range for which to retrieve tour grade availability information (must be in the future) |
year | string year component (text format) of the start of the date range for which to retrieve tour grade availability information (must be in the future) |
Array of objects array of objects specifying the age bands by which to to filter search results |
errorReference | string or null reference number of this error |
dateStamp | string or null timestamp of this response |
errorType | string or null code specifying the type of error |
errorCodes | Array of strings or null array of error codes pertaining to this error
|
errorMessage | Array of arrays or null or null array of error message strings |
errorName | string or null name of this type of error |
extraInfo | object or null ignore (Viator only) |
extraObject | object or null ignore (Viator only) |
success | boolean or null boolean indicator of this request's outcome
|
totalCount | integer or null number of results available for this service |
errorMessageText | string or null array of error message strings in plain text |
vmid | string or null unique numeric id of the server that processed this request |
object object detailing available tourgrades for the specified age bands and date range for this product |
{- "productCode": "5010SYDNEY",
- "currencyCode": "AUD",
- "month": "12",
- "year": "2020",
- "ageBands": [
- {
- "bandId": 1,
- "count": 1
}
]
}
{- "errorReference": null,
- "data": {
- "productCode": "5010SYDNEY",
- "firstAvailableDate": "2020-06-01",
- "lastAvailableDate": "2021-02-10",
- "availability": [
- {
- "sortOrder": 1,
- "bookingDate": "2020-06-01",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}, - {
- "sortOrder": 2,
- "bookingDate": "2020-06-02",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}, - {
- "sortOrder": 3,
- "bookingDate": "2020-06-03",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}, - {
- "sortOrder": 4,
- "bookingDate": "2020-06-04",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}, - {
- "sortOrder": 5,
- "bookingDate": "2020-06-05",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}, - {
- "sortOrder": 6,
- "bookingDate": "2020-06-06",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}, - {
- "sortOrder": 7,
- "bookingDate": "2020-06-07",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}, - {
- "sortOrder": 8,
- "bookingDate": "2020-06-08",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}, - {
- "sortOrder": 9,
- "bookingDate": "2020-06-09",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}, - {
- "sortOrder": 10,
- "bookingDate": "2020-06-10",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}, - {
- "sortOrder": 11,
- "bookingDate": "2020-06-11",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}, - {
- "sortOrder": 12,
- "bookingDate": "2020-06-12",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}, - {
- "sortOrder": 13,
- "bookingDate": "2020-06-13",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}, - {
- "sortOrder": 14,
- "bookingDate": "2020-06-14",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}, - {
- "sortOrder": 15,
- "bookingDate": "2020-06-15",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}, - {
- "sortOrder": 16,
- "bookingDate": "2020-06-16",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}, - {
- "sortOrder": 17,
- "bookingDate": "2020-06-17",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}, - {
- "sortOrder": 18,
- "bookingDate": "2020-06-18",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}, - {
- "sortOrder": 19,
- "bookingDate": "2020-06-19",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}, - {
- "sortOrder": 20,
- "bookingDate": "2020-06-20",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}, - {
- "sortOrder": 21,
- "bookingDate": "2020-06-21",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}, - {
- "sortOrder": 22,
- "bookingDate": "2020-06-22",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}, - {
- "sortOrder": 23,
- "bookingDate": "2020-06-23",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}, - {
- "sortOrder": 24,
- "bookingDate": "2020-06-24",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}, - {
- "sortOrder": 25,
- "bookingDate": "2020-06-25",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}, - {
- "sortOrder": 26,
- "bookingDate": "2020-06-26",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}, - {
- "sortOrder": 27,
- "bookingDate": "2020-06-27",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}, - {
- "sortOrder": 28,
- "bookingDate": "2020-06-28",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}, - {
- "sortOrder": 29,
- "bookingDate": "2020-06-29",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}, - {
- "sortOrder": 30,
- "bookingDate": "2020-06-30",
- "retailPrice": 53.1,
- "gradeCode": "24HOUR",
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "unavailableReason": null,
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD",
- "available": true
}
]
}, - "dateStamp": "2020-02-10T16:43:02+0000",
- "errorType": null,
- "errorCodes": [ ],
- "errorMessage": null,
- "errorName": null,
- "extraInfo": { },
- "extraObject": null,
- "success": true,
- "totalCount": 1,
- "errorMessageText": null,
- "vmid": "331004"
}
Get dates on which a product is available
This service:
retrieves all available dates for a product, excluding days it does not operate and blocked-out dates
returns a multi-dimensional array of year-month -> days that have any availabile tour grade or traveler mix
useful to present the user with a list of dates for selection on which this product is available for booking
Notes:
productCode | string Example: productCode=2280AAHT unique alphanumeric identifier of the product |
Accept-Language required | string Example: en-US Specifies the language into which the natural-language fields in the response from this service will be translated (see Accept-Language header for available language codes) |
errorReference | string or null reference number of this error |
dateStamp | string or null timestamp of this response |
errorType | string or null code specifying the type of error |
errorCodes | Array of strings or null array of error codes pertaining to this error
|
errorMessage | Array of arrays or null or null array of error message strings |
errorName | string or null name of this type of error |
extraInfo | object or null ignore (Viator only) |
extraObject | object or null ignore (Viator only) |
success | boolean or null boolean indicator of this request's outcome
|
totalCount | integer or null number of results available for this service |
errorMessageText | string or null array of error message strings in plain text |
vmid | string or null unique numeric id of the server that processed this request |
object dictionary of month identifiers (e.g.,
|
{- "errorReference": null,
- "data": {
- "2020-02": [
- "11",
- "12",
- "13",
- "14",
- "15",
- "16",
- "17",
- "18",
- "19",
- "20",
- "21",
- "22",
- "23",
- "24",
- "25",
- "26",
- "27",
- "28",
- "29"
], - "2020-03": [
- "01",
- "02",
- "03",
- "04",
- "05",
- "06",
- "07",
- 8,
- 9,
- "10",
- "11",
- "12",
- "13",
- "14",
- "15",
- "16",
- "17",
- "18",
- "19",
- "20",
- "21",
- "22",
- "23",
- "24",
- "25",
- "26",
- "27",
- "28",
- "29",
- "30",
- "31"
], - "2020-04": [
- "01",
- "02",
- "03",
- "04",
- "05",
- "06",
- "07",
- 8,
- 9,
- "10",
- "11",
- "12",
- "13",
- "14",
- "15",
- "16",
- "17",
- "18",
- "19",
- "20",
- "21",
- "22",
- "23",
- "24",
- "25",
- "26",
- "27",
- "28",
- "29",
- "30"
], - "2020-05": [
- "01",
- "02",
- "03",
- "04",
- "05",
- "06",
- "07",
- 8,
- 9,
- "10",
- "11",
- "12",
- "13",
- "14",
- "15",
- "16",
- "17",
- "18",
- "19",
- "20",
- "21",
- "22",
- "23",
- "24",
- "25",
- "26",
- "27",
- "28",
- "29",
- "30",
- "31"
], - "2020-06": [
- "01",
- "02",
- "03",
- "04",
- "05",
- "06",
- "07",
- 8,
- 9,
- "10",
- "11",
- "12",
- "13",
- "14",
- "15",
- "16",
- "17",
- "18",
- "19",
- "20",
- "21",
- "22",
- "23",
- "24",
- "25",
- "26",
- "27",
- "28",
- "29",
- "30"
], - "2020-07": [
- "01",
- "02",
- "03",
- "04",
- "05",
- "06",
- "07",
- 8,
- 9,
- "10",
- "11",
- "12",
- "13",
- "14",
- "15",
- "16",
- "17",
- "18",
- "19",
- "20",
- "21",
- "22",
- "23",
- "24",
- "25",
- "26",
- "27",
- "28",
- "29",
- "30",
- "31"
], - "2020-08": [
- "01",
- "02",
- "03",
- "04",
- "05",
- "06",
- "07",
- 8,
- 9,
- "10",
- "11",
- "12",
- "13",
- "14",
- "15",
- "16",
- "17",
- "18",
- "19",
- "20",
- "21",
- "22",
- "23",
- "24",
- "25",
- "26",
- "27",
- "28",
- "29",
- "30",
- "31"
], - "2020-09": [
- "01",
- "02",
- "03",
- "04",
- "05",
- "06",
- "07",
- 8,
- 9,
- "10",
- "11",
- "12",
- "13",
- "14",
- "15",
- "16",
- "17",
- "18",
- "19",
- "20",
- "21",
- "22",
- "23",
- "24",
- "25",
- "26",
- "27",
- "28",
- "29",
- "30"
], - "2020-10": [
- "01",
- "02",
- "03",
- "04",
- "05",
- "06",
- "07",
- 8,
- 9,
- "10",
- "11",
- "12",
- "13",
- "14",
- "15",
- "16",
- "17",
- "18",
- "19",
- "20",
- "21",
- "22",
- "23",
- "24",
- "25",
- "26",
- "27",
- "28",
- "29",
- "30",
- "31"
], - "2020-11": [
- "01",
- "02",
- "03",
- "04",
- "05",
- "06",
- "07",
- 8,
- 9,
- "10",
- "11",
- "12",
- "13",
- "14",
- "15",
- "16",
- "17",
- "18",
- "19",
- "20",
- "21",
- "22",
- "23",
- "24",
- "25",
- "26",
- "27",
- "28",
- "29",
- "30"
], - "2020-12": [
- "01",
- "02",
- "03",
- "04",
- "05",
- "06",
- "07",
- 8,
- 9,
- "10",
- "11",
- "12",
- "13",
- "14",
- "15",
- "16",
- "17",
- "18",
- "19",
- "20",
- "21",
- "22",
- "23",
- "24",
- "25",
- "26",
- "27",
- "28",
- "29",
- "30",
- "31"
], - "2021-01": [
- "01",
- "02",
- "03",
- "04",
- "05",
- "06",
- "07",
- 8,
- 9,
- "10",
- "11",
- "12",
- "13",
- "14",
- "15",
- "16",
- "17",
- "18",
- "19",
- "20",
- "21",
- "22",
- "23",
- "24",
- "25",
- "26",
- "27",
- "28",
- "29",
- "30",
- "31"
], - "2021-02": [
- "01",
- "02",
- "03",
- "04",
- "05",
- "06",
- "07",
- 8
]
}, - "dateStamp": "2020-02-10T16:51:10+0000",
- "errorType": null,
- "errorCodes": [ ],
- "errorMessage": null,
- "errorName": null,
- "extraInfo": { },
- "extraObject": null,
- "success": true,
- "totalCount": 1,
- "errorMessageText": null,
- "vmid": "331004"
}
Get the tour grades of a product that are currently available
This service reports:
Note: Availability data is limited to a period of 12 months into the future from the present time on the production server and 6 months on the sandbox server.
Accept-Language required | string Example: en-US Specifies the language into which the natural-language fields in the response from this service will be translated (see Accept-Language header for available language codes) |
productCode | string |
currencyCode | string currency code for the currency in which to display pricing information |
bookingDate | string date to enquire about available tour grades for this product (must be in the future) |
Array of objects array of ageBand objects |
errorReference | string or null reference number of this error |
dateStamp | string or null timestamp of this response |
errorType | string or null code specifying the type of error |
errorCodes | Array of strings or null array of error codes pertaining to this error
|
errorMessage | Array of arrays or null or null array of error message strings |
errorName | string or null name of this type of error |
extraInfo | object or null ignore (Viator only) |
extraObject | object or null ignore (Viator only) |
success | boolean or null boolean indicator of this request's outcome
|
totalCount | integer or null number of results available for this service |
errorMessageText | string or null array of error message strings in plain text |
vmid | string or null unique numeric id of the server that processed this request |
Array of objects |
{- "productCode": "5010SYDNEY",
- "currencyCode": "AUD",
- "bookingDate": "2020-12-28",
- "ageBands": [
- {
- "bandId": 1,
- "count": 1
}
]
}
{- "errorReference": null,
- "data": [
- {
- "sortOrder": 1,
- "bookingDate": "2020-02-28",
- "ageBands": [
- {
- "bandId": 1,
- "count": 1,
- "bandTotal": 42.41,
- "pricePerTravelerFormatted": "$42.41",
- "pricePerTraveler": 42.41,
- "bandTotalFormatted": "$42.41",
- "currencyCode": "AUD"
}
], - "ageBandsRequired": null,
- "langServices": {
- "en/SERVICE_AUDIO": "English - Audio",
- "de/SERVICE_AUDIO": "German - Audio",
- "fr/SERVICE_AUDIO": "French - Audio",
- "es/SERVICE_AUDIO": "Spanish - Audio",
- "ja/SERVICE_AUDIO": "Japanese - Audio",
- "ko/SERVICE_AUDIO": "Korean - Audio",
- "zh/SERVICE_AUDIO": "Chinese - Audio"
}, - "gradeCode": "24HOUR",
- "unavailableReason": null,
- "gradeTitle": "24 Hour Classic Ticket ",
- "gradeDepartureTime": "",
- "gradeDescription": "Unlimited use on Big Bus Sydney & Bondi Hop-on Hop-off Tour for 24 hours from time of first use",
- "defaultLanguageCode": "en",
- "available": true,
- "retailPrice": 53.1,
- "merchantNetPrice": 42.41,
- "retailPriceFormatted": "$53.10",
- "merchantNetPriceFormatted": "$42.41",
- "currencyCode": "AUD"
}, - {
- "sortOrder": 2,
- "bookingDate": "2020-02-28",
- "ageBands": [
- {
- "bandId": 1,
- "count": 1,
- "bandTotal": 56.79,
- "pricePerTravelerFormatted": "$56.79",
- "pricePerTraveler": 56.79,
- "bandTotalFormatted": "$56.79",
- "currencyCode": "AUD"
}
], - "ageBandsRequired": null,
- "langServices": {
- "en/SERVICE_AUDIO": "English - Audio",
- "de/SERVICE_AUDIO": "German - Audio",
- "fr/SERVICE_AUDIO": "French - Audio",
- "es/SERVICE_AUDIO": "Spanish - Audio",
- "ja/SERVICE_AUDIO": "Japanese - Audio",
- "ko/SERVICE_AUDIO": "Korean - Audio",
- "zh/SERVICE_AUDIO": "Chinese - Audio"
}, - "gradeCode": "48HOUR",
- "unavailableReason": null,
- "gradeTitle": "48 Hour Premium Ticket ",
- "gradeDepartureTime": "",
- "gradeDescription": "48 Hour Premium Ticket: Unlimited use on Big Bus Sydney & Bondi Tour for 48 hours from time of first use PLUS a guided walking tour of The Rocks, Syd",
- "defaultLanguageCode": "en",
- "available": true,
- "retailPrice": 71.1,
- "merchantNetPrice": 56.79,
- "retailPriceFormatted": "$71.10",
- "merchantNetPriceFormatted": "$56.79",
- "currencyCode": "AUD"
}, - {
- "sortOrder": 3,
- "bookingDate": "2020-02-28",
- "ageBands": [
- {
- "bandId": 1,
- "count": 1,
- "bandTotal": 79.08,
- "pricePerTravelerFormatted": "$79.08",
- "pricePerTraveler": 79.08,
- "bandTotalFormatted": "$79.08",
- "currencyCode": "AUD"
}
], - "ageBandsRequired": null,
- "langServices": {
- "en/SERVICE_AUDIO": "English - Audio",
- "de/SERVICE_AUDIO": "German - Audio",
- "fr/SERVICE_AUDIO": "French - Audio",
- "es/SERVICE_AUDIO": "Spanish - Audio",
- "ja/SERVICE_AUDIO": "Japanese - Audio",
- "ko/SERVICE_AUDIO": "Korean - Audio",
- "zh/SERVICE_AUDIO": "Chinese - Audio"
}, - "gradeCode": "DELUXE",
- "unavailableReason": null,
- "gradeTitle": "48 Hour Deluxe Bus and Cruise",
- "gradeDepartureTime": "",
- "gradeDescription": "Big Bus and Habour Cruise: Combine two great Sydney experiences into one with a hop-on hop off Big Bus Tours and a hop-on hop-off Sydney Harbour cruise <br/>Duration: 2 days: SPECIAL OFFER: EXTRA FREE DAY when you purchase a Deluxe ticket - have 3 days to explore Sydney not 2. Limited time only.\n<br/>Complimentary Walking Tour: Complimentary English-speaking 90-minute guided walking tour of “The Rocks” historic and harbourside precinct.",
- "defaultLanguageCode": "en",
- "available": true,
- "retailPrice": 99,
- "merchantNetPrice": 79.08,
- "retailPriceFormatted": "$99.00",
- "merchantNetPriceFormatted": "$79.08",
- "currencyCode": "AUD"
}, - {
- "sortOrder": 4,
- "bookingDate": "2020-02-28",
- "ageBands": [
- {
- "bandId": 1,
- "count": 1,
- "bandTotal": 103.04,
- "pricePerTravelerFormatted": "$103.04",
- "pricePerTraveler": 103.04,
- "bandTotalFormatted": "$103.04",
- "currencyCode": "AUD"
}
], - "ageBandsRequired": null,
- "langServices": {
- "en/SERVICE_AUDIO": "English - Audio",
- "de/SERVICE_AUDIO": "German - Audio",
- "fr/SERVICE_AUDIO": "French - Audio",
- "es/SERVICE_AUDIO": "Spanish - Audio",
- "ja/SERVICE_AUDIO": "Japanese - Audio",
- "ko/SERVICE_AUDIO": "Korean - Audio",
- "zh/SERVICE_AUDIO": "Chinese - Audio"
}, - "gradeCode": "TG1",
- "unavailableReason": null,
- "gradeTitle": "48Hour Deluxe PLUS Attractions",
- "gradeDepartureTime": "",
- "gradeDescription": "Hop-on Hop-Off and Attractions: 48hr Big Bus Tours, 1-day Hop-On Hop-Off Harbour Cruise, 4 Attractions: Tower Eye, Madame Tussauds, Wildlife Zoo, Aquarium<br/>Duration: 2 days: SPECIAL OFFER: EXTRA FREE DAY when you purchase a Deluxe ticket - have 3 days to explore Sydney not 2. Limited time only.\n<br/>Complimentary Walking Tours: Complimentary English-speaking guided walking tour of “The Rocks” historic and harbourside precinct.",
- "defaultLanguageCode": "en",
- "available": true,
- "retailPrice": 129,
- "merchantNetPrice": 103.04,
- "retailPriceFormatted": "$129.00",
- "merchantNetPriceFormatted": "$103.04",
- "currencyCode": "AUD"
}
], - "dateStamp": "2020-02-10T16:57:56+0000",
- "errorType": null,
- "errorCodes": [ ],
- "errorMessage": null,
- "errorName": null,
- "extraInfo": { },
- "extraObject": {
- "CDE_BRAINTREE": {
- "APPAY": "sandbox_rtg2qcnx_yx8ptb2tqsjnzdnj",
- "PP": "sandbox_rtg2qcnx_yx8ptb2tqsjnzdnj",
- "GPAY": "sandbox_rtg2qcnx_yx8ptb2tqsjnzdnj"
}
}, - "success": true,
- "totalCount": 1,
- "errorMessageText": null,
- "vmid": "331003"
}
Get a pricing matrix that includes availability and tour-grades for a product
Given a month, this service returns days with available tour grades only (i.e., days which have at least one tourgrade available), and the pricing matrix for that tour grade for that day.
Accept-Language required | string Example: en-US Specifies the language into which the natural-language fields in the response from this service will be translated (see Accept-Language header for available language codes) |
productCode | string alphanumeric identifier of product about which to retrieve tour grade and pricing information |
currencyCode | string currency code for the currency in which to display pricing details |
month | string month of year (as text) by which to filter results (must be in the future) |
year | string year (as text) by which to filter results (must be in the future) |
errorReference | string or null reference number of this error |
dateStamp | string or null timestamp of this response |
errorType | string or null code specifying the type of error |
errorCodes | Array of strings or null array of error codes pertaining to this error
|
errorMessage | Array of arrays or null or null array of error message strings |
errorName | string or null name of this type of error |
extraInfo | object or null ignore (Viator only) |
extraObject | object or null ignore (Viator only) |
success | boolean or null boolean indicator of this request's outcome
|
totalCount | integer or null number of results available for this service |
errorMessageText | string or null array of error message strings in plain text |
vmid | string or null unique numeric id of the server that processed this request |
object |
{- "productCode": "2280AAHT",
- "currenctCode": "USD",
- "month": "12",
- "year": "2020"
}
{- "errorReference": null,
- "data": {
- "bookingMonth": "2020-03",
- "pricingUnit": "per person",
- "dates": [
- {
- "sortOrder": 1,
- "bookingDate": "2020-03-01",
- "tourGrades": [
- {
- "sortOrder": 1,
- "gradeCode": "EB_ASTAR_SP~07:00",
- "gradeTitle": "Special: Earlybird A-Star 07:00",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-01",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 409.99,
- "merchantNetPrice": 383.4,
- "priceFormatted": "$409.99",
- "merchantNetPriceFormatted": "$383.40",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 2,
- "gradeCode": "EB_EC130_SP~07:00",
- "gradeTitle": "Special: Earlybird EC-130 07:00",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-01",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 434.99,
- "merchantNetPrice": 404.7,
- "priceFormatted": "$434.99",
- "merchantNetPriceFormatted": "$404.70",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 3,
- "gradeCode": "TG1~08:00",
- "gradeTitle": "Morning Departure; A-Star 08:00",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-01",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 459.99,
- "merchantNetPrice": 388.72,
- "priceFormatted": "$459.99",
- "merchantNetPriceFormatted": "$388.72",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 4,
- "gradeCode": "TG1~09:45",
- "gradeTitle": "Morning Departure; A-Star 09:45",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-01",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 459.99,
- "merchantNetPrice": 388.72,
- "priceFormatted": "$459.99",
- "merchantNetPriceFormatted": "$388.72",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 5,
- "gradeCode": "TG1~10:45",
- "gradeTitle": "Morning Departure; A-Star 10:45",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-01",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 459.99,
- "merchantNetPrice": 388.72,
- "priceFormatted": "$459.99",
- "merchantNetPriceFormatted": "$388.72",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 6,
- "gradeCode": "TG2~08:00",
- "gradeTitle": "Morning Departure; EC-130 08:00",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-01",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 484.99,
- "merchantNetPrice": 410.02,
- "priceFormatted": "$484.99",
- "merchantNetPriceFormatted": "$410.02",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 7,
- "gradeCode": "TG2~09:45",
- "gradeTitle": "Morning Departure; EC-130 09:45",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-01",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 484.99,
- "merchantNetPrice": 410.02,
- "priceFormatted": "$484.99",
- "merchantNetPriceFormatted": "$410.02",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 8,
- "gradeCode": "TG2~10:45",
- "gradeTitle": "Morning Departure; EC-130 10:45",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-01",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 484.99,
- "merchantNetPrice": 410.02,
- "priceFormatted": "$484.99",
- "merchantNetPriceFormatted": "$410.02",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 9,
- "gradeCode": "TG3~12:30",
- "gradeTitle": "Afternoon Departure; A-Star 12:30",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-01",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 449.99,
- "merchantNetPrice": 383.4,
- "priceFormatted": "$449.99",
- "merchantNetPriceFormatted": "$383.40",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 10,
- "gradeCode": "TG3~13:30",
- "gradeTitle": "Afternoon Departure; A-Star 13:30",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-01",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 449.99,
- "merchantNetPrice": 383.4,
- "priceFormatted": "$449.99",
- "merchantNetPriceFormatted": "$383.40",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 11,
- "gradeCode": "TG4~12:30",
- "gradeTitle": "Afternoon Departure; EC-130 12:30",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-01",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 474.99,
- "merchantNetPrice": 404.7,
- "priceFormatted": "$474.99",
- "merchantNetPriceFormatted": "$404.70",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 12,
- "gradeCode": "TG4~13:30",
- "gradeTitle": "Afternoon Departure; EC-130 13:30",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-01",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 474.99,
- "merchantNetPrice": 404.7,
- "priceFormatted": "$474.99",
- "merchantNetPriceFormatted": "$404.70",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}
], - "callForLastMinAvailability": false
}, - {
- "sortOrder": 2,
- "bookingDate": "2020-03-02",
- "tourGrades": [
- {
- "sortOrder": 1,
- "gradeCode": "EB_ASTAR_SP~07:00",
- "gradeTitle": "Special: Earlybird A-Star 07:00",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-02",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 409.99,
- "merchantNetPrice": 383.4,
- "priceFormatted": "$409.99",
- "merchantNetPriceFormatted": "$383.40",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 2,
- "gradeCode": "EB_EC130_SP~07:00",
- "gradeTitle": "Special: Earlybird EC-130 07:00",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-02",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 434.99,
- "merchantNetPrice": 404.7,
- "priceFormatted": "$434.99",
- "merchantNetPriceFormatted": "$404.70",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 3,
- "gradeCode": "TG1~08:00",
- "gradeTitle": "Morning Departure; A-Star 08:00",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-02",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 459.99,
- "merchantNetPrice": 388.72,
- "priceFormatted": "$459.99",
- "merchantNetPriceFormatted": "$388.72",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 4,
- "gradeCode": "TG1~09:45",
- "gradeTitle": "Morning Departure; A-Star 09:45",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-02",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 459.99,
- "merchantNetPrice": 388.72,
- "priceFormatted": "$459.99",
- "merchantNetPriceFormatted": "$388.72",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 5,
- "gradeCode": "TG1~10:45",
- "gradeTitle": "Morning Departure; A-Star 10:45",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-02",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 459.99,
- "merchantNetPrice": 388.72,
- "priceFormatted": "$459.99",
- "merchantNetPriceFormatted": "$388.72",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 6,
- "gradeCode": "TG2~08:00",
- "gradeTitle": "Morning Departure; EC-130 08:00",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-02",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 484.99,
- "merchantNetPrice": 410.02,
- "priceFormatted": "$484.99",
- "merchantNetPriceFormatted": "$410.02",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 7,
- "gradeCode": "TG2~09:45",
- "gradeTitle": "Morning Departure; EC-130 09:45",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-02",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 484.99,
- "merchantNetPrice": 410.02,
- "priceFormatted": "$484.99",
- "merchantNetPriceFormatted": "$410.02",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 8,
- "gradeCode": "TG2~10:45",
- "gradeTitle": "Morning Departure; EC-130 10:45",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-02",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 484.99,
- "merchantNetPrice": 410.02,
- "priceFormatted": "$484.99",
- "merchantNetPriceFormatted": "$410.02",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 9,
- "gradeCode": "TG3~12:30",
- "gradeTitle": "Afternoon Departure; A-Star 12:30",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-02",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 449.99,
- "merchantNetPrice": 383.4,
- "priceFormatted": "$449.99",
- "merchantNetPriceFormatted": "$383.40",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 10,
- "gradeCode": "TG3~13:30",
- "gradeTitle": "Afternoon Departure; A-Star 13:30",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-02",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 449.99,
- "merchantNetPrice": 383.4,
- "priceFormatted": "$449.99",
- "merchantNetPriceFormatted": "$383.40",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 11,
- "gradeCode": "TG4~12:30",
- "gradeTitle": "Afternoon Departure; EC-130 12:30",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-02",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 474.99,
- "merchantNetPrice": 404.7,
- "priceFormatted": "$474.99",
- "merchantNetPriceFormatted": "$404.70",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 12,
- "gradeCode": "TG4~13:30",
- "gradeTitle": "Afternoon Departure; EC-130 13:30",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-02",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 474.99,
- "merchantNetPrice": 404.7,
- "priceFormatted": "$474.99",
- "merchantNetPriceFormatted": "$404.70",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}
], - "callForLastMinAvailability": false
}, - {
- "sortOrder": 3,
- "bookingDate": "2020-03-03",
- "tourGrades": [
- {
- "sortOrder": 1,
- "gradeCode": "EB_ASTAR_SP~07:00",
- "gradeTitle": "Special: Earlybird A-Star 07:00",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-03",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 409.99,
- "merchantNetPrice": 383.4,
- "priceFormatted": "$409.99",
- "merchantNetPriceFormatted": "$383.40",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 2,
- "gradeCode": "EB_EC130_SP~07:00",
- "gradeTitle": "Special: Earlybird EC-130 07:00",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-03",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 434.99,
- "merchantNetPrice": 404.7,
- "priceFormatted": "$434.99",
- "merchantNetPriceFormatted": "$404.70",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 3,
- "gradeCode": "TG1~08:00",
- "gradeTitle": "Morning Departure; A-Star 08:00",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-03",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 459.99,
- "merchantNetPrice": 388.72,
- "priceFormatted": "$459.99",
- "merchantNetPriceFormatted": "$388.72",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 4,
- "gradeCode": "TG1~09:45",
- "gradeTitle": "Morning Departure; A-Star 09:45",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-03",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 459.99,
- "merchantNetPrice": 388.72,
- "priceFormatted": "$459.99",
- "merchantNetPriceFormatted": "$388.72",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 5,
- "gradeCode": "TG1~10:45",
- "gradeTitle": "Morning Departure; A-Star 10:45",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-03",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 459.99,
- "merchantNetPrice": 388.72,
- "priceFormatted": "$459.99",
- "merchantNetPriceFormatted": "$388.72",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 6,
- "gradeCode": "TG2~08:00",
- "gradeTitle": "Morning Departure; EC-130 08:00",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-03",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 484.99,
- "merchantNetPrice": 410.02,
- "priceFormatted": "$484.99",
- "merchantNetPriceFormatted": "$410.02",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 7,
- "gradeCode": "TG2~09:45",
- "gradeTitle": "Morning Departure; EC-130 09:45",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-03",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 484.99,
- "merchantNetPrice": 410.02,
- "priceFormatted": "$484.99",
- "merchantNetPriceFormatted": "$410.02",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 8,
- "gradeCode": "TG2~10:45",
- "gradeTitle": "Morning Departure; EC-130 10:45",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-03",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 484.99,
- "merchantNetPrice": 410.02,
- "priceFormatted": "$484.99",
- "merchantNetPriceFormatted": "$410.02",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 9,
- "gradeCode": "TG3~12:30",
- "gradeTitle": "Afternoon Departure; A-Star 12:30",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-03",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 449.99,
- "merchantNetPrice": 383.4,
- "priceFormatted": "$449.99",
- "merchantNetPriceFormatted": "$383.40",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 10,
- "gradeCode": "TG3~13:30",
- "gradeTitle": "Afternoon Departure; A-Star 13:30",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-03",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 449.99,
- "merchantNetPrice": 383.4,
- "priceFormatted": "$449.99",
- "merchantNetPriceFormatted": "$383.40",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 11,
- "gradeCode": "TG4~12:30",
- "gradeTitle": "Afternoon Departure; EC-130 12:30",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-03",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 474.99,
- "merchantNetPrice": 404.7,
- "priceFormatted": "$474.99",
- "merchantNetPriceFormatted": "$404.70",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}, - {
- "sortOrder": 12,
- "gradeCode": "TG4~13:30",
- "gradeTitle": "Afternoon Departure; EC-130 13:30",
- "pricingMatrix": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-03",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 474.99,
- "merchantNetPrice": 404.7,
- "priceFormatted": "$474.99",
- "merchantNetPriceFormatted": "$404.70",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 1,
- "maximumCountRequired": 9
}, - {
- "bandId": 3,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "USD",
- "price": 0,
- "merchantNetPrice": 0,
- "priceFormatted": "$0.00",
- "merchantNetPriceFormatted": "$0.00",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
]
}
], - "callForLastMinAvailability": false
}
]
}, - "dateStamp": "2020-02-10T18:17:58+0000",
- "errorType": null,
- "errorCodes": [ ],
- "errorMessage": null,
- "errorName": null,
- "extraInfo": { },
- "extraObject": null,
- "success": true,
- "totalCount": 1,
- "errorMessageText": null,
- "vmid": "331003"
}
Confirm the price of a tour / activity prior to booking
For more information, see: Calculating prices
Accept-Language required | string Example: en-US Specifies the language into which the natural-language fields in the response from this service will be translated (see Accept-Language header for available language codes) |
currencyCode | string currency code for the currency in which to display pricing details |
Array of objects array of travel detail objects |
errorReference | string or null reference number of this error |
dateStamp | string or null timestamp of this response |
errorType | string or null code specifying the type of error |
errorCodes | Array of strings or null array of error codes pertaining to this error
|
errorMessage | Array of arrays or null or null array of error message strings |
errorName | string or null name of this type of error |
extraInfo | object or null ignore (Viator only) |
extraObject | object or null ignore (Viator only) |
success | boolean or null boolean indicator of this request's outcome
|
totalCount | integer or null number of results available for this service |
errorMessageText | string or null array of error message strings in plain text |
vmid | string or null unique numeric id of the server that processed this request |
object |
{- "currencyCode": "USD",
- "items": [
- {
- "travelDate": "2022-6-28",
- "productCode": "75659P1",
- "tourGradeCode": "TG1~05:30",
- "travellers": [
- {
- "bandId": 1
}, - {
- "bandId": 1
}
]
}
]
}
{- "errorReference": null,
- "data": {
- "rulesApplied": null,
- "promoCode": null,
- "itinerary": {
- "sortOrder": 0,
- "rulesApplied": null,
- "omniPreRuleList": null,
- "bookingStatus": {
- "status": 0,
- "text": "Waiting to be Booked",
- "type": "WAITING",
- "level": "ITINERARY",
- "confirmed": false,
- "pending": false,
- "amended": false,
- "cancelled": false,
- "failed": false
}, - "itemSummaries": [
- {
- "sortOrder": 0,
- "rulesApplied": null,
- "bookingStatus": {
- "status": 0,
- "text": "Waiting to be Booked",
- "type": "WAITING",
- "level": "ITEM",
- "failed": false,
- "confirmed": false,
- "amended": false,
- "pending": false,
- "cancelled": false
}, - "travellerAgeBands": [
- {
- "sortOrder": 0,
- "count": 1,
- "pluralDescription": "Adults",
- "description": "Adult",
- "ageBandId": 1
}
], - "voucherKey": "",
- "voucherURL": null,
- "voucherRequirements": "You can present either a paper or an electronic voucher for this activity.",
- "appleWalletURL": null,
- "productPulledDown": false,
- "merchantCancellable": true,
- "productWidgetList": null,
- "savingAmount": 0,
- "applePassSupported": false,
- "supplierName": "Big Bus Tours",
- "supplierPhoneNumber": "+1 123 456 7890",
- "vouchers": null,
- "passbooks": null,
- "termsAndConditions": null,
- "productCode": "5010SYDNEY",
- "travelDate": "2020-03-03",
- "tourGradeCode": "24HOUR",
- "distributorItemRef": null,
- "startingTime": null,
- "languageServicesLanguageCode": null,
- "price": 31.3,
- "leadTravellerSurname": null,
- "itineraryId": 1005847086,
- "productTitle": "Big Bus Sydney and Bondi Hop-on Hop-off Tour",
- "merchantNetPrice": 29.53,
- "priceFormatted": "$31.30",
- "destId": 357,
- "voucherOption": "VOUCHER_E",
- "itemId": 580659274,
- "barcodeOption": "perperson",
- "barcodeType": "qrcode",
- "departurePoint": "You may start this tour at any of the stops listed.",
- "departurePointAddress": null,
- "departurePointDirections": null,
- "leadTravellerFirstname": "",
- "rnplInfo": null,
- "obfsId": 31185,
- "leadTravellerTitle": null,
- "lastRetailPrice": 29.53,
- "savingAmountFormated": "$0.00",
- "pickupHotelName": null,
- "hoursConfirmed": 0,
- "lastRetailPriceFormatted": "$29.53",
- "tourGradeDescription": "24 Hour Classic Ticket (24HOUR)",
- "bookingEngineId": "UF",
- "merchantNetPriceFormatted": "$29.53",
- "departsFrom": "The Rocks, Australia",
- "pickupHotelId": null,
- "priceUSD": 31.3,
- "currencyCode": "USD"
}
], - "voucherURL": null,
- "securityToken": "595798ee27965d5178ab6a800f9b796ed7efac8fd303086e4113e1e99848932c",
- "paypalRedirectURL": null,
- "exchangeRate": 1,
- "itineraryId": 1005847086,
- "bookingDate": "2020-02-10",
- "voucherKey": "",
- "bookerEmail": null,
- "distributorRef": null,
- "totalPrice": 31.3,
- "totalPriceFormatted": "$31.30",
- "totalPriceUSD": 31.3,
- "hasVoucher": false,
- "userId": null,
- "currencyCode": "USD"
}, - "paymentGatewayInfo": null,
- "promoCodeValid": false,
- "promoCodeExpired": false,
- "itineraryFromPrice": 29.53,
- "itineraryFromPriceFormatted": "$29.53",
- "itineraryNewPrice": 29.53,
- "itineraryNewPriceFormatted": "$29.53",
- "itinerarySaving": 0,
- "itinerarySavingFormatted": "$0.00",
- "hasPromoCode": false,
- "currencyCode": "USD"
}, - "dateStamp": "2020-02-10T18:26:49+0000",
- "errorType": null,
- "errorCodes": [ ],
- "errorMessage": null,
- "errorName": null,
- "extraInfo": { },
- "extraObject": null,
- "success": true,
- "totalCount": 1,
- "errorMessageText": null,
- "vmid": "331003"
}
Get hotel pick-ups Lists the hotel pickups available for either a product or a destination
productCode | string Example: productCode=2280AAHT unique alphanumeric identifier of the product |
destId | integer Example: destId=123 unique numeric identifier of the destination |
Accept-Language required | string Example: en-US Specifies the language into which the natural-language fields in the response from this service will be translated (see Accept-Language header for available language codes) |
errorReference | string or null reference number of this error |
dateStamp | string or null timestamp of this response |
errorType | string or null code specifying the type of error |
errorCodes | Array of strings or null array of error codes pertaining to this error
|
errorMessage | Array of arrays or null or null array of error message strings |
errorName | string or null name of this type of error |
extraInfo | object or null ignore (Viator only) |
extraObject | object or null ignore (Viator only) |
success | boolean or null boolean indicator of this request's outcome
|
totalCount | integer or null number of results available for this service |
errorMessageText | string or null array of error message strings in plain text |
vmid | string or null unique numeric id of the server that processed this request |
Array of objects array of hotel pick-up objects |
{- "errorReference": null,
- "data": [
- {
- "sortOrder": 1,
- "destinationId": 123,
- "productCodes": null,
- "phone": "+1 123 456 7890",
- "city": "Hahndorf",
- "postcode": "5245",
- "latitude": -35.031216,
- "longitude": 138.81102,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "35 Main St",
- "name": "The Hahndorf Inn",
- "id": "1001419406"
}, - {
- "sortOrder": 2,
- "destinationId": 123,
- "productCodes": null,
- "phone": "+1 123 456 7890",
- "city": "Clare",
- "postcode": "5453",
- "latitude": -33.863453,
- "longitude": 138.61,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "Lot 112 Neagles Rock Road",
- "name": "Neagles Retreat Villas",
- "id": "10984108"
}, - {
- "sortOrder": 3,
- "destinationId": 123,
- "productCodes": [
- "56243P2",
- "56243P3",
- "56243P6"
], - "phone": "+1 123 456 7890",
- "city": "Clare",
- "postcode": "5453",
- "latitude": -33.831417,
- "longitude": 138.60942,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "310 Main North Rd",
- "name": "The Mill Apartments",
- "id": "11205163"
}, - {
- "sortOrder": 4,
- "destinationId": 123,
- "productCodes": [
- "200245P1",
- "200245P4",
- "200245P5",
- "200245P7",
- "201625P1",
- "215244P1",
- "233580P1",
- "233580P2",
- "233580P4",
- "238603P1"
], - "phone": "+1 123 456 7890",
- "city": "Reynella",
- "postcode": "5161",
- "latitude": -35.08964,
- "longitude": 138.53828,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "14 Bridge St, Old Reynella",
- "name": "St. Francis Winery",
- "id": "1255430"
}, - {
- "sortOrder": 5,
- "destinationId": 123,
- "productCodes": [
- "119946P4",
- "119946P5",
- "119946P6",
- "119946P8",
- "120684P2",
- "142696P2",
- "142696P5",
- "200245P1",
- "200245P4",
- "200245P5",
- "200245P7",
- "201625P1",
- "215244P1",
- "233580P1",
- "233580P2",
- "233580P4",
- "238603P1",
- "40887P5"
], - "phone": "+1 123 456 7890",
- "city": "Enfield",
- "postcode": "5094",
- "latitude": -34.845764,
- "longitude": 138.60115,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "Motel 574 Main North Rd",
- "name": "Adelaide Manor",
- "id": "1255431"
}, - {
- "sortOrder": 6,
- "destinationId": 123,
- "productCodes": [
- "119946P4",
- "119946P5",
- "119946P6",
- "119946P8",
- "120684P2",
- "142696P2",
- "142696P5",
- "200245P1",
- "200245P4",
- "200245P5",
- "200245P7",
- "201625P1",
- "215244P1",
- "233580P1",
- "233580P2",
- "233580P4",
- "238603P1",
- "40887P5"
], - "phone": "+1 123 456 7890",
- "city": "Enfield",
- "postcode": "5085",
- "latitude": -34.85016,
- "longitude": 138.60077,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "471 Main North Rd, ",
- "name": "Comfort Inn Manhattan",
- "id": "1255432"
}, - {
- "sortOrder": 7,
- "destinationId": 123,
- "productCodes": [
- "119946P4",
- "119946P5",
- "119946P6",
- "119946P8",
- "119946P9",
- "120684P2",
- "142696P2",
- "142696P5",
- "200245P1",
- "200245P4",
- "200245P5",
- "200245P7",
- "201625P1",
- "215244P1",
- "233580P1",
- "233580P2",
- "233580P4",
- "238603P1",
- "40887P5"
], - "phone": "+1 123 456 7890",
- "city": "Camden Park",
- "postcode": "5038",
- "latitude": -34.97334,
- "longitude": 138.54086,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "Morphettville Motor Inn 444 - 446 Anzac Hwy",
- "name": "Morphettville Motor Inn",
- "id": "1257946"
}, - {
- "sortOrder": 8,
- "destinationId": 123,
- "productCodes": [
- "119946P4",
- "119946P5",
- "119946P6",
- "119946P8",
- "119946P9",
- "120684P2",
- "120684P5",
- "142696P2",
- "142696P5",
- "200245P1",
- "200245P4",
- "200245P5",
- "200245P7",
- "201625P1",
- "215244P1",
- "233580P1",
- "233580P2",
- "233580P4",
- "238603P1",
- "40887P5"
], - "phone": "+1 123 456 7890",
- "city": "Medindie",
- "postcode": "5081",
- "latitude": -34.89378,
- "longitude": 138.60353,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "1 Nottage Tce, ",
- "name": "Comfort Inn Scottys",
- "id": "1257951"
}, - {
- "sortOrder": 9,
- "destinationId": 123,
- "productCodes": [
- "56243P2",
- "56243P3",
- "56243P6"
], - "phone": "+1 123 456 7890",
- "city": "Clare",
- "postcode": "5453",
- "latitude": -33.820854,
- "longitude": 138.61382,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "White Hut Road, ",
- "name": "Clare Country Club",
- "id": "1262285"
}, - {
- "sortOrder": 10,
- "destinationId": 123,
- "productCodes": [
- "56243P2",
- "56243P3",
- "56243P6"
], - "phone": "+1 123 456 7890",
- "city": "Clare",
- "postcode": "5453",
- "latitude": -33.848263,
- "longitude": 138.6178,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "74a Main North Rd, ",
- "name": "Clare Valley Motel",
- "id": "1262636"
}, - {
- "sortOrder": 11,
- "destinationId": 123,
- "productCodes": [
- "56243P2",
- "56243P3",
- "56243P6"
], - "phone": "+1 123 456 7890",
- "city": "Clare",
- "postcode": "5453",
- "latitude": -33.87362,
- "longitude": 138.6354,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "Quarry Rd, Sevenhill via Clare Valley",
- "name": "Thorn Park by the Vines",
- "id": "1289197"
}, - {
- "sortOrder": 12,
- "destinationId": 123,
- "productCodes": [
- "142696P5",
- "200245P1",
- "200245P4",
- "200245P5",
- "200245P7",
- "201625P1",
- "215244P1",
- "233580P1",
- "233580P2",
- "233580P4",
- "238603P1",
- "40887P5"
], - "phone": "+1 123 456 7890",
- "city": "West Lakes",
- "postcode": "5021",
- "latitude": -34.88005,
- "longitude": 138.48842,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "141 Brebner Dr",
- "name": "Lakes Hotel",
- "id": "1301167"
}, - {
- "sortOrder": 13,
- "destinationId": 123,
- "productCodes": [
- "200245P1",
- "200245P4",
- "200245P5",
- "200245P7",
- "201625P1",
- "215244P1",
- "233580P1",
- "233580P2",
- "233580P4",
- "238603P1"
], - "phone": "+1 123 456 7890",
- "city": "Largs Bay",
- "postcode": "5016",
- "latitude": -34.825584,
- "longitude": 138.4865,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "198 Esplanade",
- "name": "Largs Pier Hotel - Motel",
- "id": "1301173"
}, - {
- "sortOrder": 14,
- "destinationId": 123,
- "productCodes": [
- "119946P4",
- "119946P5",
- "119946P6",
- "119946P8",
- "119946P9",
- "120684P2",
- "120684P5",
- "142696P2",
- "142696P5",
- "196440P1",
- "19852P6",
- "200245P1",
- "200245P4",
- "200245P5",
- "200245P7",
- "201625P1",
- "21300P2",
- "215244P1",
- "233580P1",
- "233580P2",
- "233580P4",
- "238603P1",
- "40887P5",
- "40887P6",
- "65854P1",
- "65854P2",
- "65854P3",
- "65854P6",
- "6763ULTIMATE",
- "67705P1",
- "67705P2"
], - "phone": "+1 123 456 7890",
- "city": "Kent Town",
- "postcode": "5067",
- "latitude": -34.924698,
- "longitude": 138.6194,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "24 Dequetteville Tce",
- "name": "Adelaide Royal Coach",
- "id": "1301183"
}, - {
- "sortOrder": 15,
- "destinationId": 123,
- "productCodes": [
- "119946P4",
- "119946P5",
- "119946P6",
- "119946P8",
- "119946P9",
- "120684P2",
- "142696P2",
- "142696P5",
- "200245P1",
- "200245P4",
- "200245P5",
- "200245P7",
- "201625P1",
- "215244P1",
- "233580P1",
- "233580P2",
- "233580P4",
- "238603P1",
- "40887P5"
], - "phone": "+1 123 456 7890",
- "city": "Marion",
- "postcode": "5038",
- "latitude": -34.97743,
- "longitude": 138.55557,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "540 Marion Rd",
- "name": "Marion Motel and Apartments",
- "id": "1320631"
}, - {
- "sortOrder": 16,
- "destinationId": 123,
- "productCodes": null,
- "phone": "+1 123 456 7890",
- "city": "Glenelg",
- "postcode": "5045",
- "latitude": -34.97872,
- "longitude": 138.51253,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "17 Colley Tce, ",
- "name": "Glenelg Beachside Apartments",
- "id": "1579776"
}, - {
- "sortOrder": 17,
- "destinationId": 123,
- "productCodes": [
- "119946P4",
- "119946P5",
- "119946P6",
- "119946P8",
- "119946P9",
- "120684P2",
- "142696P2",
- "142696P5",
- "200245P1",
- "200245P4",
- "200245P5",
- "200245P7",
- "201625P1",
- "215244P1",
- "233580P1",
- "233580P2",
- "233580P4",
- "238603P1",
- "40887P5"
], - "phone": "+1 123 456 7890",
- "city": "Glen Osmond",
- "postcode": "5064",
- "latitude": -34.9604,
- "longitude": 138.64185,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "373 Glen Osmond Rd, ",
- "name": "Jacksons Motor Inn",
- "id": "1584919"
}, - {
- "sortOrder": 18,
- "destinationId": 123,
- "productCodes": [
- "119946P4",
- "119946P5",
- "119946P6",
- "119946P8",
- "120684P2",
- "142696P2",
- "142696P5",
- "200245P1",
- "200245P4",
- "200245P5",
- "200245P7",
- "201625P1",
- "215244P1",
- "233580P1",
- "233580P2",
- "233580P4",
- "238603P1",
- "40887P5"
], - "phone": "+1 123 456 7890",
- "city": "Prospect",
- "postcode": "5082",
- "latitude": -34.87285,
- "longitude": 138.60158,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "288-292 Main North Rd",
- "name": "Comfort Inn & Suites Sombrero",
- "id": "1589097"
}, - {
- "sortOrder": 19,
- "destinationId": 123,
- "productCodes": [
- "56243P2",
- "56243P3",
- "56243P6"
], - "phone": "+1 123 456 7890",
- "city": "Clare",
- "postcode": "5453",
- "latitude": -33.854675,
- "longitude": 138.62292,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "Warenda Road, ",
- "name": "Brice Hill Country Lodge",
- "id": "1626470"
}, - {
- "sortOrder": 20,
- "destinationId": 123,
- "productCodes": [
- "56243P2",
- "56243P3",
- "56243P6"
], - "phone": "+1 123 456 7890",
- "city": "Clare",
- "postcode": "",
- "latitude": -33.84362,
- "longitude": 138.63342,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "Clare Valley, ",
- "name": "Springfarm Cottage",
- "id": "1630042"
}, - {
- "sortOrder": 21,
- "destinationId": 123,
- "productCodes": [
- "142696P5",
- "200245P1",
- "200245P4",
- "200245P5",
- "200245P7",
- "201625P1",
- "215244P1",
- "233580P1",
- "233580P2",
- "233580P4",
- "238603P1",
- "40887P5"
], - "phone": "+1 123 456 7890",
- "city": "Gilles Plains",
- "postcode": "5086",
- "latitude": -34.852222,
- "longitude": 138.665,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "647 North East Rd, ",
- "name": "Highlander Hotel Bar Kitchen Rooftop",
- "id": "1633907"
}, - {
- "sortOrder": 22,
- "destinationId": 123,
- "productCodes": [
- "119946P4",
- "119946P5",
- "119946P6",
- "119946P8",
- "119946P9",
- "120684P2",
- "120684P5",
- "142696P2",
- "142696P5",
- "200245P1",
- "200245P4",
- "200245P5",
- "200245P7",
- "201625P1",
- "215244P1",
- "233580P1",
- "233580P2",
- "233580P4",
- "238603P1",
- "40887P5"
], - "phone": "+1 123 456 7890",
- "city": "Frewville",
- "postcode": "5063",
- "latitude": -34.95136,
- "longitude": 138.63423,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "277 Glen Osmond Road, ",
- "name": "Welcome Inn 277",
- "id": "1661623"
}, - {
- "sortOrder": 23,
- "destinationId": 123,
- "productCodes": [
- "56243P2",
- "56243P3",
- "56243P6"
], - "phone": "+1 123 456 7890",
- "city": "Clare",
- "postcode": "5453",
- "latitude": -33.829445,
- "longitude": 138.60802,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "325 Main North Rd, ",
- "name": "Comfort Inn Clare Central",
- "id": "1729496"
}, - {
- "sortOrder": 24,
- "destinationId": 123,
- "productCodes": [
- "200245P4"
], - "phone": "+1 123 456 7890",
- "city": "Normanville",
- "postcode": "5204",
- "latitude": -35.46194,
- "longitude": 138.31508,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "73 St Andrews Bvd, ",
- "name": "Links Lady Bay Resort",
- "id": "1803904"
}, - {
- "sortOrder": 25,
- "destinationId": 123,
- "productCodes": [
- "119946P4",
- "119946P5",
- "119946P6",
- "119946P8",
- "119946P9",
- "120684P2",
- "142696P2",
- "142696P5",
- "200245P1",
- "200245P4",
- "200245P5",
- "200245P7",
- "201625P1",
- "21300P1",
- "21300P7",
- "21300P9",
- "215244P1",
- "233580P1",
- "233580P2",
- "233580P4",
- "238603P1",
- "40887P5"
], - "phone": "+1 123 456 7890",
- "city": "Brooklyn Park",
- "postcode": "5032",
- "latitude": -34.93242,
- "longitude": 138.5395,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "406 Sir Donald Bradman Dr, ",
- "name": "Adelaide Airport Motel",
- "id": "2076447"
}, - {
- "sortOrder": 26,
- "destinationId": 123,
- "productCodes": [
- "142696P5",
- "200245P1",
- "200245P4",
- "200245P5",
- "200245P7",
- "201625P1",
- "215244P1",
- "233580P1",
- "233580P2",
- "233580P4",
- "238603P1"
], - "phone": "+1 123 456 7890",
- "city": "Mawson Lakes",
- "postcode": "5095",
- "latitude": -34.80973,
- "longitude": 138.61734,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "10 Main St",
- "name": "Mawson Lakes Hotel",
- "id": "2122469"
}, - {
- "sortOrder": 27,
- "destinationId": 123,
- "productCodes": [
- "142696P5",
- "200245P1",
- "200245P4",
- "200245P5",
- "200245P7",
- "201625P1",
- "215244P1",
- "233580P1",
- "233580P2",
- "233580P4",
- "238603P1",
- "40887P5"
], - "phone": "+1 123 456 7890",
- "city": "Gilles Plains",
- "postcode": "5086",
- "latitude": -34.85213,
- "longitude": 138.6651,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "647 North East Rd, ",
- "name": "Comfort Inn Riverfront Berriedale",
- "id": "2218971"
}, - {
- "sortOrder": 28,
- "destinationId": 123,
- "productCodes": [
- "56243P2",
- "56243P3",
- "56243P6"
], - "phone": "+1 123 456 7890",
- "city": "Clare",
- "postcode": "5453",
- "latitude": -33.856297,
- "longitude": 138.62358,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "72 Warenda Rd",
- "name": "St Helens Country Cottages",
- "id": "2453318"
}, - {
- "sortOrder": 29,
- "destinationId": 123,
- "productCodes": [
- "21300P1",
- "21300P11",
- "21300P14",
- "21300P6",
- "21300P7",
- "21300P9"
], - "phone": "+1 123 456 7890",
- "city": null,
- "postcode": "5006",
- "latitude": -34.904903,
- "longitude": 138.5927,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "190 Gover St, ",
- "name": "North Adelaide Boutique Stays Accommodation",
- "id": "2479967"
}, - {
- "sortOrder": 30,
- "destinationId": 123,
- "productCodes": [
- "119946P4",
- "119946P5",
- "119946P6",
- "119946P8",
- "119946P9",
- "120684P2",
- "120684P5",
- "142696P2",
- "142696P5",
- "200245P1",
- "200245P4",
- "200245P5",
- "200245P7",
- "201625P1",
- "215244P1",
- "233580P1",
- "233580P2",
- "233580P4",
- "238603P1",
- "40887P5",
- "6763ULTIMATE"
], - "phone": "+1 123 456 7890",
- "city": "Frewville",
- "postcode": "5063",
- "latitude": -34.94779,
- "longitude": 138.62839,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "199 Glen Osmond Rd, ",
- "name": "Frewville Motor Inn",
- "id": "2482535"
}, - {
- "sortOrder": 31,
- "destinationId": 123,
- "productCodes": [
- "119946P4",
- "119946P5",
- "119946P6",
- "119946P8",
- "119946P9",
- "120684P2",
- "120684P5",
- "142696P2",
- "142696P5",
- "200245P1",
- "200245P4",
- "200245P5",
- "200245P7",
- "201625P1",
- "215244P1",
- "233580P1",
- "233580P2",
- "233580P4",
- "238603P1",
- "40887P5"
], - "phone": "+1 123 456 7890",
- "city": "Glenunga",
- "postcode": "5064",
- "latitude": -34.94681,
- "longitude": 138.6427,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "493 Portrush Rd",
- "name": "Best Western Adelaide Granada Motor Inn",
- "id": "2501758"
}, - {
- "sortOrder": 32,
- "destinationId": 123,
- "productCodes": [
- "142696P5",
- "200245P1",
- "200245P4",
- "200245P5",
- "200245P7",
- "201625P1",
- "21300P10",
- "215244P1",
- "233580P1",
- "233580P2",
- "233580P4",
- "238603P1"
], - "phone": "+1 123 456 7890",
- "city": "Mawson Lakes",
- "postcode": "5095",
- "latitude": -34.806805,
- "longitude": 138.61667,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "33 - 37 Main St",
- "name": "Quest Mawson Lakes",
- "id": "2575802"
}, - {
- "sortOrder": 33,
- "destinationId": 123,
- "productCodes": [
- "142696P5",
- "200245P1",
- "200245P4",
- "200245P5",
- "200245P7",
- "201625P1",
- "215244P1",
- "233580P1",
- "233580P2",
- "233580P4",
- "238603P1",
- "40887P5"
], - "phone": "+1 123 456 7890",
- "city": "Pooraka",
- "postcode": "5095",
- "latitude": -34.82837,
- "longitude": 138.61504,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "859 Main North Rd, ",
- "name": "Pavlos Motel",
- "id": "2628301"
}, - {
- "sortOrder": 34,
- "destinationId": 123,
- "productCodes": null,
- "phone": "+1 123 456 7890",
- "city": "Penola",
- "postcode": "5277",
- "latitude": -37.381992,
- "longitude": 140.83783,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "23-25 Church St, ",
- "name": "Alexander Cameron Suites",
- "id": "2640160"
}, - {
- "sortOrder": 35,
- "destinationId": 123,
- "productCodes": null,
- "phone": "+1 123 456 7890",
- "city": "Clare",
- "postcode": "5453",
- "latitude": -33.82023,
- "longitude": 138.58174,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "151 St Georges Tce",
- "name": "Patly Hill Farm",
- "id": "2773041"
}, - {
- "sortOrder": 36,
- "destinationId": 123,
- "productCodes": [
- "200245P4"
], - "phone": "+1 123 456 7890",
- "city": "Stansbury",
- "postcode": "5582",
- "latitude": -34.91078,
- "longitude": 137.79254,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "corner of South & West Terrace, ",
- "name": "Oyster Court Motel & Holiday Units",
- "id": "2774580"
}, - {
- "sortOrder": 37,
- "destinationId": 123,
- "productCodes": [
- "119946P4",
- "119946P5",
- "119946P6",
- "119946P8",
- "119946P9",
- "120684P2",
- "142696P2",
- "142696P5",
- "200245P1",
- "200245P4",
- "200245P5",
- "200245P7",
- "201625P1",
- "215244P1",
- "233580P1",
- "233580P2",
- "233580P4",
- "238603P1",
- "40887P5"
], - "phone": "+1 123 456 7890",
- "city": "Tonsley",
- "postcode": "5042",
- "latitude": -35.00457,
- "longitude": 138.5747,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "1274 South Rd, Adelaide",
- "name": "Tonsley Hotel Motel",
- "id": "2786536"
}, - {
- "sortOrder": 38,
- "destinationId": 123,
- "productCodes": [
- "119946P4",
- "119946P5",
- "119946P6",
- "119946P8",
- "120684P2",
- "142696P2",
- "142696P5",
- "200245P1",
- "200245P4",
- "200245P5",
- "200245P7",
- "201625P1",
- "215244P1",
- "233580P1",
- "233580P2",
- "233580P4",
- "238603P1",
- "40887P5"
], - "phone": "+1 123 456 7890",
- "city": "Woodville Park",
- "postcode": "5011",
- "latitude": -34.87638,
- "longitude": 138.54959,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "445 Torrens Rd, ",
- "name": "Lindy Lodge Motel",
- "id": "2853212"
}, - {
- "sortOrder": 39,
- "destinationId": 123,
- "productCodes": [
- "119946P4",
- "119946P5",
- "119946P6",
- "119946P8",
- "120684P2",
- "142696P2",
- "142696P5",
- "200245P1",
- "200245P4",
- "200245P5",
- "200245P7",
- "201625P1",
- "215244P1",
- "233580P1",
- "233580P2",
- "233580P4",
- "238603P1",
- "40887P5"
], - "phone": "+1 123 456 7890",
- "city": "Burnside",
- "postcode": "5066",
- "latitude": -34.93765,
- "longitude": 138.66063,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "516 Glynburn Rd",
- "name": "The Feathers Hotel",
- "id": "3002527"
}, - {
- "sortOrder": 40,
- "destinationId": 123,
- "productCodes": [
- "119946P4",
- "119946P5",
- "119946P6",
- "119946P8",
- "119946P9",
- "120684P2",
- "142696P2",
- "142696P5",
- "200245P1",
- "200245P4",
- "200245P5",
- "200245P7",
- "201625P1",
- "215244P1",
- "233580P1",
- "233580P2",
- "233580P4",
- "238603P1",
- "40887P5"
], - "phone": "+1 123 456 7890",
- "city": "Glen Osmond",
- "postcode": "5064",
- "latitude": -34.9643,
- "longitude": 138.6466,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "20 Mount Barker Rd, (Corner Gill Terrace)",
- "name": "Tollgate Motel",
- "id": "3235180"
}, - {
- "sortOrder": 41,
- "destinationId": 123,
- "productCodes": [
- "56243P2",
- "56243P3",
- "56243P6"
], - "phone": "+1 123 456 7890",
- "city": "Clare",
- "postcode": "5453",
- "latitude": -33.846573,
- "longitude": 138.62152,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "9 Warenda Rd, ",
- "name": "Riesling Trail and Clare Valley Cottages",
- "id": "3240942"
}, - {
- "sortOrder": 42,
- "destinationId": 123,
- "productCodes": [
- "56243P2",
- "56243P3",
- "56243P6"
], - "phone": "+1 123 456 7890",
- "city": "Clare",
- "postcode": "5453",
- "latitude": -33.90826,
- "longitude": 138.6238,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "Sevenhill, ",
- "name": "Skillogalee Cottages",
- "id": "3281019"
}, - {
- "sortOrder": 43,
- "destinationId": 123,
- "productCodes": null,
- "phone": "+1 123 456 7890",
- "city": "Clare",
- "postcode": "5453",
- "latitude": -33.835503,
- "longitude": 138.61389,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "191 Main North Rd, ",
- "name": "Bentleys Hotel Motel",
- "id": "3516966"
}, - {
- "sortOrder": 44,
- "destinationId": 123,
- "productCodes": null,
- "phone": "+1 123 456 7890",
- "city": "Clare",
- "postcode": "5453",
- "latitude": -33.866726,
- "longitude": 138.59903,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "220 Spring Gully Rd, ",
- "name": "Clare View Accommodation",
- "id": "3668974"
}, - {
- "sortOrder": 45,
- "destinationId": 123,
- "productCodes": [
- "119946P4",
- "119946P5",
- "119946P6",
- "119946P8",
- "120684P2",
- "142696P2",
- "142696P5",
- "200245P1",
- "200245P4",
- "200245P5",
- "200245P7",
- "201625P1",
- "215244P1",
- "233580P1",
- "233580P2",
- "233580P4",
- "238603P1",
- "40887P5"
], - "phone": "+1 123 456 7890",
- "city": "Enfield",
- "postcode": "5085",
- "latitude": -34.86265,
- "longitude": 138.60156,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "Motel 393 Main North Rd",
- "name": "Enfield Motel",
- "id": "4257826"
}, - {
- "sortOrder": 46,
- "destinationId": 123,
- "productCodes": [
- "56243P2",
- "56243P3",
- "56243P6"
], - "phone": "+1 123 456 7890",
- "city": "Clare",
- "postcode": "5453",
- "latitude": -33.864716,
- "longitude": 138.62134,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "Lot 136 Main North Road",
- "name": "Discovery Parks - Clare",
- "id": "4345469"
}, - {
- "sortOrder": 47,
- "destinationId": 123,
- "productCodes": [
- "200245P4"
], - "phone": "+1 123 456 7890",
- "city": "Stansbury",
- "postcode": "5582",
- "latitude": -34.903656,
- "longitude": 137.79562,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "16-28 Adelaide Rd",
- "name": "Stansbury Holiday Motel",
- "id": "4856431"
}, - {
- "sortOrder": 48,
- "destinationId": 123,
- "productCodes": [
- "181322P2"
], - "phone": "+1 123 456 7890",
- "city": "Brighton",
- "postcode": "5048",
- "latitude": -35.01719,
- "longitude": 138.51463,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "135 Esplanade, cnr Jetty Rd",
- "name": "Esplanade Hotel Adelaide",
- "id": "4861044"
}, - {
- "sortOrder": 49,
- "destinationId": 123,
- "productCodes": [
- "56243P2",
- "56243P3",
- "56243P6"
], - "phone": "+1 123 456 7890",
- "city": "Clare",
- "postcode": "5034",
- "latitude": -33.78769,
- "longitude": 138.60567,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "off Gaelic Cemetery Road, Stanley Flat",
- "name": "Wuthering Heights",
- "id": "4971218"
}, - {
- "sortOrder": 50,
- "destinationId": 123,
- "productCodes": [
- "56243P2",
- "56243P3",
- "56243P6"
], - "phone": "+1 123 456 7890",
- "city": "Clare",
- "postcode": "5453",
- "latitude": -33.7714,
- "longitude": 138.5837,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "431 Bungaree Road, (Off Highway B82)",
- "name": "Bungaree Station",
- "id": "5004100"
}, - {
- "sortOrder": 51,
- "destinationId": 123,
- "productCodes": [
- "56243P2",
- "56243P3",
- "56243P6"
], - "phone": "+1 123 456 7890",
- "city": "Clare",
- "postcode": "5453",
- "latitude": -33.83657,
- "longitude": 138.61197,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "18 Victoria Rd",
- "name": "Clare Valley Heritage Retreat",
- "id": "6029450"
}, - {
- "sortOrder": 52,
- "destinationId": 123,
- "productCodes": null,
- "phone": "+1 123 456 7890",
- "city": "Clare",
- "postcode": "5453",
- "latitude": -33.83995,
- "longitude": 138.61311,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "29 Hope St",
- "name": "The Reserve Apartment",
- "id": "6461957"
}, - {
- "sortOrder": 53,
- "destinationId": 123,
- "productCodes": [
- "119946P4",
- "119946P5",
- "119946P6",
- "119946P8",
- "119946P9",
- "120684P2",
- "120684P5",
- "142696P2",
- "142696P5",
- "200245P1",
- "200245P4",
- "200245P5",
- "200245P7",
- "201625P1",
- "215244P1",
- "233580P1",
- "233580P2",
- "233580P4",
- "238603P1",
- "40887P5"
], - "phone": "+1 123 456 7890",
- "city": "Walkerville",
- "postcode": "5081",
- "latitude": -34.896725,
- "longitude": 138.61743,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "The Watson 33 Warwick St",
- "name": "The Watson Adelaide - Art Series",
- "id": "7755816"
}, - {
- "sortOrder": 54,
- "destinationId": 123,
- "productCodes": null,
- "phone": "+1 123 456 7890",
- "city": "Moana",
- "postcode": "5169",
- "latitude": -35.19921,
- "longitude": 138.47296,
- "notes": null,
- "brand": null,
- "hotelString": null,
- "address": "Moana Tourist Park 44 Nashwauk Cres",
- "name": "Moana Beach Tourist Park",
- "id": "7870501"
}
], - "dateStamp": "2020-02-10T18:33:02+0000",
- "errorType": null,
- "errorCodes": [ ],
- "errorMessage": null,
- "errorName": null,
- "extraInfo": { },
- "extraObject": null,
- "success": true,
- "totalCount": 1,
- "errorMessageText": null,
- "vmid": "331004"
}
Make a booking
Note:
totalPrice
element in the response from this endpoint.For more information, see:
Accept-Language required | string Example: en-US Specifies the language into which the natural-language fields in the response from this service will be translated (see Accept-Language header for available language codes) |
demo | boolean specifier: |
currencyCode | string currency code for the currency the booking will be submitted in (you will be billed in this currency) |
object Applicable only for extra partner detail for either partner or merchant partner for sending partner specific information | |
object object containing details about the primary contact (note: this contact needn't be a traveller) | |
Array of objects array of items to be booked |
errorReference | string or null reference number of this error |
dateStamp | string or null timestamp of this response |
errorType | string or null code specifying the type of error |
errorCodes | Array of strings or null array of error codes pertaining to this error
|
errorMessage | Array of arrays or null or null array of error message strings |
errorName | string or null name of this type of error |
extraInfo | object or null ignore (Viator only) |
extraObject | object or null ignore (Viator only) |
success | boolean or null boolean indicator of this request's outcome
|
totalCount | integer or null number of results available for this service |
errorMessageText | string or null array of error message strings in plain text |
vmid | string or null unique numeric id of the server that processed this request |
object |
{- "demo": true,
- "currencyCode": "USD",
- "partnerDetail": {
- "distributorRef": "distributorRef100000"
}, - "booker": {
- "email": "apitest@viator.com",
- "homePhone": "+61 8 83798517",
- "firstname": "Homer test",
- "surname": "Simpson test",
- "title": "Mr",
- "cellPhoneCountryCode": "+61",
- "cellPhone": "0411041041"
}, - "items": [
- {
- "partnerItemDetail": {
- "distributorItemRef": "itemRef1000000"
}, - "hotelId": "1091770",
- "pickupPoint": null,
- "travelDate": "2020-12-31",
- "productCode": "2280AAHT",
- "tourGradeCode": "TG1~08:00",
- "languageOptionCode": "en/SERVICE_GUIDE",
- "bookingQuestionAnswers": [
- {
- "questionId": 23,
- "answer": "70 kgs"
}
], - "specialRequirements": "",
- "travellers": [
- {
- "bandId": 1,
- "firstname": "Homer test",
- "surname": "Simpson test",
- "title": "Mr",
- "leadTraveller": true
}
]
}
]
}
{- "errorReference": null,
- "data": {
- "sortOrder": 0,
- "rulesApplied": null,
- "omniPreRuleList": null,
- "bookingStatus": {
- "status": 3,
- "text": "Confirmed",
- "type": "CONFIRMED",
- "level": "ITINERARY",
- "confirmed": true,
- "pending": false,
- "amended": false,
- "cancelled": false,
- "failed": false
}, - "itemSummaries": [
- {
- "sortOrder": 0,
- "rulesApplied": null,
- "bookingStatus": {
- "status": 1,
- "text": "Paid & Confirmed",
- "type": "CONFIRMED",
- "level": "ITEM",
- "failed": false,
- "confirmed": true,
- "amended": false,
- "pending": false,
- "cancelled": false
}, - "travellerAgeBands": [
- {
- "sortOrder": 0,
- "count": 1,
- "pluralDescription": "Adults",
- "description": "Adult",
- "ageBandId": 1
}
], - "voucherKey": "1005851866:4af44c13ecf3f1a7d3f9ef2fc00c2257e08fa42ae20f877f3039ff9b52aba24e:580669678",
- "voucherRequirements": "You can present either a paper or an electronic voucher for this activity.",
- "appleWalletURL": null,
- "productPulledDown": false,
- "merchantCancellable": true,
- "productWidgetList": null,
- "savingAmount": 0,
- "applePassSupported": false,
- "supplierName": "Sundance Helicopters",
- "supplierPhoneNumber": "+1 123 456 7890",
- "vouchers": null,
- "passbooks": null,
- "termsAndConditions": null,
- "merchantTermsAndConditions": {
- "termsAndConditions": "For a full refund, cancel at least 24 hours in advance of the start date of the experience.",
- "merchantTermsAndConditionsType": 1,
- "amountRefundable": "USD 412.04",
- "cancellationFromTourDate": [
- {
- "dayRangeMin": 1,
- "dayRangeMax": null,
- "percentageRefundable": 100,
- "policyStartTimestamp": null,
- "policyEndTimestamp": 1585580400
}, - {
- "dayRangeMin": 0,
- "dayRangeMax": 1,
- "percentageRefundable": 0,
- "policyStartTimestamp": 1585580400,
- "policyEndTimestamp": 1585666800
}
]
}, - "productCode": "2280AAHT",
- "travelDate": "2020-03-31",
- "tourGradeCode": "TG1~08:00",
- "distributorItemRef": "itemRef1000000",
- "startingTime": "8:00 AM",
- "languageServicesLanguageCode": "en",
- "price": 412.04,
- "leadTravellerSurname": "Simpson test",
- "itineraryId": 1005851866,
- "productTitle": "Grand Canyon All-American Helicopter Tour",
- "merchantNetPrice": 388.72,
- "priceFormatted": "$412.04",
- "destId": 684,
- "voucherOption": "VOUCHER_E",
- "itemId": 580669678,
- "barcodeOption": "tour",
- "barcodeType": "code128",
- "departurePoint": "Traveler pickup is offered<br><br>",
- "departurePointAddress": null,
- "departurePointDirections": null,
- "leadTravellerFirstname": "Homer test",
- "rnplInfo": null,
- "obfsId": 362208,
- "leadTravellerTitle": "Mr",
- "lastRetailPrice": 388.72,
- "savingAmountFormated": "$0.00",
- "pickupHotelName": "null",
- "hoursConfirmed": 0,
- "lastRetailPriceFormatted": "$388.72",
- "tourGradeDescription": "Morning Departure; A-Star 08:00 (TG1~08:00)",
- "bookingEngineId": "FO",
- "merchantNetPriceFormatted": "$388.72",
- "departsFrom": "Las Vegas, United States",
- "pickupHotelId": null,
- "priceUSD": 412.04,
- "currencyCode": "USD"
}
], - "securityToken": "4af44c13ecf3f1a7d3f9ef2fc00c2257e08fa42ae20f877f3039ff9b52aba24e",
- "paypalRedirectURL": null,
- "exchangeRate": 1,
- "itineraryId": 1005851866,
- "bookingDate": "2020-02-11",
- "voucherKey": "1005851866:4af44c13ecf3f1a7d3f9ef2fc00c2257e08fa42ae20f877f3039ff9b52aba24e",
- "bookerEmail": "apitest@viator.com",
- "distributorRef": "distributorRef100000",
- "totalPrice": 412.04,
- "totalPriceFormatted": "$412.04",
- "totalPriceUSD": 412.04,
- "hasVoucher": true,
- "userId": null,
- "currencyCode": "USD"
}, - "dateStamp": "2020-02-11T16:55:47+0000",
- "errorType": null,
- "errorCodes": [ ],
- "errorMessage": null,
- "errorName": null,
- "extraInfo": { },
- "extraObject": null,
- "success": true,
- "totalCount": 1,
- "errorMessageText": null,
- "vmid": "331003"
}
Get the booking status for multiple items based on different criteria
This service:
Exceeding the rate limit
test
to true
to bypass this limit:{
"data": null
"vmid": 221002
"errorMessage": ["Access allowed every 30 minutes"]
"errorType": "EXCEPTION"
"dateStamp": "2013-03-26T10:28:51+0000"
"errorReference": 55315512721712161381352771
"errorMessageText": ["Access allowed every 30 minutes"]
"success": false
"totalCount": 1
"errorName": "PollingDeniedException"
}
Accept-Language required | string Example: en-US Specifies the language into which the natural-language fields in the response from this service will be translated (see Accept-Language header for available language codes) |
bookingDateFrom | string earliest date for this booking (must be in the future) |
bookingDateTo | string latest date for this booking (must be in the future) |
itemIds | Array of integers array of item identifiers to check |
distributorRefs | Array of strings array of partner-defined distributor reference identifiers |
distributorItemRefs | Array of strings array of partner-defined distributor item reference identifiers e.g. |
leadFirstName | string first name of the lead traveler |
leadSurname | string surname of the lead traveler |
test | boolean specifier:
|
errorReference | string or null reference number of this error |
dateStamp | string or null timestamp of this response |
errorType | string or null code specifying the type of error |
errorCodes | Array of strings or null array of error codes pertaining to this error
|
errorMessage | Array of arrays or null or null array of error message strings |
errorName | string or null name of this type of error |
extraInfo | object or null ignore (Viator only) |
extraObject | object or null ignore (Viator only) |
success | boolean or null boolean indicator of this request's outcome
|
totalCount | integer or null number of results available for this service |
errorMessageText | string or null array of error message strings in plain text |
vmid | string or null unique numeric id of the server that processed this request |
object object containing booking status and details |
{- "bookingDateFrom": "2020-12-21",
- "bookingDateTo": "2020-12-31",
- "test": true
}
{- "errorReference": null,
- "data": [
- {
- "sortOrder": 1,
- "bookingStatus": {
- "status": 3,
- "text": "Confirmed",
- "type": "CONFIRMED",
- "level": "ITINERARY",
- "failed": false,
- "confirmed": true,
- "amended": false,
- "pending": false,
- "cancelled": false
}, - "itemSummaries": [
- {
- "sortOrder": 0,
- "bookingStatus": {
- "status": 1,
- "text": "Paid & Confirmed",
- "type": "CONFIRMED",
- "level": "ITEM",
- "failed": false,
- "confirmed": true,
- "amended": false,
- "pending": false,
- "cancelled": false
}, - "travelDate": "2020-03-31",
- "distributorItemRef": "itemRef1000000",
- "itineraryId": 1005851866,
- "itemId": 580669678
}
], - "itineraryId": 1005851866,
- "bookingDate": "2020-02-11",
- "distributorRef": "distributorRef100000"
}
], - "dateStamp": "2020-02-11T18:38:25+0000",
- "errorType": null,
- "errorCodes": [ ],
- "errorMessage": null,
- "errorName": null,
- "extraInfo": { },
- "extraObject": null,
- "success": true,
- "totalCount": 1,
- "errorMessageText": null,
- "vmid": "331004"
}
Get brief booking statuses
This service is similar to /booking/status in that it:
However, it differs in that it returns a multi-item array of booking items with less detail than what would be received from /booking/status.
Accept-Language required | string Example: en-US Specifies the language into which the natural-language fields in the response from this service will be translated (see Accept-Language header for available language codes) |
bookingDateFrom | string earliest date for when the booking(s) in question were made (must be in the future) |
bookingDateTo | string latest date for when the booking(s) in question were made (must be in the future) |
itemIds | Array of integers array of booking-reference numbers to check |
distributorRefs | Array of strings array of partner-defined distributor reference identifiers |
distributorItemRefs | Array of strings array of partner-defined distributor item reference identifiers e.g. |
leadFirstName | string first name of the lead traveler |
leadSurname | string surname of the lead traveler |
test | boolean specifier:
|
errorReference | string or null reference number of this error |
dateStamp | string or null timestamp of this response |
errorType | string or null code specifying the type of error |
errorCodes | Array of strings or null array of error codes pertaining to this error
|
errorMessage | Array of arrays or null or null array of error message strings |
errorName | string or null name of this type of error |
extraInfo | object or null ignore (Viator only) |
extraObject | object or null ignore (Viator only) |
success | boolean or null boolean indicator of this request's outcome
|
totalCount | integer or null number of results available for this service |
errorMessageText | string or null array of error message strings in plain text |
vmid | string or null unique numeric id of the server that processed this request |
Array of objects array containing item ids and their associated booking status object |
{- "bookingDateFrom": "2020-12-21",
- "bookingDateTo": "2020-12-31",
- "test": true
}
{- "errorReference": null,
- "data": [
- {
- "itemId": 580669678,
- "bookingStatus": {
- "status": 1,
- "text": "Paid & Confirmed",
- "type": "CONFIRMED",
- "level": "ITEM",
- "confirmed": true,
- "amended": false,
- "failed": false,
- "pending": false,
- "cancelled": false
}, - "distributorItemRef": "itemRef1000000"
}
], - "dateStamp": "2020-02-11T19:03:06+0000",
- "errorType": null,
- "errorCodes": [ ],
- "errorMessage": null,
- "errorName": null,
- "extraInfo": { },
- "extraObject": null,
- "success": true,
- "totalCount": 1,
- "vmid": "331001",
- "errorMessageText": null
}
Get the pricing matrix for tour-grades, product age bands and pax mixes
For more information, see: Get the tour-grade pricing matrix
Accept-Language required | string Example: en-US Specifies the language into which the natural-language fields in the response from this service will be translated (see Accept-Language header for available language codes) |
productCode | string unique alphanumeric identifier of the product for which to retrieve the pricing matrix |
tourGradeCode | string alphanumeric identifier of the product tour grade for which to retrieve the pricing matrix |
bookingDate | string date for which to retrieve pricing data (must be in the future) (note: this is an optional parameter for normal products; if the date is not provided then the nearest available date is determined) |
currencyCode | string currency code of the currency in which to display pricing information |
errorReference | string or null reference number of this error |
dateStamp | string or null timestamp of this response |
errorType | string or null code specifying the type of error |
errorCodes | Array of strings or null array of error codes pertaining to this error
|
errorMessage | Array of arrays or null or null array of error message strings |
errorName | string or null name of this type of error |
extraInfo | object or null ignore (Viator only) |
extraObject | object or null ignore (Viator only) |
success | boolean or null boolean indicator of this request's outcome
|
totalCount | integer or null number of results available for this service |
errorMessageText | string or null array of error message strings in plain text |
vmid | string or null unique numeric id of the server that processed this request |
Array of objects |
{- "productCode": "5010SYDNEY",
- "tourGradeCode": "24HOUR",
- "bookingDate": "2020-12-12",
- "currencyCode": "EUR"
}
{- "errorReference": null,
- "data": [
- {
- "sortOrder": 1,
- "pricingUnit": "per person",
- "bookingDate": "2020-03-11",
- "ageBandPrices": [
- {
- "bandId": 1,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "EUR",
- "price": 33.35,
- "merchantNetPrice": 26.64,
- "priceFormatted": "€33,35",
- "merchantNetPriceFormatted": "€26,64",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 1,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}, - {
- "bandId": 2,
- "prices": [
- {
- "sortOrder": 1,
- "currencyCode": "EUR",
- "price": 22.61,
- "merchantNetPrice": 18.06,
- "priceFormatted": "€22,61",
- "merchantNetPriceFormatted": "€18,06",
- "minNoOfTravellersRequiredForPrice": 1
}
], - "sortOrder": 2,
- "minimumCountRequired": 0,
- "maximumCountRequired": 9
}
]
}
], - "dateStamp": "2020-02-11T16:21:23+0000",
- "errorType": null,
- "errorCodes": [ ],
- "errorMessage": null,
- "errorName": null,
- "extraInfo": { },
- "extraObject": null,
- "success": true,
- "totalCount": 1,
- "errorMessageText": null,
- "vmid": "331003"
}
Get voucher details
Sample query parameters
or
leadLastName | string Example: leadLastName=Simpson surname of this lead traveler |
itemId | integer Example: itemId=600033670 Booking-reference number generated by Viator
|
embeddedResources | boolean Example: embeddedResources=false ignore (Viator only) |
voucherKey | string Example: voucherKey=3299307:93c7f36a56b18ba1068787ba7fb7988da5c8ad08db77604110141ff21498603e:600033670 identifier for the voucher
|
fullHTML | boolean Example: fullHTML=true specifier:
|
mobileVoucher | boolean Example: mobileVoucher=true specifier:
|
Accept-Language required | string Example: en-US Specifies the language into which the natural-language fields in the response from this service will be translated (see Accept-Language header for available language codes) |
errorReference | string or null reference number of this error |
dateStamp | string or null timestamp of this response |
errorType | string or null code specifying the type of error |
errorCodes | Array of strings or null array of error codes pertaining to this error
|
errorMessage | Array of arrays or null or null array of error message strings |
errorName | string or null name of this type of error |
extraInfo | object or null ignore (Viator only) |
extraObject | object or null ignore (Viator only) |
success | boolean or null boolean indicator of this request's outcome
|
totalCount | integer or null number of results available for this service |
errorMessageText | string or null array of error message strings in plain text |
vmid | string or null unique numeric id of the server that processed this request |
data | string HTML-formatted voucher content |
{- "errorReference": null,
- "data": "\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n <head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width\" />\n <title>Viator</title>\n </head>\n <body>\n <div id=\"content\" class=\"voucher_box\">\n <div id=\"voucher_1\">\n\n <div class=\"section\">\n <div class=\"voucher_title\">\n Voucher 1\n of 1: Homer test Simpson test\n </div>\n </div>\n\n <div class=\"section bline\">\n <div class=\"btn_box\">\n </div>\n </div>\n\n <div style=\"line-height: 1.5;font-family:'Arial','Helvetica','Verdana',sans-serif; font-size: 12px; padding: 0 10px; border-bottom: 1px solid #CAE2EA;\">\n\n <h2 style=\"font-size:16px;font-weight:bold;margin:0.5em 0;padding:0;\">\n Grand Canyon All-American Helicopter Tour\n <span style=\"display: block;font-size:12px;\">\n Morning Departure; A-Star 08:00\n </span>\n </h2>\n\n <div class=\"barcode\">\n <img src=\"/voucher/resource?type=barcode&itineraryItemId=580669678&voucherToken=4af44c13ecf3f1a7d3f9ef2fc00c2257e08fa42ae20f877f3039ff9b52aba24e\" alt=\"\"/>\n </div>\n\n <h2 style=\"font-size:16px;font-weight:bold;margin:0.5em 0;padding:0;\">SAMPLE ONLY</h2>\n\n <ul style=\"margin:0 0 1em 1em; padding:0;\">\n <li>\n <strong>Date:</strong>\n Tuesday March 31, 2020\n </li>\n </ul>\n\n <ul style=\"margin:0 0 1em 1em; padding:0;\">\n <li>\n <strong>Lead traveler\n :\n </strong>Homer test Simpson test\n </li>\n <li>\n <strong>Number of Travelers\n :\n </strong>1 Adult</li>\n\n <li>\n <strong>Booking Reference:\n </strong>BR-580669678</li>\n\n <li>\n <strong>Product Code:\n </strong>2280AAHT</li>\n\n <li>\n <strong>Option Code:\n </strong>TG1~08:00</li>\n\n <li>\n <strong>Supplier\n : </strong>Sundance Helicopters</li>\n\n\n\n\n\n <li>\n <strong>Location\n :</strong>\n <p>Traveler pickup is offered<br><br></p>\n </li>\n\n <li>\n <strong>Tour Option Description\n :</strong>\n Morning departure between 8am and 11:45am on an A-Star Helicopter for the All American Helicopter Tour\n \n </li>\n </ul>\n\n <h3 style=\"font-size:14px;font-weight:bold;margin:0.5em 0;padding:0;\">\n Voucher Information\n </h3>\n\n <ul style=\"margin:0 0 1em 1em; padding:0;\">\n You can present either a paper or an electronic voucher for this activity.\n <span style=\"color:#888888;\"> / You can present either a paper or an electronic voucher for this activity.</span>\n </ul>\n\n <h3 style=\"font-size:14px;font-weight:bold;margin:0.5em 0;padding:0;\">\n Important Information\n </h3>\n <ul>\n<li>Your local contact is Sundance Helicopters on +17027360606.</li></ul>\n• Important: due to comfort, weight and balance of the aircraft, the maximum weight per passenger to ride in an A-Star helicopter is 275lbs (125kg / 19.6st). If passengers weigh in between 275lbs and 300lbs (136kg/21.4st), you will be required to upgrade to the EC-130.<br> • Any passenger over 300lbs will be required to purchase an additional seat. This is payable directly to the tour operator on the day of the tour.<br> • Due to the nature of this tour and the safety of all guests, the tour operator reserves the right to refuse service to passengers who are intoxicated or show signs of intoxication. If, as a result, your tour is canceled, you will not be entitled to a refund.<br> • Infant children must be under the age of two and have proof of age, such as a passport and are considered lap children.<br> • Per FAA regulations, all passenger must present photo ID at check in.<br> • If you would like a vegetarian meal as your lunch option, please contact the local operator as soon as possible.<br> • Please Note: Please look for your Limo driver who will get out and will be looking for the lead traveler’s last name of whom the reservation is under. There is also a sign in the front windshield of the Limo that will say Sundance Helicopters.<br><br>Hotel pickups commence prior to this time, you must contact the local service provider to verify your exact pickup time.<br><br>All flight times are approximate and subject to change due to weather conditions and weight restrictions.<br>\n\n <h3 style=\"font-size:14px;font-weight:bold;margin:0.5em 0;padding:0;\">\n Inclusions\n </h3>\n <ul>\n<li>45-minute (approx.) flight each way (helicopter based on option selected)</li><li>Hotel pickup and drop-off by limousine</li><li>Snacks</li><li>Glass of Champagne</li><li>All taxes and fees</li></ul>\n\n\n <h3 style=\"font-size:14px;font-weight:bold;margin:0.5em 0;padding:0;\">\n Exclusions\n </h3>\n <ul>\n<li>Gratuities</li></ul>\n\n\n\n </div>\n\n </div>\n <br/>\n\n </div>\n\n </body>\n</html>\n",
- "dateStamp": "2020-02-11T19:50:39+0000",
- "errorType": null,
- "errorCodes": [ ],
- "errorMessage": null,
- "errorName": null,
- "extraInfo": { },
- "extraObject": null,
- "success": true,
- "totalCount": 1,
- "errorMessageText": null,
- "vmid": "331003"
}
Get the details of a single specific past booking based on the voucherKey
or itemId
and email address sent in the request.
Note: this service will only return past bookings that were made with the same API key that was used to make the booking
Sample query parameters:
or
Departure details
departurePoint
, departurePointAddress
and departurePointDirections
is included in the response. For more information, see: Reviewing bookings
voucherKey | string Example: voucherKey=1005851866:4af44c13ecf3f1a7d3f9ef2fc00c2257e08fa42ae20f877f3039ff9b52aba24e:580669678 specifier of past booking type (use one of: |
string Example: email=apitest@viator.com email address by which to search for past bookings | |
itemId | string Example: itemId=580669678 Search for a booking with this unique booking-reference number. See Booking references for more information. |
Accept-Language required | string Example: en-US Specifies the language into which the natural-language fields in the response from this service will be translated (see Accept-Language header for available language codes) |
errorReference | string or null reference number of this error |
dateStamp | string or null timestamp of this response |
errorType | string or null code specifying the type of error |
errorCodes | Array of strings or null array of error codes pertaining to this error
|
errorMessage | Array of arrays or null or null array of error message strings |
errorName | string or null name of this type of error |
extraInfo | object or null ignore (Viator only) |
extraObject | object or null ignore (Viator only) |
success | boolean or null boolean indicator of this request's outcome
|
totalCount | integer or null number of results available for this service |
errorMessageText | string or null array of error message strings in plain text |
vmid | string or null unique numeric id of the server that processed this request |
object object containing pricing matrix information |
{- "errorReference": null,
- "data": {
- "sortOrder": 0,
- "rulesApplied": null,
- "omniPreRuleList": [ ],
- "bookingStatus": {
- "status": 3,
- "text": "Confirmed",
- "type": "CONFIRMED",
- "level": "ITINERARY",
- "confirmed": true,
- "pending": false,
- "amended": false,
- "cancelled": false,
- "failed": false
}, - "itemSummaries": [
- {
- "sortOrder": 0,
- "rulesApplied": null,
- "bookingStatus": {
- "status": 1,
- "text": "Paid & Confirmed",
- "type": "CONFIRMED",
- "level": "ITEM",
- "failed": false,
- "confirmed": true,
- "amended": false,
- "pending": false,
- "cancelled": false
}, - "travellerAgeBands": [
- {
- "sortOrder": 0,
- "count": 1,
- "pluralDescription": "Adults",
- "description": "Adult",
- "ageBandId": 1
}
], - "voucherKey": "1005851866:4af44c13ecf3f1a7d3f9ef2fc00c2257e08fa42ae20f877f3039ff9b52aba24e:580669678",
- "voucherRequirements": "You can present either a paper or an electronic voucher for this activity.",
- "appleWalletURL": null,
- "productPulledDown": false,
- "merchantCancellable": true,
- "productWidgetList": null,
- "savingAmount": 0,
- "applePassSupported": false,
- "supplierName": "Sundance Helicopters",
- "supplierPhoneNumber": "+1 123 456 7890",
- "vouchers": null,
- "passbooks": null,
- "termsAndConditions": null,
- "merchantTermsAndConditions": {
- "termsAndConditions": "For a full refund, cancel at least 24 hours in advance of the start date of the experience.",
- "merchantTermsAndConditionsType": 1,
- "amountRefundable": "USD 412.04",
- "cancellationFromTourDate": [
- {
- "dayRangeMin": 1,
- "dayRangeMax": null,
- "percentageRefundable": 100,
- "policyStartTimestamp": null,
- "policyEndTimestamp": 1585580400
}, - {
- "dayRangeMin": 0,
- "dayRangeMax": 1,
- "percentageRefundable": 0,
- "policyStartTimestamp": 1585580400,
- "policyEndTimestamp": 1585666800
}
]
}, - "productCode": "2280AAHT",
- "travelDate": "2020-03-31",
- "tourGradeCode": "TG1~08:00",
- "distributorItemRef": "itemRef1000000",
- "startingTime": "8:00 AM",
- "languageServicesLanguageCode": "en",
- "price": 412.04,
- "leadTravellerSurname": "Simpson test",
- "itineraryId": 1005851866,
- "productTitle": "Grand Canyon All-American Helicopter Tour",
- "merchantNetPrice": 388.72,
- "priceFormatted": "$412.04",
- "destId": 684,
- "voucherOption": "VOUCHER_E",
- "itemId": 580669678,
- "barcodeOption": "tour",
- "barcodeType": "code128",
- "departurePoint": "Traveler pickup is offered<br><br>",
- "departurePointAddress": null,
- "departurePointDirections": null,
- "leadTravellerFirstname": "Homer test",
- "rnplInfo": null,
- "obfsId": 362208,
- "leadTravellerTitle": "Mr",
- "lastRetailPrice": 388.72,
- "savingAmountFormated": "$0.00",
- "pickupHotelName": "null",
- "hoursConfirmed": 0,
- "lastRetailPriceFormatted": "$388.72",
- "tourGradeDescription": "Morning Departure; A-Star 08:00 (TG1~08:00)",
- "bookingEngineId": "FO",
- "merchantNetPriceFormatted": "$388.72",
- "departsFrom": "Las Vegas, United States",
- "pickupHotelId": null,
- "priceUSD": 412.04,
- "currencyCode": "USD"
}
], - "securityToken": "4af44c13ecf3f1a7d3f9ef2fc00c2257e08fa42ae20f877f3039ff9b52aba24e",
- "paypalRedirectURL": null,
- "exchangeRate": 1,
- "itineraryId": 1005851866,
- "bookingDate": "2020-02-11",
- "voucherKey": "1005851866:4af44c13ecf3f1a7d3f9ef2fc00c2257e08fa42ae20f877f3039ff9b52aba24e",
- "bookerEmail": "apitest@viator.com",
- "distributorRef": "distributorRef100000",
- "totalPrice": 412.04,
- "totalPriceFormatted": "$412.04",
- "totalPriceUSD": 412.04,
- "hasVoucher": true,
- "userId": null,
- "currencyCode": "USD"
}, - "dateStamp": "2020-02-11T20:06:43+0000",
- "errorType": null,
- "errorCodes": [ ],
- "errorMessage": null,
- "errorName": null,
- "extraInfo": { },
- "extraObject": null,
- "success": true,
- "totalCount": 1,
- "errorMessageText": null,
- "vmid": "331003"
}
Get a user's bookings with travel dates in the future.
This service can also be used to check the status of a booking.
Provide either:
voucherKey
, or... email
) and a booking reference (itineraryOrItemId
) (Booking Reference)voucherKey | string Example: voucherKey=3299307:93c7f36a56b18ba1068787ba7fb7988da5c8ad08db77604110141ff21498603e:600033670 voucher key for the booking |
string Example: email=apitest@viator.com email address of the booker for the booking | |
itineraryOrItemId | string Example: itineraryOrItemId=700179574 The booking reference number of the item
|
Accept-Language required | string Example: en-US Specifies the language into which the natural-language fields in the response from this service will be translated (see Accept-Language header for available language codes) |
errorReference | string or null reference number of this error |
dateStamp | string or null timestamp of this response |
errorType | string or null code specifying the type of error |
errorCodes | Array of strings or null array of error codes pertaining to this error
|
errorMessage | Array of arrays or null or null array of error message strings |
errorName | string or null name of this type of error |
extraInfo | object or null ignore (Viator only) |
extraObject | object or null ignore (Viator only) |
success | boolean or null boolean indicator of this request's outcome
|
totalCount | integer or null number of results available for this service |
errorMessageText | string or null array of error message strings in plain text |
vmid | string or null unique numeric id of the server that processed this request |
object |
{- "errorReference": null,
- "data": [
- {
- "sortOrder": 1,
- "rulesApplied": null,
- "omniPreRuleList": null,
- "bookingStatus": {
- "status": 3,
- "text": "Confirmed",
- "type": "CONFIRMED",
- "level": "ITINERARY",
- "confirmed": true,
- "pending": false,
- "amended": false,
- "cancelled": false,
- "failed": false
}, - "itemSummaries": [
- {
- "sortOrder": 0,
- "rulesApplied": null,
- "bookingStatus": {
- "status": 1,
- "text": "Paid & Confirmed",
- "type": "CONFIRMED",
- "level": "ITEM",
- "failed": false,
- "confirmed": true,
- "amended": false,
- "pending": false,
- "cancelled": false
}, - "travellerAgeBands": [
- {
- "sortOrder": 0,
- "count": 1,
- "pluralDescription": "Adults",
- "description": "Adult",
- "ageBandId": 1
}
], - "voucherKey": "1005851866:4af44c13ecf3f1a7d3f9ef2fc00c2257e08fa42ae20f877f3039ff9b52aba24e:580669678",
- "voucherRequirements": "You can present either a paper or an electronic voucher for this activity.",
- "appleWalletURL": null,
- "productPulledDown": false,
- "merchantCancellable": true,
- "productWidgetList": null,
- "savingAmount": 0,
- "applePassSupported": false,
- "supplierName": "Sundance Helicopters",
- "supplierPhoneNumber": "+1 123 456 7890",
- "vouchers": null,
- "passbooks": null,
- "termsAndConditions": null,
- "merchantTermsAndConditions": {
- "termsAndConditions": "For a full refund, cancel at least 24 hours in advance of the start date of the experience.",
- "merchantTermsAndConditionsType": 1,
- "amountRefundable": "USD 412.04",
- "cancellationFromTourDate": [
- {
- "dayRangeMin": 1,
- "dayRangeMax": null,
- "percentageRefundable": 100,
- "policyStartTimestamp": null,
- "policyEndTimestamp": 1585580400
}, - {
- "dayRangeMin": 0,
- "dayRangeMax": 1,
- "percentageRefundable": 0,
- "policyStartTimestamp": 1585580400,
- "policyEndTimestamp": 1585666800
}
]
}, - "leadTravellerFirstname": "Homer test",
- "pickupHotelName": "null",
- "productCode": "2280AAHT",
- "travelDate": "2020-03-31",
- "tourGradeCode": "TG1~08:00",
- "distributorItemRef": "itemRef1000000",
- "startingTime": "8:00 AM",
- "languageServicesLanguageCode": "en",
- "price": 412.04,
- "leadTravellerSurname": "Simpson test",
- "itineraryId": 1005851866,
- "productTitle": "Grand Canyon All-American Helicopter Tour",
- "merchantNetPrice": 388.72,
- "priceFormatted": "$412.04",
- "destId": 684,
- "voucherOption": "VOUCHER_E",
- "itemId": 580669678,
- "barcodeOption": "tour",
- "barcodeType": "code128",
- "departurePoint": "Traveler pickup is offered<br><br>",
- "departurePointAddress": null,
- "departurePointDirections": null,
- "rnplInfo": null,
- "obfsId": 362208,
- "leadTravellerTitle": "Mr",
- "lastRetailPrice": 388.72,
- "hoursConfirmed": 0,
- "lastRetailPriceFormatted": "$388.72",
- "bookingEngineId": "FO",
- "tourGradeDescription": "Morning Departure; A-Star 08:00 (TG1~08:00)",
- "savingAmountFormated": "$0.00",
- "departsFrom": "Las Vegas, United States",
- "pickupHotelId": null,
- "priceUSD": 412.04,
- "merchantNetPriceFormatted": "$388.72",
- "currencyCode": "USD"
}
], - "securityToken": "4af44c13ecf3f1a7d3f9ef2fc00c2257e08fa42ae20f877f3039ff9b52aba24e",
- "paypalRedirectURL": null,
- "userId": null,
- "exchangeRate": 1,
- "itineraryId": 1005851866,
- "bookingDate": "2020-02-11",
- "voucherKey": "1005851866:4af44c13ecf3f1a7d3f9ef2fc00c2257e08fa42ae20f877f3039ff9b52aba24e",
- "bookerEmail": "apitest@viator.com",
- "distributorRef": "distributorRef100000",
- "totalPrice": 412.04,
- "totalPriceFormatted": "$412.04",
- "totalPriceUSD": 412.04,
- "hasVoucher": true,
- "currencyCode": "USD"
}
], - "dateStamp": "2020-02-11T20:27:20+0000",
- "errorType": null,
- "errorCodes": [ ],
- "errorMessage": null,
- "errorName": null,
- "extraInfo": { },
- "extraObject": null,
- "success": true,
- "totalCount": 1,
- "errorMessageText": null,
- "vmid": "331004"
}
Retrieves a dictionary of unique identification codes (cancellationReasonCode
) and their associated natural-language descriptions (cancellationReasonText
).
For information on how to use this service, see: Cancellation API workflow
Note:
https://api.sandbox.viator.com/partner/cancel-reasons
Accept-Language required | string Example: en-US Specifies the language into which the natural-language fields in the response from this service will be translated (see Accept-Language header for available language codes) |
Array of objects (CancellationReason) Array of cancellation reason codes and their asssociated texts for display to the user |
{- "reasons": [
- {
- "cancellationReasonText": "Unexpected/medical circumstances",
- "cancellationReasonCode": "Customer_Service.Unexpected_medical_circumstances"
}, - {
- "cancellationReasonText": "Duplicate Booking",
- "cancellationReasonCode": "Customer_Service.Duplicate_Booking"
}, - {
- "cancellationReasonText": "Tour operator asked me to cancel",
- "cancellationReasonCode": "Customer_Service.Tour operator asked me to cancel"
}, - {
- "cancellationReasonText": "Chose a different/cheaper tour",
- "cancellationReasonCode": "Customer_Service.Chose_a_different_cheaper_tour"
}, - {
- "cancellationReasonText": "Weather",
- "cancellationReasonCode": "Customer_Service.Weather"
}, - {
- "cancellationReasonText": "Booked wrong tour/date",
- "cancellationReasonCode": "Customer_Service.Booked_wrong_tour_date"
}, - {
- "cancellationReasonText": "I canceled my entire trip",
- "cancellationReasonCode": "Customer_Service.I_canceled_my_entire_trip"
}
]
}
Retrieves a quote for the cancellation of a booking
For information on how to use this service, see: Cancellation API workflow
Note:
https://api.sandbox.viator.com/partner/bookings/{booking-reference}/cancel-quote
booking-reference required | string Unique numeric identifier of the booking for which to retrieve a cancellation quote |
object (RefundDetails) Details of the refund Note: Bookings that have not been confirmed by the supplier and have a status of | |
bookingId | string The booking reference number, prepended with |
status | string Enum: "CANCELLABLE" "CANCELLED" "NOT_CANCELLABLE" String indicating the cancellation status of this itinerary item:
|
{- "bookingId": "BR-580669678",
- "refundDetails": {
- "itemPrice": 412.04,
- "refundAmount": 412.04,
- "refundPercentage": 100,
- "currencyCode": "USD"
}, - "status": "CANCELLABLE"
}
Submits a cancellation request for the specified booking
For information on how to use this service, see: Cancellation API workflow
Note:
https://api.sandbox.viator.com/partner/bookings/{booking-reference}/cancel
booking-reference required | string The ID of the booking |
Accept-Language required | string Example: en-US Specifies the language into which the natural-language fields in the response from this service will be translated (see Accept-Language header for available language codes) |
reasonCode | string Machine-interpretable identification code for this cancellation reason, retrieved from cancellationReasons |
bookingId | string Booking reference number for this booking, prepended with |
status | string Enum: "ACCEPTED" "DECLINED" String indicating the outcome of the booking cancellation request.
|
reason | string Enum: "ALREADY_CANCELLED" "NOT_CANCELLABLE" |
{- "reasonCode": "Customer_Service.I_canceled_my_entire_trip"
}
{- "bookingId": "BR-580669678",
- "status": "ACCEPTED"
}
Cancel a booking Note: This service has been replaced by the cancellationReasons, bookingQuote and cancelBooking endpoints
Accept-Language required | string Example: en-US Specifies the language into which the natural-language fields in the response from this service will be translated (see Accept-Language header for available language codes) |
itineraryId | integer numeric identifier for the itinerary |
distributorRef | string itinerary reference identifier (partner defined) for the booking to cancel |
Array of objects array of objects detailing itinerary items to cancel |
errorReference | string or null reference number of this error |
dateStamp | string or null timestamp of this response |
errorType | string or null code specifying the type of error |
errorCodes | Array of strings or null array of error codes pertaining to this error
|
errorMessage | Array of arrays or null or null array of error message strings |
errorName | string or null name of this type of error |
extraInfo | object or null ignore (Viator only) |
extraObject | object or null ignore (Viator only) |
success | boolean or null boolean indicator of this request's outcome
|
totalCount | integer or null number of results available for this service |
errorMessageText | string or null array of error message strings in plain text |
vmid | string or null unique numeric id of the server that processed this request |
object |
{- "itineraryId": 1234655,
- "distributorRef": "Jdp122",
- "cancelItems": [
- {
- "itemId": 330056,
- "distributorItemRef": "JdpItin001",
- "cancelCode": "82",
- "cancelDescription": ""
}
]
}
{- "errorReference": "string",
- "dateStamp": "string",
- "errorType": "string",
- "errorCodes": [ ],
- "errorMessage": [ ],
- "errorName": "string",
- "extraInfo": { },
- "extraObject": { },
- "success": true,
- "totalCount": 0,
- "errorMessageText": "string",
- "vmid": "string",
- "data": {
- "itineraryId": 3331605,
- "cancelItems": [
- {
- "cancellationResponseStatusCode": "Confirmed",
- "cancellationResponseDescription": "No further action required",
- "itemId": "600088255",
- "distributorItemRef": "ItinItemRef012"
}
], - "distributorRef": "ItinRef012"
}
}