Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.titanos.tv/llms.txt

Use this file to discover all available pages before exploring further.

To ensure a seamless and consistent user experience across all platforms, the precise structuring of metadata is of vital importance. While core specifications—such as IDs, titles, and basic assets—remain uniform across the ecosystem, each content category requires specific extensions to accurately reflect its unique characteristics. The following sections detail the technical requirements and field definitions for our three primary content feeds. The goal is to standardize global attributes like durations, genre mapping, and availability windows, while incorporating type-specific metadata:
  • Movies: Focusing on standalone events and cinematographic details.
  • Series: Organizing hierarchical structures, including season and episode management.
  • Sports: Managing live dynamics, tournament frameworks, and time-sensitive replay logic.

Core Metadata

Scroll the table horizontally to see more.
Field NameValue & FormatDescriptionMoviesSeriesSeasonsEpisodesSport
idInteger (e.g. 12345)ID of the assetrequiredrequiredrequiredrequiredrequired
created_atISO 8601 (e.g. “2025-05-19T14:23:00Z”)UTC timestamp indicating the last time this item was createdrequiredrequiredrequiredrequiredrequired
updated_atISO 8601 (e.g. “2025-05-19T14:23:00Z”)UTC timestamp indicating the last time this item was modifiedrequiredrequiredrequiredrequiredrequired
typeEnum: “movie”, “tv_show”, “season”, “episode”, “sport_program”Type of contentrequiredrequiredrequiredrequiredrequired
original_titleString (e.g. “Inception”)Official/original title of the contentrequiredrequiredrequiredrequiredrequired
titlesArray of { locale: string, title: string }Localized titles per languagerequiredrequiredrequiredrequiredrequired
synopsesArray of { locale: string, synopsis: string }Localized short synopsis (\le 200 characters)requiredrequiredrequiredrequiredrequired
yearInteger (e.g. 2010)Year of releaserequiredrequiredrequiredrequiredrequired
durationInteger (seconds) (e.g. 8880)Total runtime in secondsrequiredrequiredrequiredrequiredoptional
deeplinkingsArray of { market: string, action: string, device_type: "TV", url: string }Deep links for launching TV content in partner apps. For more details see the deep links section.requiredrequiredrequiredrequiredrequired
availabilitiesArray of objectsAvailability of content per country/business model Add section for availabilitiesrequiredrequiredrequiredrequiredrequired
availabilities[].marketArray of ISO 3166 country code (e.g. “US”)Target marketsrequiredrequiredrequiredrequiredrequired
availabilities[].business_modelEnum: “AVOD”, “HVOD”, “RVOD”, “TVOD”, “SVOD”, “EST”AVOD (free ad-supported), HVOD (subscription + ads), etc.requiredrequiredrequiredrequiredrequired
availabilities[].priceNumberThe numerical value of the content (e.g., 3.99).If ApplicableIf ApplicableIf ApplicableIf ApplicableIf Applicable
availabilities[].currencyISO 4217 currency codeCurrency of the price. (e.g., EUR, GBP, USD).If ApplicableIf ApplicableIf ApplicableIf ApplicableIf Applicable
availabilities[].video_qualityEnum: “SD”, “HD”, “UHD”Supported video resolutionsrequiredrequiredrequiredrequiredrequired
availabilities[].availability_startISO 8601 (e.g. “2025-05-19T14:23:00Z”)UTC timestamp indicating the first day this content is available in the applicationoptionaloptionaloptionaloptionaloptional
availabilities[].availability_endISO 8601 (e.g. “2025-05-19T14:23:00Z”)UTC timestamp indicating the last day this content is available in the applicationoptionaloptionaloptionaloptionaloptional
artwork_landscapeArray of { locale: string, url: string }Mandatory horizontal artwork with title treatment (\ge 960x540, 16:9) Add section for artworkrequiredrequiredrequiredrequiredrequired
screenshot_landscapeArray of { locale: string, url: string }Horizontal screenshot without TT (\ge 1920x1080, desired 4K, 16:9)requiredrequiredrequiredrequiredrequired
screenshot_portraitArray of { locale: string, url: string }Optional portrait screenshot (\ge 400px, ideal \ge 800px)requiredrequiredrequiredrequiredrequired
artwork_portraitArray of { locale: string, url: string }Optional vertical poster/artwork (\ge 640px, ideal \ge 960px)requiredrequiredrequiredrequiredrequired
transparent_logo{ locale: string, url: string }Optional logo with transparent background (\ge 400px, ideal \ge 640px)optionaloptionaloptionaloptionaloptional
genresArray of Enum or TVA genre codesMust match predefined list (Action, Drama, etc.) We support TV Anytime (TVA) standard for Genres and strongly recommend using TVA genre codes. Link to section for genresrequiredrequiredrequiredrequiredrequired
dominant_genreString (e.g. “Drama”) OR TVA genre codeThe master genre for the title. This single value determines where the content appears in category rows and filters. Link to section for genresrequiredrequiredrequiredrequiredIf Applicable
classificationsArray of { country: string, minimum_age: integer, code: string, system: string }Age restrictions per country Add section for AgeRatingrequiredrequiredrequiredrequiredrequired
external_idArray of { type: "imdb" | "tmdb", id: string }External content identifier (IMDB or TMDB)requiredrequiredrequiredrequiredoptional
actorsArray of { name: string }Actor NamesrequiredrequiredrequiredrequiredN/A
directorsArray of { name: string }Director NamesrequiredrequiredrequiredrequiredN/A
series_infoarray of objectcontains relevant information of the seriesN/ArequiredN/AN/AN/A
series_info[].total_numbers_seasonsInteger (e.g. 3)Total numbers of Seasons (for Series)N/ArequiredN/AN/AN/A
series_info[].total_numbers_episodesInteger (e.g. 36)Total numbers of Episodes (for Series)N/ArequiredN/AN/AN/A
season_infoarray of objectcontains relevant information of the seasonN/AN/ArequiredN/AN/A
season_info[].parent_series_idInteger (e.g. 12345)ID of the series. Correspondents with the content id of the series the season belongs toN/AN/ArequiredN/AN/A
season_info[].season_numberInteger (e.g. 2)Number of the current SeasonN/AN/ArequiredN/AN/A
season_info[].total_number_episodesInteger (e.g. 7)Total numbers of Episodes in this seasonN/AN/ArequiredN/AN/A
episode_infoarray of objectcontains relevant information of the episodeN/AN/AN/ArequiredN/A
episode_info[].parent_series_idInteger (e.g. 12345)ID of the series. Correspondents with the content id of the series the episode belongs toN/AN/AN/ArequiredN/A
episode_info[].parent_season_idInteger (e.g. 12345)ID of the current season this episode belongs toN/AN/AN/ArequiredN/A
episode_info[].season_numberInteger (e.g. 2)Number of the season this episode belongs toN/AN/AN/ArequiredN/A
episode_info[].episode_numberInteger (e.g. 4)Episode number in this seasonN/AN/AN/ArequiredN/A
sport_event_infocontains relevant information for sport contentN/AN/AN/AN/Arequired
sport_event_info[].disciplineString (e.g. “Football”)N/AN/AN/AN/Arequired
sport_event_info[].sub_disciplineString (e.g. “U21”, “Heavyweight”)Used for age groups (e.g. “U21”), weight classes (e.g. “Heavyweight”), or specific disciplines within a sport (e.g. “Beach Soccer”)N/AN/AN/AN/AIf Applicable
sport_event_info[].genderEnum: “male”, “female”, “mixed”N/AN/AN/AN/Arequired
sport_event_info[].tournamentString (e.g. “UEFA Champions League”)N/AN/AN/AN/AIf Applicable
sport_event_info[].leagueString (e.g. “Primera Division”)N/AN/AN/AN/AIf Applicable
sport_event_info[].competition_stageString (e.g. “Quarter Final” or “Matchday 12“ or “Qualifying“ or “Race”)N/AN/AN/AN/AIf Applicable
sport_event_info[].is_olympicbooleanindicates if the event is part of olympic gamesN/AN/AN/AN/Arequired
sport_event_info[].type_of_eventEnum: “full_event”, “highlights”, “magazine”, “documentary”, “press_conference”, “interview”, “full_event_replay”N/AN/AN/AN/Arequired
sport_event_info[].competitor_homeString (e.g. “FC Barcelona”)N/AN/AN/AN/AIf Applicable
sport_event_info[].competitor_awayString (e.g. “Real Madrid”)N/AN/AN/AN/AIf Applicable
sport_event_info[].locationcontains relevant information for event locationN/AN/AN/AN/Arequired
sport_event_info[].location[].countryString (e.g. “Spain”)N/AN/AN/AN/AIf Applicable
sport_event_info[].location[].cityString (e.g. “Barcelona”)N/AN/AN/AN/AIf Applicable
sport_event_info[].location[].venueString (e.g. “Spotify Camp Nou”)N/AN/AN/AN/AIf Applicable
sport_event_info[].live_timelinecontains relevant information for event timelineN/AN/AN/AN/Arequired
sport_event_info[].live_timeline[].start_timeISO 8601 (e.g. “2025-05-19T14:23:00Z”)Scheduled start time of the eventN/AN/AN/AN/Arequired
sport_event_info[].live_timeline[].actual_start_timeISO 8601 (e.g. “2025-05-19T14:23:00Z”)Scheduled start time of the eventN/AN/AN/AN/Arequired
sport_event_info[].live_timeline[].end_timeISO 8601 (e.g. “2025-05-19T14:23:00Z”)Scheduled end time of the eventN/AN/AN/AN/Arequired
sport_event_info[].live_timeline[].statusEnum: “pre_event”, “live”, “ended”, “delayed”, “postponed”, “cancelled”Indicates the current status of the eventN/AN/AN/AN/Arequired
sport_event_info[].live_timeline[].is_restart_enabledbooleanindicates if the user can start from the beginningN/AN/AN/AN/Arequired

