OCTO Developer Hub
OCTO WebsiteOpenAPI (Swagger)Become a Member
  • Welcome
  • Getting Started
    • Glossary of Terms
    • Errors
    • Headers
    • Authentication
    • Endpoints & Capabilities
    • Schemas
    • Development Support
  • OCTO API Core
    • Supplier
    • Products
    • Availability
    • Bookings
  • Capabilities (Optional)
    • Pricing
    • Notifications
    • Content
    • Pickups (Proposed Draft)
    • Promotions (Proposed Draft)
  • Additional Resources
    • Validation Tool
    • Postman Collections
    • Known Implementations
Powered by GitBook
On this page
  • Localization
  • Request Headers
  • Response Headers
  • Example Headers with Localization:
  • Additional Content Fields
  • Supplier
  • Option
  • Unit
  • Availability

Was this helpful?

  1. Capabilities (Optional)

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 header

  • the Content-Language response header

  • and 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:

Header
Type (Format)
Required/Optional
Field Description
Example

Accept-Language

Optional

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:

Header
Type (Format)
Required/Optional
Field Description
Example

Content-Language

Required

en-GB

Available-Languages

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

These fields provide localized, customer-facing information and rich media assets. They are returned only when:

  • The supplier supports the content capability

  • The request includes the header: Octo-Capabilities: content

Enriched Fields (from content Capability)

Field
Type
Description

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

Field
Type
Description

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:

{
  "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": "info@merlinentertainments.biz", // 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

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 capability

  • The request includes the header: Octo-Capabilities: content

Enriched Fields (from content Capability)

Field
Type (Format)
Description

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

{
  "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 as features, faqs, media, locations, categoryLabels, and commentary 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)

Field
Type (Format)
Description

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)

Field
Type (Format)
Field Description

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.

Field
Type (Format)
Field Description

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
  }
]
PreviousNotificationsNextPickups (Proposed Draft)

Last updated 23 days ago

Was this helpful?

string ()

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: .

string ()

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: .

array<string> ()

The following fields are added to the when the content capability is used and supported by the supplier system.

The following fields are added to the when the content capability is supported and requested.

OCTO Core Supplier object
OCTO Core Product object
IETF BCP 47 tag
MDN Docs
IETF BCP 47 tag
MDN Docs
IETF BCP 47 tag