Echo Show Video Skill API Reference
The Echo Show Video Skill API Reference details how to use a set of directives in AWS Lambda to accomplish several Echo Show capabilities.
- Search
- Browse
- Pagination
- Quick Play
- Channel Navigation
- Play from Search Results
- Recommendations
- Landing Page
- Alexa directives in the Lambda
- SEARCH
- BROWSE
- PAGINATION
- QUICK PLAY
- CHANNEL NAVIGATION
- ERROR HANDLING
- LANDING PAGE
- BADGING
Search
Search using criteria like VideoName, ActorName, GenreName, etc., by querying the content providers for content to display. Potential utterances include:
- "Search for movies with Tom Hanks." (
ActorName) - "Find 'The Big Bang Theory.'" (TV Show)
- "Find 'The Big Bang Theory' Season 1 episode 4."" (
VideoName, Season, and Episode) - "Search for Interstellar." (Movie)
- "Search for comedy movies." (Genre)
- "Search comedy movies with Tom Hanks." (Actor and Genre)
Browse
Browse user's watch list, video library, recordings, etc., on the device. Potential utterances include:
- "Show me my video library."
- "Show me my watch list."
- "Show me my recordings."
Pagination
Users may go to the "next page" of search results, or scroll beyond the viewable search results on the screen.
Quick Play
Search for movies, TV shows, recording, etc., using criteria such as VideoName, ActorName, or GenreName by querying content providers for the content to play on the device. Then, go directly into playback of that content (instead of showing search results, etc.). Potential utterances include:
- "Play a movie with Tom Hanks."
- "Play Interstellar."
- "Play a comedy movie."
- "Play 'The Big Bang Theory.'"
- "Play 'The Big Bang Theory' Season 1, episode 6."
- "Play a movie."
Channel Navigation
Play a live stream or recording of a channel for the user. Potential utterances include:
- "Tune to CNN."
- "Tune to ESPN."
Play from Search Results
Play a video from the search results shown on the device. The user can play using voice or simply by tapping on an item on the screen. Potential utterances include:
- "Play number 1."
- "Play the second one."
- "Select number 1."
- "Select the second one."
Recommendations
Search for recommendations by explicitly asking for something like "Show me recommended movies," or just by saying "Open Amazon Video," which translates to searching for recommendations.
Landing Page
Alexa renders a "landing page" for your content when users say a phrase such as "Open your app name." It is analogous to an app home screen.
Alexa directives in the Lambda
You can apply the previously mentioned capabilities through the following Alexa directives in the Lambda:
- GetDisplayableItems
- This API is called when the user requests to search videos and view results on the device. You can search content based on the criteria in the request and return entity IDs for the videos corresponding to the search request. If there is no content found for the request, then an appropriate error response should be returned.
- GetDisplayableItemsMetadata
- This API is called to obtain additional metadata for results you previously returned via
GetDisplayableItemsfor a set of entity IDs. The metadata contains information required by Alexa to display the entity IDs as search results on the device. - GetPlayableItems
- This API is called when the user requests to play a video on the device. You can search content based on the criteria in the request and return entity ID for the video corresponding to the request. Result returned from this API should favor videos that the user is entitled to play through their subscription (if applicable). If there are no videos for that request, then an appropriate Error Response code should be returned.
- GetPlayableItemsMetadata
- This API is called to obtain additional metadata for results you previously returned through
GetPlayableItemsfor a set of entity IDs. The metadata contains information required for playing the video as well as to render an appropriate prompt to the user. - GetBrowseNodeItems
- Search results on Echo Show can be merged into browse nodes with multiple layers. Users can choose to drill down on those grouped result items by clicking on them to see more results under that grouping. This API should return items that are part of the specified group in the directive.
- GetNextPage
- This API is called when the user tries to view more results on the screen by scrolling than are currently displayed on the screen. This API is called to dynamically fetch more results to show on the screen, once the metadata for those results has been fetched.
SEARCH
GetDisplayableItems
Request:
{
"directive": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "9f4803ec-4c94-4fdf-89c2-d502d5e52bb4",
"name": "GetDisplayableItems",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"endpoint": {
"scope": {
"type": "BearerToken",
"token": "access-token-from-skill"
},
"endpointId": "videoDevice-001",
"cookie": {
}
},
"payload": {
"entities": [
{
"type": "Video",
"value": "Manchester by the Sea",
"externalIds": {
"gracenote": "MV000000099001"
}
}
],
"contentType": "RECORDING",
"locale": "en-US",
"minResultLimit": 8,
"maxResultLimit": 25,
"timeWindow": {
"end": "2016-09-07T23:59:00+00:00",
"start": "2016-09-01T00:00:00+00:00"
}
}
}
}
| Field | Description | Required | Type | Values |
|---|---|---|---|---|
| endpoint | An endpoint object identifies the target for a directive and the origin of an event. For more information, see Endpoint object in the Smart Home Skill API Message Reference. | Yes | Object | |
| entities | A list of entity objects to search. The relationship between different entity types should usually be interpreted as an AND operation. For example, if the request contains `{genreName = "Comedy," actorName ="Tom Hanks"}`, it implies that the search result should contain Comedy movies/TV shows with Tom Hanks. However, if the request contains multiple entities of the same type, such as `{videoName = "Interstellar," VideoName = "Interstellar Wars"}`, then you can consider this as an OR operation and can search for all the entities in the request. If in doubt, you should assume that the top entity within the type (videoName in this case) is the most relevant. Let’s say you have another request with `{mediaType = "MOVIE', genreName = "Comedy," actorName ="Tom Hanks," actorName = "Tom Hanks}`. This is assuming that there are multiple actors named Tom Hanks. In such cases, you can search for movies with all the actors in the request and then filter based on the Comedy genre to return all the search results. Alexa does not rank the entities today because Alexa does not have a way to know what the user wants to play when there are multiple matching entities. |
Yes | List | |
| type | Entity types for video content. For information about video content entity types, see Entity Types for Video Content in the Video Skill API Reference. In addition to that list, ASK has added the following types for Echo Show: LISTTYPE , SORTTYPE LISTTYPE is populated when the user wants to browse his/her Watchlist or Library. For example, utterances like "Show me my Watchlist" or "Show me my Video Library." It can have the following enum values. - WATCHLIST: For "Show me my Watchlist" - Used to show videos the user has added to their watchlist. - LIBRARY: For "Show me my Video Library" - Ised to show videos that are in the users' library. Typically, these are the videos that have been purchased by the user. SORTTYPE - This is used to give additional information about the request that should be used during the searches and how results need to be sorted. For example, for "Show me recommended movies" Alexa needs recommendations from the content provider. It can have the following enum values: - RECOMMENDED - This value is populated for utterances like "Show me recommended movies," or "show me recommended action movies," etc. |
Yes | String | MEDIATYPE, VIDEO, ACTOR, GENRE, FRANCHISE, SEASON, EPISODE New entity type: LISTTYPE - WATCHLIST, LIBRARY SORTTYPE - RECOMMENDED |
| value | The name of the entity. | Yes | String | Example: Interstellar |
| externalIds | External identifiers for the entity, key is the provider, value is the ID. | No | Map | key = "gracenote" or "gti" Id is the string identifier. |
| minResultLimit | The minimum number of results to return in this call for which a pageToken is accepted. If you return less than the `minResultLimit` field along with a `pageToken` to fetch more results, then Alexa does not consider the `pageToken` to fetch the new items and only displays whatever Alexa received. For a `pageToken` to be considered for fetching more results, the number of items have to match at least the value in `minResultLimit`, however, the number of items can be more than `minResultLimit` up to a max of `maxResultLimit`. If the number of items is more than the `maxResultLimit`, then Alexa discards the items after the `maxResultLimit`. |
Yes | Integer | Example: 8 |
| maxResultLimit | A limit to the maximum number of results to return in this call. See description of `minResultLimit` field for more details. | Yes | Integer | Example: 25 |
| timeWindow | Provides the start and end times that the request should act on. This is usually used for Live TV or Recording only and not for On Demand content. Generally, if the time window is available and can be used to filter the results, the content provider should use it. For providers that only search for On Demand content, the time window field is usually set to null and can be ignored. For Live TV or Recording, if the user specifies the time window, for example, "Search for TV shows between 4 and 5 pm," or "Find TV shows recorded last week," then you should filter the results based on the start and end times whenever available. Depending on the capabilities, either both the fields—"start" and "end"—can be present, or any one field can be present. For example for "Search TV shows between 4 and 5 pm," both the fields are present. For "Show me TV shows starting at 5 pm," only "start" field is populated while "end" is null. |
Object | ||
| start | The start time of the time window. String containing a time in ISO 8601 format. | No | String | Example: 2016-09-07T23:59:00+00:00 |
| end | The end time of the time window. String containing a time in ISO 8601 format. | No | String | Example: 2016-09-07T23:59:00+00:00 |
| contentType | ContentType specifies the content category to be searched. Note that this is different from mediaType in the entitles. MediaType specifies the type of media to search for, example: Movies, or TV shows, etc. Therefore, if the user is interested in browsing recorded movies, he/she says something like "Show me recorded movies." In this case, the mediaType is set to "MOVIE," while contentType is set to "RECORDING." Similarly, when the user wants to Browse live tv content, he/she says something like "Show me what’s on now," and in this case, the contentType is set to "LIVE." | No | Enum | RECORDING LIVE
|
| locale | The locale for the user that should be used to get displayable information for the search results. This is the locale that the user has asked for based on the language setting on the device. A locale in the same format specified for languages in the Network Working Group Best Current Practice 47 (BCP-47). For more information, see the BCP-47 document. If an unrecognized locale is received, you should default to en-US. |
Yes | String | en-US, en-GB, de-DE |
Response:
The response in this case is a list of entity IDs of the items to display on the device.
{
"event": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "5f0a0546-caad-416f-a617-80cf083a05cd",
"name": "GetDisplayableItemsResponse",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"payload": {
"nextToken": "fvkjbr20dvjbkwOpqStr",
"mediaItems": [
{
"mediaIdentifier": {
"id": "recordingId://provider1.dvr.rp.1234-2345-63434-asdf"
}
},
{
"mediaIdentifier": {
"id": "recordingId://provider1.dvr.rp.1234-2345-63434-asdf"
}
}
]
}
}
}
| Field | Description | Required | Type | Values |
|---|---|---|---|---|
| nextToken | Token to fetch the next set of results. An opaque string sent by the provider which is passed back in subsequent search requests. | No | String | opaque string |
| mediaItems | A list of mediaIdentifiers for the videos that is shown as search results on the screen. | Yes | List | |
| mediaIdentifier | Identifier for the mediaItem. | Yes | Object | |
| id | An identifier for the video item that is used to fetch any display or playback related metadata information on subsequent calls to GetDisplayableItemsMetadata or GetPlayableItemsMetadata. This identifier is opaque to Alexa and is used as-is when querying for metadata information. | Yes | String | opaque string |
GetDisplayableItemsMetadata
Request:
The request only contains a list of entity IDs that Alexa needs metadata for. The entity IDs are returned by the provider from a previous GetDisplayableItemsResults call that happened for the request.
{
"directive": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "0f918d6e-ebae-48f1-a237-13c6f5b9f5da",
"name": "GetDisplayableItemsMetadata",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"endpoint": {
"scope": {
"type": "BearerToken",
"token": "access-token-from-skill"
},
"endpointId": "videoDevice-001",
"cookie": {
}
},
"payload": {
"locale": "en-US",
"mediaIdentifiers": [
{
"id": "recordingId://provider1.dvr.rp.1234-2345-63434-asdf"
},
{
"id": "channelId://provider1.channel.rp.1234-2345-63435-asdf"
}
]
}
}
}
Response:
The response contains the metadata information required to populate the templates on our side and render the search results on the screen. The response only contains display related information in this case and no playback information is required in this case.
{
"event": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "38ce5b22-eeff-40b8-a84f-979446f9b27e",
"name": "GetDisplayableItemsMetadataResponse",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"payload": {
"searchResults": [
{
"name": "The Big Bang Theory",
"contentType": "ON_DEMAND",
"releaseYear": "2014",
"selectionAction": "BROWSE",
"thumbnailImage": {
"contentDescription": "The Big Bang Theory Image",
"sources": [
{
"url": "http://ecx.images-amazon.com/images/I/81nSh3pZUDL.RI.jpg",
"size": "X_SMALL",
"widthPixels": 480,
"heightPixels": 320
},
{
"url": "http://ecx.images-amazon.com/AJhF52zkD7ObETpyTTW.jpg",
"size": "SMALL",
"widthPixels": 720,
"heightPixels": 480
}
]
},
"runtime": {
"runTimeInMilliseconds": 120931123,
"displayString": "2h 49m"
},
"closedCaption": {
"status": "AVAILABLE",
"displayString": "CC"
},
"series": {
"seasonNumber": "1",
"episodeNumber": "1",
"seriesName": "The Big Bang Theory",
"episodeName": "Pilot"
},
"absoluteViewingPositionMilliseconds": 0,
"parentalControl": {
"pinControl": "REQUIRED"
},
"viewingDisplayString": "Purchase Options",
"reviews": [
{
"totalReviewCount": 41951,
"type": "FIVE_STAR",
"ratingDisplayString": "4.06"
}
],
"rating": {
"category": "PG-13"
}
},
{
"name": "The Big Bang Theory",
"contentType": "LIVE",
"releaseYear": "2011",
"selectionAction": "PLAY",
"thumbnailImage": {
"contentDescription": "The Big Bang Theory Image ",
"sources": [
{
"url": "http://ecx.images-amazon.com/images/I/81nSh3pZUDL.RI.jpg",
"size": "X_SMALL",
"widthPixels": 480,
"heightPixels": 320
},
{
"url": "http://ecx.images-amazon.com/AJhF52zkD7ObETpyTTW.jpg",
"size": "SMALL",
"widthPixels": 720,
"heightPixels": 480
}
]
},
"runtime": {
"runTimeInMilliseconds": 120931123,
"displayString": "30 min"
},
"closedCaption": {
"status": "AVAILABLE",
"displayString": "CC"
},
"series": {
"seasonNumber": "1",
"episodeNumber": "1",
"seriesName": "The Big Bang Theory",
"episodeName": "Pilot"
},
"absoluteViewingPositionMilliseconds": 0,
"parentalControl": {
"pinControl": "REQUIRED"
},
"viewingDisplayString": "Play Now",
"rating": {
"category": "TV-PG"
},
"networkDetails": [
{
"channel": {
"number": "1234",
"callSign": "PBS",
"affiliateCallSign": "KCTS9",
"uri": "someUrl"
},
"channelMetadata": {
"name": "Alternate Channel Name",
"image": "http://ecx.images-amazon.com/images/I/81nSh3pZUDL.RI.jpg"
},
"airingDetails": [
{
"isLiveBroadcast": "true"
"end": "2018-01-24T02:30:00Z",
"start": "2018-01-24T00:00:00Z"
}
]
}
]
}
]
}
}
}
Example payload for an ON_DEMAND movie
{
"payload": {
"searchResults": [
{
"name": "Interstellar",
"contentType": "ON_DEMAND",
"releaseYear": "2014",
"selectionAction": "PLAY",
"thumbnailImage": {
"contentDescription": "Interstellar Image",
"sources": [
{
"url": "http://ecx.images-amazon.com/images/I/81nSh3pZUDL.RI.jpg",
"size": "X_SMALL",
"widthPixels": 480,
"heightPixels": 320
}
]
},
"runtime": {
"runTimeInMilliseconds": 120931123,
"displayString": "2h 49m"
},
"closedCaption": {
"status": "AVAILABLE",
"displayString": "CC"
},
"absoluteViewingPositionMilliseconds": 0,
"parentalControl": {
"pinControl": "REQUIRED"
},
"viewingDisplayString": "Purchase Options",
"reviews": [
{
"totalReviewCount": 41951,
"type": "FIVE_STAR",
"ratingDisplayString": "4.06"
}
],
"rating": {
"category": "PG-13"
}
}
]
}
}
Example payload for an ON_DEMAND TV show
{
"payload": {
"searchResults": [
{
"name": "The Big Bang Theory",
"contentType": "ON_DEMAND",
"releaseYear": "2014",
"selectionAction": "PLAY",
"thumbnailImage": {
"contentDescription": "The Big Bang Theory Image",
"sources": [
{
"url": "http://ecx.images-amazon.com/images/I/81nSh3pZUDL.RI.jpg",
"size": "X_SMALL",
"widthPixels": 480,
"heightPixels": 320
},
{
"url": "http://ecx.images-amazon.com/AJhF52zkD7ObETpyTTW.jpg",
"size": "SMALL",
"widthPixels": 720,
"heightPixels": 480
}
]
},
"runtime": {
"runTimeInMilliseconds": 120931123,
"displayString": "2h 49m"
},
"closedCaption": {
"status": "AVAILABLE",
"displayString": "CC"
},
"series": {
"seasonNumber": "1",
"episodeNumber": "1",
"seriesName": "The Big Bang Theory",
"episodeName": "Pilot"
},
"absoluteViewingPositionMilliseconds": 0,
"parentalControl": {
"pinControl": "REQUIRED"
},
"viewingDisplayString": "Purchase Options",
"reviews": [
{
"totalReviewCount": 41951,
"type": "FIVE_STAR",
"ratingDisplayString": "4.06"
}
],
"rating": {
"category": "PG-13"
}
}
]
}
}
Example payload for LIVE content
{
"payload": {
"searchResults": [
{
"name": "Interstellar",
"contentType": "LIVE",
"releaseYear": "2011",
"selectionAction": "PLAY",
"thumbnailImage": {
"contentDescription": "Interstellar Image",
"sources": [
{
"url": "http://ecx.images-amazon.com/images/I/81nSh3pZUDL.RI.jpg",
"size": "X_SMALL",
"widthPixels": 480,
"heightPixels": 320
}
]
},
"runtime": {
"runTimeInMilliseconds": 120931123,
"displayString": "2h 30 min"
},
"closedCaption": {
"status": "AVAILABLE",
"displayString": "CC"
},
"absoluteViewingPositionMilliseconds": 0,
"parentalControl": {
"pinControl": "REQUIRED"
},
"viewingDisplayString": "Play Now",
"rating": {
"category": "PG-13"
},
"networkDetails": [
{
"channel": {
"number": "1234",
"callSign": "PBS",
"affiliateCallSign": "KCTS9",
"uri": "someUrl"
},
"channelMetadata": {
"name": "Alternate Channel Name",
"image": "http://ecx.images-amazon.com/images/I/81nSh3pZUDL.RI.jpg"
},
"airingDetails": [
{
"isLiveBroadcast": "true"
"end": "2018-01-24T02:30:00Z",
"start": "2018-01-24T00:00:00Z"
}
]
}
]
}
]
}
}
Example payload for content that can be browsed
{
"payload": {
"searchResults": [
{
"name": "The Big Bang Theory",
"contentType": "RECORDING",
"selectionAction": "BROWSE",
"thumbnailImage": {
"contentDescription": "The Big Bang Theory Image",
"sources": [
{
"url": "http://ecx.images-amazon.com/images/I/81nSh3pZUDL.RI.jpg",
"size": "X_SMALL",
"widthPixels": 480,
"heightPixels": 320
},
{
"url": "http://ecx.images-amazon.com/AJhF52zkD7ObETpyTTW.jpg",
"size": "SMALL",
"widthPixels": 720,
"heightPixels": 480
}
]
},
"viewingDisplayString": "View episodes"
}
]
}
}
| Field | Description | Required | Type | Values |
|---|---|---|---|---|
| SearchResults | The list of search results. | Yes | List | |
| name | The name of the video. | Yes | String | Example: Interstellar |
| contentType | ContentType specifies the content type for the video that was returned in the search results. If you send a Recorded movie or TV show, the contentType is set to "RECORDING." If the result contains information about a live tv show, then the contentType is set to "LIVE." If the result contains an On Demand content, then the contentType is set to "ON_DEMAND." | Yes | Enum | RECORDING LIVE ON_DEMAND |
| releaseYear | Release year of video. This is used to display the release year when showing the item on the screen. | No | String | Example: 2018 |
| selectionAction | Guidance on how to browse the entity when the user selects this item. For example, you may choose to group similar items together when sending the search results. Movies or TV shows can be grouped by Genre, or by Actor, etc. In such cases, you can drill down on the item by selecting the group and may view more results. The following enum values are allowed: BROWSE - This means that you can get browse node items on the grouped entity to view more results. In this case, Alexa ends up calling the GetBrowseNodeItems on the selected entityId. PLAY - This means that the particular entity is not grouped and hence can be selected to play the item. In this case, Alexa ends up calling the GetPlayableItemsMetadata on the selected entityId. |
Yes | Enum | BROWSE PLAY |
| thumbnailImage | Image information that is used to display an image for the result item on the screen. | Yes | Object | { "contentDescription": "string", "sources": [ { "url": "string", "size": "string", "widthPixels": integer, "heightPixels": integer }, { "url": "string", "size": "string", "widthPixels": integer, "heightPixels": integer }, {...} ] } |
| runtime | Details about the video runtime. | No | Object | |
| runtimeInMilliseconds | Duration of the video in milliseconds. | No | Long | Example: 271871324 |
| displayString | The formatted display string for the duration of the Video. This is used to show the duration on the screen. | No | String | Example: "2h 30 m" |
| closedCaption | Details about whether closed caption is available for the video and display information. | No | Object | |
| status | Whether closed caption is available for the video. This is an enum with the following values: AVAILABLE - This means that Closed caption is available for the video. NOT_AVAILABLE - This means that Closed Caption is not available for the video. |
No | Enum | AVAILABLE NOT_AVAILABLE |
| displayString | The formatted display string to be shown on the screen for Closed caption. | No | String | Example: "CC" |
| series | The metadata about the series if this item is part of a series. This information should be populated for TV shows only. If available, the information here is used to render prompts to the user for example, "Here's 'The Big Bang Theory' Season 1, episode 4." | No | Object | |
| episodeNumber | Episode number of the video. | No | String | Example: "1" |
| seasonNumber | Season number of the video. | No | String | Example: "1" |
| episodeName | Episode title. | No | String | Example: "1" |
| seasonName | Season title, if available. | No | String | Example: "1" |
| absoluteViewingPositionMilliseconds | Progress offset of video in milliseconds based on the user's watch history. If the user has watched it previously, this represents some offset greater than 0. This is used to display a progress bar on the result item indicating how much has the user watched previously. | No | Long | Example: 1248625 |
| parentalControl | Parental Control information based on the user setting and the video. | No | Object | |
| pinControl | This field indicates whether parental control is required for the user for this video based on the setting. This is an enum with 2 values. REQUIRED - This means that parental control applies to this item based on the user's setting. When this is set, there is a lock icon displayed on the item to suggest that parental control applies to this item and the user is required to enter a PIN to view the video. NOT_REQUIRED - This means that parental control does not apply to this item based on the user's setting. |
No | Enum | REQUIRED NOT_REQUIRED |
| viewingDisplayString | The display string is shown on the screen with the result item and gives the user an indication of whether he/she can play immediately or has to go through buying/renting/subscribing, etc. Based on the entitlement status, the string can be different. The String needs to be localized based on the locale sent in the request. | No | String | Example: "Play Now," "Subscribe." |
| reviews | Information about the reviews for the video. | No | List | |
| totalReviewCount | Total count of reviews for the video. | No | Long | Example: 13425 |
| type | The type of review upon which information is based. | No | Enum | FIVE_STAR |
| ratingDisplayString | Rating of the video based for the type mentioned above and the reviews. This is used to display the rating under each item in the search results. | No | String | Example: "4.06" |
| rating | Rating related information for the video. | No | Object | |
| ratingCategory | Rating category of the video. E.g. PG-13. This is rating that applies for the region that this Video is resolved from. Also the rating value may differ based on the content for example, for movies, you may send us an MPAA rating like "PG-13" or for TV shows, you may send us a TV parental guidelines rating like "TV-PG." | No | String | Example: "PG-13" Example: "TV-PG" |
| networkDetails | If the result item represents a live show (contentType = LIVE) on a channel, this object contains its metadata. | No | List | |
| channel | Information about the channel the Video is currently airing on. | No | Object | |
| channelMetadata | Metadata information about the channel. | No | Object | |
| airingDetails | This object contains information on when content airs. | No | List | |
| end | End time of the Video. String containing a time in ISO 8601 format. | Yes | String | Example: "2016-09-07T23:59:00+00:00" |
| start | Start time of the video. String containing a time in ISO 8601 format. | Yes | String | Example: "2016-09-07T23:59:00+00:00" |
| isLiveBroadcast | Whether this content is airing in real time. | No | boolean | true, false |
BROWSE
GetBrowseNodeItems
When search Results are shown on the screen, you may choose to combine similar items together into a logical group. For example, for an utterance like "Show me my recordings," you may group TV shows into one and Movies into another group. When the users select a group, they can then view more results from that group. This directive is sent for cases when the user wants to drill down into a specific browse node item as determined by selectionAction field in the GetDisplayableItems response. If the value of the field is BROWSE, you have more search results to show on the screen when the users select this item on the device. Once the user selects the Video, Alexa sends a GetBrowseNodeItems directive to get more mediaIdentifiers, and then send a GetDisplayableItemsMetadata directive for those items to display results on the screen. If the value of the selectionAction field is set to PLAY, you need to play that item if the user selects it. In such cases, Alexa sends a GetPlayableItemsMetadata directive.
Request:
{
"directive": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "0f918d6e-ebae-48f1-a237-13c6f5b9f5da",
"name": "GetBrowseNodeItems",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"endpoint": {
"scope": {
"type": "BearerToken",
"token": "access-token-from-skill"
},
"endpointId": "videoDevice-001",
"cookie": {
}
},
"payload": {
"minResultLimit": 8,
"maxResultLimit": 25,
"mediaIdentifier": {
"id": "recordingId://provider1.dvr.rp.1234-2345-63434-asdf"
}
}
}
}
Response:
The response contains the list of the Ids for the items in the requested group.
{
"event": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "5f0a0546-caad-416f-a617-80cf083a05cd",
"name": "GetBrowseNodeItemsResponse",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"payload": {
"nextToken": "fvkjbr20dvjbkwOpqStr",
"mediaItems": [
{
"mediaIdentifier": {
"id": "recordingId://provider1.dvr.rp.1234-2345-63434-asdf"
}
},
{
"mediaIdentifier": {
"id": "recordingId://provider1.dvr.rp.1234-2345-63434-asdf"
}
}
]
}
}
}
PAGINATION
GetNextPage
After receiving search results from the content provider, a user may want to see additional search results, or "the next page" of search results. For this purpose, the Lambda receives the GetNextPage directive. The following examples show requests and responses.
Request:
{
"directive": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "9f4803ec-4c94-4fdf-89c2-d502d5e52bb4",
"name": "GetNextPage",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"endpoint": {
"cookie": {
},
"endpointId": "<the identifier of the target endpoint>",
"scope": {
"token": "<an OAuth2 bearer token>",
"type": "BearerToken"
}
},
"payload": {
"nextToken": "fvkjbr20dvjbkwOpqStr",
"minResultLimit": 8,
"maxResultLimit": 25
}
}
}
| Field | Description | Required | Type | Values |
|---|---|---|---|---|
| nextToken | Token to fetch the next set of results. An opaque string sent by the provider which is passed back in subsequent search requests. | No | String | Opaque String |
| minResultLimit | The minimum number of results to return in this call for which a pageToken is accepted. If you return less than the `minResultLimit` field along with a `pageToken` to fetch more results, then Alexa does not consider the `pageToken` to fetch the new items and only displays whatever Alexa received. For a `pageToken` to be considered for fetching more results, the number of items have to match at least the value in `minResultLimit`, however, the number of items can be more than `minResultLimit` up to a max of `maxResultLimit`. If the number of items is more than the `maxResultLimit`, then Alexa discards the items after the `maxResultLimit`. |
Yes | Integer | Example: 8 |
| maxResultLimit | A limit to the maximum number of results to return in this call. See description of `minResultLimit` field for more details. | Yes | Integer | Example: 25 |
Response:
The response in this case is the list of items to display on the device. This payload follows the same format as the one for the earlier search request.
{
"event": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "9f4803ec-4c94-4fdf-89c2-d502d5e52bb4",
"name": "GetNextPageResponse",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"endpoint": {
"scope": {
"type": "BearerToken",
"token": "Alexa-access-token"
},
"endpointId": "appliance-001"
},
"payload": {
"nextToken": "qefjrfiugef74",
"mediaItems": [
{
"mediaIdentifier": {
"id": "recordingId://provider1.dvr.rp.1234-2345-63434-asdf"
}
},
{
"mediaIdentifier": {
"id": "recordingId://provider1.dvr.rp.1234-2345-63434-asdf"
}
}
]
}
}
}
| Field | Description | Required | Type | Values |
|---|---|---|---|---|
| nextToken | Token to fetch the next set of results. An opaque string sent by the provider which is passed back in subsequent search requests. | No | String | opaque string |
| mediaItems | A list of mediaIdentifiers for the videos that is shown as search results on the screen. |
Yes | List | |
| mediaIdentifier | Identifier for the mediaItem. | Yes | Object | |
| id | An identifier for the video item that is used to fetch any display or playback related metadata information on subsequent calls to GetDisplayableItemsMetadata or GetPlayableItemsMetadata. This identifier is opaque to Alexa and is just used as is when querying for metadata information. |
Yes | String | opaque string |
QUICK PLAY
GetPlayableItems
Request:
The GetPlayableItems request is identical to the previously mentioned GetDisplayableItems except for the header name. This API is used when the user is asking to play content on the device. Having separate APIs for play and search allows for greater transparency around user intent.
The following general guidance shows how to perform the search in different scenarios:
Video Name: For example, consider - "Play Interstellar."
- In the instance where a video name is present, Alexa sends a
GetPlayableItemsdirective with all the relevant video names found in the content provider catalog, with catalog IDs included in theexternalIdsfield. You should favor the content based on the IDs sent to you along with thevideoNamesand select the one that can be played and return that item. Note that in this case, Alexa found the matching titles from the catalog, so there should not be a need to do another search again. You can use the information sent to you in the request to select the correct video.
Genre/Actor: Play a comedy movie or Play an action movie with Tom Cruise
- In the instance where a video name is not present and some other slot like genre and/or actor is present, Alexa sends a
GetPlayableItemsdirective, and you should do a search using the entities sent in the request. For example, for "Play an action movie," you receive{mediaType: MOVIE, genreName: COMEDY}, and can search based on these criteria and return an identifier for a comedy movie. Similarly for "Play an action movie with Tom Cruise," you receive{mediaType: MOVIE, genreName: ACTION, actorName: Tom Cruise}, and then you can search and return an identifier for a movie that matches those criteria. Once the identifier is returned in the response, Alexa sends aGetPlayableItemsMetadatadirective to fetch additional metadata.
{
"directive": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "9f4803ec-4c94-4fdf-89c2-d502d5e52bb4",
"name": "GetPlayableItems",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"endpoint": {
"scope": {
"type": "BearerToken",
"token": "access-token-from-skill"
},
"endpointId": "videoDevice-001",
"cookie": {
}
},
"payload": {
"entities": [
{
"type": "Video",
"value": "Manchester by the Sea",
"externalIds": {
"gracenote": "MV000000099001"
}
}
],
"contentType": "RECORDING",
"locale": "en-US",
"minResultLimit": 8,
"maxResultLimit": 25,
"timeWindow": {
"end": "2016-09-07T23:59:00+00:00",
"start": "2016-09-01T00:00:00+00:00"
}
}
}
}
| Field | Description | Required | Type | Values |
|---|---|---|---|---|
| entities | A list of entity objects to search. | Yes | List | |
| type | Entity types for video content. For information about video content entity types, see Entity Types for Video Content in the Video Skill API Reference. | Yes | String | MOVIE, TV SHOW, ACTOR, GENRE, etc |
| value | The value of the entity. | Yes | String | Interstellar |
| externalIds | External identifiers for the entity, key is the provider, value is the id. | No | Map | key = "gracenote" or "gti" Value: ""SH000000012" |
| minResultLimit | The minimum number of results to return in this call for which a `pageToken` is accepted. If you return less than the `minResultLimit` field along with a `pageToken` to fetch more results, then Alexa does not consider the `pageToken` to fetch the new items and only displays whatever Alexa received. For a `pageToken` to be considered for fetching more results, the number of items have to match at least the value in `minResultLimit`, however, the number of items can be more than `minResultLimit` up to to a max of `maxResultLimit`. If the number of items is more than the `maxResultLimit`, then Alexa discards the items after the `maxResultLimit`. |
Yes | Integer | Example: 8 |
| maxResultLimit | A limit to the maximum number of results to return in this call. See description of `minResultLimit` field for more details. | Yes | Integer | Example: 25 |
| timeWindow | Provides the start and end times that the request should act on. This is usually used for Live TV or Recording only and not for On Demand content. Generally, if the time window is available and can be used to filter the results, the content provider should use it. For providers that only search for On Demand content, the time window field is usually set to null and can be ignored. For Live TV or Recording, if the user specifies the time window, for example, "Search for TV shows between 4 and 5 pm," or "Find TV shows recorded last week," then you should filter the results based on the start and end times whenever available. Depending on the capabilities, either both the fields—"start" and "end"—can be present, or any one field can be present. For example, for "Search TV shows between 4 and 5 pm," both the fields are present. For "Show me TV shows starting at 5 pm," only "start" field is populated while "end" is null. |
Object | ||
| start | The start time of the time window. String containing a time in ISO 8601 format. | No | String | 2016-09-07T23:59:00+00:00 |
| end | The end time of the time window. String containing a time in ISO 8601 format. | No | String | 2016-09-07T23:59:00+00:00 |
| contentType | `ContentType` specifies the content category to be searched. Note that this is different from `mediaType` in the entitles. `MediaType` specifies the type of media to search for. For example, Movies, or TV shows, etc. Therefore, if the user is interested in browsing recorded movies, he/she says something like "Show me recorded movies." In this case, the `mediaType` is set to "MOVIE," while `contentType` is set to "RECORDING." Similarly when the user wants to Browse live tv content, he/she says something like "Show me what’s on now," and in this case the `contentType` is set to "LIVE." | No | Enum | RECORDING LIVE ON_DEMAND |
| locale | The locale for the user that should be used to get displayable information for the search results. A locale in the same format specified for languages in in the Network Working Group Best Current Practice 47 (BCP-47). For more information, see the BCP-47 document. | Yes | String | en-US, en-GB, de-DE |
Response:
The response structure in this case is similar to the response returned for the GetDisplayableItems API.
The following guidelines explain the type of response this API returns:
-
The goal of this API is to get a single item that can be played for the request.
-
If there is only one item to play, you can just return that one item and Alexa ends up playing that item.
-
For some quickplay capabilities, you can choose to return multiple items in the response and have the user choose which one to play. For example, for "Play Star Wars," there can be multiple movies in the Star Wars franchise returned in the response or movies and TV shows pertaining to Star Wars as well. If and when you return multiple results, the number of results returned in the first call should not exceed the
resultLimitparameter specified in the request. In such cases, once the content provider returns multiple results, Alexa Video sends aGetDisplayableItemsMetadatadirective to fetch the metadata and display search results. -
If the only result found is not playable because the user is not entitled to play the title or because a subscription is required, then you can return that one item. Alexa fetches metadata and renders a prompt to either buy or rent or subscribe once Alexa finds that this item is not playable. After that, the user can trigger the purchase workflow to buy/rent the title and play it afterwards.
-
If multiple results are found that are not playable, then you can choose to return all the results, and Alexa either disambiguates or renders an informational prompt to buy, rent, or subscribe.
-
If multiple results are found, with some playable and some not, then you should favor the playable one and return the playable result so that it can be played on the device.
{
"event": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "5f0a0546-caad-416f-a617-80cf083a05cd",
"name": "GetPlayableItemsResponse",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"payload": {
"nextToken": "fvkjbr20dvjbkwOpqStr",
"mediaItems": [
{
"mediaIdentifier": {
"id": "recordingId://provider1.dvr.rp.1234-2345-63434-asdf"
}
},
{
"mediaIdentifier": {
"id": "recordingId://provider1.dvr.rp.1234-2345-63434-asdf"
}
}
]
}
}
}
| Field | Description | Required | Type | Values |
|---|---|---|---|---|
| nextToken | Token to fetch the next set of results. An opaque string sent by the provider which is passed back in subsequent search requests. | No | String | opaque string |
| mediaItems | A list of mediaIdentifiers for the videos that is shown as search results on the screen. | Yes | List | |
| mediaIdentifiers | Identifier for the mediaItem. | Yes | Object | |
| id | An identifier for the video item that is used to fetch any display or playback related metadata information on subsequent calls to GetDisplayableItemsMetadata or GetPlayableItemsMetadata. This identifier is opaque to Alexa and is just used as is when querying for metadata information. |
Yes | String | opaque string |
GetPlayableItemsMetadata
Request:
Similar to GetDisplayableItemsMetadata discussed before, the request only contains a list of entity IDs that Alexa needs metadata for. The entity IDs are returned by the provider from a previous GetPlayableItems call that happened for the request.
{
"directive": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "0f918d6e-ebae-48f1-a237-13c6f5b9f5da",
"name": "GetPlayableItemsMetadata",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"endpoint": {
"scope": {
"type": "BearerToken",
"token": "access-token-from-skill"
},
"endpointId": "videoDevice-001",
"cookie": {
}
},
"payload": {
"locale": "en-US",
"mediaIdentifier": {
"id": "recordingId://provider1.dvr.rp.1234-2345-63434-asdf"
}
}
}
}
Response:
The response in this case should only contain metadata information required for playback and for rendering any success prompts before playing the video. The metadata in the response for this API should never contain any metadata specific to displaying information on the screen unless that metadata is required for prompting.
Example response for an ON_DEMAND TV show
{
"event": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "38ce5b22-eeff-40b8-a84f-979446f9b27e",
"name": "GetPlayableItemsMetadataResponse",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"payload": {
"searchResults": [
{
"name": "Interstellar",
"contentType": "ON_DEMAND",
"series": {
"seasonNumber": "1",
"episodeNumber": "1",
"seriesName": "The Big Bang Theory",
"episodeName": "Pilot"
},
"playbackContextToken": "provider1.dv.gti.b4a9f7c6-5def-7e63-9aa7-df38a479333e",
"parentalControl": {
"pinControl": "REQUIRED"
},
"absoluteViewingPositionMilliseconds": 1232340
}
]
}
}
}
Example response for a LIVE movie
{
"event": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "38ce5b22-eeff-40b8-a84f-979446f9b27e",
"name": "GetPlayableItemsMetadataResponse",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"payload": {
"searchResults": [
{
"name": "Interstellar",
"contentType": "LIVE",
"playbackContextToken": "provider1.dv.gti.b4a9f7c6-5def-7e63-9aa7-df38a479333e",
"parentalControl": {
"pinControl": "REQUIRED"
},
"networkDetails": [
{
"channel": {
"callSign": "PBS",
"affiliateCallSign": "KCTS9"
},
"channelMetadata": {
"name": "Alternate Channel Name"
},
"airingDetails": [
{
"isLiveBroadcast": "true"
"end": "2018-01-24T02:30:00Z",
"start": "2018-01-24T00:00:00Z"
}
]
}
]
}
]
}
}
}
| Field | Description | Required | Type | Values |
|---|---|---|---|---|
| name | The name of the Video. This is used to render a prompt to the user about the video that is going to be played. For example, "Here's *Interstellar*." | Yes | String | Interstellar |
| contentType | `ContentType` specifies the content category to be searched. Note that this is different from `mediaType` in the entitles. `MediaType` specifies the type of media to search for. For example, Movies, or TV shows, etc. Therefore, if the user is interested in browsing recorded movies, then `mediaType` is set to "MOVIE," while `contentType` is set to "RECORDING." This is also used to render a prompt to the user. For example, if the `contentType` is LIVE, Alexa renders a prompt like "Here's the Academy Awards now airing on CBS, from your DVR." If the `contentType` is RECORDING, Alexa renders a prompt like "Here's the Academy Awards from your DVR." |
Yes | Enum | RECORDING LIVE ON_DEMAND |
| series | The metadata about the series if this item is part of a series. If present, the information here is used only for rendering a prompt to the user with the details about the season and episode. For example something like "Here’s 'The Big Bang Theory' Season 1, Episode 8." | No | Object | |
| seasonNumber | The season number of the video. | No | String | 1 |
| episodeNumber | The episode number of the video. | No | String | 3 |
| episodeName | The episode name. | No | String | 4 |
| seasonName | The season name. | No | String | 2 |
| playbackContextToken | Token that allows mapping of entities back to your system for further identification. You can send any string identifier as long as you can map it back to identify an entity on your side. This token is opaque to Alexa and is sent to device for playback purposes. This can be the same media identifier that was used to fetch the metadata information if that is what is needed for playback or this can be a different serialized string with additional information that is required for playback. | Yes | String | Opaque string |
| parentalControl | Parental Control information based on the user and the video. | Yes | Object | |
| pinControl | This field indicates whether parental control is required for the user for this video based on the setting. This is an enum with 2 values. REQUIRED - This means that parental control applies to this item based on the user's setting. When this is set, there is a lock icon displayed on the item to suggest that parental control applies to this item and the user is required to enter a PIN to view the video. NOT_REQUIRED - This means that parental control does not apply to this item based on the user's setting. |
Yes | Enum | REQUIRED NOT_REQUIRED |
| absoluteViewingPositionMilliseconds | Progress offset of video in milliseconds based on the user's watch history. If the user has watched it previously, this represents some offset greater than 0. This is used to display a progress bar on the result item indicating how much has the user watched previously. | Yes | Long | Example: 1248625 |
| networkDetails | If the result item represents a live show on a channel, this object contains the metadata information for it. Whenever available, the information here is used to render a prompt to the user giving details about the channel the video is currently airing along with the start and end times. | No | List | |
| channel | Information about the channel the Video is currently airing on. | No | Object | |
| channelMetadata | Metadata information about the channel. | No | Object | |
| airingDetails | This object contains information on when content airs. | No | List | |
| end | End time of the Video. String containing a time in ISO 8601 format. | No | String | 2018-01-24T02:30:00Z |
| start | Start time of the program. String containing a time in ISO 8601 format. | No | String | 2018-01-24T02:30:00Z |
| isLiveBroadcast | Whether this content is airing in real time. | No | boolean | true, false |
CHANNEL NAVIGATION
GetPlayableItems
Request:
{
"directive": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "9f4803ec-4c94-4fdf-89c2-d502d5e52bb4",
"name": "GetPlayableItems",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"endpoint": {
"scope": {
"type": "BearerToken",
"token": "access-token-from-skill"
},
"endpointId": "videoDevice-001",
"cookie": {
}
},
"payload": {
"entities": [
{
"type": "Channel",
"value": "PBS",
"externalIds": {
"gracenote": "MV000000099001"
},
"entityMetadata": {
"channelCallSign": "KBTC",
"channelNumber": "123"
}
}
],
"contentType": "RECORDING",
"locale": "en-US",
"minResultLimit": 8,
"maxResultLimit": 25,
"timeWindow": {
"end": "2016-09-07T23:59:00+00:00",
"start": "2016-09-01T00:00:00+00:00"
}
}
}
}
| Field | Description | Required | Type | Values |
|---|---|---|---|---|
| entities | A list of entity objects to search. | Yes | List | |
| type | Entity types for video content. For information about video content entity types, see Entity Types for Video Content in the Video Skill API Reference. | Yes | String | MOVIE, TV SHOW, ACTOR, GENRE, etc |
| value | The value of the entity. | Yes | String | Interstellar |
| externalIds | External identifiers for the entity, key is the provider, value is the id. | No | Map | key = "gracenote" or "gti" Value: ""SH000000012" |
| minResultLimit | The minimum number of results to return in this call for which a `pageToken` is accepted. If you return less than the `minResultLimit` field along with a `pageToken` to fetch more results, then Alexa does not consider the `pageToken` to fetch the new items and only displays whatever Alexa received. For a `pageToken` to be considered for fetching more results, the number of items have to match at least the value in `minResultLimit`. However, the number of items can be more than `minResultLimit` up to a max of `maxResultLimit`. If the number of items is more than the `maxResultLimit`, then Alexa discards the items after the `maxResultLimit`. |
Yes | Integer | Example: 8 |
| maxResultLimit | A limit to the maximum number of results to return in this call. See description of `minResultLimit` field for more details. | Yes | Integer | Example: 25 |
| timeWindow | Provides the start and end times that the request should act on. This is usually used for Live TV or Recording only and not for On Demand content. Generally, if the time window is available and can be used to filter the results, you should use it. For providers that only search for On Demand content, the time window field is usually be set to null and can be ignored. For Live TV or Recording, if the user specifies the time window, for example, "Search for TV shows between 4 and 5 pm," or "Find TV shows recorded last week," then you should filter the results based on the start and end times whenever available. Depending on the capabilities, either both the fields—"start" and "end"—can be present, or any one field can be present. For example for "Search TV shows between 4 and 5 pm," both the fields are present. For "Show me TV shows starting at 5 pm," only the "start" field is populated while "end" is null. |
Object | ||
| start | The start time of the time window. String containing a time in ISO 8601 format. | No | String | 2016-09-07T23:59:00+00:00 |
| end | The end time of the time window. String containing a time in ISO 8601 format. | No | String | 2016-09-07T23:59:00+00:00 |
| contentType | `ContentType` specifies the content category to be searched. Note that this is different from `mediaType` in the entitles. `MediaType` specifies the type of media to search for. For example, Movies, or TV shows, etc. Therefore, if the user is interested in browsing recorded movies, he/she says something like "Show me recorded movies." In this case, the `mediaType` is set to "MOVIE," while `contentType` is set to "RECORDING." Similarly when the user wants to Browse live tv content, he/she says something like "Show me what’s on now," and in this case the `contentType` is set to "LIVE." | No | Enum | RECORDING LIVE ON_DEMAND |
| locale | The locale for the user that should be used to get displayable information for the search results. A locale in the same format specified for languages in in the Network Working Group Best Current Practice 47 (BCP-47). For more information, see the BCP-47 document. | Yes | String | en-US, en-GB, de-DE |
Channel Entity Structure:
Channel represents the identifying data for a television channel; for example, "PBS" might contain the following:
| Field | Description | Type | Example |
|---|---|---|---|
| externalIds | A map of external identifiers for this entity, key is the provider, value is the id. | Object | |
| Gracenote | The external Gracenote identifier. | String | ST0000000666661 |
| entityMetadata | A map of meta data associated with the channel. | Object | |
| channelNumber | The channel number. | Integer | 1234 |
| channelCallSign | The call sign for the channel. | String | KBTC |
| value | The name of the channel. | String | PBS |
Response:
{
"event": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "5f0a0546-caad-416f-a617-80cf083a05cd",
"name": "GetPlayableItemsResponse",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"payload": {
"nextToken": "fvkjbr20dvjbkwOpqStr",
"mediaItems": [
{
"mediaIdentifier": {
"id": "channelId://provider1.dvr.rp.1234-2345-63434-asdf"
}
}
]
}
}
}
| Field | Description | Required | Type | Values |
|---|---|---|---|---|
| nextToken | Token to fetch the next set of results. An opaque string sent by the provider which is passed back in subsequent search requests. | No | String | opaque string |
| mediaItems | A list of mediaIdentifiers for the videos that is shown as search results on the screen. |
Yes | List | |
| mediaIdentifiers | Identifier for the mediaItem. | Yes | Object | |
| id | An identifier for the video item that is used to fetch any display or playback related metadata information on subsequent calls to GetDisplayableItemsMetadata or GetPlayableItemsMetadata. This identifier is opaque to Alexa and is just used as is when querying for metadata information. |
Yes | String | opaque string |
GetPlayableItemsMetadata
Request:
Similar to GetDisplayableItemsMetadata discussed before, the request only contains a list of entity IDs that Alexa needs metadata for. This call usually contains entity IDs from a previous GetPlayableItems call. You should return metadata for those entity IDs.
{
"directive": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "0f918d6e-ebae-48f1-a237-13c6f5b9f5da",
"name": "GetPlayableItemsMetadata",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"endpoint": {
"scope": {
"type": "BearerToken",
"token": "access-token-from-skill"
},
"endpointId": "videoDevice-001",
"cookie": {
}
},
"payload": {
"locale": "en-US",
"mediaIdentifier": {
"id": "channelId://provider1.dvr.rp.1234-2345-63434-asdf"
}
}
}
}
Response:
{
"event": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "38ce5b22-eeff-40b8-a84f-979446f9b27e",
"name": "GetPlayableItemsMetadataResponse",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"payload": {
"searchResults": [
{
"name": "Interstellar",
"contentType": "LIVE",
"playbackContextToken": "provider1.dv.gti.b4a9f7c6-5def-7e63-9aa7-df38a479333e",
"parentalControl": {
"pinControl": "REQUIRED"
},
"networkDetails": [
{
"channel": {
"callSign": "PBS",
"affiliateCallSign": "KCTS9"
},
"channelMetadata": {
"name": "Alternate Channel Name"
},
"airingDetails": [
{
"isLiveBroadcast": "true"
"end": "2018-01-24T02:30:00Z",
"start": "2018-01-24T00:00:00Z"
}
]
}
]
}
]
}
}
}
| Field | Description | Required | Type | Values |
|---|---|---|---|---|
| name | The name of the Video. This is used to render a prompt to the user about the video that is going to be played. For example, "Here's *Interstellar*." | Yes | String | Interstellar |
| contentType | `ContentType` specifies the content category to be searched. Note that this is different from `mediaType` in the entitles. `MediaType` specifies the type of media to search for. For example, Movies, or TV shows, etc. Therefore, if the user is interested in browsing recorded movies, then `mediaType` is set to "MOVIE," while `contentType` is set to "RECORDING." This is also used to render a prompt to the user. For example, if the `contentType` is LIVE, Alexa renders a prompt like "Here's the Academy Awards now airing on CBS, from your DVR." If the `contentType` is RECORDING, Alexa renders a prompt like "Here's the Academy Awards from your DVR." |
Yes | Enum | RECORDING LIVE ON_DEMAND |
| series | The metadata about the series, if this item is part of a series. If present, the information here is used only for rendering a prompt to the user with the details about the season and episode. For example something like "Here's 'The Big Bang Theory' Season 1, Episode 8." | No | Object | |
| seasonNumber | The season number of the video. | No | String | 1 |
| episodeNumber | The episode number of the video. | No | String | 3 |
| episodeName | The episode name. | No | String | 4 |
| seasonName | The season name. | No | String | 2 |
| playbackContextToken | Token that allows mapping of entities back to your system for further identification. You can send any string identifier as long as you can map it back to identify an entity on their side. This token is opaque to us and is sent to the device for playback purposes. This can be the same media identifier that was used to fetch the metadata information if that is what is needed for playback or this can be a different serialized string with additional information that is required for playback. | Yes | String | Opaque string |
| parentalControl | Parental Control information based on the user and the video. | Yes | Object | |
| pinControl | This field indicates whether parental control is required for the user for this video based on the setting. This is an enum with 2 values. REQUIRED - This means that parental control applies to this item based on the user's setting. When this is set, a lock icon is displayed on the item to suggest that parental control applies to this item and the user is required to enter a PIN to view the video. NOT_REQUIRED - This means that parental control does not apply to this item based on the user's setting. |
Yes | Enum | REQUIRED NOT_REQUIRED |
| absoluteViewingPositionMilliseconds | Progress offset of video in milliseconds based on the user's watch history. If the user has watched it previously, this represents some offset greater than 0. This is used to display a progress bar on the result item indicating how much has the user watched previously. | Yes | Long | Example: 1248625 |
| networkDetails | If the result item represents a live show on a channel, this object contains its metadata. Whenever available, the information here is used to render a prompt to the user giving details about the channel the video is currently airing along with the start and end times. | No | List | |
| channel | Information about the channel the Video is currently airing on. | No | Object | |
| channelMetadata | Metadata information about the channel. | No | Object | |
| airingDetails | This object contains information on when content airs. | No | List | |
| end | End time of the Video. String containing a time in ISO 8601 format. | No | String | 2018-01-24T02:30:00Z |
| start | Start time of the program. String containing a time in ISO 8601 format. | No | String | 2018-01-24T02:30:00Z |
| isLiveBroadcast | Whether this content is airing in real time. | No | boolean | true, false |
ERROR HANDLING
In the event of an error, you should return an error code in the response so that Alexa can take a specific action. For information about the structure of the response, see Alexa.Video.ErrorResponse in the Video Skill API Reference. This already includes an error type for NOT_SUBSCRIBED that can be used for non-entitled content.
For information about more general errors, see Alexa.ErrorResponse Interface in the Capability Interface Reference.
For video skills on Echo Show, the following error should be used when no search results are found:
| Error type | Description |
|---|---|
| CONTENT_NOT_FOUND | This value should be used to indicate that no content was found based on the criteria sent in the request or that the content was not recognized by the content provider. |
Sample response for Error case:
{
"event": {
"header": {
"messageId": "4e02d3c8-85e8-4e32-8a1b-08c1d52122ad",
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/==",
"name": "ErrorResponse",
"namespace": "Alexa.Video",
"payloadVersion": "3"
},
"endpoint": {
"scope": {
"type": "DirectedUserId",
"directedUserId": "access-token-from-Amazon"
},
"endpointId": "videoDevice-001"
},
"payload": {
"message": "optional information about the error that will be logged by Alexa",
"type": "CONTENT_NOT_FOUND"
}
}
}
LANDING PAGE
Alexa renders a landing page for your content when the user says a phrase such as "open your app name." Alexa renders this page using the previously discussed search, browse, and pagination APIs, but there are specific nuances specific to landing page, which are detailed here. This section provides sample requests and responses to landing-page-specific directives, as well as clarification of how these directives and responses are distinct from other similar directives.
GetDisplayableItems
For GetDisplayableItems directives used for populating your landing page, ASK has added an additional field called itemType with enum values VIDEO and CATEGORY. The itemType field specifies the type of search to complete. The following examples show directives and responses for both values.
| Field | Description | Required | Type | Values |
|---|---|---|---|---|
| itemType | itemType specifies the type of item to be searched. | No | Enum | VIDEO CATEGORY |
Request:
{
"directive": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "9f4803ec-4c94-4fdf-89c2-d502d5e52bb4",
"name": "GetDisplayableItems",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"endpoint": {
"scope": {
"type": "BearerToken",
"token": "access-token-from-skill"
},
"endpointId": "videoDevice-001",
"cookie": {
}
},
"payload": {
"entities": [
{
"type": "SORTTYPE",
"value": "RECOMMENDED"
}
],
"itemType" : "VIDEO",
"locale": "en-US",
"minResultLimit": 1,
"maxResultLimit": 1
}
}
}
Response:
{
"event": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "5f0a0546-caad-416f-a617-80cf083a05cd",
"name": "GetDisplayableItemsResponse",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"payload": {
"nextToken": "fvkjbr20dvjbkwOpqStr",
"mediaItems": [
{
"mediaIdentifier": {
"id": "gti://provider1.dv.gti.b4a9f7c6-5def-7e63-9aa7-df38a479333e"
}
}
]
}
}
}
Request:
{
"directive": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "9f4803ec-4c94-4fdf-89c2-d502d5e52bb4",
"name": "GetDisplayableItems",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"endpoint": {
"scope": {
"type": "BearerToken",
"token": "access-token-from-skill"
},
"endpointId": "videoDevice-001",
"cookie": {
}
},
"payload": {
"entities": [
{
"type": "SORTTYPE",
"value": "RECOMMENDED"
}
],
"itemType" : "CATEGORY",
"locale": "en-US",
"minResultLimit": 5,
"maxResultLimit": 5
}
}
}
Response
{
"event": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "5f0a0546-caad-416f-a617-80cf083a05cd",
"name": "GetDisplayableItemsResponse",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"payload": {
"nextToken": "fvkjbr20dvjbkwOpqStr",
"mediaItems": [
{
"mediaIdentifier": {
"id": "entity://provider/category/myWatchList"
}
},
{
"mediaIdentifier": {
"id": "entity://provider/category/primeOriginals"
}
},
{
"mediaIdentifier": {
"id": "entity://provider/category/popularMovies"
}
},
{
"mediaIdentifier": {
"id": "entity://provider/category/newReleases"
}
},
{
"mediaIdentifier": {
"id": "entity://provider/category/liveTV"
}
}
]
}
}
}
GetDisplayableItemsMetadata
For GetDisplayableItemsMetadata directives used to populate your landing page, ASK has also added the itemType field, with the same enum values. The following examples show sample directives and responses.
Request:
{
"directive": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "0f918d6e-ebae-48f1-a237-13c6f5b9f5da",
"name": "GetDisplayableItemsMetadata",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"endpoint": {
"scope": {
"type": "BearerToken",
"token": "access-token-from-skill"
},
"endpointId": "videoDevice-001",
"cookie": {
}
},
"payload": {
"locale": "en-US",
"mediaIdentifiers": [
{
"id": "gti://provider1.dv.gti.b4a9f7c6-5def-7e63-9aa7-df38a479333e"
},
{
"id": "entity://provider/category/myWatchList"
},
{
"id": "entity://provider/category/primeOriginals"
},
{
"id": "entity://provider/category/popularMovies"
},
{
"id": "entity://provider/category/newReleases"
},
{
"id": "entity://provider/category/liveTV"
}
]
}
}
}
Response:
{
"event": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "38ce5b22-eeff-40b8-a84f-979446f9b27e",
"name": "GetDisplayableItemsMetadataResponse",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"payload": {
"resultsTitle": "Search Results",
"searchResults": [
{
"name": "Interstellar",
"contentType": "ON_DEMAND",
"itemType": "VIDEO",
"releaseYear": "2014",
"selectionAction": "PLAY",
"thumbnailImage": {
"contentDescription": "Interstellar Image",
"sources": [
{
"url": "http://ecx.images-amazon.com/images/I/81nSh3pZUDL.RI.jpg",
"size": "X_LARGE",
"widthPixels": 1920,
"heightPixels": 1280
}
]
},
"runtime": {
"runTimeInMilliseconds": 120931123,
"displayString": "2h 49m"
},
"closedCaption": {
"status": "AVAILABLE",
"displayString": "CC"
},
"absoluteViewingPositionMilliseconds": 0,
"parentalControl": {
"pinControl": "REQUIRED"
},
"viewingDisplayString": "Purchase Options",
"reviews": [
{
"totalReviewCount": 41951,
"type": "FIVE_STAR",
"ratingDisplayString": "4.06"
}
],
"rating": {
"category": "PG-13"
},
"mediaIdentifier": {
"id": "gti://provider1.dv.gti.b4a9f7c6-5def-7e63-9aa7-df38a479333e"
}
},
{
"name": "My Watchlist",
"contentType": "ON_DEMAND",
"itemType": "CATEGORY",
"selectionAction": "BROWSE",
"thumbnailImage": {
"contentDescription": "My Watchlist Image",
"sources": [
{
"url": "http://ecx.images-amazon.com/images/I/81nSh3pZUDL.RI.jpg",
"size": "X_SMALL",
"widthPixels": 480,
"heightPixels": 320
},
{
"url": "http://ecx.images-amazon.com/AJhF52zkD7ObETpyTTW.jpg",
"size": "SMALL",
"widthPixels": 720,
"heightPixels": 480
}
]
},
"mediaIdentifier": {
"id": "entity://provider/category/myWatchList"
}
}
]
}
}
}
GetNextPage
Request:
{
"directive": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "9f4803ec-4c94-4fdf-89c2-d502d5e52bb4",
"name": "GetNextPage",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"endpoint": {
"cookie": {
},
"endpointId": "<the identifier of the target endpoint>",
"scope": {
"token": "<an OAuth2 bearer token>",
"type": "BearerToken"
}
},
"payload": {
"nextToken": "fvkjbr20dvjbkwOpqStr",
"minResultLimit": 9,
"maxResultLimit": 25
}
}
}
Response:
{
"event": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "9f4803ec-4c94-4fdf-89c2-d502d5e52bb4",
"name": "GetNextPageResponse",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"endpoint": {
"scope": {
"type": "BearerToken",
"token": "Alexa-access-token"
},
"endpointId": "appliance-001"
},
"payload": {
"nextToken": "qefjrfiugef74",
"mediaItems": [
{
"mediaIdentifier": {
"id": "entity://provider/category/watchNext"
}
},
{
"mediaIdentifier": {
"id": "entity://provider/category/includedOnPrime"
}
},
{
"mediaIdentifier": {
"id": "entity://provider/category/popularMovies"
}
},
{
"mediaIdentifier": {
"id": "entity://provider/category/featuredTV"
}
},
{
"mediaIdentifier": {
"id": "entity://provider/category/dramaMovies"
}
},
{
"mediaIdentifier": {
"id": "entity://provider/category/liveTV"
}
},
{
"mediaIdentifier": {
"id": "entity://provider/category/primeOriginals"
}
},
{
"mediaIdentifier": {
"id": "entity://provider/category/popularTV"
}
},
{
"mediaIdentifier": {
"id": "entity://provider/category/recentlyAdded"
}
}
]
}
}
}
GetBrowseNodeItems
Request:
{
"directive": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "0f918d6e-ebae-48f1-a237-13c6f5b9f5da",
"name": "GetBrowseNodeItems",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"endpoint": {
"scope": {
"type": "BearerToken",
"token": "access-token-from-skill"
},
"endpointId": "videoDevice-001",
"cookie": {
}
},
"payload": {
"mediaIdentifier": {
"id": "entity://provider/category/bingeableTV"
}
}
}
}
Response:
{
"event": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "5f0a0546-caad-416f-a617-80cf083a05cd",
"name": "GetBrowseNodeItemsResponse",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"payload": {
"nextToken": "fvkjbr20dvjbkwOpqStr",
"mediaItems": [
{
"mediaIdentifier": {
"id": "gti://provider1.dv.gti.b4a9f7c6-5def-7e63-9aa7-df38a479333e"
}
},
{
"mediaIdentifier": {
"id": "gti://provider1.dv.gti.b4a9f7c6-5def-7e63-9aa7-df38a479333f"
}
}
]
}
}
}
GetDisplayableItemsMetadata
Request:
{
"directive": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "0f918d6e-ebae-48f1-a237-13c6f5b9f5da",
"name": "GetDisplayableItemsMetadata",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"endpoint": {
"scope": {
"type": "BearerToken",
"token": "access-token-from-skill"
},
"endpointId": "videoDevice-001",
"cookie": {
}
},
"payload": {
"locale": "en-US",
"mediaIdentifiers": [
{
"id": "gti://provider1.dv.gti.b4a9f7c6-5def-7e63-9aa7-df38a479333e"
},
{
"id": "gti://provider1.dv.gti.b4a9f7c6-5def-7e63-9aa7-df38a479333f"
}
]
}
}
}
Response:
{
"event": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "38ce5b22-eeff-40b8-a84f-979446f9b27e",
"name": "GetDisplayableItemsMetadataResponse",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"payload": {
"resultsTitle": "Search Results",
"searchResults": [
{
"name": "The Big Bang Theory",
"contentType": "ON_DEMAND",
"itemType": "VIDEO",
"releaseYear": "2014",
"selectionAction": "BROWSE",
"thumbnailImage": {
"contentDescription": "The Big Bang Theory Image",
"sources": [
{
"url": "http://ecx.images-amazon.com/images/I/81nSh3pZUDL.RI.jpg",
"size": "X_SMALL",
"widthPixels": 480,
"heightPixels": 320
},
{
"url": "http://ecx.images-amazon.com/AJhF52zkD7ObETpyTTW.jpg",
"size": "SMALL",
"widthPixels": 720,
"heightPixels": 480
}
]
},
"runtime": {
"runTimeInMilliseconds": 120931123,
"displayString": "2h 49m"
},
"closedCaption": {
"status": "AVAILABLE",
"displayString": "CC"
},
"series": {
"seasonNumber": "1",
"episodeNumber": "1",
"seriesName": "The Big Bang Theory",
"episodeName": "Pilot"
},
"absoluteViewingPositionMilliseconds": 0,
"parentalControl": {
"pinControl": "REQUIRED"
},
"viewingDisplayString": "Purchase Options",
"reviews": [
{
"totalReviewCount": 41951,
"type": "FIVE_STAR",
"ratingDisplayString": "4.06"
}
],
"rating": {
"category": "PG-13"
},
"mediaIdentifier": {
"id": "gti://provider1.dv.gti.b4a9f7c6-5def-7e63-9aa7-df38a479333e"
}
},
{
"name": "The Big Bang Theory",
"contentType": "LIVE",
"itemType": "VIDEO",
"releaseYear": "2011",
"selectionAction": "PLAY",
"thumbnailImage": {
"contentDescription": "The Big Bang Theory Image ",
"sources": [
{
"url": "http://ecx.images-amazon.com/images/I/81nSh3pZUDL.RI.jpg",
"size": "X_SMALL",
"widthPixels": 480,
"heightPixels": 320
},
{
"url": "http://ecx.images-amazon.com/AJhF52zkD7ObETpyTTW.jpg",
"size": "SMALL",
"widthPixels": 720,
"heightPixels": 480
}
]
},
"runtime": {
"runTimeInMilliseconds": 120931123,
"displayString": "30 min"
},
"closedCaption": {
"status": "AVAILABLE",
"displayString": "CC"
},
"series": {
"seasonNumber": "1",
"episodeNumber": "1",
"seriesName": "The Big Bang Theory",
"episodeName": "Pilot"
},
"absoluteViewingPositionMilliseconds": 0,
"parentalControl": {
"pinControl": "REQUIRED"
},
"viewingDisplayString": "Play Now",
"rating": {
"category": "TV-PG"
},
"networkDetails": [
{
"channel": {
"number": "1234",
"callSign": "PBS",
"affiliateCallSign": "KCTS9",
"uri": "someUrl"
},
"channelMetadata": {
"name": "Alternate Channel Name",
"image": "http://ecx.images-amazon.com/images/I/81nSh3pZUDL.RI.jpg"
},
"airingDetails": [
{
"isLiveBroadcast": "true"
"end": "2018-01-24T02:30:00Z",
"start": "2018-01-24T00:00:00Z"
},
]
}
],
"mediaIdentifier": {
"id": "gti://provider1.dv.gti.b4a9f7c6-5def-7e63-9aa7-df38a479333f"
}
}
]
}
}
}
BADGING
It is often useful to have badges, or contextual images, on search result tiles or over video playback to provide useful information to the user. This section covers the types of badges available, as well as their intended purpose.
Badges
The following table shows the types of display badges you can implement.
| Badge type | Description |
|---|---|
| Recording | This badge is displayed when the user is actively recording the content. This badge takes precedence over all other badges. |
| Live | This badge is displayed when the content is currently airing in real time (i.e. shows such as the Oscars, Emmys, and sports games). |
| On Now | This badge is displayed when the content is airing on a channel at a given time, and is not considered Live. |
Network Logo
In addition to badges, you should also show the Network logo or the Network call sign, which indicates where this piece of content is airing. For example, let’s say you say "Show me comedy TV shows on provider." In such cases, provider can show content from multiple networks, such as ABC, HBO, CBS, etc. When you return such results on an Echo Show device, you should also show a network logo on the bottom of the box art to indicate the origin of the content. If the network logo is not available, you should show the network call sign, such as ABC, HBO, etc.
Content Freshness
You should also indicate whether the content is "new" with the search results metadata. This information comes from content providers and is displayed to indicate that this content is airing for the first time. For example, if you search for episodes of "The Big Bang Theory," and episodes 1-5 were aired already and now episode 6 is available to view, content providers should let you know so that you can display "NEW" along with other metadata for that episode.
You can specify badging in your skill through the GetDisplayableItemsMetadata and GetPlayableItemsMetadata APIs.
Badging APIs
To support badging, you should use the following structures within the GetDisplayableItemsMetadata response payload:
-
"recording" - used to indicate if content is currently being recorded.
-
"contentFreshness" - used to indicate whether the content is new.
-
"networkDetails" - used to specify channel metadata.
-
"airingDetails" – used to specify start and end times as well as whether content is airing live.
GetDisplayableItemsMetadata
Sample response:
{
"payload": {
"searchResults": [
{
"name": "Interstellar",
"contentType": "LIVE",
"releaseYear": "2011",
"selectionAction": "PLAY",
"thumbnailImage": {
"contentDescription": "InterstellarImage",
"sources": [
{
"url": "http: //ecx.images-amazon.com/images/I/81nSh3pZUDL.RI.jpg",
"size": "X_SMALL",
"widthPixels": 480,
"heightPixels": 320
}
]
},
"runtime": {
"runTimeInMilliseconds": 120931123,
"displayString": "2h30min"
},
"closedCaption": {
"status": "AVAILABLE",
"displayString": "CC"
},
"absoluteViewingPositionMilliseconds": 0,
"parentalControl": {
"pinControl": "REQUIRED"
},
"viewingDisplayString": "PlayNow",
"rating": {
"category": "PG-13"
},
"recording": {
"status": "RECORDING"
},
"contentFreshness": {
"state": "NEW"
},
"networkDetails": [
{
"channel": {
"number": "1234",
"callSign": "PBS",
"affiliateCallSign": "KCTS9",
"uri": "someUrl"
},
"channelMetadata": {
"name": "AlternateChannelName",
"image": "http: //ecx.images-amazon.com/images/I/81nSh3pZUDL.RI.jpg"
},
"airingDetails": [
{
"isLiveBroadcast": "true",
"end": "2018-01-24T02: 30: 00Z",
"start": "2018-01-24T00: 00: 00Z"
}
]
}
]
}
]
}
}
| Field | Description | Required | Type | Values |
|---|---|---|---|---|
| recording | Information related to recording. The current structure only has a single field for 'status'. The reason for making this a structure and not a standalone field is because ASK may want to add some more information to the recording structure in the future. Having it available as an object allows ASK to group these items and make it extensible for the future requirements. | No | Object | |
| recording.status | Recording status for the content. The following enum values are allowed: RECORDED - This means that the content was previously recorded. RECORDING - This means that the content is being actively recorded at the time of the request. SCHEDULED - This means that the content is scheduled to be recorded at a future time. |
No | String | RECORDED RECORDING SCHEDULED |
| contentFreshness | Details about content freshness. This object also has a single field for 'state.' Similar to the previous field, ASK can extend this and add more states in the future in addition to the one added as part of this review. In the future, this object may be expanded to add more details related to contentFreshness. |
No | Object | |
| contentFreshness.state | Whether this content is new for the provider that Alexa is fetching results from. The following enum values are allowed: NEW - This means that the content is new and/airing for the first time on the provider. |
No | String | NEW |
| networkDetails | Network details gives information about the network the program is airing from. For example, a new episode of "The Big Bang Theory" airing from CBS, or a live soccer game airing from ESPN. For On Demand content, this could Prime Video displaying Game of thrones results from HBO for example. |
No | List | |
| airingDetails.isLiveBroadcast | Whether this content is airing in real time. This must be set to true for live events like Watching an NFL football game, or award shows like Oscars or Emmys, etc that are happening in real time. This must be set to false for content that was filmed prior to the original airing time. For example, a new episode of Big bang theory that airs every Thursday. This must also be set to false for content that was once streamed in real time, like a football game in the past, but is no longer happening in real time. |
No | boolean | true, false |
GetPlayableItemsMetadata
The same networkDetails structure used in GetDisplayableItemsMetadata is also used for GetPlayableItemsMetadata.
Sample response:
{
"event": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "38ce5b22-eeff-40b8-a84f-979446f9b27e",
"name": "GetPlayableItemsMetadataResponse",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"payload": {
"searchResults": [
{
"name": "Interstellar",
"contentType": "LIVE",
"playbackContextToken": "amzn1.dv.gti.b4a9f7c6-5def-7e63-9aa7-df38a479333e",
"parentalControl": {
"pinControl": "REQUIRED"
},
"networkDetails": [
{
"channel": {
"callSign": "PBS",
"affiliateCallSign": "KCTS9"
},
"channelMetadata": {
"name": "AlternateChannelName"
},
"airingDetails": [
{
"isLiveBroadcast": "true",
"end": "2018-01-24T02: 30: 00Z",
"start": "2018-01-24T00: 00: 00Z"
}
]
}
]
}
]
}
}
}