Content (v1.3)

v1.3

The Content object provides structured, localized, customer-facing data that can be attached to Suppliers, Products, Rates, and individual price tiers. It is designed for display in your UI and separates rich marketing content from the core transactional fields.

🔗 Find the full details here: Reseller API Reference

Info

v1.2 partners: Content is a v1.3-only capability. Your existing integration is unaffected. You can adopt it at any time by switching to the /v1.3/ base path.

Requesting Content

Content is not returned by default. To include it, add content=true to any singular GET endpoint:

GET /v1.3/suppliers/{id}content=true GET /v1.3/suppliers/{id}/products/{id}content=true GET /v1.3/suppliers/{id}/products/{id}/rates/{id}content=true
Warning

Content is not available on list endpoints (e.g., GET /suppliers or GET /suppliers/{id}/products). Always use the singular endpoint when you need content data.

Filtering by Language

Add the locale= parameter to return only text in specific languages. Accepts a comma-separated list of BCP 47 language tags:

GET /v1.3/suppliers/{id}/products/{id}content=true&locale=en-US,es-ES,de-DE

If locale= is omitted, all available language variants are returned.

Priority Rule

When content is present in a response, its values must take priority over the equivalent standard entity fields for display purposes.

The name / internalName, title, and description fields on the main entities - Supplier, Product, Rate, and Rate Prices - are treated as standard fields, not content fields.

Suppliers who do not implement content capability may continue using these fields.

If a Supplier does use content, then they can use the content.name, content.title, and content.description fields to provide additional languages, alternative formats, or to override the values on the main entities.

IMPORTANT

Fall back to the standard fields only when a specific content field is absent or empty. Never display both side by side - content is the authoritative source for customer-facing text when present.

LocalizedTextSet

Content fields use the LocalizedTextSet pattern to support multi-lingual and multi-format content.

Field

Format

Description

text

string

The content string

format

enum

The content format. Allowed values: plaintext, html, markdown

locale

string

This MUST be a valid BCP 47 RFC 5646 RFC 4647 language tag

LocalizedText

Represents a single text entry in a specific language and format. If a supplier provides this object, all its internal fields (text, format, and locale) are mandatory.

LocalizedTextSet

A collection of LocalizedText objects. While a set can contain multiple entries to accommodate various locales and formats, each locale + format combination must be unique within a single LocalizedTextSet. The system will reject duplicate combinations from the Supplier side.

"description": [ { "text": "Join us for a 3-hour kayaking tour around the Barcelona coastline.", "locale": "en", "format": "plain" }, { "text": "Únete a nosotros para un recorrido en kayak de 3 horas por la costa de Barcelona.", "locale": "es", "format": "plain" } ]

Content Object Field

Field

Type

Description

Notes

id

string

Unique identifier for this content object. Used to reference and manage content independently of the parent entity.

Required to be populated by the Supplier if content is provided.

name

LocalizedTextSet

Name the Supplier uses for internal identification

Optional for the Supplier to populate.

title

LocalizedTextSet

Customer-facing name, intended for display in UIs or marketing.

Optional for the Supplier to populate.

subtitle

LocalizedTextSet

Brief tagline or descriptive phrase that complements the title and highlights key details.

Optional for the Supplier to populate.

description

LocalizedTextSet

Full long-form description. This content is intended for display in full detail pages and should help users understand what makes the Supplier/Product/Rate unique.

Optional for the Supplier to populate.

shortDescription

LocalizedTextSet

Brief teaser text. Intended for quick display in listings, search results, or previews to attract user interest.

Optional for the Supplier to populate.

categories

LocalizedTextSet

List of tags or labels that classify the content by type or theme. Useful for search, filtering, and categorization in UI and APIs.

Optional for the Supplier to populate.

duration

Duration

Defines how long the product or experience takes. Useful for setting customer expectations and supporting filters.

Optional for the Supplier to populate.

features[]

Features[]

Captures structured highlights, inclusions, exclusions, and policy-related aspects of the experience. Each item is categorized using a predefined type enum for clarity and filtering, defining how that information should be interpreted and displayed.

Optional for the Supplier to populate.

