# Content

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.&#x20;

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

<table><thead><tr><th width="178.88671875">Header</th><th width="104.37109375">Type (Format)</th><th width="101.078125">Required/Optional</th><th width="203.98828125">Field Description</th><th>Example</th></tr></thead><tbody><tr><td><code>Accept-Language</code></td><td>string (<a href="https://en.wikipedia.org/wiki/E.164">IETF BCP 47 tag</a>)</td><td>Optional</td><td>Optional request header to specify preferred languages for response content. Supports a comma-separated list of language tags with optional <code>q</code> values to set priority. Follows BCP 47 (RFC 5646 &#x26; RFC 4647). Does not guarantee content availability in those languages. Commonly used for localization in HTTP (RFC 7231). See also: <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Language">MDN Docs</a>.</td><td><code>en-US</code>, <code>en-GB</code>, <code>fr-CA;q=0.8</code>, <code>fr;q=0.7</code></td></tr></tbody></table>

### 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:&#x20;

| Header                | Type (Format)                                                           | Required/Optional | Field Description                                                                                                                                                                                                                                                                                    | Example                   |
| --------------------- | ----------------------------------------------------------------------- | ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------- |
| `Content-Language`    | string ([IETF BCP 47 tag](https://en.wikipedia.org/wiki/E.164))         | 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](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Language). | `en-GB`                   |
| `Available-Languages` | array\<string> ([IETF BCP 47 tag](https://en.wikipedia.org/wiki/E.164)) | 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:&#x20;

#### Request

```http
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
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](https://docs.octo.travel/octo-api-core/supplier) 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` 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:

```json
{
  "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

The following fields are added to the [OCTO Core Product object ](https://docs.octo.travel/octo-api-core/products)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` capability
* The request includes the header: `Octo-Capabilities: content`

#### Enriched Fields (from `content` Capability)

<table><thead><tr><th>Field</th><th width="229.55859375">Type (Format)</th><th>Description</th></tr></thead><tbody><tr><td><code>title</code></td><td>string</td><td>Public, customer-facing name of the product.</td></tr><tr><td><code>shortDescription</code></td><td>string | null</td><td>Brief marketing summary.</td></tr><tr><td><code>description</code></td><td>string | null</td><td>Long-form product narrative.</td></tr><tr><td><code>features[]</code></td><td>array</td><td>List of structured features grouped by type.</td></tr><tr><td><code>features[].shortDescription</code></td><td>string | null</td><td>Short label for the feature.</td></tr><tr><td><code>features[].type</code></td><td>string (enum)</td><td>One of: <code>INCLUSION</code>, <code>EXCLUSION</code>, <code>HIGHLIGHT</code>, <code>PREBOOKING_INFORMATION</code>, <code>PREARRIVAL_INFORMATION</code>, <code>REDEMPTION_INSTRUCTION</code>, <code>ACCESSIBILITY_INFORMATION</code>, <code>ADDITIONAL_INFORMATION</code>, <code>BOOKING_TERM</code>, <code>CANCELLATION_TERM</code>.</td></tr><tr><td><code>faqs[]</code></td><td>array</td><td>Frequently asked questions.</td></tr><tr><td><code>faqs[].question</code></td><td>string</td><td>The question text.</td></tr><tr><td><code>faqs[].answer</code></td><td>string</td><td>The corresponding answer.</td></tr><tr><td><code>media[]</code></td><td>array</td><td>List of media assets (images, PDFs, videos, etc.).</td></tr><tr><td><code>media[].src</code></td><td>string (uri)</td><td>URL of the media file.</td></tr><tr><td><code>media[].type</code></td><td>string (enum)</td><td>One of: <code>image/jpeg</code>, <code>image/png</code>, <code>image/webp</code>, <code>image/svg+xml</code>, <code>video/mp4</code>, <code>video/avi</code>, <code>external/youtube</code>, <code>external/vimeo</code>, <code>external/other</code>, <code>application/pdf</code>.</td></tr><tr><td><code>media[].rel</code></td><td>string (enum)</td><td>One of: <code>LOGO</code>, <code>COVER</code>, <code>GALLERY</code>.</td></tr><tr><td><code>media[].title</code></td><td>string | null</td><td>Title of the media.</td></tr><tr><td><code>media[].caption</code></td><td>string | null</td><td>Customer-facing caption.</td></tr><tr><td><code>media[].copyright</code></td><td>string | null</td><td>Copyright or license information.</td></tr><tr><td><code>locations[]</code></td><td>array</td><td>List of places associated with the product.</td></tr><tr><td><code>locations[].title</code></td><td>string | null</td><td>Name of the location.</td></tr><tr><td><code>locations[].shortDescription</code></td><td>string | null</td><td>Short description of the location.</td></tr><tr><td><code>locations[].types[]</code></td><td>array</td><td>One or more of: <code>START</code>, <code>ITINERARY_ITEM</code>, <code>POINT_OF_INTEREST</code>, <code>ADMISSION_INCLUDED</code>, <code>END</code>, <code>REDEMPTION</code>.</td></tr><tr><td><code>locations[].minutesTo</code></td><td>integer | null</td><td>Minutes to reach this location from the previous. Required for <code>ITINERARY_ITEM</code> or <code>END</code>.</td></tr><tr><td><code>locations[].minutesAt</code></td><td>integer | null</td><td>Minutes spent at this location. Required for <code>ITINERARY_ITEM</code> or <code>END</code>.</td></tr><tr><td><code>locations[].place</code></td><td>object</td><td>Detailed geographic and address information.</td></tr><tr><td><code>place.latitude</code></td><td>float</td><td>Latitude in decimal degrees.</td></tr><tr><td><code>place.longitude</code></td><td>float</td><td>Longitude in decimal degrees.</td></tr><tr><td><code>place.postalAddress</code></td><td>object</td><td>Postal address object.</td></tr><tr><td><code>postalAddress.streetAddress</code></td><td>string | null</td><td>Street line.</td></tr><tr><td><code>postalAddress.addressLocality</code></td><td>string | null</td><td>City.</td></tr><tr><td><code>postalAddress.addressRegion</code></td><td>string | null</td><td>Region or state.</td></tr><tr><td><code>postalAddress.postalCode</code></td><td>string | null</td><td>ZIP or postal code.</td></tr><tr><td><code>postalAddress.addressCountry</code></td><td>string | null (ISO 3166-1 alpha-2)</td><td>Two-letter country code.</td></tr><tr><td><code>postalAddress.postOfficeBoxNumber</code></td><td>string | null</td><td>PO box if available.</td></tr><tr><td><code>place.identifiers[]</code></td><td>array</td><td>Third-party platform identifiers.</td></tr><tr><td><code>identifiers.&#x3C;identifierType></code></td><td>string</td><td>Source platform (e.g., <code>googlePlaceId</code>).</td></tr><tr><td><code>identifiers.&#x3C;identifierValue></code></td><td>string</td><td>ID value from the source.</td></tr><tr><td><code>place.sameAs[]</code></td><td>array</td><td>URLs for social or external location pages.</td></tr><tr><td><code>categoryLabels[]</code></td><td>array</td><td>Tags such as <code>skip-the-line</code>, <code>wheelchair-accessible</code>.</td></tr><tr><td><code>durationMinutesFrom</code></td><td>integer</td><td>Minimum or exact duration in minutes.</td></tr><tr><td><code>durationMinutesTo</code></td><td>integer | null</td><td>Maximum duration if flexible; null if fixed.</td></tr><tr><td><code>commentary[]</code></td><td>array</td><td>Commentary formats and languages.</td></tr><tr><td><code>commentary[].format</code></td><td>string (enum)</td><td>One of: <code>IN_PERSON</code>, <code>RECORDED_AUDIO</code>, <code>WRITTEN</code>, <code>OTHER</code>.</td></tr><tr><td><code>commentary[].language</code></td><td>string (IETF BCP 47 tag)</td><td>Language code (e.g., <code>en-GB</code>, <code>fr-FR</code>).</td></tr><tr><td><code>defaultCurrency</code></td><td>string (ISO 4217 alpha code)</td><td>Default currency of the product. Returned with <code>octo/pricing</code> capability.</td></tr><tr><td><code>availableCurrencies</code></td><td>array</td><td>List of supported currencies. Returned with <code>octo/pricing</code> capability.</td></tr><tr><td><code>pricingPer</code></td><td>array (enum: UNIT, BOOKING)</td><td>Defines whether pricing is per unit or per booking. Returned with <code>octo/pricing</code> capability.</td></tr></tbody></table>

#### Example: Product Object with `content` and `pricing` Capabilities

```json
{
  "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.                                                                                                                                                              |

```json
...

  "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&#x20;

The following fields are added to the OCTO Core **Unit** object when the `content` capability is supported and requested:&#x20;

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

```json
...
  {
    "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.          |

```json
[
  {
    "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
  }
]
```
