Roku Search feed (JSON)

Apps participate in Roku Search by creating and submitting a search feed. The search feed is a single JSON file that includes the content metadata for an app's video catalog. Content meta data includes the unique ID, title, description, duration, rating, language, artwork, and so on. Once the feed has been configured following this spec, it can be submitted to Roku's feed validation tool, and the integration into Roku Search can then be completed.

The Roku search feed includes the following key features:

  • One feed for all regions. A single feed may contain region-specific content metadata and rating sources.

  • Content availabilty windows. A feed may include availability windows for individual content items.

  • Variety of content. The feed may contain the metadata for movies, television shows, and short-form content (for example, cooking videos, sports highlights, and so on).

  • Multiple source IDs. A single feed can contain both app-specific and Gracenote content source IDs.

Specifications

Root

The root of the JSON file contains basic information such as the Roku feed specification version, the default language, default availability for different regions, and the list of content items.

FieldTypeDescriptionRequired/Optional
versionStringRoku JSON feed version (use "1").Required
defaultLanguageStringThe lowercase ISO 639-1 two-letter language code to be used when the language is not specified for an asset.Required (if you do not provide the language for each asset).

If you do plan on providing the language for individual assets, the same language must be specified in the asset's title, description, and image.
defaultAvailabilityCountriesString[]The list of lowercase ISO Alpha-2 two-letter country codes to be used when availabilityInfo.country is not specified for an asset.

Click here for the list of regions where Roku Search is currently supported.
Required (if you do not provide the available countries for each asset)
assetsAsset[]The list of content items in the app's catalog.Required

Asset

An asset represents a specific content item in the app's catalog. It contains all the metadata for displaying the content item in the Roku platform and deep linking directly into content when it is selected.

FieldTypeDescriptionRequired/Optional
idStringA maximum 50-character immutable unique ID for the content item.

Once an ID is created for a content item in Roku Search, it may not be changed.

The id must be unique within the feed. If the feed contains duplicate IDs, only one of the items with the duplicated ID is preserved.

If the type for the content item is "externalIdOnly" set this field to the ID of the external source (for example, the Gracenote TMS ID).
Required, unless the type for the content item is "season".
typeEnumThe media type of the content item:
  • movie: Movie or long-form film (over 15 minutes).
  • tvspecial: One-time TV program that is not part of a series, or content that does not fit into any other mediaType category (for example, music, artists, sporting events, non-episodic news specials).
  • series: Set of related serialized episodes and possibly seasons. Includes TV shows and daily/weekly ongoing shows.
  • season: As part of a series, single set of related TV episodes.
  • episode: Single content item (an episode of a TV show, for example).
  • shortform: Standalone content that is 15 minutes or less that is not a movie or TV show (for example, movie trailers, news clips, comedy clips, food reviews, or other clips).
  • externalIdOnly: Validates the id, externalIdSource, and playOptions fields only. For a linear feed, validates the id and externalIdSource fields only.

This value is passed into deep links that are sent to the app. The app uses the value to determine how to launch the content. For example, if the type is "movie", the app will launch it directly into playback.
Required
externalIdsExternalId[]The list of external sources and IDs to be used for assigning metadata.

Include this field if provider metadata may be used in case the specified external source does not have certain metadata.
Optional
externalIdSourceEnumThe external source of the value specified for the content item in the ID field:
  • TMS: Gracenote is the source for the value specified in the id field.
  • PARTNER_TITLE_ID.
  • PARTNER_ASSET_ID.
Only if the type for the content item is "externalIdOnly".
titlesTitle[]A list of localized titles for the content item.

Titles may be a maximum of 200 characters.
Required
shortDescriptionsDescription[]A list of localized short descriptions for the content item.

Short descriptions may be a maximum of 200 characters.
Required
longDescriptionsDescription[]A list of localized long descriptions for the content item.

Long descriptions may be a maximum of 500 characters.
Optional
releaseDateStringThe date the content item was initially released or first aired in ISO 8601 format: {YYYY}-{MM}-{DD}. For example, "2022-11-11".

This field is used to sort programs chronologically and to group related content in Roku Search.
Required, unless the releaseYear field is provided.

At least one of the releaseDate or releaseYear fields must be provided.
releaseYearNumberThe year the content item was initially released or first aired in YYYY format. For example, 2022.

This field is used to sort programs chronologically and to group related content in Roku Search.
Required, unless the releaseDate field is provided.
genresString[]A list of one or more of the following genres associated with the content item:
  • action
  • action sports
  • adventure
  • aerobics
  • agriculture
  • animals
  • animated
  • anime
  • anthology
  • archery
  • arm wrestling
  • art
  • arts/crafts
  • artistic gymnastics
  • artistic swimming
  • athletics
  • auction
  • auto
  • auto racing
  • aviation
  • awards
  • badminton
  • ballet
  • baseball
  • basketball
  • 3x3 basketball
  • beach soccer
  • beach volleyball
  • biathlon
  • bicycle
  • bicycle racing
  • billiards
  • biography
  • blackjack
  • bmx racing
  • boat
  • boat racing
  • bobsled
  • bodybuilding
  • bowling
  • boxing
  • bullfighting
  • bus./financial
  • canoe
  • card games
  • ceremony
  • cheerleading
  • children
  • children-music
  • children-special
  • children-talk
  • collectibles
  • comedy
  • comedy drama
  • community
  • computers
  • canoe/kayak
  • consumer
  • cooking
  • cricket
  • crime
  • crime drama
  • curling
  • cycling
  • dance
  • dark comedy
  • darts
  • debate
  • diving
  • docudrama
  • documentary
  • dog racing
  • dog show
  • dog sled
  • drag racing
  • drama
  • educational
  • entertainment
  • environment
  • equestrian
  • erotic
  • event
  • exercise
  • fantasy
  • faith
  • fashion
  • fencing
  • field hockey
  • figure skating
  • fishing
  • football
  • food
  • fundraiser
  • gaelic football
  • game show
  • gaming
  • gay/lesbian
  • golf
  • gymnastics
  • handball
  • health
  • historical drama
  • history
  • hockey
  • holiday
  • holiday music
  • holiday music special
  • holiday special
  • holiday-children
  • holiday-children special
  • home improvement
  • horror
  • horse
  • house/garden
  • how-to
  • hunting
  • hurling
  • hydroplane racing
  • indoor soccer
  • interview
  • intl soccer
  • judo
  • karate
  • kayaking
  • lacrosse
  • law
  • live
  • luge
  • martial arts
  • medical
  • military
  • miniseries
  • mixed martial arts
  • modern pentathlon
  • motorcycle
  • motorcycle racing
  • motorsports
  • mountain biking
  • music
  • music special
  • music talk
  • musical
  • musical comedy
  • mystery
  • nature
  • news
  • newsmagazine
  • olympics
  • opera
  • outdoors
  • parade
  • paranormal
  • parenting
  • performing arts
  • playoff sports
  • poker
  • politics
  • polo
  • pool
  • pro wrestling
  • public affairs
  • racquet
  • reality
  • religious
  • ringuette
  • road cycling
  • rodeo
  • roller derby
  • romance
  • romantic comedy
  • rowing
  • rugby
  • running
  • rhythmic gymnastics
  • sailing
  • science
  • science fiction
  • self improvement
  • shooting
  • shopping
  • sitcom
  • skateboarding
  • skating
  • skeleton
  • skiing
  • snooker
  • snowboarding
  • snowmobile
  • soap
  • soap special
  • soap talk
  • soccer
  • softball
  • special
  • speed skating
  • sport climbing
  • sports
  • sports talk
  • squash
  • standup
  • sumo wrestling
  • surfing
  • suspense
  • swimming
  • table tennis
  • taekwondo
  • talk
  • technology
  • tennis
  • theater
  • thriller
  • track/field
  • track cycling
  • travel
  • trampoline
  • triathlon
  • variety
  • volleyball
  • war
  • water polo
  • water skiing
  • watersports
  • weather
  • weightlifting
  • western
  • wrestling
  • yacht racing
Required
tagsString[]One or more tags (for example, “dramas”, “korean”, and so on). Each tag is a string and is limited to 20 characters.Optional
creditsCredit[]A list of cast and crew members that may receive credit for the content item.Optional
advisoryRatingsAdvisoryRating[]A list of parental advisory rating objects for the content item.

Each parental advisory rating object includes the rating authority, rating, and advisory descriptor (for example, MPAA, PG-13, AL [adult language]) for a movie in the United States).