faqs[]

Faqs[]

Represents a frequently asked question and its answer, intended to inform customers about common concerns or clarifications.

Optional for the Supplier to populate.

media[]

Media[]

Images, videos, and external media links. Intended to enhance the customer experience by showcasing visual or multimedia content relevant to the activity or location. Public accessibility is required from the Supplier.

Optional for the Supplier to populate.

ratings[]

Ratings[]

A list of rating sets from various sources. Useful for showing aggregated scores from review platforms.

Optional for the Supplier to populate.

reviews[]

Reviews[]

User-generated reviews, feedback, and testimonials.

Optional for the Supplier to populate.

metadata

Metadata

Additional system-level metadata related to this content, such as timestamps or internal bookkeeping fields.

Optional for the Supplier to populate.

Categories

Help classify and organize content into easily searchable and filterable themes. They provide semantic tags that describe the type of experience, audience, or context - making it easier for resellers and end users to discover relevant content.

Info

The current beta-categories extension key is a supplemental extension for grouping related products (e.g., MUSICAL, PLAY, COMEDY, SPORTS). New content categories will not be mapped into beta-categories. Suppliers can continue using them for now, but they will be deprecated in the future, and categories must then be provided through the categories array of objects in the content.

"categories": [ { "category": { "en-US": "Adventure", "es-ES": "Aventura", "fr-FR": "Aventure", "de-DE": "Abenteuer" } }, { "category": { "en-US": "Food Tour", "es-ES": "Tour gastronómico", "fr-FR": "Visite gastronomique" } } ]

Duration

Defines how long the product or experience takes. Combines a numeric length, a time unit, and an optional localized description for display. Useful for setting customer expectations and supporting filters like "half-day", "multi-day", etc.

Field

Type

Description

Notes

length

number

Numeric duration value expressed in the specified unit. Can include decimal values (e.g., "1.5 for 1 hour 30 minutes")

Required to be populated by the Supplier if duration is provided.

flexible

boolean

If true, the duration is an estimate (e.g., "approx 3 hours"). If false, the duration is fixed (e.g., a _"45-minute show_").

Optional for the Supplier to populate.

unit

string (enum) [ minutes, hours, days, weeks ]

Unit of time used to interpret the duration length. Note: The API does not validate the combination of length + unit. Any value submitted will be accepted and displayed as-is, even if it results in unusual or non-standard durations (e.g., "_0.37"_ days or `"````1.87 minutes"```).

Required to be populated by the Supplier if duration is provided.

description

LocalizedTextSet

Customer-facing, localized explanation of the duration, such as _"Approximately 2.5 hours including breaks"_.

Optional for the Supplier to populate.

"duration": { "length": 2, "unit": "hours", "description": { "en-US": "Estimated 2 hours of self-paced exploration.", "es-ES": "Aproximadamente 2 horas de exploración a tu ritmo.", "fr-FR": "Environ 2 heures d’exploration autonome." } },

FAQs

Stores Frequently Asked Questions and Answers relevant to the Supplier, Product, Option/Rate, or Unit/Rate Price. This helps anticipate common customer concerns and reduces friction during booking or usage.

If an FAQ is provided, the Supplier must populate both question and answer. Additionally, for a given locale, the Supplier must ensure the question and its corresponding answer use the same locale and format values.

Field

Type

Description

Notes

question

LocalizedTextSet

The customer-facing question.

Required to be populated by the Supplier if faqs is provided.

answer

LocalizedTextSet

The clear and concise answer to the corresponding question.

Required to be populated by the Supplier if faqs is provided.

