curl --request GET \
--url https://tdms.websitetravel.com/apiv1/checkAvailabilityProductimport requests
url = "https://tdms.websitetravel.com/apiv1/checkAvailabilityProduct"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://tdms.websitetravel.com/apiv1/checkAvailabilityProduct', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://tdms.websitetravel.com/apiv1/checkAvailabilityProduct",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://tdms.websitetravel.com/apiv1/checkAvailabilityProduct"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://tdms.websitetravel.com/apiv1/checkAvailabilityProduct")
.asString();require 'uri'
require 'net/http'
url = URI("https://tdms.websitetravel.com/apiv1/checkAvailabilityProduct")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"productId": 3889,
"name": "Uluru Tour with Kata Tjuta - Eco Tent (Yulara to Yulara)",
"tourCode": "AYB2",
"image": "https://c.globaltravel.market/upload/sm/example.jpg",
"supplier": {
"name": "Australian Adventure Group Holdings Pty Ltd",
"phone": "+613 9125 3630",
"email": "reservations@adventuretours.com.au"
},
"fares": [
{
"productPricesDetailsId": 21460141,
"fareName": "Adult",
"rrp": 695,
"hasAvailability": true,
"dates": {
"2026-08-28": [
{
"datePriceCacheId": 8224582,
"bookingDate": "2026-08-28",
"bookingTime": "01:00 PM",
"bookingTimeId": "13_00_00",
"numAvailable": 5,
"rrp": 695,
"pickupLocations": [
{
"pickupId": "23225",
"pickupLocation": "14:00 Ayers Rock Airport, ",
"pickupTime": "N/A"
},
{
"pickupId": "23226",
"pickupLocation": "13:45 Desert Gardens Hotel, 1 Yulara Drive ",
"pickupTime": "N/A"
}
],
"addOns": [],
"additionalFields": [
{
"additionalFieldId": "MobilePhone",
"type": "text",
"label": "Mobile Phone",
"commonName": "Mobile",
"apiName": "",
"options": [],
"required": true
},
{
"additionalFieldId": "Nationality",
"type": "select",
"label": "Nationality",
"commonName": "Country",
"apiName": "",
"options": [
{
"default": false,
"displayName": "Australia",
"externalId": "Australia",
"name": "Australia"
}
],
"required": true
}
]
}
]
}
}
]
}Check cached availability for every fareprice of a product
Return cached availability and pricing for all fareprices of a product in one call, for a window starting at from.
Use this instead of calling /apiv1/checkavailabilityrange/{productPricesDetailsId}/... once per fareprice: a product with six fares costs one request here rather than six, which matters because the rate limit is applied per Agent Branch key.
The response is served from the availability cache, so it is fast but not live. Confirm price and availability with a live call before you take payment.
Not every product supports this endpoint. When it does not, the request fails with 400 and a not_supported message — fall back to /apiv1/checkavailabilityrange per fareprice.
Example: GET /apiv1/checkAvailabilityProduct?productId=9027&from=29-JUL-2026&days=90
curl --request GET \
--url https://tdms.websitetravel.com/apiv1/checkAvailabilityProductimport requests
url = "https://tdms.websitetravel.com/apiv1/checkAvailabilityProduct"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://tdms.websitetravel.com/apiv1/checkAvailabilityProduct', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://tdms.websitetravel.com/apiv1/checkAvailabilityProduct",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://tdms.websitetravel.com/apiv1/checkAvailabilityProduct"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://tdms.websitetravel.com/apiv1/checkAvailabilityProduct")
.asString();require 'uri'
require 'net/http'
url = URI("https://tdms.websitetravel.com/apiv1/checkAvailabilityProduct")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"productId": 3889,
"name": "Uluru Tour with Kata Tjuta - Eco Tent (Yulara to Yulara)",
"tourCode": "AYB2",
"image": "https://c.globaltravel.market/upload/sm/example.jpg",
"supplier": {
"name": "Australian Adventure Group Holdings Pty Ltd",
"phone": "+613 9125 3630",
"email": "reservations@adventuretours.com.au"
},
"fares": [
{
"productPricesDetailsId": 21460141,
"fareName": "Adult",
"rrp": 695,
"hasAvailability": true,
"dates": {
"2026-08-28": [
{
"datePriceCacheId": 8224582,
"bookingDate": "2026-08-28",
"bookingTime": "01:00 PM",
"bookingTimeId": "13_00_00",
"numAvailable": 5,
"rrp": 695,
"pickupLocations": [
{
"pickupId": "23225",
"pickupLocation": "14:00 Ayers Rock Airport, ",
"pickupTime": "N/A"
},
{
"pickupId": "23226",
"pickupLocation": "13:45 Desert Gardens Hotel, 1 Yulara Drive ",
"pickupTime": "N/A"
}
],
"addOns": [],
"additionalFields": [
{
"additionalFieldId": "MobilePhone",
"type": "text",
"label": "Mobile Phone",
"commonName": "Mobile",
"apiName": "",
"options": [],
"required": true
},
{
"additionalFieldId": "Nationality",
"type": "select",
"label": "Nationality",
"commonName": "Country",
"apiName": "",
"options": [
{
"default": false,
"displayName": "Australia",
"externalId": "Australia",
"name": "Australia"
}
],
"required": true
}
]
}
]
}
}
]
}Query Parameters
The Product ID to check. Every fareprice of the product is returned.
The first date to check, in DD-MON-YYYY format — for example 29-JUL-2026.
The number of days to check, including the start date. Walk longer ranges in successive requests.
Response
Product metadata plus availability and pricing for every fareprice, keyed by date.
dates maps each date to an array, because a fareprice can run at several booking times on the same day. Each entry carries its own numAvailable, rrp, bookingTimeId and pickup list. If you are selling a single departure, choose one entry — do not sum them.
Two prices are returned. fares[].rrp is the fareprice's standing rate; fares[].dates[...][].rrp is the rate for that date. Use the per-date figure. Accommodation in particular is repriced between individual dates, so the standing rate is only a fallback for a date the cache has no row for.
Field casing differs from /apiv1/checkavailabilityrange, which returns NumAvailable and nests its price under productPricingData.RRP. Reading the wrong one fails silently — counts populate while the price stays null, which looks like an unpriced fare rather than a parse error.
Responses can be large. additionalFields embeds every option of every select, including full country lists, repeated per date entry. A 30-day window on a product with several fares can run to megabytes, so read the fields you need and discard the rest rather than holding the whole payload.