Genres

To maintain a consistent browsing experience and power our recommendation engines, TitanOS requires all content to be tagged with accurate genre metadata. We currently support a native set of fixed genres. We strongly support a industry-standard classification systems like TVA (TV-Anytime) to allow for more granular mapping.

Genre Standards & Recommendations

TitanOS supports both our internal native genre set and the industry-standard TV-Anytime (TVA) classification system.
We strongly recommend providing your genre tags using the TVA standard.
Why use TVA?
  • Granularity: It offers a deeper level of detail than standard lists, allowing for more precise content placement.
  • Future-Proofing: It ensures your content is ready for upcoming discovery features and advanced algorithms without needing future metadata changes.
  • Maintenance: Using an industry standard ensures long-term support for your feed as the TitanOS platform evolves.

Supported Native Genre Set

Currently, TitanOS utilizes a fixed set of primary genres. When providing your feed, please map your internal categories to the following supported values, or TVA values:
ActionDocumentaryMystery
AdventureDramaReality
AnimationFamilyRomance
BiographyFantasySci-Fi
KidsHistoryThriller
ComedyHorrorWar
CrimeMusicalWestern

The dominant_genre Field

In our updated Metadata Schema, we have introduced the dominant_genre field. This is the primary value used by the TitanOS UI to place your content into grids, filters, and category rows.
  • Requirement: Every content record must contain one (1) `dominant_genre value.
  • Logic: While you may provide a list of multiple genres for search and recommendation purposes, the system will prioritize the value in the dominant_genre field for all primary UI displays.
  • Fallback: If you don’t provide the dominant_genre field our system may use the first assigned genre in the genre set

Implementation Guidelines

  • *Standard Mapping: If using our native set, ensure the spelling and casing match the table above exactly to avoid ingestion errors.
  • TVA Integration: If you provide TVA codes, our system automatically maps them to the corresponding TitanOS UI category while retaining the granular data for backend optimization.
  • Single Value: Unlike general genre tags, the dominant_genre field must contain only one primary classification to ensure consistent UI rendering.

Artwork

To ensure content is displayed correctly across the TitanOS interface, all visual assets must follow specific technical standards. These requirements prevent display issues such as blurred images, incorrect cropping, or ingestion errors.

Core Delivery Rules

  • Format & Compatibility: All images must be delivered in JPEG or PNG format using the sRGB color space.
  • Asset Availability: Artwork must be hosted on a stable, public-facing server (HTTPS) that allows the TitanOS ingestion system to download the files.
  • Update Logic: If you change an image, you must update the image URL or the metadata timestamp. Our system caches images, so keeping the same URL for a new image will prevent the UI from updating.
  • Resolution & Scaling: Always provide the highest required resolution. Images will be scaled down for lower-end devices, but low-resolution source files may be rejected to avoid pixelation on 4K displays.

UI Safe Zones

When preparing artwork, keep primary visual elements (such as faces or titles) centered. TitanOS may overlay text or other UI elements on the edges of the image.

Technical Specification Overview

RequirementStandard
File FormatsJPEG (.jpg), PNG (.png)
Max File SizeU2MB (Recommended for fast loading)
ProtocolHTTPS required
Color ProfilesRGB
Note: Providing assets that do not match the required aspect ratios (e.g., sending a 4:3 image for a 16:9 slot) will result in automatic cropping or padding, which may distort the intended look of your content.

Artwork Examples

artwork_portrait
  • Aspect ratio: 2:3
  • Resolution: Minimum width of 400px (Recommended: 800px or higher)
Metadata - Search
screenshot_portrait
  • Aspect ratio: 2:3
  • Resolution: Minimum width of 640px (Recommended: 960px)
Metadata - Search
artwork_landscape
  • Aspect ratio: 16:9
  • Resolution: Minimum width of 640px (Recommended: 960px or higher)
Metadata - Search
screenshot_landscape
  • Aspect ratio: 16:9
  • Resolution: Minimum width of 1920px (Recommended: 3840px)
Metadata - Search
transparent_logo
  • Size: Minimum width of 400px (Recommended: 640px or higher)
Metadata - Search
Deep links are the primary mechanism for navigating users from the TitanOS discovery interface directly to specific titles within your application. Once an application has passed QA and is live on the platform, deep links must function autonomously and lead directly to the content.

Technical Preconditions

To ensure a successful integration, your application and metadata must meet the following standards:
  • HTML5 Accessibility: The application must be a web-based app accessible via a stable URL.
  • Routing Logic: For Single Page Applications (SPAs), the internal routing must be configured to parse incoming URL paths or parameters and resolve the correct view state immediately.
  • Destination Targets: We support and recommend two levels of deep linking: Content Details: Leads the user to the movie or series overview page. Direct Player (Recommended): Navigates the user directly into the video player to start playback.
  • Geoblocking: Since TitanOS is a global platform, ensure the deep link provided for a specific market (e.g., ES) is not geoblocked for users in that region.

URL Construction & Structure

For HTML5 applications, the final landing URL is created by appending the content-specific path provided in your metadata to the application’s registered Base URL. The Formula: + / +
  • App Base URL: https://titanos.partner-app.com
  • Metadata Path: video/12345
  • Final Result: https://titanos.partner-app.com/video/12345
Example 1: Standard Path Routing Best for: Applications using a traditional folder-based structure.
"deeplinkings": [
  {
    "market": "DE",
    "action": "play",
    "device_type": "TV",
    "url": "https://titanos.partner-app.com/movies/interstellar-2014"
  }
]
Example 2: Direct Player (ID-based) Best for: The recommended “Direct to Player” experience using unique content IDs.
"deeplinkings": [
  {
    "market": "ES",
    "action": "play",
    "device_type": "TV",
    "url": "https://titanos.partner-app.com/player/550e8400-e29b"
  }
Example 3: Query Parameter Routing Best for: SPAs or apps that parse IDs via query strings rather than URL paths.
"deeplinkings": [
  {
    "market": "GB",
    "action": "play",
    "device_type": "TV",
    "url": "https://titanos.partner-app.com/launch?content_id=998877&autoplay=true"
  }
]
To provide a seamless discovery experience, TitanOS needs to know the exact behavior of an incoming deep link. Partners must categorize their links based on the destination experience to ensure the user journey aligns with the UI action. Supported Action Values We categorize deep link destinations into two distinct behaviors:
  • action: details (Content Details Page): Navigates the user to the informational overview or landing page of the asset. This value is mandatory for Series and Seasons, as they are containers rather than playable video files.
  • action: play (Direct Player Launch): Bypasses all menus and launches video playback immediately. This is strongly preferred for Movies and individual Episodes to keep the user journey as short as possible.
Alternative Naming Suggestions If you prefer not to use details and play as the explicit values in your feed, here are a few industry-standard alternative pairs you can implement:
  • Option A (Intent-Based): details vs. playback
  • Option B (UX-Based): landing_page vs. direct_play
  • Option C (Technical): info_view vs. player_view

Availabilities

The availabilities object is used to define the commercial and technical terms under which a title is offered. This data allows the TitanOS to filter content correctly based on the user’s region, their subscription status, and the device’s display capabilities.

Data Structure

Availabilities are delivered as an array of objects. This structure allows a single piece of content to have different business models or video qualities across multiple territories. Requirement: Every content record must contain at least one availability object to be visible in the UI.

Field Specifications

FieldTypeRequiredDescription
marketArrayYesA list of ISO 3166-1 alpha-2 country codes (e.g., ["US", "DE"]).
business_modelYesRealityThe monetization type (e.g., AVOD, SVOD). See definitions below.
video_qualityYesRomanceThe highest resolution supported: SD, HD, or UHD.
priceNumberNo*The numerical price (e.g., 4.99). Required for TVOD/EST.
currencyStringNo*ISO 4217 code (e.g., EUR). Required for TVOD/EST.
availability_startStringNoISO 8601 format. When the content becomes visible. When not provided content will be visible from the moment the content is included in the feed.
availability_endStringNoISO 8601 format. When the content is removed. When not provided content will be visible from the moment the content is removed from the feed.

Supported Business Models

To ensure content appears in the correct UI categories (e.g., “Free” Section), you must map your offer to one of the following enums:
  • AVOD: Free, ad-supported video on demand
  • SVOD: Subscription-based video on demand
  • TVOD: Transactional/Rental (rental / pay-per-view)
  • HVOD: Hybrid model (subscription + ads)
  • RVOD: Rental video on demand (specifically for limited windows)
  • EST: Electronic Sell-Through (digital purchase/buy-to-own)

Implementation Example

"availabilities": [
  {
    "market": ["ES"],
    "business_model": "AVOD",
    "video_quality": "HD",
    "price": null,
    "currency": null,
    "start_date": null,
    "end_date": null
  },
  {
    "market": ["DE"],
    "business_model": "TVOD",
    "video_quality": "UHD",
    "price": 4.99,
    "currency": "EUR",
    "start_date": "2026-06-01T12:00:00Z",
    "end_date": "2026-06-30T23:59:59Z"
  },
  {
    "market": ["GB"],
    "business_model": "SVOD",
    "video_quality": "HD",
    "price": null,
    "currency": null,
    "start_date": "2024-01-01T00:00:00Z",
    "end_date": "2026-12-31T23:59:59Z"
  }
]

Age Rating

To ensure regulatory compliance and support parental control features, TitanOS requires accurate age rating metadata for all content. Partners are responsible for providing the official classification for each market where the content is available.

Data Structure: classifications

Age ratings are provided as an array of objects. This structure allows you to specify different ratings and systems for different territories, as a title may have different legal requirements depending on the country. Requirement: Every content record must contain at least one classification object. TitanOS reserves the right to withhold publication of content lacking valid age rating information to mitigate legal risks.
FieldTypeRequiredDescription
countryStringYesISO 3166-1 alpha-2 country code (e.g., DE, ES, GB).
systemStringYesThe official rating body/system (e.g., FSK, BBFC, ICAA).
codeStringYesThe specific rating code (e.g., FSK12, 15, PG-13).
minimum_ageIntegerYesThe numerical minimum age required (e.g., 12, 15, 13).

Implementation Example

In this example, the content is classified for the German market using the FSK system and for the UK market using the BBFC system.
"classifications": [
  {
    "country": "DE",
    "system": "FSK",
    "code": "FSK12",
    "minimum_age": 12
  },
  {
    "country": "GB",
    "system": "BBFC",
    "code": "15",
    "minimum_age": 15
  }
]

Common Systems & Codes Reference

CountrySystemExample CodeMinimum Age
GermanyFSKFSK0, FSK6, FSK12, FSK16, FSK180, 6, 12, 16, 18
UKBBFCU, PG, 12A, 15, 180, 8, 12, 15, 18
SpainICAATP, 7, 12, 16, 180, 7, 12, 16, 18
USAMPAAG, PG, PG-13, R, NC-170, 10, 13, 17, 18
Standardizing the code and system strings ensures that the TitanOS UI can dynamically display the correct local rating badges for every title, providing a familiar and safe experience for the end-user.