--- title: "Metrics" slug: "170-core-metrics" updated: 2026-01-05T19:57:35Z published: 2026-01-05T19:57:35Z canonical: "docs.developer.comcast.com/170-core-metrics" --- > ## Documentation Index > Fetch the complete documentation index at: https://docs.developer.comcast.com/llms.txt > Use this file to discover all available pages before exploring further. # Metrics **Metrics Module 1.7.0 | Core SDK** ## Usage To use the Metrics module, you can import it into your project from the Firebolt SDK: ``` import { Metrics } from '@firebolt-js/sdk' ``` ## Overview Methods for sending metrics ## Methods ### action Inform the platform of something not covered by other Metrics APIs. ``` function action( category: string, type: string, parameters: FlatMap, agePolicy: AgePolicy, ): Promise ``` Parameters: | Param | Type | Required | Description | | --- | --- | --- | --- | | `category` | `string` | true | The category of action being logged. Must be 'r' for user-initated actions or 'app' for all other actions values: `'user' \| 'app'` | | cell | cell | cell | cell | | `type` | `string` | true | A short, indexible identifier for the action, e.g. 'SignIn Prompt Displayed' maxLength: 256 | | `parameters` | [`FlatMap`](/docs/170-core-Types-schemas#FlatMap) | false | | | `agePolicy` | [`AgePolicy`](/docs/170-core-Policies-schemas#AgePolicy) | false | The age policy to associate with the metrics event. The age policy describes the age group to which content is directed. | Promise resolution: Capabilities: | Role | Capability | | --- | --- | | uses | xrn:firebolt:capability:metrics:general | #### Examples Send foo action JavaScript: ``` import { Metrics } from '@firebolt-js/sdk' let success = await Metrics.action('user', 'The user did foo', undefined) console.log(success) ``` Value of `success`: ``` true ``` **JSON-RPC:** Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "Metrics.action", "params": { "category": "user", "type": "The user did foo" } } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": true } ``` --- ### appInfo Inform the platform about an app's build info. ``` function appInfo(build: string): Promise ``` Parameters: | Param | Type | Required | Description | | --- | --- | --- | --- | | `build` | `string` | true | The build / version of this app. | Promise resolution: Capabilities: | Role | Capability | | --- | --- | | uses | xrn:firebolt:capability:metrics:general | #### Examples Send appInfo metric JavaScript: ``` import { Metrics } from '@firebolt-js/sdk' let result = await Metrics.appInfo('1.2.2') console.log(result) ``` Value of `result`: ``` null ``` **JSON-RPC:** Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "Metrics.appInfo", "params": { "build": "1.2.2" } } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": null } ``` --- ### error Inform the platform of an error that has occured in your app. ``` function error( type: ErrorType, code: string, description: string, visible: boolean, parameters: FlatMap, agePolicy: AgePolicy, ): Promise ``` Parameters: | Param | Type | Required | Description | | --- | --- | --- | --- | | `type` | [`ErrorType`](/docs/170-core-metrics#errortype) | true | The type of error values: `'network' \| 'media' \| 'restriction' \| 'entitlement' \| 'other'` | | `code` | `string` | true | an app-specific error code | | `description` | `string` | true | A short description of the error | | `visible` | `boolean` | true | Whether or not this error was visible to the user. | | `parameters` | [`FlatMap`](/docs/170-core-Types-schemas#FlatMap) | false | Optional additional parameters to be logged with the error | | `agePolicy` | [`AgePolicy`](/docs/170-core-Policies-schemas#AgePolicy) | false | The age policy to associate with the metrics event. The age policy describes the age group to which content is directed. | Promise resolution: Capabilities: | Role | Capability | | --- | --- | | uses | xrn:firebolt:capability:metrics:general | #### Examples Send error metric JavaScript: ``` import { Metrics } from '@firebolt-js/sdk' let success = await Metrics.error( 'media', 'MEDIA-STALLED', 'playback stalled', true, undefined, ) console.log(success) ``` Value of `success`: ``` true ``` **JSON-RPC:** Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "Metrics.error", "params": { "type": "media", "code": "MEDIA-STALLED", "description": "playback stalled", "visible": true } } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": true } ``` --- ### mediaEnded Called when playback has stopped because the end of the media was reached. ``` function mediaEnded(entityId: string, agePolicy: AgePolicy): Promise ``` Parameters: | Param | Type | Required | Description | | --- | --- | --- | --- | | `entityId` | `string` | true | The entityId of the media. | | `agePolicy` | [`AgePolicy`](/docs/170-core-Policies-schemas#AgePolicy) | false | The age policy to associate with the metrics event. The age policy describes the age group to which content is directed. | Promise resolution: Capabilities: | Role | Capability | | --- | --- | | uses | xrn:firebolt:capability:metrics:media | #### Examples Send ended metric. JavaScript: ``` import { Metrics } from '@firebolt-js/sdk' let success = await Metrics.mediaEnded('345') console.log(success) ``` Value of `success`: ``` true ``` **JSON-RPC:** Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "Metrics.mediaEnded", "params": { "entityId": "345" } } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": true } ``` --- ### mediaLoadStart Called when setting the URL of a media asset to play, in order to infer load time. ``` function mediaLoadStart( entityId: string, agePolicy: AgePolicy, ): Promise ``` Parameters: | Param | Type | Required | Description | | --- | --- | --- | --- | | `entityId` | `string` | true | The entityId of the media. | | `agePolicy` | [`AgePolicy`](/docs/170-core-Policies-schemas#AgePolicy) | false | The age policy to associate with the metrics event. The age policy describes the age group to which content is directed. | Promise resolution: Capabilities: | Role | Capability | | --- | --- | | uses | xrn:firebolt:capability:metrics:media | #### Examples Send loadstart metric. JavaScript: ``` import { Metrics } from '@firebolt-js/sdk' let success = await Metrics.mediaLoadStart('345') console.log(success) ``` Value of `success`: ``` true ``` **JSON-RPC:** Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "Metrics.mediaLoadStart", "params": { "entityId": "345" } } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": true } ``` --- ### mediaPause Called when media playback will pause due to an intentional pause operation. ``` function mediaPause(entityId: string, agePolicy: AgePolicy): Promise ``` Parameters: | Param | Type | Required | Description | | --- | --- | --- | --- | | `entityId` | `string` | true | The entityId of the media. | | `agePolicy` | [`AgePolicy`](/docs/170-core-Policies-schemas#AgePolicy) | false | The age policy to associate with the metrics event. The age policy describes the age group to which content is directed. | Promise resolution: Capabilities: | Role | Capability | | --- | --- | | uses | xrn:firebolt:capability:metrics:media | #### Examples Send pause metric. JavaScript: ``` import { Metrics } from '@firebolt-js/sdk' let success = await Metrics.mediaPause('345') console.log(success) ``` Value of `success`: ``` true ``` **JSON-RPC:** Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "Metrics.mediaPause", "params": { "entityId": "345" } } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": true } ``` --- ### mediaPlay Called when media playback should start due to autoplay, user-initiated play, or unpausing. ``` function mediaPlay(entityId: string, agePolicy: AgePolicy): Promise ``` Parameters: | Param | Type | Required | Description | | --- | --- | --- | --- | | `entityId` | `string` | true | The entityId of the media. | | `agePolicy` | [`AgePolicy`](/docs/170-core-Policies-schemas#AgePolicy) | false | The age policy to associate with the metrics event. The age policy describes the age group to which content is directed. | Promise resolution: Capabilities: | Role | Capability | | --- | --- | | uses | xrn:firebolt:capability:metrics:media | #### Examples Send play metric. JavaScript: ``` import { Metrics } from '@firebolt-js/sdk' let success = await Metrics.mediaPlay('345') console.log(success) ``` Value of `success`: ``` true ``` **JSON-RPC:** Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "Metrics.mediaPlay", "params": { "entityId": "345" } } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": true } ``` --- ### mediaPlaying Called when media playback actually starts due to autoplay, user-initiated play, unpausing, or recovering from a buffering interuption. ``` function mediaPlaying(entityId: string, agePolicy: AgePolicy): Promise ``` Parameters: | Param | Type | Required | Description | | --- | --- | --- | --- | | `entityId` | `string` | true | The entityId of the media. | | `agePolicy` | [`AgePolicy`](/docs/170-core-Policies-schemas#AgePolicy) | false | The age policy to associate with the metrics event. The age policy describes the age group to which content is directed. | Promise resolution: Capabilities: | Role | Capability | | --- | --- | | uses | xrn:firebolt:capability:metrics:media | #### Examples Send playing metric. JavaScript: ``` import { Metrics } from '@firebolt-js/sdk' let success = await Metrics.mediaPlaying('345') console.log(success) ``` Value of `success`: ``` true ``` **JSON-RPC:** Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "Metrics.mediaPlaying", "params": { "entityId": "345" } } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": true } ``` --- ### mediaProgress Called every 60 seconds as media playback progresses. ``` function mediaProgress( entityId: string, progress: MediaPosition, agePolicy: AgePolicy, ): Promise ``` Parameters: | Param | Type | Required | Description | | --- | --- | --- | --- | | `entityId` | `string` | true | The entityId of the media. | | `progress` | [`MediaPosition`](/docs/170-core-metrics#mediaposition) | true | Progress of playback, as a decimal percentage (0-0.999) for content with a known duration, or an integer number of seconds (0-86400) for content with an unknown duration. | | `agePolicy` | [`AgePolicy`](/docs/170-core-Policies-schemas#AgePolicy) | false | The age policy to associate with the metrics event. The age policy describes the age group to which content is directed. | Promise resolution: Capabilities: | Role | Capability | | --- | --- | | uses | xrn:firebolt:capability:metrics:media | #### Examples Send progress metric. JavaScript: ``` import { Metrics } from '@firebolt-js/sdk' let success = await Metrics.mediaProgress('345', 0.75) console.log(success) ``` Value of `success`: ``` true ``` **JSON-RPC:** Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "Metrics.mediaProgress", "params": { "entityId": "345", "progress": 0.75 } } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": true } ``` --- ### mediaRateChange Called when the playback rate of media is changed. ``` function mediaRateChange( entityId: string, rate: number, agePolicy: AgePolicy, ): Promise ``` Parameters: | Param | Type | Required | Description | | --- | --- | --- | --- | | `entityId` | `string` | true | The entityId of the media. | | `rate` | `number` | true | The new playback rate. | | `agePolicy` | [`AgePolicy`](/docs/170-core-Policies-schemas#AgePolicy) | false | The age policy to associate with the metrics event. The age policy describes the age group to which content is directed. | Promise resolution: Capabilities: | Role | Capability | | --- | --- | | uses | xrn:firebolt:capability:metrics:media | #### Examples Send ratechange metric. JavaScript: ``` import { Metrics } from '@firebolt-js/sdk' let success = await Metrics.mediaRateChange('345', 2) console.log(success) ``` Value of `success`: ``` true ``` **JSON-RPC:** Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "Metrics.mediaRateChange", "params": { "entityId": "345", "rate": 2 } } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": true } ``` --- ### mediaRenditionChange Called when the playback rendition (e.g. bitrate, dimensions, profile, etc) is changed. ``` function mediaRenditionChange( entityId: string, bitrate: number, width: number, height: number, profile: string, agePolicy: AgePolicy, ): Promise ``` Parameters: | Param | Type | Required | Description | | --- | --- | --- | --- | | `entityId` | `string` | true | The entityId of the media. | | `bitrate` | `number` | true | The new bitrate in kbps. | | `width` | `number` | true | The new resolution width. | | `height` | `number` | true | The new resolution height. | | `profile` | `string` | false | A description of the new profile, e.g. 'HDR' etc. | | `agePolicy` | [`AgePolicy`](/docs/170-core-Policies-schemas#AgePolicy) | false | The age policy to associate with the metrics event. The age policy describes the age group to which content is directed. | Promise resolution: Capabilities: | Role | Capability | | --- | --- | | uses | xrn:firebolt:capability:metrics:media | #### Examples Send renditionchange metric. JavaScript: ``` import { Metrics } from '@firebolt-js/sdk' let success = await Metrics.mediaRenditionChange( '345', 5000, 1920, 1080, 'HDR+', ) console.log(success) ``` Value of `success`: ``` true ``` **JSON-RPC:** Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "Metrics.mediaRenditionChange", "params": { "entityId": "345", "bitrate": 5000, "width": 1920, "height": 1080, "profile": "HDR+" } } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": true } ``` --- ### mediaSeeked Called when a seek is completed during media playback. ``` function mediaSeeked( entityId: string, position: MediaPosition, agePolicy: AgePolicy, ): Promise ``` Parameters: | Param | Type | Required | Description | | --- | --- | --- | --- | | `entityId` | `string` | true | The entityId of the media. | | `position` | [`MediaPosition`](/docs/170-core-metrics#mediaposition) | true | Resulting position of the seek operation, as a decimal percentage (0-0.999) for content with a known duration, or an integer number of seconds (0-86400) for content with an unknown duration. | | `agePolicy` | [`AgePolicy`](/docs/170-core-Policies-schemas#AgePolicy) | false | The age policy to associate with the metrics event. The age policy describes the age group to which content is directed. | Promise resolution: Capabilities: | Role | Capability | | --- | --- | | uses | xrn:firebolt:capability:metrics:media | #### Examples Send seeked metric. JavaScript: ``` import { Metrics } from '@firebolt-js/sdk' let success = await Metrics.mediaSeeked('345', 0.51) console.log(success) ``` Value of `success`: ``` true ``` **JSON-RPC:** Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "Metrics.mediaSeeked", "params": { "entityId": "345", "position": 0.51 } } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": true } ``` --- ### mediaSeeking Called when a seek is initiated during media playback. ``` function mediaSeeking( entityId: string, target: MediaPosition, agePolicy: AgePolicy, ): Promise ``` Parameters: | Param | Type | Required | Description | | --- | --- | --- | --- | | `entityId` | `string` | true | The entityId of the media. | | `target` | [`MediaPosition`](/docs/170-core-metrics#mediaposition) | true | Target destination of the seek, as a decimal percentage (0-0.999) for content with a known duration, or an integer number of seconds (0-86400) for content with an unknown duration. | | `agePolicy` | [`AgePolicy`](/docs/170-core-Policies-schemas#AgePolicy) | false | The age policy to associate with the metrics event. The age policy describes the age group to which content is directed. | Promise resolution: Capabilities: | Role | Capability | | --- | --- | | uses | xrn:firebolt:capability:metrics:media | #### Examples Send seeking metric. JavaScript: ``` import { Metrics } from '@firebolt-js/sdk' let success = await Metrics.mediaSeeking('345', 0.5) console.log(success) ``` Value of `success`: ``` true ``` **JSON-RPC:** Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "Metrics.mediaSeeking", "params": { "entityId": "345", "target": 0.5 } } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": true } ``` --- ### mediaWaiting Called when media playback will halt due to a network, buffer, or other unintentional constraint. ``` function mediaWaiting(entityId: string, agePolicy: AgePolicy): Promise ``` Parameters: | Param | Type | Required | Description | | --- | --- | --- | --- | | `entityId` | `string` | true | The entityId of the media. | | `agePolicy` | [`AgePolicy`](/docs/170-core-Policies-schemas#AgePolicy) | false | The age policy to associate with the metrics event. The age policy describes the age group to which content is directed. | Promise resolution: Capabilities: | Role | Capability | | --- | --- | | uses | xrn:firebolt:capability:metrics:media | #### Examples Send waiting metric. JavaScript: ``` import { Metrics } from '@firebolt-js/sdk' let success = await Metrics.mediaWaiting('345') console.log(success) ``` Value of `success`: ``` true ``` **JSON-RPC:** Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "Metrics.mediaWaiting", "params": { "entityId": "345" } } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": true } ``` --- ### page Inform the platform that your user has navigated to a page or view. ``` function page(pageId: string, agePolicy: AgePolicy): Promise ``` Parameters: | Param | Type | Required | Description | | --- | --- | --- | --- | | `pageId` | `string` | true | Page ID of the content. | | `agePolicy` | [`AgePolicy`](/docs/170-core-Policies-schemas#AgePolicy) | false | The age policy to associate with the metrics event. The age policy describes the age group to which content is directed. | Promise resolution: Capabilities: | Role | Capability | | --- | --- | | uses | xrn:firebolt:capability:metrics:general | #### Examples Send page metric JavaScript: ``` import { Metrics } from '@firebolt-js/sdk' let success = await Metrics.page('xyz') console.log(success) ``` Value of `success`: ``` true ``` **JSON-RPC:** Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "Metrics.page", "params": { "pageId": "xyz" } } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": true } ``` Send startContent metric w/ entity JavaScript: ``` import { Metrics } from '@firebolt-js/sdk' let success = await Metrics.page('home') console.log(success) ``` Value of `success`: ``` true ``` **JSON-RPC:** Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "Metrics.page", "params": { "pageId": "home" } } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": true } ``` --- ### startContent Inform the platform that your user has started content. ``` function startContent(entityId: string, agePolicy: AgePolicy): Promise ``` Parameters: | Param | Type | Required | Description | | --- | --- | --- | --- | | `entityId` | `string` | false | Optional entity ID of the content. | | `agePolicy` | [`AgePolicy`](/docs/170-core-Policies-schemas#AgePolicy) | false | The age policy to associate with the metrics event. The age policy describes the age group to which content is directed. | Promise resolution: Capabilities: | Role | Capability | | --- | --- | | uses | xrn:firebolt:capability:metrics:general | #### Examples Send startContent metric JavaScript: ``` import { Metrics } from '@firebolt-js/sdk' let success = await Metrics.startContent(undefined) console.log(success) ``` Value of `success`: ``` true ``` **JSON-RPC:** Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "Metrics.startContent", "params": {} } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": true } ``` Send startContent metric w/ entity JavaScript: ``` import { Metrics } from '@firebolt-js/sdk' let success = await Metrics.startContent('abc') console.log(success) ``` Value of `success`: ``` true ``` **JSON-RPC:** Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "Metrics.startContent", "params": { "entityId": "abc" } } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": true } ``` Send startContent metric and notify the platform that the content is child-directed JavaScript: ``` import { Metrics } from '@firebolt-js/sdk' let success = await Metrics.startContent('abc', 'app:child') console.log(success) ``` Value of `success`: ``` true ``` **JSON-RPC:** Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "Metrics.startContent", "params": { "entityId": "abc", "agePolicy": "app:child" } } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": true } ``` --- ### stopContent Inform the platform that your user has stopped content. ``` function stopContent(entityId: string, agePolicy: AgePolicy): Promise ``` Parameters: | Param | Type | Required | Description | | --- | --- | --- | --- | | `entityId` | `string` | false | Optional entity ID of the content. | | `agePolicy` | [`AgePolicy`](/docs/170-core-Policies-schemas#AgePolicy) | false | The age policy to associate with the metrics event. The age policy describes the age group to which content is directed. | Promise resolution: Capabilities: | Role | Capability | | --- | --- | | uses | xrn:firebolt:capability:metrics:general | #### Examples Send stopContent metric JavaScript: ``` import { Metrics } from '@firebolt-js/sdk' let success = await Metrics.stopContent(undefined) console.log(success) ``` Value of `success`: ``` true ``` **JSON-RPC:** Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "Metrics.stopContent", "params": {} } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": true } ``` Send stopContent metric w/ entity JavaScript: ``` import { Metrics } from '@firebolt-js/sdk' let success = await Metrics.stopContent('abc') console.log(success) ``` Value of `success`: ``` true ``` **JSON-RPC:** Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "Metrics.stopContent", "params": { "entityId": "abc" } } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": true } ``` --- ## Private Methods **View** ### ready *This is a private RPC method.* Inform the platform that your app is minimally usable. This method is called automatically by `Lifecycle.ready()` Result: Capabilities: | Role | Capability | | --- | --- | | uses | xrn:firebolt:capability:metrics:general | #### Examples Send ready metric JSON-RPC: Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "Metrics.ready", "params": {} } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": true } ``` --- ### signIn *This is a private RPC method.* Log a sign in event, called by Discovery.signIn(). Result: Capabilities: | Role | Capability | | --- | --- | | uses | xrn:firebolt:capability:metrics:general | #### Examples Send signIn metric JSON-RPC: Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "Metrics.signIn", "params": {} } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": true } ``` Send signIn metric with entitlements JSON-RPC: Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "Metrics.signIn", "params": { "entitlements": [ { "entitlementId": "123", "startTime": "2025-01-01T00:00:00.000Z", "endTime": "2025-01-01T00:00:00.000Z" } ] } } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": true } ``` --- ### signOut *This is a private RPC method.* Log a sign out event, called by Discovery.signOut(). Result: Capabilities: | Role | Capability | | --- | --- | | uses | xrn:firebolt:capability:metrics:general | #### Examples Send signOut metric JSON-RPC: Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "Metrics.signOut", "params": {} } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": true } ``` --- ## Types ### ErrorType ``` ErrorType: { NETWORK: 'network', MEDIA: 'media', RESTRICTION: 'restriction', ENTITLEMENT: 'entitlement', OTHER: 'other', }, ``` --- ### MediaPosition Represents a position inside playback content, as a decimal percentage (0-0.999) for content with a known duration, or an integer number of seconds (0-86400) for content with an unknown duration. ``` type MediaPosition = void | number | number ``` ---