{ "faqs": [ { "question": { "localizedTexts": [ { "text": "What should I bring with me on the tour?", "format": "plaintext", "locale": "en-US" }, { "text": "**What should I bring with me on the tour?**", "format": "markdown", "locale": "en-US" }, { "text": "¿Qué debo llevar conmigo en la visita?", "format": "plaintext", "locale": "es-ES" }, { "text": "**¿Qué debo llevar conmigo en la visita?**", "format": "markdown", "locale": "es-ES" } ] }, "answer": { "localizedTexts": [ { "text": "We recommend bringing comfortable walking shoes, a water bottle, a hat, and sunscreen. Here in Andalusia, the sun can be strong even outside of summer, so it's always wise to be prepared.", "format": "plaintext", "locale": "en-US" }, { "text": "We recommend bringing **comfortable walking shoes**, a water bottle, a hat, and sunscreen. Here in Andalusia, the sun can be strong even outside of summer, so it's always wise to be prepared.", "format": "markdown", "locale": "en-US" }, { "text": "Recomendamos llevar calzado cómodo, una botella de agua, un sombrero y protector solar. Aquí en Andalucía, el sol puede ser fuerte incluso fuera del verano, así que siempre es prudente estar preparado.", "format": "plaintext", "locale": "es-ES" }, { "text": "Recomendamos llevar **calzado cómodo**, una botella de agua, un sombrero y protector solar. Aquí en Andalucía, el sol puede ser fuerte incluso fuera del verano, así que siempre es prudente estar preparado.", "format": "markdown", "locale": "es-ES" } ] } }, { "question": { "localizedTexts": [ { "text": "Are pets allowed on the tour?", "format": "plaintext", "locale": "en-US" }, { "text": "*Are pets allowed on the tour?*", "format": "markdown", "locale": "en-US" }, { "text": "¿Se permiten mascotas en la visita?", "format": "plaintext", "locale": "es-ES" }, { "text": "*¿Se permiten mascotas en la visita?*", "format": "markdown", "locale": "es-ES" } ] }, "answer": { "localizedTexts": [ { "text": "Pets are not allowed on the tour, except for service animals. Please plan accordingly.", "format": "plaintext", "locale": "en-US" }, { "text": "Pets are not allowed on the tour, except for **service animals**. Please plan accordingly.", "format": "markdown", "locale": "en-US" }, { "text": "No se permiten mascotas en la visita, excepto animales de servicio. Por favor, planifique en consecuencia.", "format": "plaintext", "locale": "es-ES" }, { "text": "No se permiten mascotas en la visita, excepto **animales de servicio**. Por favor, planifique en consecuencia.", "format": "markdown", "locale": "es-ES" } ] } } ] }

Features

Captures structured highlights, inclusions, exclusions, and policy-related aspects of the experience. Each item is categorized using a predefined type enum for clarity and filtering, defining how that information should be interpreted and displayed.

We currently allow duplicate feature types within the features array. This means you may include multiple entries with the same type (e.g., more than one HIGHLIGHT).

Field

Type

Description

Notes

type

string (enum)

Classification of the feature.

Required to be populated by the Supplier if feature is provided.

description

LocalizedTextSet

A localized explanation or label for the feature, to be displayed to end users in their preferred language.

Required to be populated by the Supplier if feature is provided.

Feature Types

Type

Description

Example

INCLUSION

What is included in the experience, entitlements, services, or perks.

"Mobile app access for all participants"

EXCLUSION

What is not included, or costs that may apply additionally.

"Food and drinks not included in the ticket price"

HIGHLIGHT

A key selling point, unique aspect, or experience standout. Usually shown as a badge or bullet in UI.

"Explore famous landmarks in a gamified scavenger hunt"

PREBOOKING_INFORMATION

Information users should know before booking. Includes eligibility, requirements, limitations.

"Players must have a smartphone with internet access"

PREARRIVAL_INFORMATION

What users need to know or prepare before arriving at the location.

"Arrive 10 minutes early to check in and download the app"

REDEMPTION_INSTRUCTION

Steps required to begin or redeem the experience. Useful for self-guided, ticketed, or app-based activities.

"Start your quest by launching the app at the designated starting point"

ACCESSIBILITY_INFORMATION

Notes about accessibility features or limitations. e.g., mobility, hearing, or visual support.

Thi__s tour is wheelchair accessible and includes step-free routes"

ADDITIONAL_INFORMATION

Other useful details not covered by another category. Typically supplementary or nice-to-know content.

"We recommend wearing comfortable walking shoes"

BOOKING_TERMS_AND_CONDITIONS

Rules or terms related to ticket validity, age restrictions, or group limits.

"Ticket valid for 7 days from purchase"