A content item may have multiple advisoryRatings objects. For example, an item to be included in search results for USA and Germany would have at least two advisoryRatings objects in the list.
Required. Omitting the advisoryRatings field for a content item in EU countries excludes it from Roku's search and discovery features in EU countries.
imagesImage[]A list of main poster and background images to be displayed for the content item in the Roku Search results.

Images may have an aspect ratio of 16:9 or 2:3.

Roku determines the dimensions and aspect ratio to be used after downloading the image.
A main 16:9 or 2:3 poster image is required.
contentContentContains options for playing the content item.

The Content object includes a playOptions field that specifies the availability, pricing, licensing, quality, and playId (for deep linking into content from Roku Search) for the content item.
Required, unless the type field is "series" or "season".
durationInMillisecondsNumberThe duration of content in milliseconds.

If both the durationInSeconds and durationInMilliseconds field are provided, they must be equal. However, it is recommended that only one is provided.

Use the durationInMilliseconds field to provide the duration with maximum precision.
Required, unless the if durationInSeconds field is provided.

At least one of the durationInSeconds or durationInMilliseconds fields must be provided.

This field is not required if the type field is "series" or "season".
durationInSecondsNumberThe duration of content in seconds.

If both the durationInSeconds and durationInMilliseconds field are provided, they must be equal. However, it is recommended that only one is provided.

Use the durationInMilliseconds field to provide the duration with maximum precision.
Required, unless the if durationInMilliSeconds field is provided.

This field is not required if the type field is "series" or "season".
episodeInfoEpisodeInfoMetadata related to a television episode.
The EpisodeInfo object specifies the episode number, season number, and series ID of the episode.
Required only if the type field is "episode".
seasonInfoSeasonInfoMetadata related to a television season.

The SeasonInfo object specifies the season number and series ID of the season.
Required only if the type field is "season".

Title

Provide a localized title of the content item.

FieldTypeDescriptionRequired
valueStringA maximum 200-character title for the content item in human readable text.

This field is used for matching in Roku Search. Do not include extra information such as year, version label, and so on.
Required
languagesString[]A list of languages in ISO 639-1 two-letter language code (lowercased) format for which the title is applicable.

The previously listed language field (a String) has been deprecated and replaced by the languages field (a String[]) in order to reduce feed sizes.

Required, if the defaultLanguage field is not specified.

If the languages for a localized title are provided, localized descriptions and images with the same languages must also be provided.

Description

Provide a localized description of the content item.

FieldTypeDescriptionRequired
valueStringA description of the content item. A short description may be a maximum of 200 characters. A long description may be a maximum of 500 characters.Required
languagesString[]A list of languages in ISO 639-1 two-letter language code (lowercased) format for which the description is applicable.

The previously listed language field (a String) has been deprecated and replaced by the languages field (a String[]) in order to reduce feed sizes.

Required, if the defaultLanguage field is not specified.

If the languages for a localized title are provided, localized descriptions and images with the same languages must also be provided.

Credit

Provide the names and roles of cast and crew members that may receive credit for the content item.

FieldTypeDescriptionRequired
nameStringFull name of the personRequired
roleStringThe role of the person:
  • actor
  • anchor
  • host
  • narrator
  • voice
  • director
  • producer
  • screenwriter
Required

AdvisoryRating

Provide the list of parental advisory rating objects for the content item. Each parental advisory rating object includes the rating source (the rating system or authority responsible for the ratings), the rating value (for example, a "G" rating from the MPAA in the United States), and rating descriptor (for example, MPAA adult language [AL] or mild violence [MV]).

FieldTypeDescriptionRequired
sourceEnumThe rating system or authority responsible for the ratings.

See the Rating authority column in the Ratings table for the list of supported values.
Required
valueEnumThe rating received by the content item from the rating source (for example, a "G" rating from the MPAA in the United States).

See the Ratings column in the Ratings table for the complete list of possible values per rating source.
Required
descriptorsEnum[] (String enums)The list of advisory ratings received by the content item (for example, adult language ["AL"] or mild violence ["MV"] from the MPAA in the United States).

See the Ratings descriptors column in the Ratings table for the complete list of possible values per rating source. .
Optional

Ratings

For each country supported by Roku Search, the rating authorities, ratings, and advisory ratings are as follows:

CountryRating authority
(source)
Ratings
(value)
Advisory ratings
(descriptors)
auACB (Australian Classification Board)
  • NR
  • E
  • G
  • PG
  • M
  • MA 15+
  • R 18+
  • X 18+
  • C
  • RC
  • P
brCLASSIND (Classificação Indicativa)
  • L
  • 10
  • 12
  • 14
  • 16
  • 18
  • Violência
  • Violência Extrema
  • Conteúdo Sexual
  • Nudez
  • Sexo
  • Sexo Explícito
  • Drogas
  • Drogas Lícitas
  • Drogas Ilícitas
  • Linguagem Imprópria
  • Atos Criminosos
  • onteúdo Impactante
caCHVRS (Canadian Home Video Rating System)
  • G
  • PG
  • 14-A (also 14A)
  • 18-A (also 18A)
  • R
  • E
  • Not Recommended For Young Children
  • Not Recommended For Children
  • Frightening Scenes
  • Mature Theme
  • Coarse Language
  • Crude Content
  • Nudity
  • Sexual Content
  • Violence
  • Disturbing Content
  • Substance Abuse
  • Gory Scenes
  • Explicit Sexual Content
  • Brutal Violence
  • Sexual Violence
  • Language May Offend
caCPR (Canadian Parental Rating)
  • 14+
  • 18+
  • C
  • C-8 (also C8)
  • G
  • PG
  • E
deFSF (Freiwillige Selbstkontrolle Fernsehen [German Association for Voluntary Self-Regulation of Television])
  • 0
  • 6
  • 12
  • 16
  • 18
deFSK (Freiwillige Selbstkontrolle der Filmwirtschaft [German Self-Regulatory Body of the Movie Industry])
  • 0
  • 6
  • 12
  • 16
  • 18
gbBBFC (British Board of Film Classification)
  • U
  • PG
  • 12-A (also 12A)
  • 12
  • 15
  • 18
  • R18
  • R-1
  • Theme
  • Behaviour
  • Horror
  • Nudity
  • Discrimination
  • Language
  • Violence
  • Drugs
  • Sex
mxRTC (General Directorate of Radio Television and Cinematography)
  • AA
  • A
  • B
  • B-15 (also B15)
  • C
  • D
  • Violence
  • Sex
  • Language
  • Drugs
usMPAA (Motion Picture Association of America)
  • G
  • PG
  • PG-13 (also PG13)
  • R
  • NC-17 (also NC17)
  • UR
  • AC
  • AL
  • GL
  • MV
  • V
  • GV
  • BN
  • N
  • SSC
  • RP
usUSA_PR (USA Parental Rating)
  • TV-Y (also TVY)
  • TV-Y7 (also TVY7)
  • TV-G (also TVG)
  • TV-PG (also TVPG)
  • TV-14 (also TV14)
  • TV-MA (also TVMA)
  • D
  • L
  • S
  • V
  • FV

Image

Provide the poster and background images to be displayed for the content item in the Roku Search results. Provide localized images for each region in which the item is to be made available to Roku Search. The supported image formats and aspect ratios are as follows:

  • format: JPEG (.jpg file extension), GIF (.gif file extension) or PNG (.png file extension)
  • aspect ratio: 16:9 or 2:3 required.
  • maximum resolution: 1920 X 1080
FieldTypeDescriptionRequired
typeEnumThe image type:
  • main: A poster image with title treatment. The aspect ratio of the poster may be 16:9 or 2:3.
  • background: A textless image displayed in the background. The aspect ratio of the background image may be 16:9 or 2:3.
Required
urlStringThe source url for the image.Required
languagesString[]A list of languages in ISO 639-1 two-letter language code format for which the image is applicable.Required, if the defaultLanguage field is not specified.

If the language for a localized image is provided, a localized title and description with the same language must also be provided.

Content

FieldTypeDescriptionRequired
playOptions[PlayOption][]The list of options for playing the content item.Required

playOptions

In the playOptions field, specify the availability, pricing, licensing, quality, and playId (for deep linking into content from Roku Search) for the content item.

