Content
Adds extra content fields to OCTO Core object schemas on select endpoints to provide detailed descriptive information about supplier, products, options, units, booking, etc.
Updated: May 14, 2025
To use this capability, add content
to your Octo-Capabilities
header.
This capability extends the Supplier, Product, Option, Unit, Availability, and Booking schemas to add additional descriptive content that can be used to populate product listings as well as for various other use cases that require this information.
Localization
Since suppliers and their systems may offer content in different languages, this content capability supports localization through:
the
Accept-Language
request headerthe
Content-Language
response headerand the
Available-Languages
response header
This allows clients to request and receive content in their preferred languages, and understand what language options are available for a product.
Request Headers
The reseller system can include language preferences in the API call to the supplier system to request content in a specific language. The Accept-Language
header communicates which languages are preferred and in what order. This header is optional—if omitted or empty, the supplier system will fall back to their default language:
Accept-Language
string (IETF BCP 47 tag)
Optional
Optional request header to specify preferred languages for response content. Supports a comma-separated list of language tags with optional q
values to set priority. Follows BCP 47 (RFC 5646 & RFC 4647). Does not guarantee content availability in those languages. Commonly used for localization in HTTP (RFC 7231). See also: MDN Docs.
en-US
, en-GB
, fr-CA;q=0.8
, fr;q=0.7
Response Headers
The supplier system response may include headers that indicate the language of the returned content and the set of available language options. These help reseller systems interpret the response and determine if additional requests are needed for other languages. When the content
capability is used, both Content-Language
and Available-Languages
headers must be present in the response:
Content-Language
string (IETF BCP 47 tag)
Required
Indicates the language of the returned content. Only one language is allowed per response. To get multiple languages, separate requests are needed. Conforms to BCP 47 and is defined in RFC 7231. See also: MDN Docs.
en-GB
Available-Languages
array<string> (IETF BCP 47 tag)
Required
Lists all languages in which the content is available. Not a standard HTTP header, but widely used in APIs for localization awareness. Helps determine language options without making extra requests. Must follow BCP 47 standards.
en-GB
, es-ES
, de-DE
Example Headers with Localization:
Request
GET /octo/products/be665021-a694-4320-9e7d-6f04a7541755 HTTP/1.1
Host: api.example.com
User-Agent: MyClient/1.0.0
Accept: application/json
Authorization: Bearer 3b162482-7fe3-4d91-b6b4-26302530f0dc
Content-Type: application/json
Octo-Capabilities: content, pricing
Octo-Env: live
Accept-Language: fr-FR, fr;q=0.9, en;q=0.8
Response
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Octo-Capabilities: content, pricing
Content-Language: fr-FR
Octo-Env: live
Octo-Available-Languages: en, fr, es, de
Additional Content Fields
The content
capability enriches standard OCTO Core objects with additional, language-specific content such as titles, descriptions, and other localized attributes.
When the capability content
is included in the Octo-Capabilities
header of a request to any OCTO Core endpoint, and if the supplier system supports this capability, the following objects may include additional fields:
Supplier
Product
Option
Unit
Availability
Booking
These enrichments are dynamically included in the response based on language preferences provided in the request (via Accept-Language
) and the available translations on the supplier side.
Each object’s additional fields will be detailed in the following sections below:
Supplier
The following fields are added to the OCTO Core Supplier object when the content
capability is used and supported by the supplier system.
These fields provide localized, customer-facing information and rich media assets. They are returned only when:
The supplier supports the
content
capabilityThe request includes the header:
Octo-Capabilities: content
Enriched Fields (from content
Capability)
content
Capability)shortDescription
string | null
A brief, customer-facing summary of the supplier’s business. Can be localized. May be null
if not available.
media
array of objects
A list of associated media objects such as logos, promotional images, or videos. Each object contains metadata to support display and attribution.
media[]
Object Fields
type
string (enum)
Format of the media. Supported types include: image/jpeg
, image/png
, image/webp
, image/svg+xml
, video/mp4
, video/avi
, external/youtube
, external/vimeo
, external/other
, application/pdf
.
rel
string (enum)
Defines the relationship of the media to the supplier. Values: LOGO
, COVER
, GALLERY
.
src
string (uri)
The URL of the media file. Must be stable and publicly accessible.
title
string | null
Title or label of the media file. Useful for organizational or display purposes.
caption
string | null
A customer-facing caption that provides additional context or information about the media.
copyright
string | null
Copyright or usage restrictions, such as attribution or licensing notes. Can be null
if no restrictions apply.
Example: Supplier Object with content
Capability Fields:
content
Capability Fields:{
"id": "697e3ce8-1860-4cbf-80ad-95857df1f640", // OCTO Core field
"endpoint": "https://api.supplierdomain.com/octo", // OCTO Core field
"name": "Merlin Entertainments", // OCTO Core field
"contact": { // OCTO Core field
"website": "https://www.merlinentertainments.biz", // OCTO Core field
"email": "[email protected]", // OCTO Core field
"telephone": "+441202666900", // OCTO Core field
"address": "Link House, 25 West St, Poole BH15 1LD, United Kingdom" // OCTO Core field
},
"shortDescription": "Merlin Entertainments is a global leader in location-based entertainment, operating iconic attractions such as LEGOLAND, Madame Tussauds, SEA LIFE, and The Dungeons.",
"media": [
{
"type": "image/png",
"rel": "LOGO",
"src": "https://www.merlinentertainments.biz/media/logo-blue.png",
"title": "Merlin Entertainments Logo",
"caption": "Official Logo of Merlin Entertainments",
"copyright": "© 2024 Merlin Entertainments"
},
{
"type": "image/jpeg",
"rel": "COVER",
"src": "https://cdn.example.com/images/cover-merlin.jpg",
"title": "Main Visual",
"caption": "Families enjoying the LEGOLAND experience",
"copyright": null
},
{
"type": "external/youtube",
"rel": "GALLERY",
"src": "https://www.youtube.com/watch?v=xyz12345",
"title": "Promo Video",
"caption": "Discover Merlin attractions worldwide",
"copyright": null
},
{
"type": "external/other",
"rel": "GALLERY",
"src": "https://cdn.example.com/media/promo-pdf.pdf",
"title": "Brochure PDF",
"caption": "Download our detailed product brochure",
"copyright": "© 2024 Merlin Entertainments"
}
]
}
Product
The following fields are added to the OCTO Core Product object when the content
capability is supported and requested.
They enhance the product with localized titles, descriptions, rich media, features, FAQs, category labels, durations, commentary, and location data to help resellers provide a complete, customer-facing product view.
These fields are returned when:
The supplier supports the
content
capabilityThe request includes the header:
Octo-Capabilities: content
Enriched Fields (from content
Capability)
content
Capability)title
string
Public, customer-facing name of the product.
shortDescription
string | null
Brief marketing summary.
description
string | null
Long-form product narrative.
features[]
array
List of structured features grouped by type.
features[].shortDescription
string | null
Short label for the feature.
features[].type
string (enum)
One of: INCLUSION
, EXCLUSION
, HIGHLIGHT
, PREBOOKING_INFORMATION
, PREARRIVAL_INFORMATION
, REDEMPTION_INSTRUCTION
, ACCESSIBILITY_INFORMATION
, ADDITIONAL_INFORMATION
, BOOKING_TERM
, CANCELLATION_TERM
.
faqs[]
array
Frequently asked questions.
faqs[].question
string
The question text.
faqs[].answer
string
The corresponding answer.
media[]
array
List of media assets (images, PDFs, videos, etc.).
media[].src
string (uri)
URL of the media file.
media[].type
string (enum)
One of: image/jpeg
, image/png
, image/webp
, image/svg+xml
, video/mp4
, video/avi
, external/youtube
, external/vimeo
, external/other
, application/pdf
.
media[].rel
string (enum)
One of: LOGO
, COVER
, GALLERY
.
media[].title
string | null
Title of the media.
media[].caption
string | null
Customer-facing caption.
media[].copyright
string | null
Copyright or license information.
locations[]
array
List of places associated with the product.
locations[].title
string | null
Name of the location.
locations[].shortDescription
string | null
Short description of the location.
locations[].types[]
array
One or more of: START
, ITINERARY_ITEM
, POINT_OF_INTEREST
, ADMISSION_INCLUDED
, END
, REDEMPTION
.
locations[].minutesTo
integer | null
Minutes to reach this location from the previous. Required for ITINERARY_ITEM
or END
.
locations[].minutesAt
integer | null
Minutes spent at this location. Required for ITINERARY_ITEM
or END
.
locations[].place
object
Detailed geographic and address information.
place.latitude
float
Latitude in decimal degrees.
place.longitude
float
Longitude in decimal degrees.
place.postalAddress
object
Postal address object.
postalAddress.streetAddress
string | null
Street line.
postalAddress.addressLocality
string | null
City.
postalAddress.addressRegion
string | null
Region or state.
postalAddress.postalCode
string | null
ZIP or postal code.
postalAddress.addressCountry
string | null (ISO 3166-1 alpha-2)
Two-letter country code.
postalAddress.postOfficeBoxNumber
string | null
PO box if available.
place.identifiers[]
array
Third-party platform identifiers.
identifiers.<identifierType>
string
Source platform (e.g., googlePlaceId
).
identifiers.<identifierValue>
string
ID value from the source.
place.sameAs[]
array
URLs for social or external location pages.
categoryLabels[]
array
Tags such as skip-the-line
, wheelchair-accessible
.
durationMinutesFrom
integer
Minimum or exact duration in minutes.
durationMinutesTo
integer | null
Maximum duration if flexible; null if fixed.
commentary[]
array
Commentary formats and languages.
commentary[].format
string (enum)
One of: IN_PERSON
, RECORDED_AUDIO
, WRITTEN
, OTHER
.
commentary[].language
string (IETF BCP 47 tag)
Language code (e.g., en-GB
, fr-FR
).
defaultCurrency
string (ISO 4217 alpha code)
Default currency of the product. Returned with octo/pricing
capability.
availableCurrencies
array
List of supported currencies. Returned with octo/pricing
capability.
pricingPer
array (enum: UNIT, BOOKING)
Defines whether pricing is per unit or per booking. Returned with octo/pricing
capability.
Example: Product Object with content
and pricing
Capabilities
content
and pricing
Capabilities{
"id": "6b903d44-dc24-4ca4-ae71-6bde6c4f4854", // OCTO Core field
"reference": "LEYE", // OCTO Core field
"internalName": "London Eye Admission", // OCTO Core field
"locale": "en-GB", // OCTO Core field
"timeZone": "Europe/London", // OCTO Core field
"allowFreesale": true, // OCTO Core field
"availabilityRequired": true, // OCTO Core field
"instantConfirmation": true, // OCTO Core field
"instantDelivery": true, // OCTO Core field
"availabilityType": "OPENING_HOURS", // OCTO Core field
"deliveryMethods": ["TICKET", "VOUCHER"], // OCTO Core field
"deliveryFormats": ["QRCODE", "PDF_URL", "PKPASS_URL"], // OCTO Core field
"redemptionMethod": "DIGITAL", // OCTO Core field,
"title": "The Official London Eye Entry Ticket",
"shortDescription": "Experience breathtaking 360-degree views of London from the iconic London Eye.",
"description": "Step into one of the 32 high-tech glass capsules and ascend 135 meters above the River Thames...",
"features": [
{ "shortDescription": "Air-conditioned glass capsules", "type": "INCLUSION" },
{ "shortDescription": "Free Wi-Fi at the boarding area", "type": "INCLUSION" },
{ "shortDescription": "Wheelchair accessible", "type": "ACCESSIBILITY_INFORMATION" },
{ "shortDescription": "Baby changing facilities available", "type": "ACCESSIBILITY_INFORMATION" },
{ "shortDescription": "No food or drink allowed inside capsules", "type": "PREBOOKING_INFORMATION" },
{ "shortDescription": "Binoculars available at the gift shop", "type": "ADDITIONAL_INFORMATION" }
],
"faqs": [
{ "question": "How long does a ride on the London Eye take?", "answer": "A full rotation takes approximately 30 minutes." },
{ "question": "Can I bring my luggage?", "answer": "Large luggage items are not allowed." },
{ "question": "Are pets allowed?", "answer": "Only assistance dogs are permitted." },
{ "question": "Is there a fast-track option?", "answer": "Yes, fast-track tickets are available for an additional fee." }
],
"media": [
{
"src": "https://www.londoneye.com/media/london-eye-day.jpg",
"type": "image/jpeg",
"rel": "COVER",
"title": "London Eye Daytime View",
"caption": "Panoramic view of the London Eye in daylight.",
"copyright": "© London Eye"
},
{
"src": "https://www.londoneye.com/media/london-eye-night.jpg",
"type": "image/jpeg",
"rel": "GALLERY",
"title": "London Eye at Night",
"caption": "The illuminated wheel at night.",
"copyright": "© London Eye"
},
{
"src": "https://www.youtube.com/watch?v=abc123",
"type": "external/youtube",
"rel": "GALLERY",
"title": "Experience the London Eye",
"caption": "Promotional video overview."
},
{
"src": "https://www.londoneye.com/media/brochure.pdf",
"type": "application/pdf",
"rel": "GALLERY",
"title": "Visitor Brochure",
"caption": null
}
],
"locations": [
{
"title": "London Eye",
"shortDescription": "Observation wheel on the South Bank of the River Thames.",
"types": ["POINT_OF_INTEREST", "REDEMPTION", "ADMISSION_INCLUDED"],
"place": {
"latitude": 51.5033,
"longitude": -0.1195,
"postalAddress": {
"streetAddress": "Riverside Building, County Hall",
"addressLocality": "London",
"addressRegion": null,
"postalCode": "SE1 7PB",
"addressCountry": "GB",
"postOfficeBoxNumber": null
},
"identifiers": [
{ "googlePlaceId": "ChIJc2nSALkEdkgRkuoJJBfzkUI" }
],
"sameAs": [
"https://www.londoneye.com"
]
}
}
],
"categoryLabels": ["skip-the-line", "wheelchair-accessible", "family-friendly"],
"durationMinutesFrom": 30,
"durationMinutesTo": null,
"commentary": [
{ "format": "RECORDED_AUDIO", "language": "en-GB" },
{ "format": "WRITTEN", "language": "fr-FR" }
],
"defaultCurrency": "GBP", // pricing capability field
"availableCurrencies": ["GBP", "EUR", "USD"], // pricing capability field
"pricingPer": ["UNIT"] // pricing capability field
}
Option
The following fields are added to the OCTO Core Option object when the content
capability is supported and requested.
⚠️ Content Field Reuse Across Levels
Certain
content
fields such asfeatures
,faqs
,media
,locations
,categoryLabels
, andcommentary
are intentionally repeated across the Product and Option levels.Implementer supplier systems must return these fields only at the most appropriate level (product or option) depending on the relevance of the content.
Reseller systems are expected to concatenate or display these fields according to their presentation logic, combining product-level and option-level data where suitable.
Enriched Fields (from content
Capability)
content
Capability)title
string
Public, customer-facing name of the option.
shortDescription
string | null
A brief summary of the option. May be null.
description
string | null
A detailed description of the option, highlighting experience-specific details.
features[]
array (feature object)
Customer-facing feature details specific to this option.
features[].shortDescription
string | null
Short summary of a feature (e.g., "Fast Track entry included").
features[].type
string (enum)
One of: INCLUSION, EXCLUSION, HIGHLIGHT, PREBOOKING_INFORMATION, PREARRIVAL_INFORMATION, REDEMPTION_INSTRUCTION, ACCESSIBILITY_INFORMATION, ADDITIONAL_INFORMATION, BOOKING_TERM, CANCELLATION_TERM.
faqs[]
array (faq object)
Option-specific questions and answers to clarify expectations.
faqs[].question
string
The question text.
faqs[].answer
string
Answer text providing clarity or support.
media[]
array (media object)
Images or videos specific to the option, if applicable.
media[].src
string (uri)
Stable, publicly accessible URL pointing to the media file.
media[].type
string (enum: image/jpeg, image/png, video/mp4, video/avi, external/youtube, external/vimeo)
Format of the media.
media[].rel
string (enum: LOGO, COVER, GALLERY)
The relation of this media to the option (branding, cover, gallery).
media[].title
string | null
Optional title or identifier.
media[].caption
string | null
Caption shown alongside the media asset, if any.
media[].copyright
string | null
Copyright notice or license info, if required.
...
"id": "2214b32d-ffa1-426c-b4d2-947dca724e50",
"reference": "LEYE-FT",
"default": false,
"internalName": "Fast Track",
"availabilityLocalStartTimes": ["10:00", "11:00", "12:00"],
"cancellationCutoff": "24 hours",
"cancellationCutoffAmount": 24,
"cancellationCutoffUnit": "hour",
"requiredContactFields": ["firstName", "lastName"],
"restrictions": {
"minUnits": 1,
"maxUnits": 20
},
"title": "Fast Track Admission to the London Eye",
"shortDescription": "Skip the lines with fast track entry to the iconic observation wheel.",
"description": "Enjoy priority access and spend less time queuing for your unforgettable London Eye experience.",
"features": [
{
"shortDescription": "Priority boarding through Fast Track entrance",
"type": "INCLUSION"
},
{
"shortDescription": "Tickets non-transferable and non-refundable",
"type": "CANCELLATION_TERM"
}
],
"faqs": [
{
"question": "Do I need to queue if I have Fast Track?",
"answer": "Fast Track tickets allow you to bypass the standard line, but short waits may still occur."
}
],
"media": [
{
"src": "https://www.londoneye.com/media/fast-track-entry.jpg",
"type": "image/jpeg",
"rel": "GALLERY",
"title": "Fast Track Entrance",
"caption": "Guests entering through the Fast Track gate",
"copyright": "© London Eye"
}
]
}
Unit
The following fields are added to the OCTO Core Unit object when the content
capability is supported and requested:
Enriched Fields (from content
Capability)
content
Capability)title
string
Customer-facing name of the unit (e.g., "Adult", "Student").
shortDescription
string | null
Brief summary describing the unit's eligibility or characteristics.
features[]
array (feature object)
Features specific to this unit, such as inclusions, exclusions, or safety notes.
features[].shortDescription
string
A short, clear label describing the unit-specific feature.
features[].type
string (enum: INCLUSION, EXCLUSION, HIGHLIGHT, MUST_KNOW, SAFETY_INFORMATION, REDEMPTION_INSTRUCTIONS, ADDITIONAL_INFORMATION)
Categorizes the feature for display and filtering.
...
{
"id": "unit_adult_001", // OCTO Core
"reference": "ADULT-TICKET", // OCTO Core
"internalName": "Adult Ticket", // OCTO Core
"type": "ADULT", // OCTO Core
"requiredContactFields": ["firstName", "lastName"], // OCTO Core
"restrictions": {
"minAge": 18,
"maxAge": 64,
"idRequired": false,
"minQuantity": 1,
"maxQuantity": 10,
"paxCount": 1,
"accompaniedBy": []
},
"title": "Adult", // content capability
"shortDescription": "Standard ticket for adults aged 18 to 64." // content capability
},
{
"id": "unit_child_001", // OCTO Core
"reference": "CHILD-TICKET", // OCTO Core
"internalName": "Child Ticket", // OCTO Core
"type": "CHILD", // OCTO Core
"requiredContactFields": ["firstName"], // OCTO Core
"restrictions": {
"minAge": 5,
"maxAge": 12,
"idRequired": false,
"minQuantity": 1,
"maxQuantity": 5,
"paxCount": 1,
"accompaniedBy": ["unit_adult_001"]
},
"title": "Child", // content capability
"shortDescription": "Discounted ticket for children aged 5 to 12.", // content capability
"features": [
{
"shortDescription": "Access to children's exhibits and audio guide",
"type": "INCLUSION"
},
{
"shortDescription": "Must be accompanied by an adult",
"type": "MUST_KNOW"
}
]
}
...
Availability
The following fields are added to the OCTO Core Availability object when the content
capability is supported and requested.
title
string | null
Public-facing name for the availability slot. Can be null when not applicable.
shortDescription
string | null
A brief summary description of the availability window or conditions.
[
{
"id": "2025-05-01T20:15:00+01:00", // OCTO Core
"localDateTimeStart": "2025-05-01T20:15:00+01:00", // OCTO Core
"localDateTimeEnd": "2025-05-01T20:30:00+01:00", // OCTO Core
"allDay": false, // OCTO Core
"available": true, // OCTO Core
"status": "LIMITED", // OCTO Core
"vacancies": 3, // OCTO Core
"capacity": 20, // OCTO Core
"maxUnits": 3, // OCTO Core
"openingHours": [ // OCTO Core
{ "from": "09:00", "to": "23:00" }
],
"title": "Sunset Ride",
"shortDescription": "Perfect for catching golden hour views from the London Eye."
},
{
"id": "2025-05-01T21:00:00+01:00", // OCTO Core
"localDateTimeStart": "2025-05-01T21:00:00+01:00", // OCTO Core
"localDateTimeEnd": "2025-05-01T21:15:00+01:00", // OCTO Core
"allDay": false, // OCTO Core
"available": true, // OCTO Core
"status": "LIMITED", // OCTO Core
"vacancies": 5, // OCTO Core
"capacity": 20, // OCTO Core
"maxUnits": 5, // OCTO Core
"openingHours": [ // OCTO Core
{ "from": "09:00", "to": "23:00" }
],
"title": null,
"shortDescription": null
}
]
Last updated
Was this helpful?