CANCELLATION_TERMS_AND_CONDITIONS

Policy about refunds or cancellations, including cut-off times.

"Full refund available up to 24 hours before start time"

TERMS_AND_CONDITIONS

General or overarching legal agreements, user obligations, and liability waivers governing the entire experience.

"By purchasing a ticket, participants agree to our standard liability waiver"

RESTRICTION_REQUIREMENT

Strict physical, health, or legal mandates that participants must meet to join the experience.

"Participants must be at least 12 years old and over 120cm tall"

SAFETY_INFORMATION

Guidelines, hazards, or health advisories to ensure participant well-being during the activity.

"Not recommended for pregnant travelers or those with serious medical conditions"

PRIVATE

Indicates whether the option or experience is private or shared with other public participants.

"This is a private tour, meaning your group will have a dedicated guide"

COMMENTARY

Describes narrative elements, guides, or storytelling that may be part of the experience.

"Includes audio narration at key landmarks, voiced by a local historian"

OTHER

Catch-all for any uncategorized or partner-specific feature content.

"Includes souvenir digital photo upon completion"

"features": [ { "type": "INCLUSION", "description": { "en-US": "Mobile app access for all participants", "es-ES": "Acceso a la aplicación móvil para todos los participantes", "fr-FR": "Accès à l'application mobile pour tous les participants" } }, { "type": "HIGHLIGHT", "description": { "en-US": "Explore iconic city landmarks in a fun, gamified way", "es-ES": "Explora lugares emblemáticos de la ciudad de forma divertida y gamificada", "fr-FR": "Découvrez les monuments emblématiques de la ville de manière ludique" } }, { "type": "PREBOOKING_INFORMATION", "description": { "en-US": "Players must have a smartphone with internet access", "es-ES": "Los jugadores deben tener un teléfono inteligente con acceso a internet", "fr-FR": "Les joueurs doivent avoir un smartphone avec accès à Internet" } }, { "type": "REDEMPTION_INSTRUCTION", "description": { "en-US": "Start your adventure by launching the app at the designated starting point", "es-ES": "Inicia tu aventura abriendo la aplicación en el punto de partida designado", "fr-FR": "Commencez votre aventure en lançant l'application au point de départ indiqué" } }, { "type": "CANCELLATION_TERM", "description": { "en-US": "Full refund available up to 24 hours before start time", "es-ES": "Reembolso completo disponible hasta 24 horas antes del inicio", "fr-FR": "Remboursement complet jusqu'à 24 heures avant le début" } } ]

Media

Provides images, videos, logos, or other rich media assets that represent the Supplier, Product, Option/Rate, or Unit/Rate Price. Media helps enhance visual storytelling and improve user engagement. Public accessibility is required from the Supplier.

Field

Type

Description

Notes

url

string

Direct link to the media asset (image, video, etc.).

Required to be populated by the Supplier if media is provided.

Public accessibility is required from the Supplier. The url is validated for correct HTTP/HTTPS format, but Travel Curious does not check if the resource is public or reachable.

^https?:\/\/(?:[\w-]+\.)+[\w-]+(?::\d+)?(?:\/[^\s])?(?:\?[^\s])?$

type

string (enum)

The media file type.

Required to be populated by the Supplier if media is provided.

relationship

string (enum)

Describes how the media relates to the object. Examples: "logo" (Supplier branding), "cover" (hero image for product), "gallery" (set of supplementary visuals). Helps clients render or prioritize media appropriately.

Required to be populated by the Supplier if media is provided.

title

LocalizedTextSet

Localized title for the media asset, useful for accessibility or alt text.

Optional for the Supplier to populate.

caption

LocalizedTextSet

Localized caption displayed alongside the media (e.g., "View from the summit at sunrise").

Optional for the Supplier to populate.

copyright

LocalizedTextSet

Localized copyright information (e.g., "© 2025 Adventure Co.").

Optional for the Supplier to populate.

credits

LocalizedTextSet

Localized attribution for creators or sources (e.g., "Photo by John Smith").

Optional for the Supplier to populate.

metadata

LocalizedTextSet