FieldTypeDescriptionRequired
licenseEnumThe type of licensing terms for the content:
  • free: Content is directly playable upon being deep linked.
  • subscription: Content is only playable upon being deep linked if the customer has a subscription. For customers that do not have a subscription, the app typically displays a subscription sign-up page when receiving deep links into content that is behind a paywall.
  • rental
  • purchase
Required
priceFloatThe price of the content in decimal format (for example, 1.90, 1.99, or 2.00).

If the price is 0.00, set the license field to "subscription" or "free" instead of setting this field. This automatically sets the price field to 0.00 by default.
Required, if the license field is set to "purchase" or "rental".
qualityEnumThe playback resolution of the content item:
  • sd
  • hd
  • hd+
  • fhd
  • uhd
Required
currencyStringThe ISO 4217 three-letter currency code for the value specified in the price field:
  • usd (or USD) (default)
  • gbp (or GBP)
  • cad (or CAD)
  • eur (or EUR)
Required, if the license field is set to "purchase" or "rental".
playIdStringA unique, immutable ID for the content item. When customers search for this content item and select your app to watch it, the playId is passed in a deep link back to your app.

The playId must map to the contentid in your app for the same content. It is therefore important to keep the Roku Search feed synchronized with the app's content feed.
Required
availabilityStartTimeStampNumberThe time (in epoch milliseconds) when the content item is to be made available to Roku Search.Optional

If you are not providing an availability start time, omit this field from your search feed.
availabilityEndTimeStampNumberThe time (in epoch milliseconds) when the content item is to stop being made available to Roku Search.Optional

If you are not providing an availability end time or if the content is available indefinitely, omit this field from your search feed.
availabilityStartTimeStringThe time (as an ISO timestamp) when the content item is to be made available to Roku Search.Optional

If you are not providing an availability start time, omit this field from your search feed.
availabilityEndTimeStringThe time (as an ISO timestamp) when the content item is to stop being made available to Roku Search.Optional

If you are not providing an availability end time or if the content is available indefinitely, omit this field from your search feed.
availabilityInfoMap<Enum, String[]>The list of ISO Alpha-2 two-letter country codes in which the content item is to be made available to Roku Search.Required, if the defaultAvailabilityCountries field is not specified.

SeasonInfo

If the asset.type field is set to "season" for a content item, provide metadata about the season.

FieldTypeDescriptionRequired
seriesIdStringThe series ID associated with the season.Required
seasonNumberNumberThe number used to identify the season.Required

EpisodeInfo

If the asset.type field is set to "episode" for a content item, provide metadata about the episode.

FieldTypeDescriptionRequired
seriesIdStringThe ID of the series containing the episode.Required
seasonNumberNumberThe season number in which the episode occurs.Optional
episodeNumberNumberThe number used to identify the episode within the season.Required

ExternalId

Provide a list of IDs and sources to be used for linking external metadata to the content item.

FieldTypeDescriptionRequired
idStringThe third-party metadata provider ID that uniquely identifies the content item.

For Gracenote/TMS, the ID is a 14-character string (for example, MV123456780000). The first 2 characters in the ID represent the unique ID domain applied to the program record:
  • MV: Movie (theatrical, made-for-television, direct-to-video).
  • EP: Television episode.
  • SH: Television show
Required
sourceStringThe source of the specified external ID. This must be one of the following values:
  • TMS
Required

Live feed specification

Apps in the U.S. Streaming Store with 24/7 live linear streams can participate in Roku's Live Search by creating and submitting a web-hosted JSON feed that includes the 24/7 live channels in their service. The Roku Live Search feed is modeled after Roku's Search feed JSON specification above, but requires only a small subset of fields. One of the fields is the externalIds field, which contains the Gracenote station IDs for the live channels to be discoverable.

Your search feed may only include channels directly distributed by your app. Do not include channels offered through third-party channel subscriptions (subscriptions or add-ons that require a separate publisher account).

The live liner integration requires Gracenote Station IDs. Individual live events or channels without Gracenote Station IDs are currently not supported. Roku uses Gracenote EPG and GSD data (schedule of event IDs). Publishers are responsiiblwe for contacting Gracenote to get their Station IDs.

Specifications

Root

The root of the JSON file contains basic information such as the feed specification version, the default language, default availability for different regions, and the list of live channels.

FieldTypeDescriptionRequired/Optional
versionStringRoku JSON feed version (use "1").Required
defaultLanguageStringThe ISO 639-1 two-letter language code to be used when the language is not specified for an asset.Required (if you do not provide the language for each asset).
defaultAvailabilityCountriesString[]The list of ISO Alpha-2 two-letter country codes to be used when availabilityInfo.country is not specified for an asset.Required (if you do not provide the availability countries for each asset).
assetsAsset[]The list of live channels in the distributor's service to be surfaced in Roku's Search.Required

Asset

An asset represents a specific live channel in the distributor's service. It contains all the metadata for displaying the live channel in the Roku Search UI and directly launching the channel via deeplinking when selected.

FieldTypeDescriptionRequired/Optional
idStringA maximum 50-character immutable unique ID for the live channel. This ID is used by the distributor for reference.Once an ID is created for a channel, it may not be changed. The id must be unique within the feed. If the feed contains duplicate IDs, only one of the items with the duplicated ID is preserved.Required
typeEnumThe media type of the live channel, which is liveStream. Channels use the type to determine how to launch content.Typically, the type specified in the search feed is directly passed into deep link requests to channels. In this integration, however, the "liveStream" type specified in the feed is sent as a "livefeed" mediaType in deep link requests. Channels participating in Roku's Live Search Feed must therefore launch the channel specified in the playId field directly into playback upon receiving a deep link request with the mediaType set to "livefeed".Required
externalIdsExternalId[]The list of Gracenote tech IDs (prgSvcID) for the live channels to be discoverable through the Roku Search customer experience. Roku uses Gracenote stationIDs to obtain EPG and GSD data. Partners need to contact Gracenote directly to obtain stationIDs for their livelinear channels.Required
contentContentContains options for playing the live channel. The Content object includes a playOptions field that specifies the availability, pricing, licensing, quality, and playId (for deep linking into content from Roku Search) for the live channel.Required
tagsString[]A list of one or more distributor-specific strings for categorizing the channel.Optional

ExternalId

The Gracenote tech ID (prgSvcId) for the live channel to be made discoverable through the Roku Search customer experience.

FieldTypeDescriptionRequired
idStringThe prgSvcId for the channel.Required
channelNameStringA human-readable channel name associated with the channel specified in the externalId.id field. This helps Roku debug your Search integration.Required
sourceStringThe source of the ID, which must be set to the following value: GRACENOTE_STATION_IDRequired

Content

FieldTypeDescriptionRequired
playOptionsPlayOption[]The list of options for playing the live channel.Required

PlayOption

In the playOptions field, specify the availability, pricing, licensing, quality, and playId (for deep linking into content from Roku Search) for the live channel.

Field

Type

Description

Required

license

Enum

The type of licensing terms for the channel.

  • free: Channel is directly playable upon being deep linked.
  • subscription: Channel is only playable upon being deep linked if the customer has a subscription. For customers that do not have a subscription, the channel typically displays a subscription sign-up page when receiving deep links into channels that are behind a paywall. This integration does not consider whether a channel is part of a basic or premium package. Channels that are only accessible via a premium package should be considered as "subscription".

Required

quality

Enum

The playback resolution of the live channel:

  • SD
  • HD
  • HD+
  • FHD
  • UHD.

Required

playId

String

A unique, immutable ID for the live channel that is used for deep linking. When customers search for this content item and select your channel to watch it, the playId is passed in a deep link back to your channel. The playId may not be a URL. If you require this ID to be a URL please talk to your partner manager.

Required

availabilityInfo

AvailabilityInfo

May include following: countryrestriction

Required if defaults are not specified.

AvailabilityInfo

FieldTypeDescriptionRequired
countryString[]countries where playOption availableRequired
restrictionRestriction[]any restriction information

Restriction

FieldTypeDescriptionRequired
allowbooleantrue for allowlist, false for blocklist
typeRestrictionTypegeoRequired
valueTypeRestrictionValueTypetype of the values (postal_code or dma)
valuesString[]

Live stream sample feed

The following example demonstrates the proper implementation of the various feed segments and fields for a live stream:

