Title
Create new category
Edit page index title
Edit category
Edit link
Suppliers, Products & Rates
Travel Curious connects Resellers to Suppliers through a channel binding process - a commercial agreement that makes a Supplier's Products and Rates visible to your API requests. If you do not see the Suppliers or Products you expect, contact the Supplier directly or reach out to your Travel Curious Integration Manager.
The three core entities in this section form a hierarchy. Every API call in the transaction flow depends on IDs retrieved here:
Supplier β Product β Rate β Availability β Hold β Booking
The name, title, and description fields on the main entities - Supplier, Product, Rate, and Rate Price - are treated as standard fields, not content fields.
Suppliers who do not implement content capability may continue using these fields.
Suppliers
A Supplier represents the operator providing the travel experience - a tour company, museum, attraction, or event venue. The Supplier object carries the operator's identity, contacts, accepted traveler types, business hours, and location data.
π Available Endpoints & Params
| Endpoints | Recommended use |
|---|---|
| GET /suppliers | Daily cache refresh of your full Supplier catalog |
| GET /suppliers/{supplier_id} | Real-time lookups; prefer this over the list wherever possible |
| GET /suppliers/{supplier_id}?content=true | Real-time with localized content (v1.3) |
βοΈ Supplier Object Capabilities
| Component | Type | Version | Operational Function |
|---|---|---|---|
| Contacts | Array | v1.2 & v1.3 | Used for high-level account management, central billing inquiries, or escalation issues with the operator's corporate team. |
| Content | Object | Usually used for brand identity. Contains "About Us" marketing copy, global operator terms, and high-level company assets. | |
| Hours | Array | v1.2 & v1.3 | Usually used for Corporate Business Hours. Indicates when the operator's central customer service or head office is open to take inquiries. |
| Locations | Array | v1.2 & v1.3 | This is usually the legal business address of the Supplier. The Corporate Headquarters or central depot. |
| Traveler Types | Array | v1.2 & v1.3 | Global Age Dictionaries (Rarely Used). This represents the operator's default baseline for age bands across their entire business (e.g., defining that, generally, a "Child" is 4β12 years old). Note: It is not commonly used or relied upon at this level, as individual products usually dictate their own specific age rules.___ _ **** |
π₯ Fields Recently Added to Supplier Models
| Field | Type | Description | Example | Notes |
|---|---|---|---|---|
content
| object | Provides localized, structured, and customer-facing content that can be attached to multiple entities. This object is the primary source for descriptive marketing data across all levels of the catalog. | See more details in the Content page. | |
description | string | A detailed overview of the Supplier or operator, highlighting their offerings, background, and value proposition. This content is intended for display in full detail pages and should help users understand what makes the Supplier unique. | "Urban Quest Adventures turns city streets into interactive playgrounds. Our app-guided scavenger hunts and outdoor escape games combine local landmarks, puzzles, and storytelling to create unforgettable experiences in cities like New York, Chicago, and San Francisco." | Optional for the supplier to populate. |
title | string | Customer-facing name of the Supplier, intended for display in UIs. | "Urban Quest Adventures - Explore Cities Like Never Before" | Optional for the supplier to populate. |
ποΈβπ¨οΈ Response Example
Get Supplier call response example below. Note: the id field needs to be unique and is used to identify the Supplier.
xxxxxxxxxx Products
A Product is a bookable experience offered by a Supplier - a walking tour, museum entry, river cruise, parasailing session, or live show. Each Product belongs to one Supplier and may have multiple Rates.
π Available Endpoints & Params
| Endpoints | Recommended use |
|---|---|
| GET /suppliers/{id}/products | Daily cache refresh |
| GET /suppliers/{id}/products/{id} | Real-time product detail pages |
| GET /suppliers/{id}/products/{id}?content=true | Real-time with localized content (v1.3) |
βοΈ Product Object Capabilities
Capability Discovery: When querying a Product, the response will include a capabilities array. This array explicitly tells you which advanced features are supported by that specific product so your system knows what to expect. For example, if a product supports content and booking questions, you will see values like the following in this capability array: ["travelcurious/content","travelcurious/bookingquestions"]
| Component | Type | Version | Operational Function |
|---|---|---|---|
| Contacts | Array | v1.2 & v1.3 | List of designated operational points of contact, on-site coordinators, or emergency help lines for this specific experience. |
| Content | Object | Usually used for the experience description. Houses the main marketing narrative, overarching highlights, general FAQs (e.g., "What should I wear?"), and primary photo galleries. | |
| Hours | Array | v1.2 & v1.3 | General Operating Hours. Indicates the overarching availability of the experience (e.g., "The Museum is open 09:00 to 17:00, Tuesday through Sunday"). |
| Locations | Array | v1.2 & v1.3 | Ordered array of physical address coordinates and routing notes. The Main Venue or Default Meeting Point. This is the physical address of the museum, the main entrance of the theme park, or the general starting point for the walking tour. |
π₯ Fields Recently Added to Product Models
| Field | Type | Description | Example | Notes |
|---|---|---|---|---|
content
| object | Provides localized, structured, and customer-facing content that can be attached to multiple entities. This object is the primary source for descriptive marketing data across all levels of the catalog. | See more details in the Content page. | |
deliveryFormats | string(enum) | Specifies the technical format of the barcode or identifier that will be issued upon booking confirmation. This field informs the Reseller how to correctly parse, render, or encode the ticket value for the end guest. While the list contains standard industry types like QR_CODE and CODE128, Resellers must ensure their systems can handle any format specified here to successfully distribute this Product. | "QR_CODE" | Required to be populated by the Supplier. |
deliveryMethods
| string(enum) | Defines how fulfillment identifiers are distributed within a booking. A value of TICKET means a unique barcode or identifier is issued for every individual guest or unit in the booking. A value of VOUCHER indicates that a single identifier is issued for the entire booking and is shared across all guests. | "TICKET" | Required to be populated by the Supplier. |
| instantConfirmation
| boolean | Indicates whether the booking is confirmed immediately. If false, the request requires asynchronous processing (due to Supplier review or system load); Resellers should expect an initial PENDING state and must handle delayed confirmation to the customer. | "true" | Required to be populated by the Supplier. |
instantDelivery
| boolean | Indicates whether fulfillment identifiers (tickets/vouchers) are available immediately upon confirmation. If false, the delivery process is asynchronous (due to system latency or generation delays); Resellers must handle a secondary fulfillment step and should not promise the customer immediate access to their tickets. | "true" | Required to be populated by the Supplier. |
locale
| string | Language and region identifier. Must be a valid BCP 47 RFC 5646 RFC 4647 language tag. | "en-US" | Required to be populated by the Supplier. |
productType
| array | Classifies the operational nature of the Product to determine the booking behavior.
| "BEST_AVAILABLE" | Required to be populated by the Supplier. |
redemptionInstructions
| string | Provides clear, human-readable directions explaining how the guest should redeem their ticket or voucher at the venue. | "Please present your QR code at the main entrance kiosk to receive your physical pass." | Optional for the Supplier to populate. Note: This is currently mapped to an extension key. You can continue using them for now, but the key will be deprecated in the future. |
ποΈβπ¨οΈ Response Example
xxxxxxxxxx Rates
A Rate defines a specific bookable option within a Product. A single Product can have multiple Rates, for example, separate morning and afternoon sessions with independent capacity, or a standard and premium tier. Each Rate has its own pricing, hours, cancellation policy, and hold configuration.
π Available Endpoints & Params
| Endpoints | Recommended use |
|---|---|
| GET /suppliers/{id}/products/{id}/rates | Daily cache refresh |
| GET /suppliers/{id}/products/{id}/rates/{id} | Real-time Rate detail pages |
| GET /suppliers/{id}/products/{id}/rates/{id}?content=true | Real-time with localized content (v1.3) |
βοΈ Rate Object Capabilities
| Component | Type | Version | Operational Function |
|---|---|---|---|
| Booking Questions | Object | Houses the dynamic, typed checkout questions (e.g., dietary needs, gear sizes). | |
| Content | Object | Usually used for Rate option-specific inclusions. Highly specific details for this option, such as VIP perks, or what is strictly included/excluded in this price option compared to others. | |
| Hours | Array | v1.2 & v1.3 | Also used for General Operating Hours or for the specific rate option hours. Indicates the overarching availability of the experience (e.g., "The Museum is open 09:00 to 17:00, Tuesday through Sunday"). |
| Locations | Array | v1.2 & v1.3 | Ordered array of physical address coordinates and routing notes. The Option-Specific Touchpoint. Used when a specific variation has a different logistical path. For example, a "VIP Dinner Cruise" Rate might depart from Pier 4, while the standard "Lunch Cruise" Rate departs from Pier 1. |
| Prices | Array | v1.2 & v1.3 | Contains the actual currency breakdowns, age bands (e.g., ADULT, CHILD), net/retail amounts, and included tax structures for the Rate price option. |
π₯ Fields Recently Added to Rate Models
| Field | Type | Description | Example | Notes |
|---|---|---|---|---|
bookingQuestions
| object | An array of questions that can be asked during the booking flow. Visible when the bookableQuestions query parameter is set to true. | See more details in the Booking Questions page. | |
content
| object | Provides localized, structured, and customer-facing content that can be attached to multiple entities. This object is the primary source for descriptive marketing data across all levels of the catalog. | See more details in the Content page. | |
description | string | A detailed explanation of the specific activity, experience, or event offered in this Option/Rate. This long-form content is meant to appear on Product detail pages, highlighting experience-specific details or restrictions. | "Perfect for early birds who want to explore the city before the crowds." | Optional for the Supplier to populate. |
ποΈβπ¨οΈ Response Example
xxxxxxxxxx Rate Type
There are three different rate types: FREESALE, PASS, and RESERVED.
FREESALETickets and entry passes are available during the opening hours of the attraction, and there is no specific entry time.PASSRates are used for Products where access is granted multiple times, whereasFREESALEandRESERVEDRates are normally single-use.RESERVEDRates can be with or without capacity, depending on the requirements and inventory defined by the Supplier, and always require a hold to ensure that the availability for a certain date and time does not change between the availability check and the booking request. Bookings can, however, be rejected if there is insufficient capacity at the requested date and time.
Being able to handle both types of product rates gives you, the Reseller, the flexibility to manage both general admission (FREESALE) and time-slot defined (RESERVED) types. This allows you to accommodate a broader range of use cases for different suppliers and their connected products.
Validity vs. Hours
The rate.hours are used to define the available times for the product, which are the product operating hours the traveler is able to enter the attraction.
rate.valid is used to determine when the rate is available for purchase. Bookings can only occur within the defined valid from and valid until attributes. Some suppliers set up products ahead of their validity date for visibility and preparation. Please note and enforce the validity dates.
An example for this would be if a Supplier sets up 2 different rates: General Admission ticket for 2026 and 2027.
xxxxxxxxxxname: General Admissioncode: GA2023valid: 2026-01-01 to 2026-12-31 name: General Admissioncode: GA2024valid: 2027-01-01 to 2027-12-31They are available to be booked the entire year, but there are specific days and times the product is available in that year.
xxxxxxxxxxrate.hours[0]- Monday, Tuesday, Wednesday, Thursday- 5:00pm to 7:00pm- valid: 2023-01-01 to 2023-12-31The timezone field is provided as an IANA timezone string (e.g., "America/New_York"). If this field is empty, then the open and close times are communicated in UTC and should be used to convert to the local time of the product location.
Rate minTravelers & maxTravelers
This field represents the minimum and maximum number of travelers to qualify for this rate which means the maximum number of tickets that can be purchased for this rate. The data is being mapped from the Supplier setup. This will prevent customers from selecting more than the allowed quantity and getting errors during Hold and Booking requests.
Rate travelerTypes, ageBand and modifier
Support list of ageBand to describe a particular age or occupation of a traveler type
Ideally, being able to consume the
nameandmodifierto support the full breadth of price/traveler types the operators provide. These could be things likeEU_CITIZEN,MILITARYMinimally support all age bands in the specifications
ADULT,ANY,CHILD,INFANT,SENIOR,STUDENT,YOUTH- The
ANYtype may be used instead of the above listedageBand, if distinctions between age or occupation are not relevant to the product. Itβs a generic ageband type used by some suppliers and itβs recommended to be supported, otherwise, a workaround needs to be done to map that value.
- The
Solve multiple instances of the same age band. There are instances where operators will send 2 prices for the same traveler type (ie 2 - ADULT). This typically means there is a difference in the name/modifier that makes it a different traveler type still limited to adults OR it means theyβre running a special price for a limited time. You can:
- Consume name/modifier and display both
- Display only one lower or higher of the 2 prices
Cancelable Flag
The cancellation policy for a product is indicated by the boolean cancelable = true or cancelable = false. When true, it indicates that bookings made under this Rate are eligible for cancellation. Please note that this does not refer to a hold, which can always be released or canceled regardless of this setting.
β¨Tip: You can also check the refundable boolean on the Rate, which indicates if a booking made with this Rate is eligible for a monetary refund. This defines the financial policy, whereas cancelable defines the operational ability to void a booking.
Rate Prices
Each Rate object contains a prices array listing baseline prices by traveler type. These are always superseded by the Price Schedule when a scheduled price exists for the requested date - always check the Price Schedule first and use static prices only as a fallback.
However, because experience prices often fluctuate based on seasonality or specific dates, you must use the Price Schedule API to retrieve the actual bookable price for a specific date.
When placing a Hold or a Booking, provide the priceId from Price Schedule response.
More detailed pricing implementation steps can be found in the Pricing section.
Please note that Rates from the Price Schedule ALWAYS supersede Rate prices.
Rate Traveler Type
Defines the eligibility requirements and classification for a traveler. Includes age ranges, modifiers, and display information.
βοΈ Traveler Type Object Capabilities
| Component | Type | Version | Operational Function |
|---|---|---|---|
| Content | Object | Houses localized text clarifying the specific passenger profile (e.g., stating that a "Senior" ticket applies to ages 65+ or a "Student" requires a valid university ID at the gate). | |
| Constraints | Array | v1.2 & v1.3 | Defines mandatory physical or demographic boundaries for this specific ticket, such as strict minimum/maximum ages, height restrictions, or weight limits. |
π₯ Fields Recently Added to Traveler Type Models
| Field | Type | Description | Example | Notes |
|---|---|---|---|---|
content
| object | Provides localized, structured, and customer-facing content that can be attached to multiple entities. This object is the primary source for descriptive marketing data across all levels of the catalog. | See more details in the Content page. | |
description | string | Provides information and details about this item. | "Perfect for early birds who want to explore the city before the crowds." | Optional for the Supplier to populate. |
title | string | Customer-facing display name. This value may be shown to end customers across reseller and distribution channels. | Optional for the Supplier to populate. |
Traveler Type Constraints New
Adds a structured constraints array (with min, max, and type) to the travelerType object to help you programmatically enforce operational rules like age or weight restrictions.
π₯ Fields Recently Added to Constraints Models
| Field | Type | Description | Example | Notes |
|---|---|---|---|---|
message | string | Provides information and details about this item. | "Perfect for early birds who want to explore the city before the crowds." | Optional for the Supplier to populate. |
min | number($double) | Minimum allowable value for the constraint. If specified, the traveler or item must meet or exceed this value to be eligible. At least one of min or max must be set. Must be less than or equal to max if both are set. | Optional for the Supplier to populate. | |
max | number($double) | Maximum allowable value for the constraint. If specified, the traveler or item must not exceed this value to be eligible. At least one of min or max must be set. Must be greater than or equal to min if both are set. | Optional for the Supplier to populate. | |
pattern | string | A regex pattern for validation. | Optional for the Supplier to populate. | |
type | string(enum) | Enumerates the supported constraint types, defining both the measurement and unit used to evaluate eligibility. | Required to be populated by the Supplier if constraints is provided |
Questions? We'd love to hear them. Contact Travel Curious Support.