Optional localized metadata, tags, or notes about the media. Useful for additional display context or search indexing.

Optional for the Supplier to populate.

Media Types

Type

Description

image/jpeg

JPEG image

image/png

PNG image

image/webp

WebP image

image/svg+xml

SVG vector image

video/mp4

MP4 hosted video

video/avi

AVI hosted video

external/youtube

YouTube embedded URL video

external/vimeo

Vimeo embedded video

external/other

Other hosted or embedded video

application/pdf

PDF document

Media Relationships

Relationships

Description

LOGO

Brand mark for the Supplier - typically used in headers and search results

COVER

Hero or banner image - used as the primary visual for detail pages

GALLERY

Supplementary images - intended for display in a secondary position, often as part of a browsable image carousel or collection, to offer more context than the COVER image alone.

OTHER

Uncategorized media - a general-purpose type for miscellaneous attachments like instructional diagrams, technical charts, or other supporting documents.

{ "url": "https://example.com/media/grand-canyon.jpg", "type": "image", "relationship": "cover", "title": { "en-US": "Grand Canyon Sunset", "es-ES": "Atardecer en el Gran Cañón", "fr-FR": "Coucher de soleil sur le Grand Canyon" }, "caption": { "en-US": "A breathtaking view from the South Rim at dusk.", "es-ES": "Una vista impresionante desde el borde sur al atardecer.", "fr-FR": "Une vue à couper le souffle depuis la rive sud au crépuscule." }, "copyright": { "en-US": "© 2025 Canyon Tours Ltd.", "es-ES": "© 2025 Canyon Tours Ltd.", "fr-FR": "© 2025 Canyon Tours Ltd." }, "credits": { "en-US": "Photo by Alex Rivera", "es-ES": "Foto de Alex Rivera", "fr-FR": "Photo par Alex Rivera" } }

Ratings

Aggregates review scores from sources like Google, TripAdvisor, Yelp, etc. This provides social proof, helping users quickly evaluate the quality and reliability of the experience.

Rating Aggregate

Field

Type

Description

Notes

source

LocalizedTextSet

Localized name of the review platform or source (e.g., _"TripAdvisor"_, _"Google Reviews"_).

Required to be populated by the Supplier if ratings is provided.

average

Rating

The average rating value (e.g., 1-5).

Required to be populated by the Supplier if ratings is provided.

count

integer

Total number of ratings that contributed to the average. Must be non-negative values (integer ≥ 0).

Required to be populated by the Supplier if ratings is provided.

lastUpdated

string($date-time)

Timestamp of the last time the rating data was refreshed. Format: ISO 8601 (e.g., "2025-06-25T10:00:00Z").

Optional for the Supplier to populate.

Rating

Field

Type

Description

Notes

value

number

Rating value.

Required to be populated by the Supplier if rating is provided.

min

integer

Minimum possible rating.

Required to be populated by the Supplier if rating is provided.

max

integer

Maximum possible rating.

Required to be populated by the Supplier if rating is provided.

{ "RatingAggregate": [ { "source": { "en-US": "Google Reviews", "es-ES": "Google Reseñas", "fr-FR": "Avis Google" }, "average": { "value": 3.5, "min": 1, "max": 5 }, "count": 100000, "lastUpdated": "2026-05-25T18:40:00Z" }, { "source": { "en-US": "Yelp Reviews", "es-ES": "Reseñas de Yelp", "fr-FR": "Avis Yelp" }, "average": { "value": 97.5, "min": 1, "max": 100 }, "count": 12000, "lastUpdated": "2026-05-24T12:00:00Z" } ] }

Reviews

Captures written customer testimonials or feedback. These reviews reflect real user sentiment and provide qualitative insights for potential buyers.

Field

Type

Description

Notes

reviewerName

LocalizedTextSet

Localized display name or alias of the reviewer (e.g., _"Alice T."_, _"Traveler from Berlin"_). Used for presentation only; not required for anonymous reviews.

Optional for the Supplier to populate.

title

LocalizedTextSet

Localized title or headline of the review (e.g., _"Amazing experience!"_). Useful for summarizing experience sentiment.

Optional for the Supplier to populate.