{ 
 "version": "1", 
 "defaultLanguage": "en", 
 "defaultAvailabilityCountries": [ 
  "US" 
 ], 
 "assets": [ 
  { 
   "id": "f182d1ce-d635-4538-aa8c-fb25efd6c020", 
   "type": "liveStream", 
   "content": { 
    "playOptions": [ 
     { 
      "playId": "[https://rokudevelopers.com%3Fchannel_id%3D111111](https://rokudevelopers.com%3Fchannel_id=111111/)", 
      "license": "free", 
      "quality": "HD" 
     }, 
     { 
      "playId": "[https://rokudevelopers.com%3Fchannel_id%3D222222](https://rokudevelopers.com%3Fchannel_id=222222/)", 
      "license": "free", 
      "quality": "UHD" 
     } 
    ] 
   }, 
   "externalIds": [ 
    { 
     "source": "GRACENOTE_STATION_ID", 
     "id": "ABCDE" 
    } 
   ], 
   "tags": [ 
    "partner_channel" 
   ] 
  }, 
  { 
   "id": "f182d1ce-d635-4538-aa8c-fb25efd6c020", 
   "type": "liveStream", 
   "content": { 
    "playOptions": [ 
     { 
      "playId": "[https://rokudevelopers.com%3Fchannel_id%3D111111](https://rokudevelopers.com%3Fchannel_id=111111/)", 
      "license": "free", 
      "quality": "HD", 
      "availabilityInfo": { 
       "country": [ 
        "us" 
       ], 
       "restrictions": [ 
        { 
         "allow": true, 
         "type": "geo", 
         "valueType": "postal_code", 
         "values": [ 
          "19468", 
          "19462", 
          "19465", 
          "19464" 
         ] 
        } 
       ] 
      } 
     }, 
     { 
      "playId": "[https://rokudevelopers.com%3Fchannel_id%3D222222](https://rokudevelopers.com%3Fchannel_id=222222/)", 
      "license": "free", 
      "quality": "UHD", 
      "availabilityInfo": { 
       "country": [ 
        "us" 
       ], 
       "restrictions": [ 
        { 
         "allow": false, 
         "type": "geo", 
         "valueType": "postal_code", 
         "values": [ 
          "19468", 
          "19462", 
          "19465", 
          "19464" 
         ] 
        } 
       ] 
      } 
     } 
    ] 
   }, 
   "externalIds": [ 
    { 
     "source": "GRACENOTE_STATION_ID", 
     "id": "RegionalABCDE" 
    } 
   ], 
   "tags": [ 
    "regional_partner_channel" 
   ] 
  } 
 ] 
} 

Managing a feed that includes VOD content

You can maintain a single feed that includes both Livestream and VOD content. To add VOD content to your feed, follow the Roku Search feed specification. In addition, make sure that your combined feed includes a defaultAvailabiliityPlatforms field and that it accurately specifies in which countries content is available (using the root.defaultAvailabilityCountries and asset.availabilityInfo fields).

The following example demonstrates a feed that includes both Live and VOD content:

{ 
 "version": "1", 
 "defaultLanguage": "en", 
 "defaultAvailabilityCountries": [ 
  "us", "mx" 
 ], 
 "defaultAvailabilityPlatforms": [ 
  "all" 
 ], 
 "assets": [{ 
  "id": "shortform-voice-control", 
  "type": "shortForm", 
  "titles": [{ 
   "value": "Voice Features", 
   "language": "en" 
  }], 
  "shortDescriptions": [{ 
   "value": "A video highlighting Direct to Play and Enhanced Voice Control features", 
   "language": "en" 
  }], 
  "releaseDate": "2020-01-17", 
  "genres": [ 
   "educational" 
  ], 
  "advisoryRatings": [{ 
   "source": "USA_PR", 
   "value": "TVG" 
   }, 
   { 
   "source": "RTC", 
   "value": "A" 
   } 
  ], 
  "images": [{ 
   "type": "main", 
   "url": "https://image.roku.com/ZHZscHItMTc2/roku-dev-search.png", 
   "languages": [ 
   "en", 
   "es" 
   ] 
  }], 
  "durationInSeconds": 98, 
  "content": { 
   "playOptions": [{ 
   "license": "free", 
   "quality": "UHD", 
   "playId": "shortform-voice-control", 
   "availabilityStartTimeStamp": 1565085600000, 
   "availabilityEndTimeStamp": 1593597600000, 
   "availabilityInfo": { 
    "country": [ 
    "us", 
    "mx" 
    ] 
   } 
   }] 
  } 
  }, 
  { 
  "id": "liveshow", 
  "type": "liveStream", 
  "content": { 
   "playOptions": [{ 
   "playId": "[https://rokudevelopers.com%3Fchannel_id%3D111111](https://rokudevelopers.com%3Fchannel_id=111111/)", 
   "license": "free", 
   "quality": "HD" 
   }] 
  }, 
  "externalIds": [{ 
   "source": "GRACENOTE_STATION_ID", 
   "id": "ABCDE" 
  }], 
  "tags": [ 
   "partner_channel" 
  ] 
  } 
 ] 
} 

Pagination

Pagination can be used to separate a single search feed into multiple discrete pages of smaller size (250MB maximum). This reduces the payload of the feed, which improves the performance of the publisher's and Roku's servers and optimizes the download frequency.

If the search feed is 20MB or larger, pagination should be used.

If a page within the search feed has not changed, Roku attempts to skip the downloading of it and use the previous download instead. To force a new download, update the ETag or Last-Modified header.

To use pagination in your search feed, follow these steps:

  1. Separate the search feed into multiple pages (the maximum size for each page is 250MB).
  2. In the paged response, set the nextPageUrl to the URL of the next page.
  3. On the last page, do not set the nextPageUrl.
  4. Roku downloads the pages in the search feed as long as nextPageUrl is in the paged response.

Schema

Developers can use the Roku Search feed schema to validate the format of their search feed (it, however, does not guarantee that a feed will be validated by Roku). This schema may occasionally be updated by Roku.

Some fields in the schema are for use by content providers onboarding content into The Roku Channel only.

Click here to download Roku's Search feed schema.

