> ## Documentation Index
> Fetch the complete documentation index at: https://mcp.theoryofevolution.com.au/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# 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`



## OpenAPI

````yaml /openapi/agent-reseller-api.mintlify.json get /apiv1/checkAvailabilityProduct
openapi: 3.0.0
info:
  title: TravelDesk Agent API
  contact:
    name: API Support
    email: api@websitetravel.com
  version: '1.0'
  description: >-
    TravelDesk Agent (Reseller) API.


    ## Rate limiting


    The quota is applied **per Agent Branch key** — the per-branch client
    id/secret pair — not per account, per host, or per integration. Standard
    branches get **200 calls per minute**; upgraded branches get **900**. That
    budget is shared across everything the branch does: availability refreshes,
    background sweeps, customer-facing pricing, and quote or booking creation.


    Two consequences worth designing around:


    - A background sweep can starve customer-facing traffic for the same branch.
    Give live requests priority over refresh work, and cap the concurrency of
    any bulk job.

    - Cooldowns after a `429` must be keyed per branch. Keying them by host
    throttles every branch at once, because they all share
    `tdms.websitetravel.com`.


    Prefer endpoints that answer for a whole product in one request —
    `/apiv1/checkAvailabilityProduct` over one `/apiv1/checkavailabilityrange`
    call per fareprice — since the saving is measured against this quota.


    ## Dates


    Most endpoints take and return `DD-MON-YYYY` (`29-JUL-2026`).
    `/apiv1/checkAvailabilityProduct` returns ISO `YYYY-MM-DD` keys in `dates`.
    Parse both.


    ## Pricing


    Accommodation is dynamically priced — rates move between individual dates,
    not just between seasons — so never cache one rate per fareprice and reuse
    it across a range. Nett tracks RRP at a fixed commission ratio per
    fareprice, because changing commission requires a new
    `productPricesDetailsId`; that makes nett safe to derive from RRP rather
    than store.
servers:
  - url: https://tdms.websitetravel.com
    description: Production Server
  - url: https://tdmstest03.websitetravel.com
    description: Test Server
  - url: http://tdms.localhost
    description: Development Server
security: []
tags:
  - name: Authentication
  - name: Products
  - name: Availability and Pricing - Booking system based Live Availability
  - name: Availability and Pricing - Siteminder Live Availability
  - name: Availability and Pricing - Cached Availability and Live pricing
  - name: Availability and Pricing - Package Availability
  - name: Availability and Pricing - Check Availability via mail to supplier
  - name: Order Placement
  - name: Post Order Management
  - name: Accommodation
  - name: Reports
paths:
  /apiv1/checkAvailabilityProduct:
    get:
      tags:
        - Availability
      summary: Check cached availability for every fareprice of a product
      description: >-
        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`
      parameters:
        - name: productId
          in: query
          required: true
          description: The Product ID to check. Every fareprice of the product is returned.
          schema:
            type: string
        - name: from
          in: query
          required: true
          description: >-
            The first date to check, in `DD-MON-YYYY` format — for example
            `29-JUL-2026`.
          schema:
            type: string
        - name: days
          in: query
          required: true
          description: >-
            The number of days to check, including the start date. Walk longer
            ranges in successive requests.
          schema:
            type: integer
      responses:
        '200':
          description: >-
            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.
          content:
            application/json:
              schema:
                type: object
                properties:
                  productId:
                    type: integer
                  name:
                    type: string
                    description: Product name.
                  tourCode:
                    type: string
                  image:
                    type: string
                    description: Absolute URL to the product image.
                  supplier:
                    type: object
                    properties:
                      name:
                        type: string
                      phone:
                        type: string
                      email:
                        type: string
                  fares:
                    type: array
                    items:
                      type: object
                      properties:
                        productPricesDetailsId:
                          type: integer
                          description: The Product Prices Detail ID of the fareprice.
                        fareName:
                          type: string
                          description: >-
                            For example `Adult`, `Child (8-15 years)`, `Single
                            Tent Add-on`.
                        rrp:
                          type: number
                          description: >-
                            The fareprice's standing rate. Prefer the per-date
                            `rrp` below.
                        hasAvailability:
                          type: boolean
                          description: >-
                            False when the fareprice has no availability
                            anywhere in the window. Use it to skip a fare
                            without walking its dates.
                        dates:
                          type: object
                          description: >-
                            Keyed by ISO date (`YYYY-MM-DD`). Each value is an
                            array of one entry per booking time.
                          additionalProperties:
                            type: array
                            items:
                              type: object
                              properties:
                                datePriceCacheId:
                                  type: integer
                                bookingDate:
                                  type: string
                                  description: ISO `YYYY-MM-DD`, matching the key.
                                bookingTime:
                                  type: string
                                  description: Display form, for example `01:00 PM`.
                                bookingTimeId:
                                  type: string
                                  description: >-
                                    The identifier to send when booking, for
                                    example `13_00_00`. A product with a single
                                    daily departure returns `0`.
                                numAvailable:
                                  type: integer
                                  description: >-
                                    Places remaining for this fareprice at this
                                    booking time.
                                rrp:
                                  type: number
                                  description: >-
                                    Retail price per person for this date.
                                    Prefer this over the fareprice's standing
                                    rate.
                                pickupLocations:
                                  type: array
                                  description: >-
                                    Pickup points offered on this departure.
                                    Required at booking where the product uses
                                    them.
                                  items:
                                    type: object
                                    properties:
                                      pickupId:
                                        type: string
                                      pickupLocation:
                                        type: string
                                      pickupTime:
                                        type: string
                                addOns:
                                  type: array
                                  description: Add-ons offered on this departure.
                                  items:
                                    type: object
                                additionalFields:
                                  type: array
                                  description: >-
                                    Passenger details this departure requires at
                                    booking. Read this rather than hard-coding a
                                    form: the set varies by product, and
                                    `required` varies with it.
                                  items:
                                    type: object
                                    properties:
                                      additionalFieldId:
                                        type: string
                                        description: >-
                                          For example `Sex`, `MobilePhone`,
                                          `Nationality`.
                                      type:
                                        type: string
                                        description: '`select` or `text`.'
                                      label:
                                        type: string
                                        description: Display label, for example `Gender`.
                                      commonName:
                                        type: string
                                      apiName:
                                        type: string
                                      required:
                                        type: boolean
                                      options:
                                        type: array
                                        description: >-
                                          Present for `select`. Can be very long —
                                          `Nationality` returns the full country
                                          list on every date entry.
                                        items:
                                          type: object
                                          properties:
                                            default:
                                              type: boolean
                                            displayName:
                                              type: string
                                            externalId:
                                              type: string
                                            name:
                                              type: string
              example:
                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
        '400':
          description: >-
            The product does not support cached availability. The message
            contains `not_supported`. Fall back to
            `/apiv1/checkavailabilityrange` per fareprice.
        '403':
          description: Not authorised.
        '404':
          description: >-
            Product not found, or not available to this agent. Also returned
            once you walk past the end of the product's bookable dates, so treat
            a `404` that follows at least one successful window as the end of
            the calendar rather than a failure.
        '500':
          description: >-
            **Also returned for a window that simply has no results**, with the
            message `Unable to fetch cached availability`. This is a known
            defect, confirmed in Postman and raised with the TravelDesk
            developers on 2026-07-27. Treat that specific message as an empty
            window and keep walking — a seasonal product can have an empty
            90-day span followed by a full one, so stopping here silently drops
            every later departure.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.