content

LocalizedTextSet

Localized full review content describing the customer’s experience.

Required to be populated by the Supplier if review is provided.

source

LocalizedTextSet

Localized name of the review platform or source (e.g., _"TripAdvisor"_, _"Google Reviews"_).

Optional for the Supplier to populate.

rating

Rating

Aggregates review scores

Optional for the Supplier to populate.

createdAt

string($date-time)

Timestamp of when the review was created. Useful for sorting and freshness. Format: ISO 8601 (e.g., "2025-06-25T14:20:00Z").

Optional for the Supplier to populate.

verified

boolean

Indicates whether the review is from a verified booking or customer. Helps establish credibility and trust.

Optional for the Supplier to populate.

"reviews": [ { "reviewerName": { "en-US": "Samantha", "es-ES": "Samantha", "fr-FR": "Samantha" }, "title": { "en-US": "Incredible experience!", "es-ES": "¡Experiencia increíble!", "fr-FR": "Expérience incroyable !" }, "content": { "en-US": "This was the highlight of our trip. The guide was knowledgeable and the views were amazing.", "es-ES": "Fue lo mejor de nuestro viaje. El guía sabía mucho y las vistas eran impresionantes.", "fr-FR": "C'était le meilleur moment de notre voyage. Le guide était très compétent et les vues étaient magnifiques." }, "rating": 5.0, "createdAt": "2025-06-24T17:45:00Z", "verified": true } ]

Metadata

Additional system-level metadata related to this content, such as timestamps or internal bookkeeping fields.

Use lastUpdated to determine whether a cached Content object needs to be refreshed.

Field

Type

Description

Notes

lastUpdated

string($date-time)

Timestamp indicating when the record was last updated.

Optional for the Supplier to populate.

{ "metadata": { "lastUpdated": "2026-05-25T18:55:00Z" } }

Content by Entity

Not all fields are populated at every level. Content is enrichment data, not guaranteed data. Always check for the presence of each field before rendering it.

Info

The sections below are just examples of what each entity can typically carry.

Supplier

Typical content fields: name, title, description, media (logo and gallery), ratings, reviews, faqs .

Example response (abbreviated):

{ "supplier": { "id": "08e4f505-3374-447e-b3b0-32698603b155", "name": "Oceanic Adventures Barcelona", "mainLocation": { "type": "HQ", "name": "Main Office", "address": { "locality": "Barcelona", "countryCode": "ESP" }, "references": [ { "platform": "GOOGLE_PLACE_ID", "id": "ChIJYYYYYY", "url": "http://googleusercontent.com/maps.google.com/1..." } ] }, "otherLocations": [ { "type": "MEETING_POINT", "name": "Beach Kiosk", "address": { "locality": "Barcelona", "countryCode": "ESP" }, "references": [ { "platform": "GOOGLE_PLACE_ID", "id": "ChIJXXXXXX", "url": "https://maps.google.com/..." } ] } ], "content": { "name": [ { "text": "Oceanic Adventures Barcelona", "locale": "en", "format": "plain" }, { "text": "Aventuras Oceánicas Barcelona", "locale": "es", "format": "plain" } ], "description": [ { "text": "Award-winning water sports operator on the Barcelona waterfront since 2008.", "locale": "en", "format": "plain" }, { "text": "Operador de deportes acuáticos galardonado en la costa de Barcelona desde 2008.", "locale": "es", "format": "plain" } ], "media": [ { "url": "https://cdn.example.com/logo.png", "type": "image/png", "relationship": "LOGO" }, { "url": "https://cdn.example.com/cover.jpg", "type": "image/jpeg", "relationship": "COVER" } ], "ratings": [ { "source": [ { "text": "Google", "locale": "en", "format": "plain" }, { "text": "Google", "locale": "es", "format": "plain" } ], "average": { "value": 4.8, "min": 0, "max": 5 }, "count": 312 } ] } } }

Product

Typical content fields: All fields - name, title, subtitle, description, shortDescription, categories, duration, features, faqs, media, ratings, reviews

Rate

Typical content fields:

RatePrice / TravelerType

Typical content fields: name, description