{
	"$schema": "http://json-schema.org/draft-07/schema#",
	"type": "object",
	"properties": {
		"version": {
			"type": "string"
		},
		"defaultLanguage": {
			"$ref": "#/definitions/language_type"
		},
		"defaultAvailabilityCountries": {
			"type": "array",
			"items": [{
				"$ref": "#/definitions/country_type"
			}]
		},
		"nextPageUrl": {
			"type": "string",
			"pattern": "^http(s)?://.+$"
		},
		"assets": {
			"type": "array",
			"items": {
				"type": "object",
				"properties": {
					"id": {
						"type": "string"
					},
					"type": {
						"$ref": "#/definitions/asset_type"
					},
					"titles": {
						"type": "array",
						"items": {
							"$ref": "#/definitions/title"
						}
					},
					"shortDescriptions": {
						"type": "array",
						"items": {
							"$ref": "#/definitions/short_description"
						}
					},
					"longDescriptions": {
						"type": "array",
						"items": {
							"$ref": "#/definitions/long_description"
						}
					},
					"externalIdSource": {
						"$ref": "#/definitions/external_id_source_type"
					},
					"externalIds": {
						"type": "array",
						"items": {
							"$ref": "#/definitions/external_id"
						}
					},
					"releaseDate": {
						"description": "ISO-8601",
						"type": "string",
						"pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
					},
					"releaseYear": {
						"type": "integer"
					},
					"genres": {
						"type": "array",
						"items": {
							"$ref": "#/definitions/genre_type"
						}
					},
					"tags": {
						"type": "array",
						"items": {
							"type": "string"
						}
					},
					"credits": {
						"type": "array",
						"items": {
							"type": "object",
							"properties": {
								"name": {
									"type": "string"
								},
								"role": {
									"type": "string"
								},
								"birthDate": {
									"type": "string"
								},
								"deathDate": {
									"type": "string"
								},
								"imageUrl": {
									"type": "string"
								}
							}
						}
					},
					"advisoryRatings": {
						"type": "array",
						"items": {
							"$ref": "#/definitions/advisory_rating"
						}
					},
					"images": {
						"type": "array",
						"items": {
							"$ref": "#/definitions/image"
						}
					},
					"durationInMilliseconds": {
						"type": "number"
					},
					"durationInSeconds": {
						"type": "integer"
					},
					"episodeInfo": {
						"type": "object",
						"properties": {
							"seriesId": {
								"type": "string"
							},
							"seasonNumber": {
								"type": "integer"
							},
							"episodeNumber": {
								"type": "integer"
							}
						},
						"required": [
							"seriesId",
							"episodeNumber"
						]
					},
					"seasonInfo": {
						"type": "object",
						"properties": {
							"seasonNumber": {
								"type": "integer"
							},
							"seriesId": {
								"type": "string"
							}
						},
						"required": [
							"seasonNumber",
							"seriesId"
						]
					},
					"content": {
						"type": "object",
						"properties": {
							"media": {
								"$ref": "#/definitions/media"
							},
							"linearEvents": {
								"type": "array",
								"items": {
									"$ref": "#/definitions/linear_event"
								}
							},
							"playOptions": {
								"type": "array",
								"items": {
									"$ref": "#/definitions/play_option"
								}
							}
						},
						"oneOf": [{
								"required": [
									"media"
								]
							},
							{
								"required": [
									"playOptions"
								]
							}
						]
					},
					"isOriginal": {
						"type": "boolean"
					}
				},
				"if": {
					"properties": {
						"type": {
							"const": "externalIdOnly"
						}
					},
					"required": [
						"type"
					]
				},
				"then": {
					"required": [
						"id",
						"type",
						"externalIdSource"
					]
				},
				"else": {
					"if": {
						"properties": {
							"type": {
								"const": "season"
							}
						},
						"required": [
							"type"
						]
					},
					"then": {
						"required": [
							"type",
							"seasonInfo"
						]
					},
					"else": {
						"required": [
							"id",
							"titles",
							"type"
						]
					}
				}
			}
		}
	},
	"required": [
		"version",
		"assets"
	],
	"definitions": {
		"image": {
			"type": "object",
			"properties": {
				"type": {
					"$ref": "#/definitions/image_type"
				},
				"url": {
					"type": "string",
					"pattern": "^http(s)?://.+$"
				},
				"languages": {
					"type": "array",
					"items": {
						"$ref": "#/definitions/language_type"
					}
				}
			},
			"required": [
				"type",
				"url"
			]
		},
		"short_description": {
			"type": "object",
			"properties": {
				"value": {
					"type": "string",
					"maxLength": 200
				},
				"languages": {
					"type": "array",
					"items": {
						"$ref": "#/definitions/language_type"
					}
				}
			},
			"required": [
				"value"
			]
		},
		"long_description": {
			"type": "object",
			"properties": {
				"value": {
					"type": "string",
					"maxLength": 500
				},
				"languages": {
					"type": "array",
					"items": {
						"$ref": "#/definitions/language_type"
					}
				}
			},
			"required": [
				"value"
			]
		},
		"title": {
			"type": "object",
			"properties": {
				"value": {
					"type": "string",
					"maxLength": 200
				},
				"languages": {
					"type": "array",
					"items": {
						"$ref": "#/definitions/language_type"
					}
				}
			},
			"required": [
				"value"
			]
		},
		"advisory_rating": {
			"type": "object",
			"properties": {
				"source": {
					"$ref": "#/definitions/advisory_ratings_source_type"
				},
				"value": {
					"type": "string"
				},
				"descriptors": {
					"type": "array"
				}
			},
			"allOf": [{
					"if": {
						"properties": {
							"source": {
								"const": "ACB"
							}
						}
					},
					"then": {
						"properties": {
							"value": {
								"$ref": "#/definitions/ACB_values"
							}
						}
					}
				},
				{
					"if": {
						"properties": {
							"source": {
								"const": "BBFC"
							}
						}
					},
					"then": {
						"properties": {
							"value": {
								"$ref": "#/definitions/BBFC_values"
							},
							"descriptors": {
								"items": {
									"$ref": "#/definitions/BBFC_descriptors"
								}
							}
						}
					}
				},
				{
					"if": {
						"properties": {
							"source": {
								"const": "CLASSIND"
							}
						}
					},
					"then": {
						"properties": {
							"value": {
								"$ref": "#/definitions/CLASSIND_values"
							},
							"descriptors": {
								"items": {
									"$ref": "#/definitions/CLASSIND_descriptors"
								}
							}
						}
					}
				},
				{
					"if": {
						"properties": {
							"source": {
								"const": "CHVRS"
							}
						}
					},
					"then": {
						"properties": {
							"value": {
								"$ref": "#/definitions/CHVRS_values"
							},
							"descriptors": {
								"items": {
									"$ref": "#/definitions/CHVRS_descriptors"
								}
							}
						}
					}
				},
				{
					"if": {
						"properties": {
							"source": {
								"const": "CPR"
							}
						}
					},
					"then": {
						"properties": {
							"value": {
								"$ref": "#/definitions/CPR_values"
							}
						}
					}
				},
				{
					"if": {
						"properties": {
							"source": {
								"const": "FSF"
							}
						}
					},
					"then": {
						"properties": {
							"value": {
								"$ref": "#/definitions/FSF_values"
							}
						}
					}
				},
				{
					"if": {
						"properties": {
							"source": {
								"const": "FSK"
							}
						}
					},
					"then": {
						"properties": {
							"value": {
								"$ref": "#/definitions/FSK_values"
							}
						}
					}
				},
				{
					"if": {
						"properties": {
							"source": {
								"const": "MPAA"
							}
						}
					},
					"then": {
						"properties": {
							"value": {
								"$ref": "#/definitions/MPAA_values"
							},
							"descriptors": {
								"items": {
									"$ref": "#/definitions/MPAA_descriptors"
								}
							}
						}
					}
				},
				{
					"if": {
						"properties": {
							"source": {
								"const": "RTC"
							}
						}
					},
					"then": {
						"properties": {
							"value": {
								"$ref": "#/definitions/RTC_values"
							},
							"descriptors": {
								"items": {
									"$ref": "#/definitions/RTC_descriptors"
								}
							}
						}
					}
				},
				{
					"if": {
						"properties": {
							"source": {
								"const": "USA_PR"
							}
						}
					},
					"then": {
						"properties": {
							"value": {
								"$ref": "#/definitions/USA_PR_values"
							},
							"descriptors": {
								"items": {
									"$ref": "#/definitions/USA_PR_descriptors"
								}
							}
						}
					}
				}
			],
			"required": [
				"source",
				"value"
			]
		},
		"asset_type": {
			"type": "string",
			"enum": [
				"movie",
				"tvspecial",
				"series",
				"season",
				"episode",
				"shortform",
				"externalIdOnly"
			]
		},
		"external_id_source_type": {
			"type": "string",
			"enum": [
				"tms",
				"ref",
				"gsd",
				"partner_title_id",
				"partner_asset_id",
				"gracenote_station_id"
			]
		},
		"externalIdRelationTypes": {
			"type": "string",
			"enum": [
				"parent",
				"child",
				"sibling"
			]
		},
		"image_type": {
			"type": "string",
			"enum": [
				"main",
				"background",
				"keyart",
				"logo",
				"dark_logo",
				"hud_logo"
			]
		},
		"genre_type": {
			"type": "string",
			"enum": [
				"action",
				"action sports",
				"adventure",
				"aerobics",
				"agriculture",
				"animals",
				"animated",
				"anime",
				"anthology",
				"archery",
				"arm wrestling",
				"art",
				"arts/crafts",
				"artistic gymnastics",
				"artistic swimming",
				"athletics",
				"auction",
				"auto",
				"auto racing",
				"aviation",
				"awards",
				"badminton",
				"ballet",
				"baseball",
				"basketball",
				"3x3 basketball",
				"beach soccer",
				"beach volleyball",
				"biathlon",
				"bicycle",
				"bicycle racing",
				"billiards",
				"biography",
				"blackjack",
				"bmx racing",
				"boat",
				"boat racing",
				"bobsled",
				"bodybuilding",
				"bowling",
				"boxing",
				"bullfighting",
				"bus./financial",
				"canoe",
				"card games",
				"ceremony",
				"cheerleading",
				"children",
				"children-music",
				"children-special",
				"children-talk",
				"collectibles",
				"comedy",
				"comedy drama",
				"community",
				"computers",
				"canoe/kayak",
				"consumer",
				"cooking",
				"cricket",
				"crime",
				"crime drama",
				"curling",
				"cycling",
				"dance",
				"dark comedy",
				"darts",
				"debate",
				"diving",
				"docudrama",
				"documentary",
				"dog racing",
				"dog show",
				"dog sled",
				"drag racing",
				"drama",
				"educational",
				"entertainment",
				"environment",
				"equestrian",
				"erotic",
				"event",
				"exercise",
				"fantasy",
				"faith",
				"fashion",
				"fencing",
				"field hockey",
				"figure skating",
				"fishing",
				"football",
				"food",
				"fundraiser",
				"gaelic football",
				"game show",
				"gaming",
				"gay/lesbian",
				"golf",
				"gymnastics",
				"handball",
				"health",
				"historical drama",
				"history",
				"hockey",
				"holiday",
				"holiday music",
				"holiday music special",
				"holiday special",
				"holiday-children",
				"holiday-children special",
				"home improvement",
				"horror",
				"horse",
				"house/garden",
				"how-to",
				"hunting",
				"hurling",
				"hydroplane racing",
				"indoor soccer",
				"interview",
				"intl soccer",
				"judo",
				"karate",
				"kayaking",
				"lacrosse",
				"law",
				"live",
				"luge",
				"martial arts",
				"medical",
				"military",
				"miniseries",
				"mixed martial arts",
				"modern pentathlon",
				"motorcycle",
				"motorcycle racing",
				"motorsports",
				"mountain biking",
				"music",
				"music special",
				"music talk",
				"musical",
				"musical comedy",
				"mystery",
				"nature",
				"news",
				"newsmagazine",
				"olympics",
				"opera",
				"outdoors",
				"parade",
				"paranormal",
				"parenting",
				"performing arts",
				"playoff sports",
				"poker",
				"politics",
				"polo",
				"pool",
				"pro wrestling",
				"public affairs",
				"racquet",
				"reality",
				"religious",
				"ringuette",
				"road cycling",
				"rodeo",
				"roller derby",
				"romance",
				"romantic comedy",
				"rowing",
				"rugby",
				"running",
				"rhythmic gymnastics",
				"sailing",
				"science",
				"science fiction",
				"self improvement",
				"shooting",
				"shopping",
				"sitcom",
				"skateboarding",
				"skating",
				"skeleton",
				"skiing",
				"snooker",
				"snowboarding",
				"snowmobile",
				"soap",
				"soap special",
				"soap talk",
				"soccer",
				"softball",
				"special",
				"speed skating",
				"sport climbing",
				"sports",
				"sports talk",
				"squash",
				"standup",
				"sumo wrestling",
				"surfing",
				"suspense",
				"swimming",
				"table tennis",
				"taekwondo",
				"talk",
				"technology",
				"tennis",
				"theater",
				"thriller",
				"track/field",
				"track cycling",
				"travel",
				"trampoline",
				"triathlon",
				"variety",
				"volleyball",
				"war",
				"water polo",
				"water skiing",
				"watersports",
				"weather",
				"weightlifting",
				"western",
				"wrestling",
				"yacht racing"
			]
		},
		"advisory_ratings_source_type": {
			"type": "string",
			"enum": [
				"ACB",
				"BBFC",
				"CLASSIND",
				"CHVRS",
				"CPR",
				"FSF",
				"FSK",
				"MPAA",
				"RTC",
				"USA_PR"
			]
		},
		"language_type": {
			"type": "string",
			"enum": [
				"af",
				"am",
				"ar",
				"ar-dz",
				"ar-bh",
				"ar-eg",
				"ar-iq",
				"ar-jo",
				"ar-kw",
				"ar-lb",
				"ar-ly",
				"ar-ma",
				"ar-om",
				"ar-qa",
				"ar-sa",
				"ar-sy",
				"ar-tn",
				"ar-ae",
				"ar-ye",
				"as",
				"az",
				"be",
				"bg",
				"bh",
				"bn",
				"bo",
				"bs",
				"ca",
				"cs",
				"cy",
				"da",
				"de",
				"de-at",
				"de-de",
				"de-li",
				"de-lu",
				"de-ch",
				"dv",
				"dz",
				"el",
				"en",
				"en-at",
				"en-au",
				"en-bz",
				"en-ca",
				"en-ie",
				"en-jm",
				"en-nz",
				"en-za",
				"en-tt",
				"en-gb",
				"en-us",
				"es",
				"es-ar",
				"es-bo",
				"es-cl",
				"es-co",
				"es-cr",
				"es-do",
				"es-ec",
				"es-es",
				"es-sv",
				"es-gt",
				"es-hn",
				"es-mx",
				"es-ni",
				"es-pa",
				"es-py",
				"es-pe",
				"es-pr",
				"es-us",
				"es-uy",
				"es-ve",
				"eu",
				"et",
				"fa",
				"ff",
				"fi",
				"fo",
				"fr",
				"fr-be",
				"fr-ca",
				"fr-lu",
				"fr-ch",
				"fy",
				"ga",
				"gd",
				"gl",
				"gn",
				"gu",
				"ha",
				"he",
				"hi",
				"hr",
				"ht",
				"hu",
				"hy",
				"id",
				"ig",
				"ii",
				"ik",
				"is",
				"it",
				"it-ch",
				"iu",
				"ja",
				"ka",
				"kk",
				"km",
				"kn",
				"ko",
				"kr",
				"ks",
				"ku",
				"ky",
				"la",
				"lo",
				"lt",
				"lv",
				"mg",
				"mk",
				"ml",
				"mn",
				"mr",
				"ms",
				"mt",
				"my",
				"nd",
				"ne",
				"nl",
				"nl-be",
				"no",
				"om",
				"or",
				"pa",
				"pl",
				"ps",
				"pt",
				"pt-br",
				"qu",
				"ro",
				"ro-md",
				"rm",
				"rn",
				"ru",
				"ru-md",
				"rw",
				"sa",
				"sd",
				"se",
				"si",
				"sk",
				"sl",
				"sn",
				"so",
				"sq",
				"sr",
				"st",
				"sv",
				"sv-fi",
				"sw",
				"ta",
				"te",
				"tg",
				"th",
				"ti",
				"tk",
				"tn",
				"tr",
				"ts",
				"tt",
				"ty",
				"uk",
				"ur",
				"uz",
				"ve",
				"vi",
				"xh",
				"yi",
				"yo",
				"zh",
				"zh-hk",
				"zh-cn",
				"zh-sg",
				"zh-tw",
				"zu"
			]
		},
		"country_type": {
			"type": "string",
			"enum": [
				"ar",
				"at",
				"au",
				"bo",
				"br",
				"ca",
				"cl",
				"co",
				"cr",
				"de",
				"ec",
				"es",
				"fr",
				"gb",
				"gt",
				"hn",
				"ie",
				"mx",
				"ni",
				"pa",
				"pe",
				"sv",
				"us"
			]
		},
		"ACB_values": {
			"type": "string",
			"enum": [
				"NR",
				"E",
				"G",
				"PG",
				"M",
				"MA 15+",
				"R 18+",
				"X 18+",
				"AV 15+",
				"C",
				"NC",
				"RC",
				"P"
			]
		},
		"BBFC_descriptors": {
			"type": "string",
			"description": "Descriptors for BBFC ratings",
			"enum": [
				"theme",
				"behaviour",
				"horror",
				"nudity",
				"discrimination",
				"language",
				"violence",
				"drugs",
				"sex"
			]
		},
		"BBFC_values": {
			"type": "string",
			"enum": [
				"NR",
				"U",
				"PG",
				"12A",
				"12-A",
				"12",
				"15",
				"18",
				"R18",
				"R-18"
			]
		},
		"CHVRS_descriptors": {
			"type": "string",
			"description": "Descriptors for CHVRS ratings",
			"enum": [
				"not recommended for young children",
				"not recommended for children",
				"frightening scenes",
				"mature theme",
				"coarse language",
				"crude content",
				"nudity",
				"sexual content",
				"violence",
				"disturbing content",
				"substance abuse",
				"gory scenes",
				"explicit sexual content",
				"brutal violence",
				"sexual violence",
				"language may offend"
			]
		},
		"CHVRS_values": {
			"type": "string",
			"enum": [
				"NR",
				"G",
				"PG",
				"14A",
				"14-A",
				"18A",
				"18-A",
				"R",
				"E"
			]
		},
		"CLASSIND_descriptors": {
			"type": "string",
			"description": "Descriptors for CLASSIND ratings",
			"enum": [
				"violência",
				"violência extrema",
				"conteúdo sexual",
				"nudez",
				"sexo",
				"sexo explícito",
				"drogas",
				"drogas lícitas",
				"drogas ilícitas",
				"linguagem imprópria",
				"atos criminosos",
				"onteúdo impactante"
			]
		},
		"CLASSIND_values": {
			"type": "string",
			"enum": [
				"NR",
				"L",
				"10",
				"12",
				"14",
				"16",
				"18"
			]
		},
		"CPR_values": {
			"type": "string",
			"enum": [
				"NR",
				"14+",
				"18+",
				"C",
				"C8",
				"C-8",
				"G",
				"PG",
				"E"
			]
		},
		"FSF_values": {
			"type": "string",
			"enum": [
				"NR",
				"0",
				"6",
				"12",
				"16",
				"18"
			]
		},
		"FSK_values": {
			"type": "string",
			"enum": [
				"NR",
				"0",
				"6",
				"12",
				"16",
				"18"
			]
		},
		"MPAA_descriptors": {
			"type": "string",
			"description": "Descriptors for MPAA ratings",
			"enum": [
				"AC",
				"AL",
				"GL",
				"MV",
				"V",
				"GV",
				"BN",
				"N",
				"SSC",
				"RP"
			]
		},
		"MPAA_values": {
			"type": "string",
			"enum": [
				"NR",
				"G",
				"PG",
				"PG13",
				"PG-13",
				"R",
				"NC-17",
				"NC17",
				"UR"
			]
		},
		"RTC_descriptors": {
			"type": "string",
			"description": "Descriptors for RTC ratings",
			"enum": [
				"violence",
				"sex",
				"language",
				"drugs"
			]
		},
		"RTC_values": {
			"type": "string",
			"enum": [
				"NR",
				"AA",
				"A",
				"B",
				"B-15",
				"B15",
				"C",
				"D"
			]
		},
		"USA_PR_descriptors": {
			"type": "string",
			"description": "Descriptors used for USA_PR ratings",
			"enum": [
				"D",
				"L",
				"S",
				"V",
				"FV"
			]
		},
		"USA_PR_values": {
			"type": "string",
			"enum": [
				"NR",
				"TV-Y",
				"TVY",
				"TV-Y7",
				"TVY7",
				"TV-G",
				"TVG",
				"TV-PG",
				"TVPG",
				"TV-14",
				"TV14",
				"TV-MA",
				"TVMA"
			]
		},
		"media": {
			"type": "object",
			"properties": {
				"originalProductionLanguage": {
					"$ref": "#/definitions/language_type"
				},
				"secondaryAudioLanguages": {
					"type": "array",
					"items": {
						"$ref": "#/definitions/language_type"
					}
				},
				"audioTracks": {
					"type": "array",
					"items": {
						"type": "object",
						"properties": {
							"label": {
								"type": "string"
							},
							"type": {
								"enum": [
									"original",
									"audio description",
									"other"
								]
							},
							"language": {
								"$ref": "#/definitions/language_type"
							}
						},
						"required": [
							"language"
						]
					}
				},
				"audioFormats": {
					"type": "array",
					"items": {
						"$ref": "#/definitions/audio_format_type"
					}
				},
				"videos": {
					"type": "array",
					"items": {
						"type": "object",
						"properties": {
							"url": {
								"type": "string"
							},
							"quality": {
								"$ref": "#/definitions/video_type"
							},
							"videoType": {
								"$ref": "#/definitions/video_quality_type"
							},
							"bitRate": {
								"description": "must be greater than or equal to 0",
								"type": "integer"
							},
							"drmAuthentication": {
								"type": "object",
								"properties": {
									"drmContentProvider": {
										"type": "string"
									}
								}
							}
						},
						"required": [
							"url",
							"quality",
							"videoType"
						]
					}
				},
				"captions": {
					"type": "array",
					"items": {
						"type": "object",
						"properties": {
							"url": {
								"type": "string"
							},
							"captionType": {
								"enum": [
									"closed_caption",
									"subtitle"
								]
							},
							"language": {
								"$ref": "#/definitions/language_type"
							}
						},
						"required": [
							"url",
							"captionType",
							"language"
						]
					}
				},
				"trickPlayFiles": {
					"type": "array",
					"items": {
						"type": "object",
						"properties": {
							"url": {
								"type": "string"
							},
							"quality": {
								"$ref": "#/definitions/video_quality_type"
							}
						},
						"required": [
							"url",
							"quality"
						]
					}
				},
				"creditCuePoints": {
					"type": "array",
					"items": {
						"type": "object",
						"properties": {
							"url": {
								"type": "string"
							},
							"creditType": {
								"enum": [
									"intro",
									"end",
									"recap",
									"behindthescenes"
								]
							},
							"start": {
								"type": "number"
							},
							"end": {
								"type": "number"
							}
						},
						"required": [
							"creditType"
						]
					}
				},
				"dateAddedTimeStamp": {
					"duration": "must be before now",
					"type": "number"
				},
				"adBreaks": {
					"type": "array",
					"items": {
						"description": "offset from start, must be less than program duration",
						"type": "number"
					}
				}
			},
			"required": [
				"videos"
			]
		},
		"play_option": {
			"type": "object",
			"properties": {
				"license": {
					"$ref": "#/definitions/license_type"
				},
				"price": {
					"type": "number"
				},
				"quality": {
					"$ref": "#/definitions/video_quality_type"
				},
				"audioFormats": {
					"type": "array",
					"items": {
						"$ref": "#/definitions/audio_format_type"
					}
				},
				"currency": {
					"type": "string"
				},
				"playId": {
					"type": "string"
				},
				"availabilityStartTimeStamp": {
					"description": "millis since epoch",
					"type": "number"
				},
				"availabilityEndTimeStamp": {
					"description": "millis since epoch",
					"type": "number"
				},
				"availabilityStartTime": {
					"description": "ISO-8601",
					"type": "string"
				},
				"availabilityEndTime": {
					"description": "ISO-8601",
					"type": "string"
				},
				"discreteLiveEvent": {
					"$ref": "#/definitions/live_event"
				},
				"availabilityInfo": {
					"$ref": "#/definitions/availability_info"
				}
			},
			"allOf": [{
					"if": {
						"properties": {
							"license": {
								"enum": [
									"rental",
									"purchase"
								]
							}
						}
					},
					"then": {
						"required": [
							"price"
						]
					}
				},
				{
					"if": {
						"properties": {
							"license": {
								"enum": [
									"free",
									"subscription"
								]
							}
						}
					},
					"then": {
						"not": {
							"required": [
								"price"
							]
						}
					}
				}
			],
			"required": [
				"license",
				"quality",
				"playId"
			]
		},
		"license_type": {
			"type": "string",
			"enum": [
				"free",
				"subscription",
				"rental",
				"purchase"
			]
		},
		"video_type": {
			"type": "string",
			"enum": [
				"hls",
				"smooth",
				"dash",
				"mp4",
				"mov",
				"m4v"
			]
		},
		"video_quality_type": {
			"type": "string",
			"enum": [
				"sd",
				"hd",
				"hd+",
				"uhd",
				"fhd"
			]
		},
		"audio_format_type": {
			"type": "string",
			"enum": [
				"mono",
				"stereo",
				"dolby digital",
				"dolby atmos",
				"dolby digital plus"
			]
		},
		"linear_event": {
			"type": "object",
			"properties": {
				"stationId": {
					"type": "string"
				},
				"referenceId": {
					"type": "string"
				},
				"durationInSeconds": {
					"type": "integer"
				},
				"isLive": {
					"type": "boolean"
				},
				"date": {
					"type": "string"
				},
				"times": {
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"attributes": {
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"title": {
					"type": "string"
				},
				"externalId": {
					"$ref": "#/definitions/external_id"
				},
				"startTime": {
					"type": "integer"
				},
				"endTime": {
					"type": "integer"
				}
			}
		},
		"external_id": {
			"type": "object",
			"properties": {
				"id": {
					"type": "string"
				},
				"source": {
					"$ref": "#/definitions/external_id_source_type"
				}
			},
			"required": [
				"id",
				"source"
			]
		},
		"live_event": {
			"type": "object",
			"properties": {
				"streamStart": {
					"type": "integer"
				},
				"streamEnd": {
					"type": "integer"
				},
				"streamViewable": {
					"type": "integer"
				},
				"streamUnviewable": {
					"type": "integer"
				},
				"eventStart": {
					"type": "integer"
				},
				"eventEnd": {
					"type": "integer"
				},
				"timeChangeReason": {
					"type": "string"
				}
			}
		},
		"availability_info": {
			"type": "object",
			"properties": {
				"country": {
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"license": {
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"platform": {
					"type": "array",
					"items": {
						"type": "string"
					}
				}
			}
		}
	}
}

Sample feeds

The following examples, which pass Roku's schema validation, demonstrate the proper implementation of the various feed segments and fields. They are, however, not intended to address any particular production requirement or scenario. These examples can be used as templates for adding entries to a feed.

Simple feed example (single content item)

Click here to download this sample feed.

{
  "version": "1",
  "defaultLanguage": "en",
  "defaultAvailabilityCountries": [
    "us",
    "mx"
  ],
  "assets": [
    {
      "id": "shortform-voice-control",
      "type": "shortform",
      "titles": [
        {
          "value": "Voice Features",
          "language": "en"
        },
        {
          "value": "Funciones de Voz",
          "languages": ["es"]
        }
      ],
      "shortDescriptions": [
        {
          "value": "A video highlighting Direct to Play and Enhanced Voice Control features",
          "languages": ["en"]
        },
        {
          "value": "Un video que destaca las funciones Direct to Play y Enhanced Voice Control",
          "languages": ["es"]
        }
      ],
      "longDescriptions": [
        {
          "value": "A video highlighting Direct to Play and Enhanced Voice Control features on Roku",
          "languages": ["en"]
        },
        {
          "value": "Un video que destaca las funciones Direct to Play y Enhanced Voice Control en Roku",
          "languages": ["es"]
        }
      ],
      "releaseDate": "2020-01-17",
      "genres": [
        "educational"
      ],
      "advisoryRatings": [
        {
          "source": "USA_PR",
          "value": "TVG"
        },
        {
          "source": "RTC",
          "value": "A"
        }
      ],
      "images": [
        {
          "type": "main",
          "url": "https://images.sr.roku.com/test/simple-shortform.png",
          "languages": [
            "en",
            "es"
          ]
        }
      ],
      "durationInSeconds": 98,
      "content": {
        "playOptions": [
          {
            "license": "free",
            "quality": "uhd",
            "playId": "shortform-voice-control",
            "availabilityStartTimeStamp": 1565085600000,
            "availabilityEndTimeStamp": 2524546800000,
            "availabilityInfo": {
              "country": [
                "us",
                "mx"
              ]
            }
          }
        ]
      }
    }
  ]
}

Advanced feed example (series, season, episode)

Click here to download this sample feed.

{
  "version": "1",
  "defaultLanguage": "en",
  "defaultAvailabilityCountries": [
    "us",
    "mx"
  ],
  "assets": [
    {
      "id": "roku-demos-series",
      "type": "series",
      "titles": [
        {
          "value": "Roku Demo Videos",
          "languages": ["en"]
        },
        {
          "value": "Vídeos de demostración de Roku",
          "languages": ["es"]
        }
      ],
      "shortDescriptions": [
        {
          "value": "Roku regularly hosts webinars to provide the Roku development community with detailed coverage of key tools and features",
          "languages": ["en"]
        },
        {
          "value": "Roku organiza regularmente seminarios web para brindar a la comunidad de desarrollo de Roku una cobertura detallada de las herramientas y características clave.",
          "languages": ["es"]
        }
      ],
      "longDescriptions": [
        {
          "value": "Roku regularly hosts webinars to provide the Roku development community with detailed coverage of key Roku development tools and features. The webinars are usually led by Roku engineers or other subject matter experts, and they typically include a presentation explaining the importance of the feature, a demo showing how it works, and Q&A session for addressing questions from the Roku developer community. Webinars also include Roku's annual developer summit.",
          "languages": ["en"]
        },
        {
          "value": "Roku organiza seminarios web con regularidad para brindar a la comunidad de desarrollo de Roku una cobertura detallada de las herramientas y funciones clave de desarrollo de Roku. Los seminarios web generalmente están dirigidos por ingenieros de Roku u otros expertos en la materia, y generalmente incluyen una presentación que explica la importancia de la función, una demostración que muestra cómo funciona.",
          "languages": ["es"]
        }
      ],
      "releaseDate": "2020-01-17",
      "genres": [
        "educational"
      ],
      "advisoryRatings": [
        {
          "source": "USA_PR",
          "value": "TVG"
        },
        {
          "source": "RTC",
          "value": "A"
        }
      ],
      "images": [
        {
          "type": "main",
          "url": "https://images.sr.roku.com/test/advanced-series.png",
          "languages": [
            "en",
            "es"
          ]
        }
      ]
    },
    {
      "type": "season",
      "titles": [
        {
          "value": "Demos Season 1",
          "languages": ["en"]
        },
        {
          "value": "Demostración temporada 1",
          "languages": ["es"]
        }
      ],
      "shortDescriptions": [
        {
          "value": "Season 1 of the Roku Demo and Webinars series",
          "languages": ["en"]
        },
        {
          "value": "Temporada 1 de la serie Roku Demo and Webinars",
          "languages": ["es"]
        }
      ],
      "longDescriptions": [
        {
          "value": "Season 1 of the Roku Demo and Webinars series",
          "languages": ["en"]
        },
        {
          "value": "Temporada 1 de la serie Roku Demo and Webinars",
          "languages": ["es"]
        }
      ],
      "seasonInfo": {
        "seriesId": "roku-demos-series",
        "seasonNumber": 1
      },
      "releaseDate": "2020-01-17",
      "genres": [
        "educational"
      ],
      "advisoryRatings": [
        {
          "source": "USA_PR",
          "value": "TVG"
        },
        {
          "source": "RTC",
          "value": "A"
        }
      ],
      "images": [
        {
          "type": "main",
          "url": "https://images.sr.roku.com/test/advanced-season.png",
          "languages": [
            "en",
            "es"
          ]
        }
      ]
    },
    {
      "id": "voice-control-demo-episode",
      "type": "episode",
      "titles": [
        {
          "value": "Voice Features",
          "languages": ["en"]
        },
        {
          "value": "Funciones de Voz",
          "languages": ["es"]
        }
      ],
      "shortDescriptions": [
        {
          "value": "A video highlighting Direct to Play and Enhanced Voice Control features",
          "languages": ["en"]
        },
        {
          "value": "Un video que destaca las funciones Direct to Play y Enhanced Voice Control",
          "languages": ["es"]
        }
      ],
      "longDescriptions": [
        {
          "value": "A video highlighting Direct to Play and Enhanced Voice Control features. This helps developers understand how this enhances the user experience",
          "languages": ["en"]
        },
        {
          "value": "Un video que destaca las funciones Direct to Play y Enhanced Voice Control. Esto ayuda a los desarrolladores a comprender cómo mejora la experiencia del usuario.",
          "languages": ["es"]
        }
      ],
      "episodeInfo": {
        "seriesId": "roku-demos-series",
        "episodeNumber": 1
      },
      "releaseDate": "2020-01-17",
      "genres": [
        "educational"
      ],
      "advisoryRatings": [
        {
          "source": "USA_PR",
          "value": "TVG"
        },
        {
          "source": "RTC",
          "value": "A"
        }
      ],
      "images": [
        {
          "type": "main",
          "url": "https://images.sr.roku.com/test/advanced-episode.png",
          "languages": [
            "en",
            "es"
          ]
        }
      ],
      "durationInSeconds": 98,
      "content": {
        "playOptions": [
          {
            "license": "free",
            "quality": "uhd",
            "playId": "shortform-voice-control",
            "availabilityStartTimeStamp": 1565085600000,
            "availabilityEndTimeStamp": 2524546800000,
            "availabilityInfo": {
              "country": [
                "us",
                "mx"
              ]
            }
          }
        ]
      }
    }
  ]
}

TMS feed example (movies, series, episode)

Click here to download this sample feed. The prefixes in the IDs indicate the content type (MV=movie, SH=series, EP=episode).

{
  "version": "1.0",
  "defaultLanguage": "en",
  "defaultAvailabilityCountries": [
    "US"
  ],
  "assets": [
    {
      "id": "MV000833410000",
      "type": "externalIdOnly",
      "externalIdSource": "TMS",
      "content": {
        "playOptions": [
          {
            "playId": "11213123",
            "license": "subscription",
            "quality": "FHD",
            "availabilityInfo": {
              "country": [
                "MX"
              ]
            }
          }
        ]
      }
    },
    {
      "id": "SH000833410000",
      "type": "externalIdOnly",
      "externalIdSource": "TMS"
    },
    {
      "id": "EP000833410000",
      "type": "externalIdOnly",
      "externalIdSource": "TMS",
      "content": {
        "playOptions": [
          {
            "playId": "11213123",
            "license": "subscription",
            "quality": "FHD"
          }
        ]
      }
    }
  ]
}