Deep Linking

    Deep Linking


    Article summary

    Deep linking is how the X1 Platform can inform your App of a user's intention to view a specific, indexed piece of content beyond just your home screen.

    In Firebolt®, a deep link is expressed as a NavigationIntent object, which has all of the details your App needs to identify and navigate to the appropriate content. Navigation Intents are passed to your App via the navigateTo event, which allows your App to receive deep links without the X1 Platform forcing it to reload. This creates a much faster and seamless experience.

    Integrating with Navigation Intents is required in order to fully support Content Discovery.

    Why use Navigation Intents

    Navigation Intents are designed to inform your App of the user's intent to navigate somewhere in your App. There are several reasons why the X1 Platform would need to pass this information to your App:

    • The user launches your App via a voice command with a specific program

    • The user initiates a search for content w/ in your App, e.g. "Show me comedies in 'Example App'"

    • The user selects an editorially promoted tile for your content in an aggregated experience

    • The user selects a tile for your content in an aggregated search

    • The user selects an advertisement for your content from somewhere outside of your App

    Navigation Intents also enable us to notify you of any platform-initiated user navigation requests such as voice searches for specific pages, content, genres, or content within your App.

    Simply put, Navigation Intents connect the user's intentions on the X1 Platform to your App's desired destination.

    How to use Navigation Intents

    In order to respond to Navigation Intents, your App must listen to the Discovery module's navigateTo event. This allows the X1 Platform to pre-load your App before the user requests it, and then let you know the user's requested content much more quickly when they do.

    You can listen for Navigation Intents with the Discovery.listen API, for example:

    Discovery.listen('navigateTo', (intent) => {
        // use intent.action to determine what kind of intent this is
        console.log(intent.action)
    
        // use intent.data, if present, to get more context, e.g. intent.data.entityId if applicable
        console.dir(intent.data)
    })
    

    See also:

    Types of Navigation Intents

    The following sections describe each specific type of Navigation Intent.

    Home Intent

    The Home Intent tells your App to simply return to the home page. This may be sent because the user did something in the aggregated experience that would make them reasonably expect your app to be reset.

    For example:

    • User launches your App

    • User exits via the home key

    • User turns off their device, putting it in sleep mode

    • User turns on their device later and relaunches your App

    If your App was still in the inactive state (See Lifecycle Management) then the X1 Platform might reset it to the home page in order to create the experience of the TV having been restarted.

    An example Home Intent object:

    {
        "action": "home",
        "context": {
            "source": "voice"
        }
    }
    

    Entity Intent

    The Entity Intent tells your App that the user intends to see full details of a program or entity in your App.

    This should be used to bring up the details view for an entity, and not go directly to a playback experience (see Playback Intent below).

    This is the most common type of Navigation Intent, as it's all about your Apps content. The reasons for sending this intent are simple: The user has made it clear they intend to view a specific program or entity in your App.

    The X1 Platform may derive this intention from a voice command the user issues, or infer the intention from the user selecting a tile representing content in your App. Either way, the X1 Platform will hand the intent off to your App in the form of an Entity Intent, for example:

    {
        "action": "entity",
        "data": {
            "entityId": "xyz"
        },
        "context": {
            "source": "voice"
        }
    }
    

    The entityId field inside the data object will be an entity identifier from *your catalog identifiers. These were provided to us via one of the integration paths described in Content Discovery, which is a prerequisite for functional deep links that contain Entity Intents.

    The entityId field is required on all Entity Intents. Other optional fields include:

    Field

    Type

    Description

    programType

    String

    What type of program, e.g. "Movie", "SeriesMaster", "Episode", "MusicVideo", etc.

    seriesId

    String

    Identifier of the TV Series for this entity, if applicable.

    seasonId

    String

    Identifier of the TV Series season of this entity, if applicable.

    assetId

    String

    An additional disambiguation identifier if your app requires one.

    appContentData

    String

    Any additional parameters your app's metadata may have provided

    Playback Intent

    The Playback Intent tells your App that the user intends to start playback of a program or entity in your App.

    This should be used to immediately bring up your App's player with the entity's (or the best playable child entity's) stream beginning to load.

    This is used in situations where the user would reasonable expect playback, rather than details. The most common example of this is if the user selected content from your App via a "Play Now" tile inside of an aggregated experience.

    {
        "action": "playback",
        "data": {
            "entityId": "xyz"
        },
        "context": {
            "source": "voice"
        }
    }
    

    The fields available inside the Playback Intent are the same as for the Entity Intent.

    Search Intent

    The Search Intent tells your App that the user intends to see search results for some term or phrase in your App.

    This should be used to bring up your App's search experience.

    The reasons for sending this intent are simple: The user asked to see content from a genre or related to search term in your App, e.g. "Show me comedies in 'Example App,'" for example:

    {
        "action": "search",
        "data": {
            "query": "comedies"
        },
        "context": {
            "source": "voice"
        }
    }
    

    Note that the platform extracts the query from the voice command, and only sends the query. This is to ensure consistent results regardless of whether the intent came from voice, or somewhere else, e.g. an editorial deep link to your App.

    The query field inside the data object is required and will always be there.

    Section Intent

    The Section Intent tells your App that the user intends to see some other section of your site, not represented by your content catalog, e.g. a Settings page or an Upgrade page.

    This should be used to bring up the page specified by the Section Intent.

    This intent would be sent based on an agreement between you and each Distributor Partner. For example you might have agreed to place a free signup tile on an aggregated experience, and the distributor would use this intent to deep link to the sign up with the appropriate business rules.

    {
        "action": "section",
        "data": {
            "sectionName": "free-signup-for-example-distributor"
        },
        "context": {
            "source": "voice"
        }
    }
    

    The sectionName field inside the data object is required and will always be there. The value of this field is based on values supplied during Metadata Integration.


    Was this article helpful?

    What's Next