<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://nielsentest.mywikis.net/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=AmySockanathan</id>
	<title>Engineering Client Portal - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://nielsentest.mywikis.net/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=AmySockanathan"/>
	<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/wiki/Special:Contributions/AmySockanathan"/>
	<updated>2026-04-11T11:33:15Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.5</generator>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=TVOS_SDK_Release_Notes&amp;diff=7011</id>
		<title>TVOS SDK Release Notes</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=TVOS_SDK_Release_Notes&amp;diff=7011"/>
		<updated>2026-03-24T14:14:32Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: Update TVOS page with all release notes.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
 __NOTOC__ &lt;br /&gt;
== Release 10.2.0.0 (03-24-2026) ==&lt;br /&gt;
&lt;br /&gt;
* iOS Digital Signature Certificate Renewal&lt;br /&gt;
* Fixes for Viewabiity defects&lt;br /&gt;
* Ad length warning - Fixed the ad tracking logic so now, the 300-second warning will only fire if the current ad actually plays for more than 5 minutes, and that error state will no longer bleed over into the next ad.&lt;br /&gt;
* SDK Code Signature fix (Global Flavor only) - The Global direct binary available on the Engineering Portal now correctly includes the SDK code signature for manual integrations.&lt;br /&gt;
&lt;br /&gt;
== Release 10.1.0.0 (10-17-2025) ==&lt;br /&gt;
&lt;br /&gt;
* Support for FPID multi-instance integrations.&lt;br /&gt;
* Support for Flutter cross-platform plugin.&lt;br /&gt;
* Support for Apple's iOS26/tvOS26 Log Visibility Changes.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 10.0.0.0 (04-04-2025) ==&lt;br /&gt;
&lt;br /&gt;
* Support for DTVR Subminute product.&lt;br /&gt;
* Support for DCR video playhead bridging.&lt;br /&gt;
* Support for VisionOS platform.&lt;br /&gt;
* Change in DemographicID behavior for Chromecast.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 9.4.0.0 (07-09-2024) ==&lt;br /&gt;
&lt;br /&gt;
* Support for privacy manifest with content tracking domain for Ad flavors.&lt;br /&gt;
* Support for content tracking and no-tracking domains across sdk flavors and products.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 9.3.0.0 (05-10-2024) ==&lt;br /&gt;
&lt;br /&gt;
* Support for privacy manifest with tracking domain for Ad flavors.&lt;br /&gt;
* Support for capturing user opt-out during initialization.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 9.2.0.0 (9-27-2023) ==&lt;br /&gt;
*Support for privacy manifest and required reason API introduced in XCode 15.&lt;br /&gt;
*Digitally signed SDK framework per Apple recommendation&lt;br /&gt;
*DCR Static recognizing metadata with changed assetID for new impressions. &lt;br /&gt;
*Limiting ping retries during https failures. &lt;br /&gt;
*Other bug fixes and enhancements. &lt;br /&gt;
&lt;br /&gt;
== Release 9.1.0.0 (3-31-2023) ==&lt;br /&gt;
*DCR Static duration measurement for AppSDK (currently only AGF).&lt;br /&gt;
*Removed use of iOS keychains, started using NSUserDefaults for persistent storage.&lt;br /&gt;
*Viewability: allow enabling by product (DCR, DTVR).&lt;br /&gt;
*Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 9.0.0.0 (10-07-2022) ==&lt;br /&gt;
* Viewability measurement for DTVR, DCR Content and DCR Ad products.&lt;br /&gt;
* Audibility measurement for DTVR, DCR Content and DCR Ad products.&lt;br /&gt;
* SDK built with XCode 14.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 8.2.0.0 (03-21-2022) ==&lt;br /&gt;
* Adopting Swift language internally, built on a mixed model (Swift+Objective C).&lt;br /&gt;
* Support for Swift markers to help Swift developers.&lt;br /&gt;
* Removed the usage of deprecated iOS network reachability class.&lt;br /&gt;
* Disabled iCloud backup/synchronization of SDK keychain items.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 8.1.0.0 (06-28-2021) ==&lt;br /&gt;
* Support for XCFramework build distribution.&lt;br /&gt;
* Support for MacOS Catalyst platform framework.&lt;br /&gt;
* Fixed the device classification for MacOS M1 measurement.&lt;br /&gt;
* Support to capture Hashed email and UID.&lt;br /&gt;
* Support to collect SDK diagnostic data.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 8.0.0.0 (10-05-2020) ==&lt;br /&gt;
* iOS 14 App Transparency Framework support.&lt;br /&gt;
* FPID and VendorID support.&lt;br /&gt;
* Fixed the device classification for iPADOS measurement.&lt;br /&gt;
* Support for Xamarin cross platform framework.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 7.2.0.0 (05-18-2020) ==&lt;br /&gt;
* DTVR AQH and IVD requirements for End and pause timeout.&lt;br /&gt;
* Support for Hybrid app webview measurement. &lt;br /&gt;
* Support for Hybrid app react native webview measurement. &lt;br /&gt;
* Support for React Native measurement.&lt;br /&gt;
* Other bug fixes and enhancements&lt;br /&gt;
&lt;br /&gt;
== Release 7.1.0.0 (12-09-2019) ==&lt;br /&gt;
* Removed usage of deprecated class UIWebView&lt;br /&gt;
* Offline viewing measurement enhancements&lt;br /&gt;
* Fixed deadlock on SDK shutdown&lt;br /&gt;
* Revisited precedence logic for sfcode parameter&lt;br /&gt;
* Fix for DCR individual ad pings parameters after channel change&lt;br /&gt;
* Using default value for incorrect adModel parameter&lt;br /&gt;
* Defaulting isLive parameter value on channel change&lt;br /&gt;
* Other fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Release 7.0.0.0 (09-06-2019) ==&lt;br /&gt;
* Support for CDN based config.&lt;br /&gt;
* Support for Market based EMM UAID pings.&lt;br /&gt;
* Changes required for proper DCR Static measurement in multi-instance/multiple appid's case.&lt;br /&gt;
* Fixes for OTT synchronization issues between iOS and Android platforms.&lt;br /&gt;
* Fixes for EV data parameters in few scenarios.&lt;br /&gt;
* Fixes for DCR Static product behaviour in background app refresh and background fetch scenarios.&lt;br /&gt;
* DCR Ad reporting improvements.&lt;br /&gt;
* Fixes and improvements for the SDK console log messages.&lt;br /&gt;
* Other enhancements and fixes.&lt;br /&gt;
&lt;br /&gt;
== Release 6.2.0.0 (02-04-2019) == &lt;br /&gt;
* Introduced Dynamic framework for SDK.&lt;br /&gt;
* Removal of Location Module from SDK Code.&lt;br /&gt;
* Increased SDK log file size for Debug mode.&lt;br /&gt;
* Removed OTT Airplay/mirroring detection that caused crashes in AVAudioSession class.&lt;br /&gt;
* DCR performance improvements.&lt;br /&gt;
* Fixed the parsing error happening when clientid/vcid provided as empty in metadata.&lt;br /&gt;
* Align AppSDK for FW detection with BSDK for DCR measurement.&lt;br /&gt;
* Other Bug Fixes/Enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 6.1.0.1 (9-13-2018) ==&lt;br /&gt;
*Nielsen SDK support for Xcode 10 and tvOS 12&lt;br /&gt;
&lt;br /&gt;
== Release 6.0.0.4 (5-24-2018) ==&lt;br /&gt;
*If the SDK build target is set to AGF then SDK will send the hello ping to “eu” and “eu-uat” for debug builds. No changes to the non AGF build the default sfcode will continue to be &amp;quot;sdk&amp;quot; and &amp;quot;cert&amp;quot; for debug build.&lt;br /&gt;
*The C1 parameter (NUID) will now be sent as encrypted DeviceID.&lt;br /&gt;
*New SessionID changes. The sessionID will contain 29 length random characters appended by timestamp.&lt;br /&gt;
*Support for multiple SDK instance without any limit.&lt;br /&gt;
*New log feature for CAT tool to retrieve the API level information from client apps. This ping will contain the eventType, parameters, SDK version, appid etc.&lt;br /&gt;
*Removed Viewability for this release.&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.17 (1-23-2017) ==&lt;br /&gt;
*Added &amp;quot;seconds&amp;quot; place to the launch ping&lt;br /&gt;
*Ability to opt-out using &amp;quot;Limit Ad Tracking&amp;quot; feature&lt;br /&gt;
*Improved CPU Performance while apps are running in background&lt;br /&gt;
*Opt-Out pages can be served based on user’s language and locale from device&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.12 (12-14-2016) ==&lt;br /&gt;
*Support for Nielsen TV Brand Effect&lt;br /&gt;
*Ability to set CMS parameters at a more global level&lt;br /&gt;
*Opt-out pages based on locale and country&lt;br /&gt;
*Opt-out policy based on the &amp;quot;Limit Ad Tracking&amp;quot; flag&lt;br /&gt;
*Collection of additional device information&lt;br /&gt;
*Issue a warning in client developer’s console when ad is played for more than 5 minutes&lt;br /&gt;
*Removed the requirement for “type” parameter&lt;br /&gt;
*Limit the duration reported for App launch&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.7 (9-13-2016) ==&lt;br /&gt;
*General bug fix and performance improvements&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.5 (7-12-2016) ==&lt;br /&gt;
*Includes a sample TVOS application used to assist during integration.&lt;br /&gt;
*Support for TVML based optout pages&lt;br /&gt;
*General bug fix and performance improvements&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.0.7 (6-15-2016) ==&lt;br /&gt;
*Combined SDK for DCR US and International (Germany)&lt;br /&gt;
*API to signal end of content (end API)&lt;br /&gt;
*Support for Pause timeout&lt;br /&gt;
*Updated API to support JSON object instead of string.&lt;br /&gt;
*Reporting of media URL and bundle ID&lt;br /&gt;
*Updated ping retry logic&lt;br /&gt;
*Changes in OptOut process behavioral&lt;br /&gt;
*Enhanced Debugging and SDK logging&lt;br /&gt;
*Changes to API signature&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=iOS_SDK_Release_Notes&amp;diff=7010</id>
		<title>iOS SDK Release Notes</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=iOS_SDK_Release_Notes&amp;diff=7010"/>
		<updated>2026-03-23T14:25:37Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: Changed the release date of 10.2 to 3/24/2026&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Digital]]&lt;br /&gt;
 __NOTOC__&lt;br /&gt;
&lt;br /&gt;
{{Breadcrumb|}} {{Breadcrumb|Digital Downloads}} {{CurrentBreadcrumb}}&lt;br /&gt;
&lt;br /&gt;
== Release 10.2.0.0 (03-24-2026) ==&lt;br /&gt;
*iOS Digital Signature Certificate Renewal&lt;br /&gt;
*Fixes for Viewabiity defects&lt;br /&gt;
*Ad length warning - Fixed the ad tracking logic so now, the 300-second warning will only fire if the current ad actually plays for more than 5 minutes, and that error state will no longer bleed over into the next ad.&lt;br /&gt;
*SDK Code Signature fix (Global Flavor only) - The Global direct binary available on the Engineering Portal now correctly includes the SDK code signature for manual integrations.&lt;br /&gt;
&lt;br /&gt;
== Release 10.1.0.0 (10-17-2025) ==&lt;br /&gt;
*Support for FPID multi-instance integrations.&lt;br /&gt;
*Support for Flutter cross-platform plugin.&lt;br /&gt;
*Support for Apple's iOS26/tvOS26 Log Visibility Changes.&lt;br /&gt;
*Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 10.0.0.0 (04-04-2025) ==&lt;br /&gt;
*Support for DTVR Subminute product.&lt;br /&gt;
*Support for DCR video playhead bridging.&lt;br /&gt;
*Support for VisionOS platform.&lt;br /&gt;
*Change in DemographicID behavior for Chromecast.&lt;br /&gt;
*Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== '''Release 9.4.0.0 (07-09-2024)''' ==&lt;br /&gt;
*Support for privacy manifest with content tracking domain for Ad flavors.&lt;br /&gt;
*Support for content tracking and no-tracking domains across sdk flavors and products.&lt;br /&gt;
*Other bug fixes and enhancements.&lt;br /&gt;
== Release 9.3.0.0 (05-10-2024) ==&lt;br /&gt;
*Support for privacy manifest with tracking domain for Ad flavors.&lt;br /&gt;
*Support for capturing user opt-out during initialization.&lt;br /&gt;
*Other bug fixes and enhancements.&lt;br /&gt;
== Release 9.2.0.0 (9-27-2023) ==&lt;br /&gt;
*Support for privacy manifest and required reason API introduced in XCode 15.&lt;br /&gt;
*Digitally signed SDK framework per Apple recommendation&lt;br /&gt;
*DCR Static recognizing metadata with changed assetID for new impressions. &lt;br /&gt;
*Limiting ping retries during https failures. &lt;br /&gt;
*Other bug fixes and enhancements. &lt;br /&gt;
&lt;br /&gt;
== Release 9.1.0.0 (3-31-2023) ==&lt;br /&gt;
*DCR Static duration measurement for AppSDK (currently only AGF).&lt;br /&gt;
*Removed use of iOS keychains, started using NSUserDefaults for persistent storage.&lt;br /&gt;
*Viewability: allow enabling by product (DCR, DTVR).&lt;br /&gt;
*Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 9.0.0.0 (10-07-2022) ==&lt;br /&gt;
* Viewability measurement for DTVR, DCR Content and DCR Ad products.&lt;br /&gt;
* Audibility measurement for DTVR, DCR Content and DCR Ad products.&lt;br /&gt;
* SDK built with XCode 14.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 8.2.0.0 (03-21-2022) ==&lt;br /&gt;
* Adopting Swift language internally, built on a mixed model (Swift+Objective C).&lt;br /&gt;
* Support for Swift markers to help Swift developers.&lt;br /&gt;
* Removed the usage of deprecated iOS network reachability class.&lt;br /&gt;
* Disabled iCloud backup/synchronization of SDK keychain items.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 8.1.0.0 (06-28-2021) ==&lt;br /&gt;
* Support for XCFramework build distribution.&lt;br /&gt;
* Support for MacOS Catalyst platform framework.&lt;br /&gt;
* Fixed the device classification for MacOS M1 measurement.&lt;br /&gt;
* Support to capture Hashed email and UID.&lt;br /&gt;
* Support to collect SDK diagnostic data.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 8.0.0.0 (10-05-2020) ==&lt;br /&gt;
* iOS 14 App Transparency Framework support.&lt;br /&gt;
* FPID and VendorID support.&lt;br /&gt;
* Fixed the device classification for iPADOS measurement.&lt;br /&gt;
* Support for Xamarin cross platform framework.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 7.2.0.0 (05-18-2020) ==&lt;br /&gt;
* DTVR AQH and IVD requirements for End and pause timeout.&lt;br /&gt;
* Support for Hybrid app webview measurement. &lt;br /&gt;
* Support for Hybrid app react native webview measurement. &lt;br /&gt;
* Support for React Native measurement.&lt;br /&gt;
* Other bug fixes and enhancements&lt;br /&gt;
&lt;br /&gt;
== Release 7.1.0.0 (12-09-2019) ==&lt;br /&gt;
* Removed usage of deprecated class UIWebView&lt;br /&gt;
* Offline viewing measurement enhancements&lt;br /&gt;
* Fixed deadlock on SDK shutdown&lt;br /&gt;
* Revisited precedence logic for sfcode parameter&lt;br /&gt;
* Fix for DCR individual ad pings parameters after channel change&lt;br /&gt;
* Using default value for incorrect adModel parameter&lt;br /&gt;
* Defaulting isLive parameter value on channel change&lt;br /&gt;
* Other fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 7.0.0.0 (09-06-2019) ==&lt;br /&gt;
* Support for CDN based config.&lt;br /&gt;
* Support for Market based EMM UAID pings.&lt;br /&gt;
* Changes required for proper DCR Static measurement in multi-instance/multiple appid's case.&lt;br /&gt;
* Fixes for OTT synchronization issues between iOS and Android platforms.&lt;br /&gt;
* Fixes for EV data parameters in few scenarios.&lt;br /&gt;
* Fixes for DCR Static product behaviour in background app refresh and background fetch scenarios.&lt;br /&gt;
* DCR Ad reporting improvements.&lt;br /&gt;
* Fixes and improvements for the SDK console log messages.&lt;br /&gt;
* Other enhancements and fixes.&lt;br /&gt;
&lt;br /&gt;
== Release 6.2.0.0 (02-04-2019) == &lt;br /&gt;
* Introduced Dynamic framework for SDK.&lt;br /&gt;
* Removal of Location Module from SDK Code.&lt;br /&gt;
* Increased SDK log file size for Debug mode.&lt;br /&gt;
* Removed OTT Airplay/mirroring detection that caused crashes in AVAudioSession class.&lt;br /&gt;
* DCR performance improvements.&lt;br /&gt;
* Fixed the parsing error happening when clientid/vcid provided as empty in metadata.&lt;br /&gt;
* Align AppSDK for FW detection with BSDK for DCR measurement.&lt;br /&gt;
* Other Bug Fixes/Enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 6.1.0.1 (9-13-2018) ==&lt;br /&gt;
*Support added for Video On Demand in TV Ratings&lt;br /&gt;
*Support for Xcode 10 and iOS 12&lt;br /&gt;
&lt;br /&gt;
== Release 6.0.0.4 (5-24-2018) ==&lt;br /&gt;
*If the SDK build target is set to AGF then SDK will send the hello ping to “eu” and “eu-uat” for debug builds. No changes to the non AGF build the default sfcode will continue to be &amp;quot;sdk&amp;quot; and &amp;quot;cert&amp;quot; for debug build.&lt;br /&gt;
*The C1 parameter (NUID) will now be sent as encrypted DeviceID.&lt;br /&gt;
*New SessionID changes. The sessionID will contain 29 length random characters appended by timestamp.&lt;br /&gt;
*Support for multiple SDK instance without any limit.&lt;br /&gt;
*New log feature for CAT tool to retrieve the API level information from client apps. This ping will contain the eventType, parameters, SDK version, appid etc.&lt;br /&gt;
*Removed Viewability for this release.&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.29 (7-31-2017) ==&lt;br /&gt;
*Genre parameter will be a part of DCR pings and the value will be reflected as part of c44 parameter.&lt;br /&gt;
*Merged adModel and adLoadType flags&lt;br /&gt;
*Fix for stop event data carried to next session’s duration ping&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.25 (5-31-2017) ==&lt;br /&gt;
*Enhanced support for Digital Audio&lt;br /&gt;
*Ability to pass adloadtype as “linear” or “dynamic”&lt;br /&gt;
*Ability to detect end of content and static material through duration pings&lt;br /&gt;
*Acceptance of empty parameters with a warning message triggered, if a required parameter is missing&lt;br /&gt;
*Acceptance of case-insensitive JSON key values&lt;br /&gt;
*Configurable feature to show Ad view counts in the duration pings&lt;br /&gt;
*Automatic Pause Detection and Debug build detection&lt;br /&gt;
*Change of default ‘type’ from “ad” to “content”&lt;br /&gt;
*Removal of “Static” Launch Ping for Non-Static product implementations&lt;br /&gt;
*Fix for App crash when multiple threads are accessing the SQLite&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.23 (5-5-2017) ==&lt;br /&gt;
*Ability to pass adloadtype as “linear” or “dynamic”&lt;br /&gt;
*Ability to detect end of content and static material through duration pings&lt;br /&gt;
*Acceptance of empty parameters with a warning message triggered, if a required parameter is missing&lt;br /&gt;
*Acceptance of case-insensitive JSON key values&lt;br /&gt;
*Configurable feature to show Ad view counts in the duration pings&lt;br /&gt;
*Automatic Pause Detection and Debug build detection&lt;br /&gt;
*Change of default ‘type’ from “ad” to “content”&lt;br /&gt;
*Removal of “Static” Launch Ping for Non-Static product implementations&lt;br /&gt;
*Fix for App crash when multiple threads are accessing the SQLite&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.19 (4-3-2017) ==&lt;br /&gt;
*Fix for muting background music apps&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.18 (2-3-2017) ==&lt;br /&gt;
*Minor bug fixes and performance improvement&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.17 (1-23-2017) ==&lt;br /&gt;
*Added “seconds” place to the launch ping&lt;br /&gt;
*Ability to opt-out using “Limit Ad Tracking” feature&lt;br /&gt;
*Improved CPU Performance while apps are running in background&lt;br /&gt;
*Opt-Out pages can be served based on user’s language and locale from device&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.12 (12-14-2016) ==&lt;br /&gt;
*Support for Nielsen TV Brand Effect&lt;br /&gt;
*Ability to set CMS parameters at a more global level&lt;br /&gt;
*Opt-out pages based on locale and country&lt;br /&gt;
*Opt-out policy based on the ‘Limit Ad Tracking’ flag&lt;br /&gt;
*Collection of additional device information&lt;br /&gt;
*Issue a warning in client developer’s console when ad is played for more than 5 minutes&lt;br /&gt;
*Removed the requirement for “type” parameter&lt;br /&gt;
*Limit the duration reported for App launch&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.9 (10-18-2016) ==&lt;br /&gt;
*Fixed Linker error duplicate symbols for Reachability notification in iOS.&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.7 (9-13-2016) ==&lt;br /&gt;
*Support for iOS 10&lt;br /&gt;
*Usage of stop API call is made optional when switching between content or advertising occurs.&lt;br /&gt;
*General bug fix and performance improvements&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.5 (7-12-2016) ==&lt;br /&gt;
*Sending event level (button press data) data to census collections.&lt;br /&gt;
*Support for Pause timeout (from 30 minutes to 5 minutes)&lt;br /&gt;
*Changes in OTT when switching from mobile to Chromecast&lt;br /&gt;
*Self-error Reporting for iOS SDK&lt;br /&gt;
*General bug fix and performance improvements&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.0.5 (4-25-2016) ==&lt;br /&gt;
*Combined SDK for DCR US and International (Germany)&lt;br /&gt;
*API to signal end of content (end API)&lt;br /&gt;
*Changes to use of stop API&lt;br /&gt;
*Support for OTT measurement&lt;br /&gt;
*Support for Pause timeout&lt;br /&gt;
*Offline viewing&lt;br /&gt;
*Updated API to support JSON object instead of string.&lt;br /&gt;
*Reporting of media URL and bundle ID&lt;br /&gt;
*Updated ping retry logic&lt;br /&gt;
*Changes in OptOut process behavioral&lt;br /&gt;
*Enhanced Debugging and SDK logging&lt;br /&gt;
*Changes to API signature&lt;br /&gt;
*Introduced new API updateOTT to report current OTT status.&lt;br /&gt;
&lt;br /&gt;
== Release 4.0.0.8 (6-9-2015) ==&lt;br /&gt;
*Support for Nielsen DCR product (Digital Content Ratings)&lt;br /&gt;
**All the products should be migrated to the latest SDK.&lt;br /&gt;
**This SDK distribution does not have a native library component or shared object.&lt;br /&gt;
*Support for Nielsen App static measurement&lt;br /&gt;
*Support for Ad measurement&lt;br /&gt;
*Removal of Native C++ code&lt;br /&gt;
*Removed singleton restriction&lt;br /&gt;
*Support for iOS 9 and iOS 9 PIP mode&lt;br /&gt;
*General bug fix and performance improvements&lt;br /&gt;
&lt;br /&gt;
== Release 3.2.1.26 (1-10-2015) ==&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Android_SDK_Release_Notes&amp;diff=7009</id>
		<title>Android SDK Release Notes</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Android_SDK_Release_Notes&amp;diff=7009"/>
		<updated>2026-03-23T14:24:50Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: Changed release 10.2 date to 3/24/2026&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Digital]]&lt;br /&gt;
 __NOTOC__&lt;br /&gt;
&lt;br /&gt;
{{Breadcrumb|}} {{Breadcrumb|Digital Downloads}} {{CurrentBreadcrumb}}&lt;br /&gt;
== Release 10.2.0.0 (03-24-2026) ==&lt;br /&gt;
*[[Mitigation of Android 15 background]] network access restrictions.&lt;br /&gt;
*Fixed Viewabiity defects.&lt;br /&gt;
*Ad length warning - Fixed the ad tracking logic so now, the 300-second warning will only fire if the current ad actually plays for more than 5 minutes, and that error state will no longer bleed over into the next ad.&lt;br /&gt;
&lt;br /&gt;
== Release 10.1.0.0 (10-17-2025) ==&lt;br /&gt;
*Support for FPID multi-instance integrations.&lt;br /&gt;
*Support for Flutter cross-platform plugin.&lt;br /&gt;
*Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 10.0.0.0 (04-04-2025) ==&lt;br /&gt;
*Support for DTVR Subminute product.&lt;br /&gt;
*Support for DCR video playhead bridging.&lt;br /&gt;
*Support for Ethernet network connection for TV platforms.&lt;br /&gt;
*Change in DemographicID behavior for Chromecast.&lt;br /&gt;
*Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 9.2.0.0 (9-27-2023) ==&lt;br /&gt;
*DCR Static recognizing metadata with changed assetID for new impressions. &lt;br /&gt;
*Limiting ping retries during https failures. &lt;br /&gt;
*Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 9.1.0.0 (3-31-2023) ==&lt;br /&gt;
*DCR Static duration measurement for AppSDK (currently only AGF)&lt;br /&gt;
*Viewability: allow enabling by product (DCR, DTVR)&lt;br /&gt;
*Other bug fixes and enhancements&lt;br /&gt;
&lt;br /&gt;
== Release 9.0.0.0 (10-07-2022) ==&lt;br /&gt;
* Viewability measurement for DTVR, DCR Content and DCR Ad products. &lt;br /&gt;
* Audibility measurement for DTVR, DCR Content and DCR Ad products.&lt;br /&gt;
* Kotlin-Java interoperability implementation in SDK.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 8.2.0.0 (03-21-2022) ==&lt;br /&gt;
* Support for EMM AGF AdID-less solution.&lt;br /&gt;
* Enabled SDK to capture network availability changes.&lt;br /&gt;
* Removed the usage of deprecated network classes.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 8.1.0.0 (06-28-2021) ==&lt;br /&gt;
* Support for SDK build variants - AD/NoAD/NoID.&lt;br /&gt;
* Support to indicate ID used for AD build variant - AD ID vs Android ID.&lt;br /&gt;
* Support to capture Hashed email and UID.&lt;br /&gt;
* Support to collect SDK diagnostic data.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 8.0.0.0 (10-05-2020) ==&lt;br /&gt;
* FPID and VendorID support.&lt;br /&gt;
* Support for Android apps running on ChromeOS.&lt;br /&gt;
* Support for Xamarin cross platform framework.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 7.2.0.0 (05-18-2020) ==&lt;br /&gt;
* DTVR AQH and IVD requirements for End and pause timeout.&lt;br /&gt;
* Support for Hybrid app webview measurement. &lt;br /&gt;
* Support for Hybrid app react native webview measurement. &lt;br /&gt;
* Support for React Native measurement.&lt;br /&gt;
* Other bug fixes and enhancements&lt;br /&gt;
&lt;br /&gt;
== Release 7.1.0.0 (12-09-2019) ==&lt;br /&gt;
&lt;br /&gt;
* Application background/foreground state auto-detection (AndroidX)&lt;br /&gt;
* Fixed forward rewind evdata containing negative values&lt;br /&gt;
* Offline viewing measurement enhancements&lt;br /&gt;
* Revisited precedence logic for sfcode parameter&lt;br /&gt;
* Using default value for incorrect adModel parameter&lt;br /&gt;
* Defaulting isLive parameter value on channel change&lt;br /&gt;
* Other fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 7.0.0.0 (09-06-2019) ==&lt;br /&gt;
&lt;br /&gt;
* Support for CDN based config.&lt;br /&gt;
* Support for Market based EMM UAID pings.&lt;br /&gt;
* Changes required for proper DCR Static measurement in multi-instance/multiple appid's case.&lt;br /&gt;
* Fixes for OTT synchronization issues between iOS and Android platforms.&lt;br /&gt;
* Fixes for EV data parameters in few scenarios.&lt;br /&gt;
* Fixes for DCR Static product behaviour in background app refresh and background fetch scenarios.&lt;br /&gt;
* DCR Ad reporting improvements.&lt;br /&gt;
* Fixes and improvements for the SDK console log messages.&lt;br /&gt;
* Other enhancements and fixes.&lt;br /&gt;
&lt;br /&gt;
== Release 6.2.0.0  (02-04-2019) ==&lt;br /&gt;
* Removal of Location Module from SDK Code.&lt;br /&gt;
* Fixed the getOptoutStatus() api, so that client can call it in main thread.&lt;br /&gt;
* Fixed the parsing error happening when clientid/vcid provided as empty in metadata.&lt;br /&gt;
* Align AppSDK for FW detection with BSDK for DCR measurement.&lt;br /&gt;
* Other enhancements and fixes.&lt;br /&gt;
&lt;br /&gt;
== Release 6.1.0.1 (9-13-2018) ==&lt;br /&gt;
*Support added for Video On Demand in TV Ratings&lt;br /&gt;
*Bug fixes and improvements&lt;br /&gt;
&lt;br /&gt;
== Release 6.0.0.4 (5-24-2018) ==&lt;br /&gt;
*If the SDK build target is set to AGF then SDK will send the hello ping to “eu” and “eu-uat” for debug builds. No changes to the non AGF build the default sfcode will continue to be &amp;quot;sdk&amp;quot; and &amp;quot;cert&amp;quot; for debug build.&lt;br /&gt;
*The C1 parameter (NUID) will now be sent as encrypted DeviceID.&lt;br /&gt;
*New SessionID changes. The sessionID will contain 29 length random characters appended by timestamp.&lt;br /&gt;
*Support for multiple SDK instance without any limit.&lt;br /&gt;
*New log feature for CAT tool to retrieve the API level information from client apps. This ping will contain the eventType, parameters, SDK version, appid etc.&lt;br /&gt;
*Removed Viewability for this release.&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.26 (7-31-2017) ==&lt;br /&gt;
*Genre parameter will be a part of DCR pings and the value is reflected as part of c44 parameter.&lt;br /&gt;
*Merged adModel and adLoadType flags&lt;br /&gt;
*Fix for stop event data carried to next session’s duration ping&lt;br /&gt;
*Fix for last playhead call that is not processed (when there is no time-gap between the last playhead and end call)&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.24 (6-2-2017) ==&lt;br /&gt;
*Enhanced support for Digital Audio&lt;br /&gt;
*Ability to pass adloadtype as “linear” or “dynamic”&lt;br /&gt;
*Ability to detect end of content and static material through duration pings&lt;br /&gt;
*Acceptance of empty parameters with a warning message triggered, if a required parameter is missing&lt;br /&gt;
*Acceptance of case-insensitive JSON key values&lt;br /&gt;
*Configurable feature to show Ad view counts in the duration pings&lt;br /&gt;
*Automatic Pause Detection and Debug build detection&lt;br /&gt;
*Change of default ‘type’ from “ad” to “content”&lt;br /&gt;
*Removal of “Static” Launch Ping for Non-Static product implementations&lt;br /&gt;
*Fix for metadata carry over between channels after a channel change&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.18 (1-24-2017) ==&lt;br /&gt;
*Ability to opt-out using “Limit Ad Tracking” feature&lt;br /&gt;
*Improved CPU Performance through encryption process change&lt;br /&gt;
*Opt-Out pages can be served based on user’s language and locale from device&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.14 (12-10-2016) ==&lt;br /&gt;
*Support for Nielsen TV Brand Effect&lt;br /&gt;
*Ability to set CMS parameters at a more global level&lt;br /&gt;
*Collection of additional device information&lt;br /&gt;
*Opt-out pages based on locale and country&lt;br /&gt;
*Opt-out based on the ‘Limit Ad Tracking’ flag&lt;br /&gt;
*Issue a warning in client developer’s console when an ad is being played for more than 5 minutes&lt;br /&gt;
*Reduced load time of Android SDK, caused due to encryption.&lt;br /&gt;
*Limit the duration reported for App launch&lt;br /&gt;
*Modification to accept non-JSON strings&lt;br /&gt;
*Fixed&lt;br /&gt;
**Incorrect DRM placement ID&lt;br /&gt;
**DRM pings sent in bursts in case of time change&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.10 (10-19-2016) ==&lt;br /&gt;
*Fixed an issue where SDK will send a burst of data pings in Android.&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.7 (9-1-2016) ==&lt;br /&gt;
*Support for Android N&lt;br /&gt;
*Usage of stop API call is made optional when switching between content or advertising occurs.&lt;br /&gt;
*General bug fix and performance improvements&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.4 (8-1-2016) ==&lt;br /&gt;
*Support for Pause timeout (from 30 minutes to 5 minutes)&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.3 (7-7-2016) ==&lt;br /&gt;
*Sending event level (button press data) data to census collections.&lt;br /&gt;
*Changes in OTT when switching from mobile to Chromecast&lt;br /&gt;
*General bug fix and performance improvements&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.0.4 (4-25-2016) ==&lt;br /&gt;
*Combined SDK for DCR US and International (Germany)&lt;br /&gt;
*API to signal end of content (end API)&lt;br /&gt;
*Changes to use of stop API&lt;br /&gt;
*Support for OTT measurement&lt;br /&gt;
*Support for Pause timeout&lt;br /&gt;
*Offline viewing&lt;br /&gt;
*Updated API to support JSON object instead of string.&lt;br /&gt;
*Reporting of media URL and bundle ID&lt;br /&gt;
*Updated ping retry logic&lt;br /&gt;
*Changes in OptOut process behavioral&lt;br /&gt;
*Enhanced Debugging and SDK logging&lt;br /&gt;
*Changes to API signature&lt;br /&gt;
*Introduced new API updateOTT to report current OTT status.&lt;br /&gt;
&lt;br /&gt;
== Release 4.0.0.8 (6-9-2015) ==&lt;br /&gt;
*Support for Nielsen DCR product (Digital Content Ratings)&lt;br /&gt;
*All the products should be migrated to the latest SDK.&lt;br /&gt;
*This SDK distribution does not have a native library component or shared object.&lt;br /&gt;
*Support for Nielsen App static measurement&lt;br /&gt;
*Support for Ad measurement&lt;br /&gt;
*Removal of Native C++ code&lt;br /&gt;
*Removed singleton restriction&lt;br /&gt;
*Support for Android 6.0 Marshmallow&lt;br /&gt;
*General bug fix and performance improvements&lt;br /&gt;
&lt;br /&gt;
== Release 1.2.3.8 (1-10-2015) ==&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Mitigation_of_Android_15_background&amp;diff=6998</id>
		<title>Mitigation of Android 15 background</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Mitigation_of_Android_15_background&amp;diff=6998"/>
		<updated>2026-03-20T14:49:29Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: /* Observation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Mitigation of Android 15 background network access restrictions==&lt;br /&gt;
===Observation===&lt;br /&gt;
On devices running Android 15 and 16, ping HTTP requests consistently fail while the application is in a background state.&lt;br /&gt;
These failed pings currently undergo five retry attempts, which consistently result in a 404 error response.&lt;br /&gt;
Once the retry limit is reached, the failed requests are purged from the pending database table.&lt;br /&gt;
The OS's aggressive background restrictions prevent the SDK from establishing a stable network handshake.&lt;br /&gt;
&lt;br /&gt;
===Root Cause===&lt;br /&gt;
Below writeup has been taken directly from the official [https://developer.android.com/about/versions/15/behavior-changes-all#background-network-access Android developer documentation] which states that -&lt;br /&gt;
&lt;br /&gt;
“In Android 15, apps that start a network request outside of a valid process lifecycle receive an exception. Typically, an UnknownHostException or other socket-related IOException. Network requests that happen outside of a valid lifecycle are usually due to apps unknowingly continuing a network request even after the app is no longer active.&lt;br /&gt;
&lt;br /&gt;
To mitigate this exception, ensure your network requests are lifecycle aware and cancelled upon leaving a valid process lifecycle by using lifecycle aware components. If it is important that the network request should happen even when the user leaves the application, consider scheduling the network request using WorkManager or continue a user visible task using Foreground Service.”&lt;br /&gt;
&lt;br /&gt;
===Conclusion Of Background Behaviour Changes===&lt;br /&gt;
Starting with Android 15, the system has introduced stricter limitations on background network access! So we have transitioned our background operations to use the WorkManager API, which is now a required dependency. Without the WorkManager library, background network calls may be blocked or fail silently, leading to data loss on devices running Android 15 or later.&lt;br /&gt;
&lt;br /&gt;
===WorkManager Integration (Client Side)===&lt;br /&gt;
Client apps must add the WorkManager library once they have integrated version '''10.2.0.0''' of the AppSDK. Starting with this version, the WorkManager library is a mandatory dependency and missing it will '''fail the AppSDK initialization'''. &lt;br /&gt;
&lt;br /&gt;
The AppSDK will flash the below error message to the console -&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;“AppApi initialize failed! Starting with Android 15, the system has introduced stricter limitations on background network access! So we have transitioned our background operations to use the WorkManager API, which is now a required dependency. Without the WorkManager library, background network calls may be blocked or fail silently, leading to data synchronization issues on newer devices. Please add the androidx.work:work-runtime dependency to your project's build.gradle file“&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''Note:''' ''Please add the'' '''androidx.work:work-runtime''' ''dependency to the project's build.gradle file.''&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Mitigation_of_Android_15_background&amp;diff=6997</id>
		<title>Mitigation of Android 15 background</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Mitigation_of_Android_15_background&amp;diff=6997"/>
		<updated>2026-03-20T14:47:30Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: /* Observation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Mitigation of Android 15 background network access restrictions==&lt;br /&gt;
===Observation===&lt;br /&gt;
On devices running Android 15 and 16, ping HTTP requests consistently fail while the application is in a background state.&lt;br /&gt;
&lt;br /&gt;
These failed pings currently undergo five retry attempts, which consistently result in a 404 error response.&lt;br /&gt;
&lt;br /&gt;
Once the retry limit is reached, the failed requests are purged from the pending database table.&lt;br /&gt;
&lt;br /&gt;
The OS's aggressive background restrictions prevent the SDK from establishing a stable network handshake.&lt;br /&gt;
&lt;br /&gt;
===Root Cause===&lt;br /&gt;
Below writeup has been taken directly from the official [https://developer.android.com/about/versions/15/behavior-changes-all#background-network-access Android developer documentation] which states that -&lt;br /&gt;
&lt;br /&gt;
“In Android 15, apps that start a network request outside of a valid process lifecycle receive an exception. Typically, an UnknownHostException or other socket-related IOException. Network requests that happen outside of a valid lifecycle are usually due to apps unknowingly continuing a network request even after the app is no longer active.&lt;br /&gt;
&lt;br /&gt;
To mitigate this exception, ensure your network requests are lifecycle aware and cancelled upon leaving a valid process lifecycle by using lifecycle aware components. If it is important that the network request should happen even when the user leaves the application, consider scheduling the network request using WorkManager or continue a user visible task using Foreground Service.”&lt;br /&gt;
&lt;br /&gt;
===Conclusion Of Background Behaviour Changes===&lt;br /&gt;
Starting with Android 15, the system has introduced stricter limitations on background network access! So we have transitioned our background operations to use the WorkManager API, which is now a required dependency. Without the WorkManager library, background network calls may be blocked or fail silently, leading to data loss on devices running Android 15 or later.&lt;br /&gt;
&lt;br /&gt;
===WorkManager Integration (Client Side)===&lt;br /&gt;
Client apps must add the WorkManager library once they have integrated version '''10.2.0.0''' of the AppSDK. Starting with this version, the WorkManager library is a mandatory dependency and missing it will '''fail the AppSDK initialization'''. &lt;br /&gt;
&lt;br /&gt;
The AppSDK will flash the below error message to the console -&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;“AppApi initialize failed! Starting with Android 15, the system has introduced stricter limitations on background network access! So we have transitioned our background operations to use the WorkManager API, which is now a required dependency. Without the WorkManager library, background network calls may be blocked or fail silently, leading to data synchronization issues on newer devices. Please add the androidx.work:work-runtime dependency to your project's build.gradle file“&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''Note:''' ''Please add the'' '''androidx.work:work-runtime''' ''dependency to the project's build.gradle file.''&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=iOS_SDK_Release_Notes&amp;diff=6996</id>
		<title>iOS SDK Release Notes</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=iOS_SDK_Release_Notes&amp;diff=6996"/>
		<updated>2026-03-19T19:41:55Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: Add 10.2.0.0 release notes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Digital]]&lt;br /&gt;
 __NOTOC__&lt;br /&gt;
&lt;br /&gt;
{{Breadcrumb|}} {{Breadcrumb|Digital Downloads}} {{CurrentBreadcrumb}}&lt;br /&gt;
&lt;br /&gt;
== Release 10.2.0.0 (03-23-2026) ==&lt;br /&gt;
*iOS Digital Signature Certificate Renewal&lt;br /&gt;
*Fixes for Viewabiity defects&lt;br /&gt;
*Ad length warning - Fixed the ad tracking logic so now, the 300-second warning will only fire if the current ad actually plays for more than 5 minutes, and that error state will no longer bleed over into the next ad.&lt;br /&gt;
*SDK Code Signature fix (Global Flavor only) - The Global direct binary available on the Engineering Portal now correctly includes the SDK code signature for manual integrations.&lt;br /&gt;
&lt;br /&gt;
== Release 10.1.0.0 (10-17-2025) ==&lt;br /&gt;
*Support for FPID multi-instance integrations.&lt;br /&gt;
*Support for Flutter cross-platform plugin.&lt;br /&gt;
*Support for Apple's iOS26/tvOS26 Log Visibility Changes.&lt;br /&gt;
*Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 10.0.0.0 (04-04-2025) ==&lt;br /&gt;
*Support for DTVR Subminute product.&lt;br /&gt;
*Support for DCR video playhead bridging.&lt;br /&gt;
*Support for VisionOS platform.&lt;br /&gt;
*Change in DemographicID behavior for Chromecast.&lt;br /&gt;
*Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== '''Release 9.4.0.0 (07-09-2024)''' ==&lt;br /&gt;
*Support for privacy manifest with content tracking domain for Ad flavors.&lt;br /&gt;
*Support for content tracking and no-tracking domains across sdk flavors and products.&lt;br /&gt;
*Other bug fixes and enhancements.&lt;br /&gt;
== Release 9.3.0.0 (05-10-2024) ==&lt;br /&gt;
*Support for privacy manifest with tracking domain for Ad flavors.&lt;br /&gt;
*Support for capturing user opt-out during initialization.&lt;br /&gt;
*Other bug fixes and enhancements.&lt;br /&gt;
== Release 9.2.0.0 (9-27-2023) ==&lt;br /&gt;
*Support for privacy manifest and required reason API introduced in XCode 15.&lt;br /&gt;
*Digitally signed SDK framework per Apple recommendation&lt;br /&gt;
*DCR Static recognizing metadata with changed assetID for new impressions. &lt;br /&gt;
*Limiting ping retries during https failures. &lt;br /&gt;
*Other bug fixes and enhancements. &lt;br /&gt;
&lt;br /&gt;
== Release 9.1.0.0 (3-31-2023) ==&lt;br /&gt;
*DCR Static duration measurement for AppSDK (currently only AGF).&lt;br /&gt;
*Removed use of iOS keychains, started using NSUserDefaults for persistent storage.&lt;br /&gt;
*Viewability: allow enabling by product (DCR, DTVR).&lt;br /&gt;
*Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 9.0.0.0 (10-07-2022) ==&lt;br /&gt;
* Viewability measurement for DTVR, DCR Content and DCR Ad products.&lt;br /&gt;
* Audibility measurement for DTVR, DCR Content and DCR Ad products.&lt;br /&gt;
* SDK built with XCode 14.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 8.2.0.0 (03-21-2022) ==&lt;br /&gt;
* Adopting Swift language internally, built on a mixed model (Swift+Objective C).&lt;br /&gt;
* Support for Swift markers to help Swift developers.&lt;br /&gt;
* Removed the usage of deprecated iOS network reachability class.&lt;br /&gt;
* Disabled iCloud backup/synchronization of SDK keychain items.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 8.1.0.0 (06-28-2021) ==&lt;br /&gt;
* Support for XCFramework build distribution.&lt;br /&gt;
* Support for MacOS Catalyst platform framework.&lt;br /&gt;
* Fixed the device classification for MacOS M1 measurement.&lt;br /&gt;
* Support to capture Hashed email and UID.&lt;br /&gt;
* Support to collect SDK diagnostic data.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 8.0.0.0 (10-05-2020) ==&lt;br /&gt;
* iOS 14 App Transparency Framework support.&lt;br /&gt;
* FPID and VendorID support.&lt;br /&gt;
* Fixed the device classification for iPADOS measurement.&lt;br /&gt;
* Support for Xamarin cross platform framework.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 7.2.0.0 (05-18-2020) ==&lt;br /&gt;
* DTVR AQH and IVD requirements for End and pause timeout.&lt;br /&gt;
* Support for Hybrid app webview measurement. &lt;br /&gt;
* Support for Hybrid app react native webview measurement. &lt;br /&gt;
* Support for React Native measurement.&lt;br /&gt;
* Other bug fixes and enhancements&lt;br /&gt;
&lt;br /&gt;
== Release 7.1.0.0 (12-09-2019) ==&lt;br /&gt;
* Removed usage of deprecated class UIWebView&lt;br /&gt;
* Offline viewing measurement enhancements&lt;br /&gt;
* Fixed deadlock on SDK shutdown&lt;br /&gt;
* Revisited precedence logic for sfcode parameter&lt;br /&gt;
* Fix for DCR individual ad pings parameters after channel change&lt;br /&gt;
* Using default value for incorrect adModel parameter&lt;br /&gt;
* Defaulting isLive parameter value on channel change&lt;br /&gt;
* Other fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 7.0.0.0 (09-06-2019) ==&lt;br /&gt;
* Support for CDN based config.&lt;br /&gt;
* Support for Market based EMM UAID pings.&lt;br /&gt;
* Changes required for proper DCR Static measurement in multi-instance/multiple appid's case.&lt;br /&gt;
* Fixes for OTT synchronization issues between iOS and Android platforms.&lt;br /&gt;
* Fixes for EV data parameters in few scenarios.&lt;br /&gt;
* Fixes for DCR Static product behaviour in background app refresh and background fetch scenarios.&lt;br /&gt;
* DCR Ad reporting improvements.&lt;br /&gt;
* Fixes and improvements for the SDK console log messages.&lt;br /&gt;
* Other enhancements and fixes.&lt;br /&gt;
&lt;br /&gt;
== Release 6.2.0.0 (02-04-2019) == &lt;br /&gt;
* Introduced Dynamic framework for SDK.&lt;br /&gt;
* Removal of Location Module from SDK Code.&lt;br /&gt;
* Increased SDK log file size for Debug mode.&lt;br /&gt;
* Removed OTT Airplay/mirroring detection that caused crashes in AVAudioSession class.&lt;br /&gt;
* DCR performance improvements.&lt;br /&gt;
* Fixed the parsing error happening when clientid/vcid provided as empty in metadata.&lt;br /&gt;
* Align AppSDK for FW detection with BSDK for DCR measurement.&lt;br /&gt;
* Other Bug Fixes/Enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 6.1.0.1 (9-13-2018) ==&lt;br /&gt;
*Support added for Video On Demand in TV Ratings&lt;br /&gt;
*Support for Xcode 10 and iOS 12&lt;br /&gt;
&lt;br /&gt;
== Release 6.0.0.4 (5-24-2018) ==&lt;br /&gt;
*If the SDK build target is set to AGF then SDK will send the hello ping to “eu” and “eu-uat” for debug builds. No changes to the non AGF build the default sfcode will continue to be &amp;quot;sdk&amp;quot; and &amp;quot;cert&amp;quot; for debug build.&lt;br /&gt;
*The C1 parameter (NUID) will now be sent as encrypted DeviceID.&lt;br /&gt;
*New SessionID changes. The sessionID will contain 29 length random characters appended by timestamp.&lt;br /&gt;
*Support for multiple SDK instance without any limit.&lt;br /&gt;
*New log feature for CAT tool to retrieve the API level information from client apps. This ping will contain the eventType, parameters, SDK version, appid etc.&lt;br /&gt;
*Removed Viewability for this release.&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.29 (7-31-2017) ==&lt;br /&gt;
*Genre parameter will be a part of DCR pings and the value will be reflected as part of c44 parameter.&lt;br /&gt;
*Merged adModel and adLoadType flags&lt;br /&gt;
*Fix for stop event data carried to next session’s duration ping&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.25 (5-31-2017) ==&lt;br /&gt;
*Enhanced support for Digital Audio&lt;br /&gt;
*Ability to pass adloadtype as “linear” or “dynamic”&lt;br /&gt;
*Ability to detect end of content and static material through duration pings&lt;br /&gt;
*Acceptance of empty parameters with a warning message triggered, if a required parameter is missing&lt;br /&gt;
*Acceptance of case-insensitive JSON key values&lt;br /&gt;
*Configurable feature to show Ad view counts in the duration pings&lt;br /&gt;
*Automatic Pause Detection and Debug build detection&lt;br /&gt;
*Change of default ‘type’ from “ad” to “content”&lt;br /&gt;
*Removal of “Static” Launch Ping for Non-Static product implementations&lt;br /&gt;
*Fix for App crash when multiple threads are accessing the SQLite&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.23 (5-5-2017) ==&lt;br /&gt;
*Ability to pass adloadtype as “linear” or “dynamic”&lt;br /&gt;
*Ability to detect end of content and static material through duration pings&lt;br /&gt;
*Acceptance of empty parameters with a warning message triggered, if a required parameter is missing&lt;br /&gt;
*Acceptance of case-insensitive JSON key values&lt;br /&gt;
*Configurable feature to show Ad view counts in the duration pings&lt;br /&gt;
*Automatic Pause Detection and Debug build detection&lt;br /&gt;
*Change of default ‘type’ from “ad” to “content”&lt;br /&gt;
*Removal of “Static” Launch Ping for Non-Static product implementations&lt;br /&gt;
*Fix for App crash when multiple threads are accessing the SQLite&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.19 (4-3-2017) ==&lt;br /&gt;
*Fix for muting background music apps&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.18 (2-3-2017) ==&lt;br /&gt;
*Minor bug fixes and performance improvement&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.17 (1-23-2017) ==&lt;br /&gt;
*Added “seconds” place to the launch ping&lt;br /&gt;
*Ability to opt-out using “Limit Ad Tracking” feature&lt;br /&gt;
*Improved CPU Performance while apps are running in background&lt;br /&gt;
*Opt-Out pages can be served based on user’s language and locale from device&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.12 (12-14-2016) ==&lt;br /&gt;
*Support for Nielsen TV Brand Effect&lt;br /&gt;
*Ability to set CMS parameters at a more global level&lt;br /&gt;
*Opt-out pages based on locale and country&lt;br /&gt;
*Opt-out policy based on the ‘Limit Ad Tracking’ flag&lt;br /&gt;
*Collection of additional device information&lt;br /&gt;
*Issue a warning in client developer’s console when ad is played for more than 5 minutes&lt;br /&gt;
*Removed the requirement for “type” parameter&lt;br /&gt;
*Limit the duration reported for App launch&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.9 (10-18-2016) ==&lt;br /&gt;
*Fixed Linker error duplicate symbols for Reachability notification in iOS.&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.7 (9-13-2016) ==&lt;br /&gt;
*Support for iOS 10&lt;br /&gt;
*Usage of stop API call is made optional when switching between content or advertising occurs.&lt;br /&gt;
*General bug fix and performance improvements&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.5 (7-12-2016) ==&lt;br /&gt;
*Sending event level (button press data) data to census collections.&lt;br /&gt;
*Support for Pause timeout (from 30 minutes to 5 minutes)&lt;br /&gt;
*Changes in OTT when switching from mobile to Chromecast&lt;br /&gt;
*Self-error Reporting for iOS SDK&lt;br /&gt;
*General bug fix and performance improvements&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.0.5 (4-25-2016) ==&lt;br /&gt;
*Combined SDK for DCR US and International (Germany)&lt;br /&gt;
*API to signal end of content (end API)&lt;br /&gt;
*Changes to use of stop API&lt;br /&gt;
*Support for OTT measurement&lt;br /&gt;
*Support for Pause timeout&lt;br /&gt;
*Offline viewing&lt;br /&gt;
*Updated API to support JSON object instead of string.&lt;br /&gt;
*Reporting of media URL and bundle ID&lt;br /&gt;
*Updated ping retry logic&lt;br /&gt;
*Changes in OptOut process behavioral&lt;br /&gt;
*Enhanced Debugging and SDK logging&lt;br /&gt;
*Changes to API signature&lt;br /&gt;
*Introduced new API updateOTT to report current OTT status.&lt;br /&gt;
&lt;br /&gt;
== Release 4.0.0.8 (6-9-2015) ==&lt;br /&gt;
*Support for Nielsen DCR product (Digital Content Ratings)&lt;br /&gt;
**All the products should be migrated to the latest SDK.&lt;br /&gt;
**This SDK distribution does not have a native library component or shared object.&lt;br /&gt;
*Support for Nielsen App static measurement&lt;br /&gt;
*Support for Ad measurement&lt;br /&gt;
*Removal of Native C++ code&lt;br /&gt;
*Removed singleton restriction&lt;br /&gt;
*Support for iOS 9 and iOS 9 PIP mode&lt;br /&gt;
*General bug fix and performance improvements&lt;br /&gt;
&lt;br /&gt;
== Release 3.2.1.26 (1-10-2015) ==&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Mitigation_of_Android_15_background&amp;diff=6995</id>
		<title>Mitigation of Android 15 background</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Mitigation_of_Android_15_background&amp;diff=6995"/>
		<updated>2026-03-19T19:36:40Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: /* The Root Cause */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Mitigation of Android 15 background network access restrictions==&lt;br /&gt;
===Observation===&lt;br /&gt;
 On devices running Android 15 and 16, ping HTTP requests consistently fail while the application is in a background state.&lt;br /&gt;
&lt;br /&gt;
These failed pings currently undergo five retry attempts, which consistently result in a 404 error response.&lt;br /&gt;
&lt;br /&gt;
Once the retry limit is reached, the failed requests are purged from the pending database table.&lt;br /&gt;
&lt;br /&gt;
 The OS's aggressive background restrictions prevent the SDK from establishing a stable network handshake.&lt;br /&gt;
&lt;br /&gt;
===Root Cause===&lt;br /&gt;
Below writeup has been taken directly from the official [https://developer.android.com/about/versions/15/behavior-changes-all#background-network-access Android developer documentation] which states that -&lt;br /&gt;
&lt;br /&gt;
“In Android 15, apps that start a network request outside of a valid process lifecycle receive an exception. Typically, an UnknownHostException or other socket-related IOException. Network requests that happen outside of a valid lifecycle are usually due to apps unknowingly continuing a network request even after the app is no longer active.&lt;br /&gt;
&lt;br /&gt;
To mitigate this exception, ensure your network requests are lifecycle aware and cancelled upon leaving a valid process lifecycle by using lifecycle aware components. If it is important that the network request should happen even when the user leaves the application, consider scheduling the network request using WorkManager or continue a user visible task using Foreground Service.”&lt;br /&gt;
&lt;br /&gt;
===Conclusion Of Background Behaviour Changes===&lt;br /&gt;
Starting with Android 15, the system has introduced stricter limitations on background network access! So we have transitioned our background operations to use the WorkManager API, which is now a required dependency. Without the WorkManager library, background network calls may be blocked or fail silently, leading to data loss on devices running Android 15 or later.&lt;br /&gt;
&lt;br /&gt;
===WorkManager Integration (Client Side)===&lt;br /&gt;
Client apps must add the WorkManager library once they have integrated version '''10.2.0.0''' of the AppSDK. Starting with this version, the WorkManager library is a mandatory dependency and missing it will '''fail the AppSDK initialization'''. &lt;br /&gt;
&lt;br /&gt;
The AppSDK will flash the below error message to the console -&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;“AppApi initialize failed! Starting with Android 15, the system has introduced stricter limitations on background network access! So we have transitioned our background operations to use the WorkManager API, which is now a required dependency. Without the WorkManager library, background network calls may be blocked or fail silently, leading to data synchronization issues on newer devices. Please add the androidx.work:work-runtime dependency to your project's build.gradle file“&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''Note:''' ''Please add the'' '''androidx.work:work-runtime''' ''dependency to the project's build.gradle file.''&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Mitigation_of_Android_15_background&amp;diff=6994</id>
		<title>Mitigation of Android 15 background</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Mitigation_of_Android_15_background&amp;diff=6994"/>
		<updated>2026-03-19T19:35:49Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: Create a new page for &amp;quot;Mitigation of Android 15 background&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Mitigation of Android 15 background network access restrictions==&lt;br /&gt;
===Observation===&lt;br /&gt;
 On devices running Android 15 and 16, ping HTTP requests consistently fail while the application is in a background state.&lt;br /&gt;
&lt;br /&gt;
These failed pings currently undergo five retry attempts, which consistently result in a 404 error response.&lt;br /&gt;
&lt;br /&gt;
Once the retry limit is reached, the failed requests are purged from the pending database table.&lt;br /&gt;
&lt;br /&gt;
 The OS's aggressive background restrictions prevent the SDK from establishing a stable network handshake.&lt;br /&gt;
&lt;br /&gt;
===The Root Cause===&lt;br /&gt;
Below writeup has been taken directly from the official [https://developer.android.com/about/versions/15/behavior-changes-all#background-network-access Android developer documentation] which states that -&lt;br /&gt;
&lt;br /&gt;
“In Android 15, apps that start a network request outside of a valid process lifecycle receive an exception. Typically, an UnknownHostException or other socket-related IOException. Network requests that happen outside of a valid lifecycle are usually due to apps unknowingly continuing a network request even after the app is no longer active.&lt;br /&gt;
&lt;br /&gt;
To mitigate this exception, ensure your network requests are lifecycle aware and cancelled upon leaving a valid process lifecycle by using lifecycle aware components. If it is important that the network request should happen even when the user leaves the application, consider scheduling the network request using WorkManager or continue a user visible task using Foreground Service.”&lt;br /&gt;
&lt;br /&gt;
===Conclusion Of Background Behaviour Changes===&lt;br /&gt;
Starting with Android 15, the system has introduced stricter limitations on background network access! So we have transitioned our background operations to use the WorkManager API, which is now a required dependency. Without the WorkManager library, background network calls may be blocked or fail silently, leading to data loss on devices running Android 15 or later.&lt;br /&gt;
&lt;br /&gt;
===WorkManager Integration (Client Side)===&lt;br /&gt;
Client apps must add the WorkManager library once they have integrated version '''10.2.0.0''' of the AppSDK. Starting with this version, the WorkManager library is a mandatory dependency and missing it will '''fail the AppSDK initialization'''. &lt;br /&gt;
&lt;br /&gt;
The AppSDK will flash the below error message to the console -&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;“AppApi initialize failed! Starting with Android 15, the system has introduced stricter limitations on background network access! So we have transitioned our background operations to use the WorkManager API, which is now a required dependency. Without the WorkManager library, background network calls may be blocked or fail silently, leading to data synchronization issues on newer devices. Please add the androidx.work:work-runtime dependency to your project's build.gradle file“&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''Note:''' ''Please add the'' '''androidx.work:work-runtime''' ''dependency to the project's build.gradle file.''&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Android_SDK_Release_Notes&amp;diff=6993</id>
		<title>Android SDK Release Notes</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Android_SDK_Release_Notes&amp;diff=6993"/>
		<updated>2026-03-19T19:21:06Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: Add the link to new page for &amp;quot;mitigation of Android 15 background issue&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Digital]]&lt;br /&gt;
 __NOTOC__&lt;br /&gt;
&lt;br /&gt;
{{Breadcrumb|}} {{Breadcrumb|Digital Downloads}} {{CurrentBreadcrumb}}&lt;br /&gt;
== Release 10.2.0.0 (03-23-2026) ==&lt;br /&gt;
*[[Mitigation of Android 15 background]] network access restrictions.&lt;br /&gt;
*Fixed Viewabiity defects.&lt;br /&gt;
*Ad length warning - Fixed the ad tracking logic so now, the 300-second warning will only fire if the current ad actually plays for more than 5 minutes, and that error state will no longer bleed over into the next ad.&lt;br /&gt;
&lt;br /&gt;
== Release 10.1.0.0 (10-17-2025) ==&lt;br /&gt;
*Support for FPID multi-instance integrations.&lt;br /&gt;
*Support for Flutter cross-platform plugin.&lt;br /&gt;
*Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 10.0.0.0 (04-04-2025) ==&lt;br /&gt;
*Support for DTVR Subminute product.&lt;br /&gt;
*Support for DCR video playhead bridging.&lt;br /&gt;
*Support for Ethernet network connection for TV platforms.&lt;br /&gt;
*Change in DemographicID behavior for Chromecast.&lt;br /&gt;
*Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 9.2.0.0 (9-27-2023) ==&lt;br /&gt;
*DCR Static recognizing metadata with changed assetID for new impressions. &lt;br /&gt;
*Limiting ping retries during https failures. &lt;br /&gt;
*Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 9.1.0.0 (3-31-2023) ==&lt;br /&gt;
*DCR Static duration measurement for AppSDK (currently only AGF)&lt;br /&gt;
*Viewability: allow enabling by product (DCR, DTVR)&lt;br /&gt;
*Other bug fixes and enhancements&lt;br /&gt;
&lt;br /&gt;
== Release 9.0.0.0 (10-07-2022) ==&lt;br /&gt;
* Viewability measurement for DTVR, DCR Content and DCR Ad products. &lt;br /&gt;
* Audibility measurement for DTVR, DCR Content and DCR Ad products.&lt;br /&gt;
* Kotlin-Java interoperability implementation in SDK.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 8.2.0.0 (03-21-2022) ==&lt;br /&gt;
* Support for EMM AGF AdID-less solution.&lt;br /&gt;
* Enabled SDK to capture network availability changes.&lt;br /&gt;
* Removed the usage of deprecated network classes.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 8.1.0.0 (06-28-2021) ==&lt;br /&gt;
* Support for SDK build variants - AD/NoAD/NoID.&lt;br /&gt;
* Support to indicate ID used for AD build variant - AD ID vs Android ID.&lt;br /&gt;
* Support to capture Hashed email and UID.&lt;br /&gt;
* Support to collect SDK diagnostic data.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 8.0.0.0 (10-05-2020) ==&lt;br /&gt;
* FPID and VendorID support.&lt;br /&gt;
* Support for Android apps running on ChromeOS.&lt;br /&gt;
* Support for Xamarin cross platform framework.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 7.2.0.0 (05-18-2020) ==&lt;br /&gt;
* DTVR AQH and IVD requirements for End and pause timeout.&lt;br /&gt;
* Support for Hybrid app webview measurement. &lt;br /&gt;
* Support for Hybrid app react native webview measurement. &lt;br /&gt;
* Support for React Native measurement.&lt;br /&gt;
* Other bug fixes and enhancements&lt;br /&gt;
&lt;br /&gt;
== Release 7.1.0.0 (12-09-2019) ==&lt;br /&gt;
&lt;br /&gt;
* Application background/foreground state auto-detection (AndroidX)&lt;br /&gt;
* Fixed forward rewind evdata containing negative values&lt;br /&gt;
* Offline viewing measurement enhancements&lt;br /&gt;
* Revisited precedence logic for sfcode parameter&lt;br /&gt;
* Using default value for incorrect adModel parameter&lt;br /&gt;
* Defaulting isLive parameter value on channel change&lt;br /&gt;
* Other fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 7.0.0.0 (09-06-2019) ==&lt;br /&gt;
&lt;br /&gt;
* Support for CDN based config.&lt;br /&gt;
* Support for Market based EMM UAID pings.&lt;br /&gt;
* Changes required for proper DCR Static measurement in multi-instance/multiple appid's case.&lt;br /&gt;
* Fixes for OTT synchronization issues between iOS and Android platforms.&lt;br /&gt;
* Fixes for EV data parameters in few scenarios.&lt;br /&gt;
* Fixes for DCR Static product behaviour in background app refresh and background fetch scenarios.&lt;br /&gt;
* DCR Ad reporting improvements.&lt;br /&gt;
* Fixes and improvements for the SDK console log messages.&lt;br /&gt;
* Other enhancements and fixes.&lt;br /&gt;
&lt;br /&gt;
== Release 6.2.0.0  (02-04-2019) ==&lt;br /&gt;
* Removal of Location Module from SDK Code.&lt;br /&gt;
* Fixed the getOptoutStatus() api, so that client can call it in main thread.&lt;br /&gt;
* Fixed the parsing error happening when clientid/vcid provided as empty in metadata.&lt;br /&gt;
* Align AppSDK for FW detection with BSDK for DCR measurement.&lt;br /&gt;
* Other enhancements and fixes.&lt;br /&gt;
&lt;br /&gt;
== Release 6.1.0.1 (9-13-2018) ==&lt;br /&gt;
*Support added for Video On Demand in TV Ratings&lt;br /&gt;
*Bug fixes and improvements&lt;br /&gt;
&lt;br /&gt;
== Release 6.0.0.4 (5-24-2018) ==&lt;br /&gt;
*If the SDK build target is set to AGF then SDK will send the hello ping to “eu” and “eu-uat” for debug builds. No changes to the non AGF build the default sfcode will continue to be &amp;quot;sdk&amp;quot; and &amp;quot;cert&amp;quot; for debug build.&lt;br /&gt;
*The C1 parameter (NUID) will now be sent as encrypted DeviceID.&lt;br /&gt;
*New SessionID changes. The sessionID will contain 29 length random characters appended by timestamp.&lt;br /&gt;
*Support for multiple SDK instance without any limit.&lt;br /&gt;
*New log feature for CAT tool to retrieve the API level information from client apps. This ping will contain the eventType, parameters, SDK version, appid etc.&lt;br /&gt;
*Removed Viewability for this release.&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.26 (7-31-2017) ==&lt;br /&gt;
*Genre parameter will be a part of DCR pings and the value is reflected as part of c44 parameter.&lt;br /&gt;
*Merged adModel and adLoadType flags&lt;br /&gt;
*Fix for stop event data carried to next session’s duration ping&lt;br /&gt;
*Fix for last playhead call that is not processed (when there is no time-gap between the last playhead and end call)&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.24 (6-2-2017) ==&lt;br /&gt;
*Enhanced support for Digital Audio&lt;br /&gt;
*Ability to pass adloadtype as “linear” or “dynamic”&lt;br /&gt;
*Ability to detect end of content and static material through duration pings&lt;br /&gt;
*Acceptance of empty parameters with a warning message triggered, if a required parameter is missing&lt;br /&gt;
*Acceptance of case-insensitive JSON key values&lt;br /&gt;
*Configurable feature to show Ad view counts in the duration pings&lt;br /&gt;
*Automatic Pause Detection and Debug build detection&lt;br /&gt;
*Change of default ‘type’ from “ad” to “content”&lt;br /&gt;
*Removal of “Static” Launch Ping for Non-Static product implementations&lt;br /&gt;
*Fix for metadata carry over between channels after a channel change&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.18 (1-24-2017) ==&lt;br /&gt;
*Ability to opt-out using “Limit Ad Tracking” feature&lt;br /&gt;
*Improved CPU Performance through encryption process change&lt;br /&gt;
*Opt-Out pages can be served based on user’s language and locale from device&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.14 (12-10-2016) ==&lt;br /&gt;
*Support for Nielsen TV Brand Effect&lt;br /&gt;
*Ability to set CMS parameters at a more global level&lt;br /&gt;
*Collection of additional device information&lt;br /&gt;
*Opt-out pages based on locale and country&lt;br /&gt;
*Opt-out based on the ‘Limit Ad Tracking’ flag&lt;br /&gt;
*Issue a warning in client developer’s console when an ad is being played for more than 5 minutes&lt;br /&gt;
*Reduced load time of Android SDK, caused due to encryption.&lt;br /&gt;
*Limit the duration reported for App launch&lt;br /&gt;
*Modification to accept non-JSON strings&lt;br /&gt;
*Fixed&lt;br /&gt;
**Incorrect DRM placement ID&lt;br /&gt;
**DRM pings sent in bursts in case of time change&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.10 (10-19-2016) ==&lt;br /&gt;
*Fixed an issue where SDK will send a burst of data pings in Android.&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.7 (9-1-2016) ==&lt;br /&gt;
*Support for Android N&lt;br /&gt;
*Usage of stop API call is made optional when switching between content or advertising occurs.&lt;br /&gt;
*General bug fix and performance improvements&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.4 (8-1-2016) ==&lt;br /&gt;
*Support for Pause timeout (from 30 minutes to 5 minutes)&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.3 (7-7-2016) ==&lt;br /&gt;
*Sending event level (button press data) data to census collections.&lt;br /&gt;
*Changes in OTT when switching from mobile to Chromecast&lt;br /&gt;
*General bug fix and performance improvements&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.0.4 (4-25-2016) ==&lt;br /&gt;
*Combined SDK for DCR US and International (Germany)&lt;br /&gt;
*API to signal end of content (end API)&lt;br /&gt;
*Changes to use of stop API&lt;br /&gt;
*Support for OTT measurement&lt;br /&gt;
*Support for Pause timeout&lt;br /&gt;
*Offline viewing&lt;br /&gt;
*Updated API to support JSON object instead of string.&lt;br /&gt;
*Reporting of media URL and bundle ID&lt;br /&gt;
*Updated ping retry logic&lt;br /&gt;
*Changes in OptOut process behavioral&lt;br /&gt;
*Enhanced Debugging and SDK logging&lt;br /&gt;
*Changes to API signature&lt;br /&gt;
*Introduced new API updateOTT to report current OTT status.&lt;br /&gt;
&lt;br /&gt;
== Release 4.0.0.8 (6-9-2015) ==&lt;br /&gt;
*Support for Nielsen DCR product (Digital Content Ratings)&lt;br /&gt;
*All the products should be migrated to the latest SDK.&lt;br /&gt;
*This SDK distribution does not have a native library component or shared object.&lt;br /&gt;
*Support for Nielsen App static measurement&lt;br /&gt;
*Support for Ad measurement&lt;br /&gt;
*Removal of Native C++ code&lt;br /&gt;
*Removed singleton restriction&lt;br /&gt;
*Support for Android 6.0 Marshmallow&lt;br /&gt;
*General bug fix and performance improvements&lt;br /&gt;
&lt;br /&gt;
== Release 1.2.3.8 (1-10-2015) ==&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Android_SDK_Release_Notes&amp;diff=6992</id>
		<title>Android SDK Release Notes</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Android_SDK_Release_Notes&amp;diff=6992"/>
		<updated>2026-03-19T19:09:44Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: Android 10.2.0. release notes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Digital]]&lt;br /&gt;
 __NOTOC__&lt;br /&gt;
&lt;br /&gt;
{{Breadcrumb|}} {{Breadcrumb|Digital Downloads}} {{CurrentBreadcrumb}}&lt;br /&gt;
== Release 10.2.0.0 (03-23-2026) ==&lt;br /&gt;
*Mitigation of Android 15 background network access restrictions.&lt;br /&gt;
*Fixed Viewabiity defects.&lt;br /&gt;
*Ad length warning - Fixed the ad tracking logic so now, the 300-second warning will only fire if the current ad actually plays for more than 5 minutes, and that error state will no longer bleed over into the next ad.&lt;br /&gt;
&lt;br /&gt;
== Release 10.1.0.0 (10-17-2025) ==&lt;br /&gt;
*Support for FPID multi-instance integrations.&lt;br /&gt;
*Support for Flutter cross-platform plugin.&lt;br /&gt;
*Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 10.0.0.0 (04-04-2025) ==&lt;br /&gt;
*Support for DTVR Subminute product.&lt;br /&gt;
*Support for DCR video playhead bridging.&lt;br /&gt;
*Support for Ethernet network connection for TV platforms.&lt;br /&gt;
*Change in DemographicID behavior for Chromecast.&lt;br /&gt;
*Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 9.2.0.0 (9-27-2023) ==&lt;br /&gt;
*DCR Static recognizing metadata with changed assetID for new impressions. &lt;br /&gt;
*Limiting ping retries during https failures. &lt;br /&gt;
*Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 9.1.0.0 (3-31-2023) ==&lt;br /&gt;
*DCR Static duration measurement for AppSDK (currently only AGF)&lt;br /&gt;
*Viewability: allow enabling by product (DCR, DTVR)&lt;br /&gt;
*Other bug fixes and enhancements&lt;br /&gt;
&lt;br /&gt;
== Release 9.0.0.0 (10-07-2022) ==&lt;br /&gt;
* Viewability measurement for DTVR, DCR Content and DCR Ad products. &lt;br /&gt;
* Audibility measurement for DTVR, DCR Content and DCR Ad products.&lt;br /&gt;
* Kotlin-Java interoperability implementation in SDK.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 8.2.0.0 (03-21-2022) ==&lt;br /&gt;
* Support for EMM AGF AdID-less solution.&lt;br /&gt;
* Enabled SDK to capture network availability changes.&lt;br /&gt;
* Removed the usage of deprecated network classes.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 8.1.0.0 (06-28-2021) ==&lt;br /&gt;
* Support for SDK build variants - AD/NoAD/NoID.&lt;br /&gt;
* Support to indicate ID used for AD build variant - AD ID vs Android ID.&lt;br /&gt;
* Support to capture Hashed email and UID.&lt;br /&gt;
* Support to collect SDK diagnostic data.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 8.0.0.0 (10-05-2020) ==&lt;br /&gt;
* FPID and VendorID support.&lt;br /&gt;
* Support for Android apps running on ChromeOS.&lt;br /&gt;
* Support for Xamarin cross platform framework.&lt;br /&gt;
* Other bug fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 7.2.0.0 (05-18-2020) ==&lt;br /&gt;
* DTVR AQH and IVD requirements for End and pause timeout.&lt;br /&gt;
* Support for Hybrid app webview measurement. &lt;br /&gt;
* Support for Hybrid app react native webview measurement. &lt;br /&gt;
* Support for React Native measurement.&lt;br /&gt;
* Other bug fixes and enhancements&lt;br /&gt;
&lt;br /&gt;
== Release 7.1.0.0 (12-09-2019) ==&lt;br /&gt;
&lt;br /&gt;
* Application background/foreground state auto-detection (AndroidX)&lt;br /&gt;
* Fixed forward rewind evdata containing negative values&lt;br /&gt;
* Offline viewing measurement enhancements&lt;br /&gt;
* Revisited precedence logic for sfcode parameter&lt;br /&gt;
* Using default value for incorrect adModel parameter&lt;br /&gt;
* Defaulting isLive parameter value on channel change&lt;br /&gt;
* Other fixes and enhancements.&lt;br /&gt;
&lt;br /&gt;
== Release 7.0.0.0 (09-06-2019) ==&lt;br /&gt;
&lt;br /&gt;
* Support for CDN based config.&lt;br /&gt;
* Support for Market based EMM UAID pings.&lt;br /&gt;
* Changes required for proper DCR Static measurement in multi-instance/multiple appid's case.&lt;br /&gt;
* Fixes for OTT synchronization issues between iOS and Android platforms.&lt;br /&gt;
* Fixes for EV data parameters in few scenarios.&lt;br /&gt;
* Fixes for DCR Static product behaviour in background app refresh and background fetch scenarios.&lt;br /&gt;
* DCR Ad reporting improvements.&lt;br /&gt;
* Fixes and improvements for the SDK console log messages.&lt;br /&gt;
* Other enhancements and fixes.&lt;br /&gt;
&lt;br /&gt;
== Release 6.2.0.0  (02-04-2019) ==&lt;br /&gt;
* Removal of Location Module from SDK Code.&lt;br /&gt;
* Fixed the getOptoutStatus() api, so that client can call it in main thread.&lt;br /&gt;
* Fixed the parsing error happening when clientid/vcid provided as empty in metadata.&lt;br /&gt;
* Align AppSDK for FW detection with BSDK for DCR measurement.&lt;br /&gt;
* Other enhancements and fixes.&lt;br /&gt;
&lt;br /&gt;
== Release 6.1.0.1 (9-13-2018) ==&lt;br /&gt;
*Support added for Video On Demand in TV Ratings&lt;br /&gt;
*Bug fixes and improvements&lt;br /&gt;
&lt;br /&gt;
== Release 6.0.0.4 (5-24-2018) ==&lt;br /&gt;
*If the SDK build target is set to AGF then SDK will send the hello ping to “eu” and “eu-uat” for debug builds. No changes to the non AGF build the default sfcode will continue to be &amp;quot;sdk&amp;quot; and &amp;quot;cert&amp;quot; for debug build.&lt;br /&gt;
*The C1 parameter (NUID) will now be sent as encrypted DeviceID.&lt;br /&gt;
*New SessionID changes. The sessionID will contain 29 length random characters appended by timestamp.&lt;br /&gt;
*Support for multiple SDK instance without any limit.&lt;br /&gt;
*New log feature for CAT tool to retrieve the API level information from client apps. This ping will contain the eventType, parameters, SDK version, appid etc.&lt;br /&gt;
*Removed Viewability for this release.&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.26 (7-31-2017) ==&lt;br /&gt;
*Genre parameter will be a part of DCR pings and the value is reflected as part of c44 parameter.&lt;br /&gt;
*Merged adModel and adLoadType flags&lt;br /&gt;
*Fix for stop event data carried to next session’s duration ping&lt;br /&gt;
*Fix for last playhead call that is not processed (when there is no time-gap between the last playhead and end call)&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.24 (6-2-2017) ==&lt;br /&gt;
*Enhanced support for Digital Audio&lt;br /&gt;
*Ability to pass adloadtype as “linear” or “dynamic”&lt;br /&gt;
*Ability to detect end of content and static material through duration pings&lt;br /&gt;
*Acceptance of empty parameters with a warning message triggered, if a required parameter is missing&lt;br /&gt;
*Acceptance of case-insensitive JSON key values&lt;br /&gt;
*Configurable feature to show Ad view counts in the duration pings&lt;br /&gt;
*Automatic Pause Detection and Debug build detection&lt;br /&gt;
*Change of default ‘type’ from “ad” to “content”&lt;br /&gt;
*Removal of “Static” Launch Ping for Non-Static product implementations&lt;br /&gt;
*Fix for metadata carry over between channels after a channel change&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.18 (1-24-2017) ==&lt;br /&gt;
*Ability to opt-out using “Limit Ad Tracking” feature&lt;br /&gt;
*Improved CPU Performance through encryption process change&lt;br /&gt;
*Opt-Out pages can be served based on user’s language and locale from device&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.14 (12-10-2016) ==&lt;br /&gt;
*Support for Nielsen TV Brand Effect&lt;br /&gt;
*Ability to set CMS parameters at a more global level&lt;br /&gt;
*Collection of additional device information&lt;br /&gt;
*Opt-out pages based on locale and country&lt;br /&gt;
*Opt-out based on the ‘Limit Ad Tracking’ flag&lt;br /&gt;
*Issue a warning in client developer’s console when an ad is being played for more than 5 minutes&lt;br /&gt;
*Reduced load time of Android SDK, caused due to encryption.&lt;br /&gt;
*Limit the duration reported for App launch&lt;br /&gt;
*Modification to accept non-JSON strings&lt;br /&gt;
*Fixed&lt;br /&gt;
**Incorrect DRM placement ID&lt;br /&gt;
**DRM pings sent in bursts in case of time change&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.10 (10-19-2016) ==&lt;br /&gt;
*Fixed an issue where SDK will send a burst of data pings in Android.&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.7 (9-1-2016) ==&lt;br /&gt;
*Support for Android N&lt;br /&gt;
*Usage of stop API call is made optional when switching between content or advertising occurs.&lt;br /&gt;
*General bug fix and performance improvements&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.4 (8-1-2016) ==&lt;br /&gt;
*Support for Pause timeout (from 30 minutes to 5 minutes)&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.1.3 (7-7-2016) ==&lt;br /&gt;
*Sending event level (button press data) data to census collections.&lt;br /&gt;
*Changes in OTT when switching from mobile to Chromecast&lt;br /&gt;
*General bug fix and performance improvements&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.0.4 (4-25-2016) ==&lt;br /&gt;
*Combined SDK for DCR US and International (Germany)&lt;br /&gt;
*API to signal end of content (end API)&lt;br /&gt;
*Changes to use of stop API&lt;br /&gt;
*Support for OTT measurement&lt;br /&gt;
*Support for Pause timeout&lt;br /&gt;
*Offline viewing&lt;br /&gt;
*Updated API to support JSON object instead of string.&lt;br /&gt;
*Reporting of media URL and bundle ID&lt;br /&gt;
*Updated ping retry logic&lt;br /&gt;
*Changes in OptOut process behavioral&lt;br /&gt;
*Enhanced Debugging and SDK logging&lt;br /&gt;
*Changes to API signature&lt;br /&gt;
*Introduced new API updateOTT to report current OTT status.&lt;br /&gt;
&lt;br /&gt;
== Release 4.0.0.8 (6-9-2015) ==&lt;br /&gt;
*Support for Nielsen DCR product (Digital Content Ratings)&lt;br /&gt;
*All the products should be migrated to the latest SDK.&lt;br /&gt;
*This SDK distribution does not have a native library component or shared object.&lt;br /&gt;
*Support for Nielsen App static measurement&lt;br /&gt;
*Support for Ad measurement&lt;br /&gt;
*Removal of Native C++ code&lt;br /&gt;
*Removed singleton restriction&lt;br /&gt;
*Support for Android 6.0 Marshmallow&lt;br /&gt;
*General bug fix and performance improvements&lt;br /&gt;
&lt;br /&gt;
== Release 1.2.3.8 (1-10-2015) ==&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_Release_Notes&amp;diff=6956</id>
		<title>Browser SDK Release Notes</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_Release_Notes&amp;diff=6956"/>
		<updated>2026-03-06T15:48:15Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: Release notes for R1 2026 BSDK release&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
== Release R1(v6.0.0.747) (03-04-2026) ==&lt;br /&gt;
&lt;br /&gt;
* Added support for Viewability &amp;amp; Audibility&lt;br /&gt;
* Last DTVR Subminute ping for iOS-Safari browser was not fired through the POST request.&lt;br /&gt;
* Fix for some RTVOD sceanrios&lt;br /&gt;
* Fix to not fire a DTVR Subminute timer ping with the evdata containing 00000 offset when FD channel transitions from a valid CID to null&lt;br /&gt;
&lt;br /&gt;
== Release R1(v6.0.0.734) (07-08-2025) ==&lt;br /&gt;
&lt;br /&gt;
* Support for DTVR Subminute feature&lt;br /&gt;
&lt;br /&gt;
== Release V1(v6.0.110) (05-21-2024) ==&lt;br /&gt;
&lt;br /&gt;
* Suppression of v60/v52/v53 legacy pings&lt;br /&gt;
&lt;br /&gt;
== Release R2(v6.0.0.702) (10-30-2024) ==&lt;br /&gt;
&lt;br /&gt;
* 2nd release of DOMless SDK&lt;br /&gt;
* Support DCR Static&lt;br /&gt;
* Support Debug interface which can be used to view API calls and SDK pings&lt;br /&gt;
* Support caching of pings when network is not available&lt;br /&gt;
&lt;br /&gt;
== Release R1(v6.0.0.692) (07-31-2024) ==&lt;br /&gt;
&lt;br /&gt;
* DOMless SDK Release with support for Amazon, ReactNative and other DOM less platforms&lt;br /&gt;
&lt;br /&gt;
== Release R6(v6.0.0.673) (09-05-2023) ==&lt;br /&gt;
&lt;br /&gt;
* Fix for stream id of stream 2 is populated in the last duration ping of stream 1 when mandatory END is not called&lt;br /&gt;
&lt;br /&gt;
== Release R5(v6.0.0.673) (08-14-2023) (AGF Release) ==&lt;br /&gt;
&lt;br /&gt;
* Fix for stream id of stream 2 is populated in the last duration ping of stream 1 when mandatory END is not called&lt;br /&gt;
&lt;br /&gt;
== Release R4(v6.0.0.672) (08-01-2023) ==&lt;br /&gt;
&lt;br /&gt;
* Viewability build with support for Viewability and Audibility features&lt;br /&gt;
&lt;br /&gt;
== Release R3(v6.0.0.663) (05-30-2023) ==&lt;br /&gt;
&lt;br /&gt;
* Support to measure static on hbbtv with the iFrame fixes.&lt;br /&gt;
&lt;br /&gt;
== Release R2(v.6.0.0.648) (05-03-2023) (AGF Release) ==&lt;br /&gt;
&lt;br /&gt;
* Support to measure DCR static when browser sdk is initialized on parent page while video is played within the iFrame&lt;br /&gt;
* Fix to propagate correct starttm value in postroll content trailing ping&lt;br /&gt;
* Fix the 1st party cookie expiry date&lt;br /&gt;
* Fix first party id time to live parameter (nol_fpid_ttl) override&lt;br /&gt;
* Update the sessionURL in BSDK600 code with FPID parameters&lt;br /&gt;
* SIVT support for DCR &amp;amp; DTVR&lt;br /&gt;
* StaticEnd support for Hybrid App&lt;br /&gt;
&lt;br /&gt;
== Release R1.2(v6.0.0.662) (04-19-2023) ==&lt;br /&gt;
* Support to measure DCR static when browser sdk is initialized on parent page while video is played within the iFrame&lt;br /&gt;
* Support to measure DCR static on a Single Page Application when staticEnd is not called while navigating from one page to another&lt;br /&gt;
&lt;br /&gt;
== Release R1(v6.0.0.648) (03-06-2023) ==&lt;br /&gt;
* SIVT support for DCR &amp;amp; DTVR&lt;br /&gt;
* StaticEnd support for Hybrid App&lt;br /&gt;
&lt;br /&gt;
== Release R4(v6.0.0.623) (05-02-2022) ==&lt;br /&gt;
* Fix the 1st party cookie expiry date&lt;br /&gt;
* Fix first party id time to live parameter (nol_fpid_ttl) override&lt;br /&gt;
* Update the sessionURL in BSDK600 code with FPID parameters&lt;br /&gt;
&lt;br /&gt;
== Release R3(v6.0.0.618) (03-29-2022) ==&lt;br /&gt;
* Fix to measure dcr static while video is in focus and within an iFrame&lt;br /&gt;
* Fix to propagate correct starttm value in postroll content trailing ping&lt;br /&gt;
&lt;br /&gt;
== Release v6.0.0.355 ==&lt;br /&gt;
* Performance improvements through the use of cachable configuration via the Static Queue Snippet.&lt;br /&gt;
* Dynamic Configuration File&lt;br /&gt;
* Session Ping/UAID - A unique identifier of the device which allows for a single facebook ping per session.&lt;br /&gt;
* Support for iOS 12.2&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.0 (Build 2) ==&lt;br /&gt;
*Support for DCR Static Lite Measurement&lt;br /&gt;
*Advanced Dynamic Script Initialization&lt;br /&gt;
*Removal of Configuration file dependency&lt;br /&gt;
&lt;br /&gt;
== Release 5.0.0 (Build 17) ==   &lt;br /&gt;
*Support for Nielsen Digital Content Ratings (DCR) product&lt;br /&gt;
*Support for measurement of static content&lt;br /&gt;
*Support for Ad measurement&lt;br /&gt;
*Support for Facebook Pings&lt;br /&gt;
*Support for multiple instances of the SDK&lt;br /&gt;
*General bug fix and performance improvements&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Domless_SDK_API_Reference&amp;diff=6945</id>
		<title>Domless SDK API Reference</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Domless_SDK_API_Reference&amp;diff=6945"/>
		<updated>2026-01-27T21:27:38Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: /* SetInterval */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==License==&lt;br /&gt;
Nielsen SDK contains material that is protected by copyright laws, patent laws, trade secret laws, and by international treaty provisions and is Copyright © 2024 The Nielsen Company (US) LLC. All intellectual property rights and licenses therein are reserved by The Nielsen Company (US) LLC and its licensors. Please read the license agreement presented [https://engineeringportal.nielsen.com/wiki/Special:ClickThrough here], which must be accepted in order to download the Nielsen SDKs. For more information, reach out to your Nielsen Technical Account Manager(TAM).&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen DOM-less SDK provides APIs that allows our clients to integrate the Nielsen SDK in DOM-less environments, e.g., React Native, Node, etc.&lt;br /&gt;
&lt;br /&gt;
== DOM-less SDK Initialization ==&lt;br /&gt;
&lt;br /&gt;
=== Obtain the Nielsen Application ID (apid) ===&lt;br /&gt;
The Nielsen &amp;lt;code&amp;gt;apid&amp;lt;/code&amp;gt; is required to enable SDK functionality. Technical Account Manager will provide an apid for each player configuration. Browser SDK can support URLs that use any of the protocols – HTTPS and HTTP.&lt;br /&gt;
&lt;br /&gt;
=== Configure the DOM-less SDK ===&lt;br /&gt;
====Installation====&lt;br /&gt;
Install with &amp;lt;code&amp;gt;npm install &amp;lt;nowiki&amp;gt;https://github.com/NielsenDigitalSDK/bsdk-domless&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and import the &amp;lt;code&amp;gt;BsdkInstance&amp;lt;/code&amp;gt; into video player component&lt;br /&gt;
 import { BsdkInstance } from 'bsdk-domless'&lt;br /&gt;
======status.ok()======&lt;br /&gt;
Initialization of the instance can be done with &amp;lt;code&amp;gt;status.ok()&amp;lt;/code&amp;gt; function or use Promise handling approach&lt;br /&gt;
 const instance = await new BsdkInstance(appID, instanceName, instanceMetadata, implementationHooks);&lt;br /&gt;
 &lt;br /&gt;
 if (instance &amp;amp;&amp;amp; instance.status.ok()) {&lt;br /&gt;
     expect(instance).not.toBe(undefined);&lt;br /&gt;
     expect(instance.status.ok()).toBe(true);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: ImplementationHooks are mandatory for the DOM-less SDK instance. Please refer to the ImplementationHooks section below for details.&lt;br /&gt;
&lt;br /&gt;
====Exposed Interface====&lt;br /&gt;
The exposed interface is as follows:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;code&amp;gt;`ggPM`&amp;lt;/code&amp;gt; - method to send messages to the Nielsen SDK&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;code&amp;gt;`processEvent`&amp;lt;/code&amp;gt; - method to send app state to the Nielsen SDK, e.g., focus, blur, appclose&lt;br /&gt;
=== Initialization Global Parameters ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!'''Parameter'''&lt;br /&gt;
!'''Description'''&lt;br /&gt;
!'''Value'''&lt;br /&gt;
|-&lt;br /&gt;
|apid&lt;br /&gt;
|UniqueID assigned to player/site.&lt;br /&gt;
|'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName&lt;br /&gt;
|Name of SDK instance&lt;br /&gt;
|&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|domlessEnv&lt;br /&gt;
|Type of Dom-less environment like ReactNative, Node, etc.&lt;br /&gt;
|&amp;quot;domlessEnv&amp;quot;: &amp;quot;1&amp;quot;, // For ReactNative&lt;br /&gt;
&amp;quot;domlessEnv&amp;quot;: &amp;quot;2&amp;quot;, // For Amazon&lt;br /&gt;
&lt;br /&gt;
&amp;quot;domlessEnv&amp;quot;: &amp;quot;3&amp;quot;, // For NodeJS&lt;br /&gt;
&lt;br /&gt;
“domlessEnv”: “4”, // For Custom&lt;br /&gt;
|-&lt;br /&gt;
|deviceId&lt;br /&gt;
|Device Identifier&lt;br /&gt;
|Alphanumeric string eg. &lt;br /&gt;
|-&lt;br /&gt;
|nol_sdkDebug&lt;br /&gt;
|Enables Nielsen console logging. Only required for testing&lt;br /&gt;
|&amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|optout&lt;br /&gt;
|User optout status&lt;br /&gt;
|&amp;quot;true&amp;quot;, &amp;quot;false&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_sha256&lt;br /&gt;
|SHA256-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_sha1&lt;br /&gt;
|SHA1-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;XvBniTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_md5&lt;br /&gt;
|MD5-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;JnIbdTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|uid2&lt;br /&gt;
|An identifier based on a user’s verifiable PII (e.g. hashed email). UID2.0 was initially created by The Trade Desk (TTD) and is now managed by Prebid.&lt;br /&gt;
|&amp;quot;MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|uid2_token&lt;br /&gt;
|Encrypted Unified ID 2.0&lt;br /&gt;
|&amp;quot;AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8Ql&lt;br /&gt;
DSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeK QI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhC xG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|luid&lt;br /&gt;
|Living Unit ID - Experian Household ID&lt;br /&gt;
'''Note: This parameter is applicable only for CTV and First Party Livestream data'''&lt;br /&gt;
|&amp;quot;B0EOFEDgD&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Implementation Hooks ===&lt;br /&gt;
====='''''&amp;lt;pre style=&amp;quot;color: green; font-weight: bold; font-size: 20px&amp;quot;&amp;gt;Note: Implementation Hooks are mandatory for the DOM-less SDK to function as expected.&amp;lt;/pre&amp;gt;'''''=====&lt;br /&gt;
&lt;br /&gt;
This object captures the required entities for the DOM-less SDK to operate correctly. These are normally platform dependent and are expected to be passed on to the DOM-less SDK as part of its initialization. See below for the descriptions of each key.&lt;br /&gt;
&lt;br /&gt;
==== '''log''' ====&lt;br /&gt;
Log the DOM-less SDK messages to an external stream, e.g. the browser console, stdout.&lt;br /&gt;
&lt;br /&gt;
e.g. Log.debug('debug', 'NIELSEN TAGS EXPECTED TO FIRE:')&lt;br /&gt;
&lt;br /&gt;
===== Methods =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;info()&lt;br /&gt;
&lt;br /&gt;
Log.info(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
debug()&lt;br /&gt;
&lt;br /&gt;
Log.debug(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
warn()&lt;br /&gt;
&lt;br /&gt;
Log.warn(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
error()&lt;br /&gt;
&lt;br /&gt;
Log.error(label: string, ...message: string[]): void&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;label Required&lt;br /&gt;
&lt;br /&gt;
● string - severity type, e.g. info, debug, warn, error or custom label&lt;br /&gt;
&lt;br /&gt;
message Required&lt;br /&gt;
&lt;br /&gt;
● string - message that will be output to the console&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== storage ====&lt;br /&gt;
Persistent storage of key/values, similar in behavior to browser localStorage.&lt;br /&gt;
&lt;br /&gt;
e.g. storage.setItem('nol_lsid', 'umy3w4ik9usw2ppqmw2vkecckxfob1697308388')&lt;br /&gt;
&lt;br /&gt;
===== Methods =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;setItem()&lt;br /&gt;
&lt;br /&gt;
storage.setItem(key: string, value: string)&lt;br /&gt;
&lt;br /&gt;
getItem()&lt;br /&gt;
&lt;br /&gt;
storage.getItem(key: string)&lt;br /&gt;
&lt;br /&gt;
removeItem()&lt;br /&gt;
&lt;br /&gt;
storage.removeItem(key: string)&lt;br /&gt;
&lt;br /&gt;
clear()&lt;br /&gt;
&lt;br /&gt;
storage.clear()&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== fetch ====&lt;br /&gt;
Function to fetch resources from the network. Required for the transmission of the DOM-less SDK requests (pings) to the Nielsen endpoints.&lt;br /&gt;
&lt;br /&gt;
e.g. Fetch(resource: string, options: object)&lt;br /&gt;
&lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;resource Required&lt;br /&gt;
&lt;br /&gt;
● A string that provides the URL of the resource to fetch&lt;br /&gt;
&lt;br /&gt;
options Optional Object containing settings to apply to the request:&lt;br /&gt;
&lt;br /&gt;
method&lt;br /&gt;
&lt;br /&gt;
● string - request method: &amp;quot;GET&amp;quot;, &amp;quot;POST&amp;quot;. If one is not provided SDK will default to &amp;quot;GET&amp;quot;&lt;br /&gt;
&lt;br /&gt;
headers&lt;br /&gt;
&lt;br /&gt;
● object - headers to add to the outgoing request, an object literal with String values&lt;br /&gt;
&lt;br /&gt;
body&lt;br /&gt;
&lt;br /&gt;
● string - body to add to the request; SDK will send out string&lt;br /&gt;
&lt;br /&gt;
mode&lt;br /&gt;
&lt;br /&gt;
● string - mode for request: cors, no-cors, same-origin&lt;br /&gt;
&lt;br /&gt;
referrer&lt;br /&gt;
&lt;br /&gt;
● string - a string specifying the referrer of the request&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SetTimeout ====&lt;br /&gt;
Function to set a timer in milliseconds to execute a block of code on expiry&lt;br /&gt;
&lt;br /&gt;
e.g. SetTimeout(callback , 1000) &lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;callback Required&lt;br /&gt;
&lt;br /&gt;
● A function to execute when the timer expires&lt;br /&gt;
&lt;br /&gt;
timeout Required&lt;br /&gt;
&lt;br /&gt;
● number - The time that the timer should wait before the callback function is executed. This is in milliseconds.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SetInterval ====&lt;br /&gt;
Function to repeatedly call a function with a fixed time delay in milliseconds between each call.&lt;br /&gt;
&lt;br /&gt;
e.g. SetInterval(callback , 1000) &lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;callback Required&lt;br /&gt;
&lt;br /&gt;
● A function to be executed every interval specified&lt;br /&gt;
&lt;br /&gt;
interval Required&lt;br /&gt;
&lt;br /&gt;
● number - The delay in milliseconds between the execution of the function&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ClearTimeout ====&lt;br /&gt;
Function to cancel the timeout previously set by SetTimeout&lt;br /&gt;
&lt;br /&gt;
e.g. ClearTimeout(1000) &lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;timeout Required&lt;br /&gt;
&lt;br /&gt;
● number - The time that the timer should wait before the callback function is executed&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
==== ClearInterval ====&lt;br /&gt;
Function to cancel the timed repeating call which was previously established through SetInterval&lt;br /&gt;
&lt;br /&gt;
e.g. ClearInterval(1000) &lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;interval Required&lt;br /&gt;
&lt;br /&gt;
● number - The delay between the execution of the function&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
==== Nielsen Debug Node.js Server for Event Tracking ====&lt;br /&gt;
We are excited to announce the beta version of our Debug Node.js server, designed to track requests and events sent from our Dom-less SDK using WebSocket connections. While this feature is not officially released, we are currently looking for users interested in beta testing.&lt;br /&gt;
&lt;br /&gt;
If you'd like to try this tool and provide feedback, please reach out to your Nielsen Technical Account Manager (TAM) for more information. Your insights would be invaluable in helping us refine this feature for a future release!&lt;br /&gt;
&lt;br /&gt;
== DOM-less SDK API Methods &amp;amp; Properties ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Method/Property&lt;br /&gt;
!Event #&lt;br /&gt;
!DTVR&lt;br /&gt;
!DAR&lt;br /&gt;
!DCR&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|[[play (Browser)|play]]&lt;br /&gt;
|5&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used when there is an ID3 fed product such as DTVR and the client does not want to send in all the CMS metadata that is sent in loadMetadata. This allows the client to send in at least the required “channel name” value associated to the ID3 feed. When the client passes in the channelName, they can change the CMS data stored by passing new values. If this event is not called then the “channel name” value populated will be the default value of “defaultChannelName”.&lt;br /&gt;
|-&lt;br /&gt;
|[[stop (Browser)|stop]]&lt;br /&gt;
|7&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used when switching between ad and content or content and ad.&lt;br /&gt;
|-&lt;br /&gt;
|[[loadMetadata (Browser)|loadMetadata]]&lt;br /&gt;
|15&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|Used when there is a preroll ad that needs to be associated with content metadata. The loadMetadata will first be called to populate the content metadata values and then the loadMetadata for ad metadata will be called. This allows sending a content ping with the ad info, even if the user bails out during the preroll ad.&lt;br /&gt;
|-&lt;br /&gt;
|[[setPlayheadPosition (Browser)|setPlayheadPosition]]&lt;br /&gt;
|49&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to send the playhead position.&lt;br /&gt;
|-&lt;br /&gt;
|[[sendID3 (Browser)|sendID3]]&lt;br /&gt;
|55&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|Used to send the ID3 metadata.&lt;br /&gt;
|-&lt;br /&gt;
|[[end (Browser)|end]]&lt;br /&gt;
|57&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|This is triggered 1) at the end of the content stream, 2) if the user switches to another piece of content 3) when the browser is refreshed or closed&lt;br /&gt;
|-&lt;br /&gt;
|[[setVolume (Browser)|setVolume]]&lt;br /&gt;
|61&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to pass in the player volume levels in %. Default value is -1.&lt;br /&gt;
|-&lt;br /&gt;
|[[staticstart (Browser)|staticstart]]&lt;br /&gt;
|14&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to send the metadata for the static page.&lt;br /&gt;
|-&lt;br /&gt;
|[[StaticEnd (Browser)|staticend]]&lt;br /&gt;
|56&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|In Single Page Application (SPA) it is imperative that staticend is called prior to the loading of new metadata. This allows the SDK to properly credit the previous section/content being viewed before measuring the new one.&lt;br /&gt;
|-&lt;br /&gt;
|[[onPaginate (Browser)|onPaginate]]&lt;br /&gt;
|30&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to initialize the SDK object&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Domless_SDK_API_Reference&amp;diff=6944</id>
		<title>Domless SDK API Reference</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Domless_SDK_API_Reference&amp;diff=6944"/>
		<updated>2026-01-27T21:27:03Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: /* SetTimeout */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==License==&lt;br /&gt;
Nielsen SDK contains material that is protected by copyright laws, patent laws, trade secret laws, and by international treaty provisions and is Copyright © 2024 The Nielsen Company (US) LLC. All intellectual property rights and licenses therein are reserved by The Nielsen Company (US) LLC and its licensors. Please read the license agreement presented [https://engineeringportal.nielsen.com/wiki/Special:ClickThrough here], which must be accepted in order to download the Nielsen SDKs. For more information, reach out to your Nielsen Technical Account Manager(TAM).&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen DOM-less SDK provides APIs that allows our clients to integrate the Nielsen SDK in DOM-less environments, e.g., React Native, Node, etc.&lt;br /&gt;
&lt;br /&gt;
== DOM-less SDK Initialization ==&lt;br /&gt;
&lt;br /&gt;
=== Obtain the Nielsen Application ID (apid) ===&lt;br /&gt;
The Nielsen &amp;lt;code&amp;gt;apid&amp;lt;/code&amp;gt; is required to enable SDK functionality. Technical Account Manager will provide an apid for each player configuration. Browser SDK can support URLs that use any of the protocols – HTTPS and HTTP.&lt;br /&gt;
&lt;br /&gt;
=== Configure the DOM-less SDK ===&lt;br /&gt;
====Installation====&lt;br /&gt;
Install with &amp;lt;code&amp;gt;npm install &amp;lt;nowiki&amp;gt;https://github.com/NielsenDigitalSDK/bsdk-domless&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and import the &amp;lt;code&amp;gt;BsdkInstance&amp;lt;/code&amp;gt; into video player component&lt;br /&gt;
 import { BsdkInstance } from 'bsdk-domless'&lt;br /&gt;
======status.ok()======&lt;br /&gt;
Initialization of the instance can be done with &amp;lt;code&amp;gt;status.ok()&amp;lt;/code&amp;gt; function or use Promise handling approach&lt;br /&gt;
 const instance = await new BsdkInstance(appID, instanceName, instanceMetadata, implementationHooks);&lt;br /&gt;
 &lt;br /&gt;
 if (instance &amp;amp;&amp;amp; instance.status.ok()) {&lt;br /&gt;
     expect(instance).not.toBe(undefined);&lt;br /&gt;
     expect(instance.status.ok()).toBe(true);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: ImplementationHooks are mandatory for the DOM-less SDK instance. Please refer to the ImplementationHooks section below for details.&lt;br /&gt;
&lt;br /&gt;
====Exposed Interface====&lt;br /&gt;
The exposed interface is as follows:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;code&amp;gt;`ggPM`&amp;lt;/code&amp;gt; - method to send messages to the Nielsen SDK&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;code&amp;gt;`processEvent`&amp;lt;/code&amp;gt; - method to send app state to the Nielsen SDK, e.g., focus, blur, appclose&lt;br /&gt;
=== Initialization Global Parameters ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!'''Parameter'''&lt;br /&gt;
!'''Description'''&lt;br /&gt;
!'''Value'''&lt;br /&gt;
|-&lt;br /&gt;
|apid&lt;br /&gt;
|UniqueID assigned to player/site.&lt;br /&gt;
|'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName&lt;br /&gt;
|Name of SDK instance&lt;br /&gt;
|&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|domlessEnv&lt;br /&gt;
|Type of Dom-less environment like ReactNative, Node, etc.&lt;br /&gt;
|&amp;quot;domlessEnv&amp;quot;: &amp;quot;1&amp;quot;, // For ReactNative&lt;br /&gt;
&amp;quot;domlessEnv&amp;quot;: &amp;quot;2&amp;quot;, // For Amazon&lt;br /&gt;
&lt;br /&gt;
&amp;quot;domlessEnv&amp;quot;: &amp;quot;3&amp;quot;, // For NodeJS&lt;br /&gt;
&lt;br /&gt;
“domlessEnv”: “4”, // For Custom&lt;br /&gt;
|-&lt;br /&gt;
|deviceId&lt;br /&gt;
|Device Identifier&lt;br /&gt;
|Alphanumeric string eg. &lt;br /&gt;
|-&lt;br /&gt;
|nol_sdkDebug&lt;br /&gt;
|Enables Nielsen console logging. Only required for testing&lt;br /&gt;
|&amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|optout&lt;br /&gt;
|User optout status&lt;br /&gt;
|&amp;quot;true&amp;quot;, &amp;quot;false&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_sha256&lt;br /&gt;
|SHA256-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_sha1&lt;br /&gt;
|SHA1-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;XvBniTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_md5&lt;br /&gt;
|MD5-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;JnIbdTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|uid2&lt;br /&gt;
|An identifier based on a user’s verifiable PII (e.g. hashed email). UID2.0 was initially created by The Trade Desk (TTD) and is now managed by Prebid.&lt;br /&gt;
|&amp;quot;MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|uid2_token&lt;br /&gt;
|Encrypted Unified ID 2.0&lt;br /&gt;
|&amp;quot;AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8Ql&lt;br /&gt;
DSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeK QI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhC xG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|luid&lt;br /&gt;
|Living Unit ID - Experian Household ID&lt;br /&gt;
'''Note: This parameter is applicable only for CTV and First Party Livestream data'''&lt;br /&gt;
|&amp;quot;B0EOFEDgD&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Implementation Hooks ===&lt;br /&gt;
====='''''&amp;lt;pre style=&amp;quot;color: green; font-weight: bold; font-size: 20px&amp;quot;&amp;gt;Note: Implementation Hooks are mandatory for the DOM-less SDK to function as expected.&amp;lt;/pre&amp;gt;'''''=====&lt;br /&gt;
&lt;br /&gt;
This object captures the required entities for the DOM-less SDK to operate correctly. These are normally platform dependent and are expected to be passed on to the DOM-less SDK as part of its initialization. See below for the descriptions of each key.&lt;br /&gt;
&lt;br /&gt;
==== '''log''' ====&lt;br /&gt;
Log the DOM-less SDK messages to an external stream, e.g. the browser console, stdout.&lt;br /&gt;
&lt;br /&gt;
e.g. Log.debug('debug', 'NIELSEN TAGS EXPECTED TO FIRE:')&lt;br /&gt;
&lt;br /&gt;
===== Methods =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;info()&lt;br /&gt;
&lt;br /&gt;
Log.info(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
debug()&lt;br /&gt;
&lt;br /&gt;
Log.debug(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
warn()&lt;br /&gt;
&lt;br /&gt;
Log.warn(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
error()&lt;br /&gt;
&lt;br /&gt;
Log.error(label: string, ...message: string[]): void&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;label Required&lt;br /&gt;
&lt;br /&gt;
● string - severity type, e.g. info, debug, warn, error or custom label&lt;br /&gt;
&lt;br /&gt;
message Required&lt;br /&gt;
&lt;br /&gt;
● string - message that will be output to the console&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== storage ====&lt;br /&gt;
Persistent storage of key/values, similar in behavior to browser localStorage.&lt;br /&gt;
&lt;br /&gt;
e.g. storage.setItem('nol_lsid', 'umy3w4ik9usw2ppqmw2vkecckxfob1697308388')&lt;br /&gt;
&lt;br /&gt;
===== Methods =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;setItem()&lt;br /&gt;
&lt;br /&gt;
storage.setItem(key: string, value: string)&lt;br /&gt;
&lt;br /&gt;
getItem()&lt;br /&gt;
&lt;br /&gt;
storage.getItem(key: string)&lt;br /&gt;
&lt;br /&gt;
removeItem()&lt;br /&gt;
&lt;br /&gt;
storage.removeItem(key: string)&lt;br /&gt;
&lt;br /&gt;
clear()&lt;br /&gt;
&lt;br /&gt;
storage.clear()&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== fetch ====&lt;br /&gt;
Function to fetch resources from the network. Required for the transmission of the DOM-less SDK requests (pings) to the Nielsen endpoints.&lt;br /&gt;
&lt;br /&gt;
e.g. Fetch(resource: string, options: object)&lt;br /&gt;
&lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;resource Required&lt;br /&gt;
&lt;br /&gt;
● A string that provides the URL of the resource to fetch&lt;br /&gt;
&lt;br /&gt;
options Optional Object containing settings to apply to the request:&lt;br /&gt;
&lt;br /&gt;
method&lt;br /&gt;
&lt;br /&gt;
● string - request method: &amp;quot;GET&amp;quot;, &amp;quot;POST&amp;quot;. If one is not provided SDK will default to &amp;quot;GET&amp;quot;&lt;br /&gt;
&lt;br /&gt;
headers&lt;br /&gt;
&lt;br /&gt;
● object - headers to add to the outgoing request, an object literal with String values&lt;br /&gt;
&lt;br /&gt;
body&lt;br /&gt;
&lt;br /&gt;
● string - body to add to the request; SDK will send out string&lt;br /&gt;
&lt;br /&gt;
mode&lt;br /&gt;
&lt;br /&gt;
● string - mode for request: cors, no-cors, same-origin&lt;br /&gt;
&lt;br /&gt;
referrer&lt;br /&gt;
&lt;br /&gt;
● string - a string specifying the referrer of the request&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SetTimeout ====&lt;br /&gt;
Function to set a timer in milliseconds to execute a block of code on expiry&lt;br /&gt;
&lt;br /&gt;
e.g. SetTimeout(callback , 1000) &lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;callback Required&lt;br /&gt;
&lt;br /&gt;
● A function to execute when the timer expires&lt;br /&gt;
&lt;br /&gt;
timeout Required&lt;br /&gt;
&lt;br /&gt;
● number - The time that the timer should wait before the callback function is executed. This is in milliseconds.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SetInterval ====&lt;br /&gt;
Function to repeatedly call a function with a fixed time delay between each call.&lt;br /&gt;
&lt;br /&gt;
e.g. SetInterval(callback , 1000) &lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;callback Required&lt;br /&gt;
&lt;br /&gt;
● A function to be executed every interval specified&lt;br /&gt;
&lt;br /&gt;
interval Required&lt;br /&gt;
&lt;br /&gt;
● number - The delay between the execution of the function&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
==== ClearTimeout ====&lt;br /&gt;
Function to cancel the timeout previously set by SetTimeout&lt;br /&gt;
&lt;br /&gt;
e.g. ClearTimeout(1000) &lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;timeout Required&lt;br /&gt;
&lt;br /&gt;
● number - The time that the timer should wait before the callback function is executed&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
==== ClearInterval ====&lt;br /&gt;
Function to cancel the timed repeating call which was previously established through SetInterval&lt;br /&gt;
&lt;br /&gt;
e.g. ClearInterval(1000) &lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;interval Required&lt;br /&gt;
&lt;br /&gt;
● number - The delay between the execution of the function&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
==== Nielsen Debug Node.js Server for Event Tracking ====&lt;br /&gt;
We are excited to announce the beta version of our Debug Node.js server, designed to track requests and events sent from our Dom-less SDK using WebSocket connections. While this feature is not officially released, we are currently looking for users interested in beta testing.&lt;br /&gt;
&lt;br /&gt;
If you'd like to try this tool and provide feedback, please reach out to your Nielsen Technical Account Manager (TAM) for more information. Your insights would be invaluable in helping us refine this feature for a future release!&lt;br /&gt;
&lt;br /&gt;
== DOM-less SDK API Methods &amp;amp; Properties ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Method/Property&lt;br /&gt;
!Event #&lt;br /&gt;
!DTVR&lt;br /&gt;
!DAR&lt;br /&gt;
!DCR&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|[[play (Browser)|play]]&lt;br /&gt;
|5&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used when there is an ID3 fed product such as DTVR and the client does not want to send in all the CMS metadata that is sent in loadMetadata. This allows the client to send in at least the required “channel name” value associated to the ID3 feed. When the client passes in the channelName, they can change the CMS data stored by passing new values. If this event is not called then the “channel name” value populated will be the default value of “defaultChannelName”.&lt;br /&gt;
|-&lt;br /&gt;
|[[stop (Browser)|stop]]&lt;br /&gt;
|7&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used when switching between ad and content or content and ad.&lt;br /&gt;
|-&lt;br /&gt;
|[[loadMetadata (Browser)|loadMetadata]]&lt;br /&gt;
|15&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|Used when there is a preroll ad that needs to be associated with content metadata. The loadMetadata will first be called to populate the content metadata values and then the loadMetadata for ad metadata will be called. This allows sending a content ping with the ad info, even if the user bails out during the preroll ad.&lt;br /&gt;
|-&lt;br /&gt;
|[[setPlayheadPosition (Browser)|setPlayheadPosition]]&lt;br /&gt;
|49&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to send the playhead position.&lt;br /&gt;
|-&lt;br /&gt;
|[[sendID3 (Browser)|sendID3]]&lt;br /&gt;
|55&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|Used to send the ID3 metadata.&lt;br /&gt;
|-&lt;br /&gt;
|[[end (Browser)|end]]&lt;br /&gt;
|57&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|This is triggered 1) at the end of the content stream, 2) if the user switches to another piece of content 3) when the browser is refreshed or closed&lt;br /&gt;
|-&lt;br /&gt;
|[[setVolume (Browser)|setVolume]]&lt;br /&gt;
|61&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to pass in the player volume levels in %. Default value is -1.&lt;br /&gt;
|-&lt;br /&gt;
|[[staticstart (Browser)|staticstart]]&lt;br /&gt;
|14&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to send the metadata for the static page.&lt;br /&gt;
|-&lt;br /&gt;
|[[StaticEnd (Browser)|staticend]]&lt;br /&gt;
|56&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|In Single Page Application (SPA) it is imperative that staticend is called prior to the loading of new metadata. This allows the SDK to properly credit the previous section/content being viewed before measuring the new one.&lt;br /&gt;
|-&lt;br /&gt;
|[[onPaginate (Browser)|onPaginate]]&lt;br /&gt;
|30&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to initialize the SDK object&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Domless_SDK_API_Reference&amp;diff=6943</id>
		<title>Domless SDK API Reference</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Domless_SDK_API_Reference&amp;diff=6943"/>
		<updated>2026-01-27T21:23:27Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: Implementation Hooks: Added settimeout, setinterval, cleartimeout and clearinterval&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==License==&lt;br /&gt;
Nielsen SDK contains material that is protected by copyright laws, patent laws, trade secret laws, and by international treaty provisions and is Copyright © 2024 The Nielsen Company (US) LLC. All intellectual property rights and licenses therein are reserved by The Nielsen Company (US) LLC and its licensors. Please read the license agreement presented [https://engineeringportal.nielsen.com/wiki/Special:ClickThrough here], which must be accepted in order to download the Nielsen SDKs. For more information, reach out to your Nielsen Technical Account Manager(TAM).&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen DOM-less SDK provides APIs that allows our clients to integrate the Nielsen SDK in DOM-less environments, e.g., React Native, Node, etc.&lt;br /&gt;
&lt;br /&gt;
== DOM-less SDK Initialization ==&lt;br /&gt;
&lt;br /&gt;
=== Obtain the Nielsen Application ID (apid) ===&lt;br /&gt;
The Nielsen &amp;lt;code&amp;gt;apid&amp;lt;/code&amp;gt; is required to enable SDK functionality. Technical Account Manager will provide an apid for each player configuration. Browser SDK can support URLs that use any of the protocols – HTTPS and HTTP.&lt;br /&gt;
&lt;br /&gt;
=== Configure the DOM-less SDK ===&lt;br /&gt;
====Installation====&lt;br /&gt;
Install with &amp;lt;code&amp;gt;npm install &amp;lt;nowiki&amp;gt;https://github.com/NielsenDigitalSDK/bsdk-domless&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and import the &amp;lt;code&amp;gt;BsdkInstance&amp;lt;/code&amp;gt; into video player component&lt;br /&gt;
 import { BsdkInstance } from 'bsdk-domless'&lt;br /&gt;
======status.ok()======&lt;br /&gt;
Initialization of the instance can be done with &amp;lt;code&amp;gt;status.ok()&amp;lt;/code&amp;gt; function or use Promise handling approach&lt;br /&gt;
 const instance = await new BsdkInstance(appID, instanceName, instanceMetadata, implementationHooks);&lt;br /&gt;
 &lt;br /&gt;
 if (instance &amp;amp;&amp;amp; instance.status.ok()) {&lt;br /&gt;
     expect(instance).not.toBe(undefined);&lt;br /&gt;
     expect(instance.status.ok()).toBe(true);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: ImplementationHooks are mandatory for the DOM-less SDK instance. Please refer to the ImplementationHooks section below for details.&lt;br /&gt;
&lt;br /&gt;
====Exposed Interface====&lt;br /&gt;
The exposed interface is as follows:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;code&amp;gt;`ggPM`&amp;lt;/code&amp;gt; - method to send messages to the Nielsen SDK&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;code&amp;gt;`processEvent`&amp;lt;/code&amp;gt; - method to send app state to the Nielsen SDK, e.g., focus, blur, appclose&lt;br /&gt;
=== Initialization Global Parameters ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!'''Parameter'''&lt;br /&gt;
!'''Description'''&lt;br /&gt;
!'''Value'''&lt;br /&gt;
|-&lt;br /&gt;
|apid&lt;br /&gt;
|UniqueID assigned to player/site.&lt;br /&gt;
|'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName&lt;br /&gt;
|Name of SDK instance&lt;br /&gt;
|&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|domlessEnv&lt;br /&gt;
|Type of Dom-less environment like ReactNative, Node, etc.&lt;br /&gt;
|&amp;quot;domlessEnv&amp;quot;: &amp;quot;1&amp;quot;, // For ReactNative&lt;br /&gt;
&amp;quot;domlessEnv&amp;quot;: &amp;quot;2&amp;quot;, // For Amazon&lt;br /&gt;
&lt;br /&gt;
&amp;quot;domlessEnv&amp;quot;: &amp;quot;3&amp;quot;, // For NodeJS&lt;br /&gt;
&lt;br /&gt;
“domlessEnv”: “4”, // For Custom&lt;br /&gt;
|-&lt;br /&gt;
|deviceId&lt;br /&gt;
|Device Identifier&lt;br /&gt;
|Alphanumeric string eg. &lt;br /&gt;
|-&lt;br /&gt;
|nol_sdkDebug&lt;br /&gt;
|Enables Nielsen console logging. Only required for testing&lt;br /&gt;
|&amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|optout&lt;br /&gt;
|User optout status&lt;br /&gt;
|&amp;quot;true&amp;quot;, &amp;quot;false&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_sha256&lt;br /&gt;
|SHA256-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_sha1&lt;br /&gt;
|SHA1-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;XvBniTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_md5&lt;br /&gt;
|MD5-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;JnIbdTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|uid2&lt;br /&gt;
|An identifier based on a user’s verifiable PII (e.g. hashed email). UID2.0 was initially created by The Trade Desk (TTD) and is now managed by Prebid.&lt;br /&gt;
|&amp;quot;MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|uid2_token&lt;br /&gt;
|Encrypted Unified ID 2.0&lt;br /&gt;
|&amp;quot;AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8Ql&lt;br /&gt;
DSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeK QI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhC xG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|luid&lt;br /&gt;
|Living Unit ID - Experian Household ID&lt;br /&gt;
'''Note: This parameter is applicable only for CTV and First Party Livestream data'''&lt;br /&gt;
|&amp;quot;B0EOFEDgD&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Implementation Hooks ===&lt;br /&gt;
====='''''&amp;lt;pre style=&amp;quot;color: green; font-weight: bold; font-size: 20px&amp;quot;&amp;gt;Note: Implementation Hooks are mandatory for the DOM-less SDK to function as expected.&amp;lt;/pre&amp;gt;'''''=====&lt;br /&gt;
&lt;br /&gt;
This object captures the required entities for the DOM-less SDK to operate correctly. These are normally platform dependent and are expected to be passed on to the DOM-less SDK as part of its initialization. See below for the descriptions of each key.&lt;br /&gt;
&lt;br /&gt;
==== '''log''' ====&lt;br /&gt;
Log the DOM-less SDK messages to an external stream, e.g. the browser console, stdout.&lt;br /&gt;
&lt;br /&gt;
e.g. Log.debug('debug', 'NIELSEN TAGS EXPECTED TO FIRE:')&lt;br /&gt;
&lt;br /&gt;
===== Methods =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;info()&lt;br /&gt;
&lt;br /&gt;
Log.info(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
debug()&lt;br /&gt;
&lt;br /&gt;
Log.debug(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
warn()&lt;br /&gt;
&lt;br /&gt;
Log.warn(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
error()&lt;br /&gt;
&lt;br /&gt;
Log.error(label: string, ...message: string[]): void&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;label Required&lt;br /&gt;
&lt;br /&gt;
● string - severity type, e.g. info, debug, warn, error or custom label&lt;br /&gt;
&lt;br /&gt;
message Required&lt;br /&gt;
&lt;br /&gt;
● string - message that will be output to the console&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== storage ====&lt;br /&gt;
Persistent storage of key/values, similar in behavior to browser localStorage.&lt;br /&gt;
&lt;br /&gt;
e.g. storage.setItem('nol_lsid', 'umy3w4ik9usw2ppqmw2vkecckxfob1697308388')&lt;br /&gt;
&lt;br /&gt;
===== Methods =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;setItem()&lt;br /&gt;
&lt;br /&gt;
storage.setItem(key: string, value: string)&lt;br /&gt;
&lt;br /&gt;
getItem()&lt;br /&gt;
&lt;br /&gt;
storage.getItem(key: string)&lt;br /&gt;
&lt;br /&gt;
removeItem()&lt;br /&gt;
&lt;br /&gt;
storage.removeItem(key: string)&lt;br /&gt;
&lt;br /&gt;
clear()&lt;br /&gt;
&lt;br /&gt;
storage.clear()&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== fetch ====&lt;br /&gt;
Function to fetch resources from the network. Required for the transmission of the DOM-less SDK requests (pings) to the Nielsen endpoints.&lt;br /&gt;
&lt;br /&gt;
e.g. Fetch(resource: string, options: object)&lt;br /&gt;
&lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;resource Required&lt;br /&gt;
&lt;br /&gt;
● A string that provides the URL of the resource to fetch&lt;br /&gt;
&lt;br /&gt;
options Optional Object containing settings to apply to the request:&lt;br /&gt;
&lt;br /&gt;
method&lt;br /&gt;
&lt;br /&gt;
● string - request method: &amp;quot;GET&amp;quot;, &amp;quot;POST&amp;quot;. If one is not provided SDK will default to &amp;quot;GET&amp;quot;&lt;br /&gt;
&lt;br /&gt;
headers&lt;br /&gt;
&lt;br /&gt;
● object - headers to add to the outgoing request, an object literal with String values&lt;br /&gt;
&lt;br /&gt;
body&lt;br /&gt;
&lt;br /&gt;
● string - body to add to the request; SDK will send out string&lt;br /&gt;
&lt;br /&gt;
mode&lt;br /&gt;
&lt;br /&gt;
● string - mode for request: cors, no-cors, same-origin&lt;br /&gt;
&lt;br /&gt;
referrer&lt;br /&gt;
&lt;br /&gt;
● string - a string specifying the referrer of the request&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SetTimeout ====&lt;br /&gt;
Function to set a timer to execute a block of code on expiry&lt;br /&gt;
&lt;br /&gt;
e.g. SetTimeout(callback , 1000) &lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;callback Required&lt;br /&gt;
&lt;br /&gt;
● A function to execute when the timer expires&lt;br /&gt;
&lt;br /&gt;
timeout Required&lt;br /&gt;
&lt;br /&gt;
● number - The time that the timer should wait before the callback function is executed&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
==== SetInterval ====&lt;br /&gt;
Function to repeatedly call a function with a fixed time delay between each call.&lt;br /&gt;
&lt;br /&gt;
e.g. SetInterval(callback , 1000) &lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;callback Required&lt;br /&gt;
&lt;br /&gt;
● A function to be executed every interval specified&lt;br /&gt;
&lt;br /&gt;
interval Required&lt;br /&gt;
&lt;br /&gt;
● number - The delay between the execution of the function&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
==== ClearTimeout ====&lt;br /&gt;
Function to cancel the timeout previously set by SetTimeout&lt;br /&gt;
&lt;br /&gt;
e.g. ClearTimeout(1000) &lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;timeout Required&lt;br /&gt;
&lt;br /&gt;
● number - The time that the timer should wait before the callback function is executed&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
==== ClearInterval ====&lt;br /&gt;
Function to cancel the timed repeating call which was previously established through SetInterval&lt;br /&gt;
&lt;br /&gt;
e.g. ClearInterval(1000) &lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;interval Required&lt;br /&gt;
&lt;br /&gt;
● number - The delay between the execution of the function&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
==== Nielsen Debug Node.js Server for Event Tracking ====&lt;br /&gt;
We are excited to announce the beta version of our Debug Node.js server, designed to track requests and events sent from our Dom-less SDK using WebSocket connections. While this feature is not officially released, we are currently looking for users interested in beta testing.&lt;br /&gt;
&lt;br /&gt;
If you'd like to try this tool and provide feedback, please reach out to your Nielsen Technical Account Manager (TAM) for more information. Your insights would be invaluable in helping us refine this feature for a future release!&lt;br /&gt;
&lt;br /&gt;
== DOM-less SDK API Methods &amp;amp; Properties ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Method/Property&lt;br /&gt;
!Event #&lt;br /&gt;
!DTVR&lt;br /&gt;
!DAR&lt;br /&gt;
!DCR&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|[[play (Browser)|play]]&lt;br /&gt;
|5&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used when there is an ID3 fed product such as DTVR and the client does not want to send in all the CMS metadata that is sent in loadMetadata. This allows the client to send in at least the required “channel name” value associated to the ID3 feed. When the client passes in the channelName, they can change the CMS data stored by passing new values. If this event is not called then the “channel name” value populated will be the default value of “defaultChannelName”.&lt;br /&gt;
|-&lt;br /&gt;
|[[stop (Browser)|stop]]&lt;br /&gt;
|7&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used when switching between ad and content or content and ad.&lt;br /&gt;
|-&lt;br /&gt;
|[[loadMetadata (Browser)|loadMetadata]]&lt;br /&gt;
|15&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|Used when there is a preroll ad that needs to be associated with content metadata. The loadMetadata will first be called to populate the content metadata values and then the loadMetadata for ad metadata will be called. This allows sending a content ping with the ad info, even if the user bails out during the preroll ad.&lt;br /&gt;
|-&lt;br /&gt;
|[[setPlayheadPosition (Browser)|setPlayheadPosition]]&lt;br /&gt;
|49&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to send the playhead position.&lt;br /&gt;
|-&lt;br /&gt;
|[[sendID3 (Browser)|sendID3]]&lt;br /&gt;
|55&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|Used to send the ID3 metadata.&lt;br /&gt;
|-&lt;br /&gt;
|[[end (Browser)|end]]&lt;br /&gt;
|57&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|This is triggered 1) at the end of the content stream, 2) if the user switches to another piece of content 3) when the browser is refreshed or closed&lt;br /&gt;
|-&lt;br /&gt;
|[[setVolume (Browser)|setVolume]]&lt;br /&gt;
|61&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to pass in the player volume levels in %. Default value is -1.&lt;br /&gt;
|-&lt;br /&gt;
|[[staticstart (Browser)|staticstart]]&lt;br /&gt;
|14&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to send the metadata for the static page.&lt;br /&gt;
|-&lt;br /&gt;
|[[StaticEnd (Browser)|staticend]]&lt;br /&gt;
|56&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|In Single Page Application (SPA) it is imperative that staticend is called prior to the loading of new metadata. This allows the SDK to properly credit the previous section/content being viewed before measuring the new one.&lt;br /&gt;
|-&lt;br /&gt;
|[[onPaginate (Browser)|onPaginate]]&lt;br /&gt;
|30&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to initialize the SDK object&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Domless_SDK_API_Reference&amp;diff=6937</id>
		<title>Domless SDK API Reference</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Domless_SDK_API_Reference&amp;diff=6937"/>
		<updated>2025-11-25T13:45:34Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: /* storage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==License==&lt;br /&gt;
Nielsen SDK contains material that is protected by copyright laws, patent laws, trade secret laws, and by international treaty provisions and is Copyright © 2024 The Nielsen Company (US) LLC. All intellectual property rights and licenses therein are reserved by The Nielsen Company (US) LLC and its licensors. Please read the license agreement presented [https://engineeringportal.nielsen.com/wiki/Special:ClickThrough here], which must be accepted in order to download the Nielsen SDKs. For more information, reach out to your Nielsen Technical Account Manager(TAM).&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen DOM-less SDK provides APIs that allows our clients to integrate the Nielsen SDK in DOM-less environments, e.g., React Native, Node, etc.&lt;br /&gt;
&lt;br /&gt;
== DOM-less SDK Initialization ==&lt;br /&gt;
&lt;br /&gt;
=== Obtain the Nielsen Application ID (apid) ===&lt;br /&gt;
The Nielsen &amp;lt;code&amp;gt;apid&amp;lt;/code&amp;gt; is required to enable SDK functionality. Technical Account Manager will provide an apid for each player configuration. Browser SDK can support URLs that use any of the protocols – HTTPS and HTTP.&lt;br /&gt;
&lt;br /&gt;
=== Configure the DOM-less SDK ===&lt;br /&gt;
====Installation====&lt;br /&gt;
Install with &amp;lt;code&amp;gt;npm install &amp;lt;nowiki&amp;gt;https://github.com/NielsenDigitalSDK/bsdk-domless&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and import the &amp;lt;code&amp;gt;BsdkInstance&amp;lt;/code&amp;gt; into video player component&lt;br /&gt;
 import { BsdkInstance } from 'bsdk-domless'&lt;br /&gt;
======status.ok()======&lt;br /&gt;
Initialization of the instance can be done with &amp;lt;code&amp;gt;status.ok()&amp;lt;/code&amp;gt; function or use Promise handling approach&lt;br /&gt;
 const instance = await new BsdkInstance(appID, instanceName, instanceMetadata, implementationHooks);&lt;br /&gt;
 &lt;br /&gt;
 if (instance &amp;amp;&amp;amp; instance.status.ok()) {&lt;br /&gt;
     expect(instance).not.toBe(undefined);&lt;br /&gt;
     expect(instance.status.ok()).toBe(true);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: ImplementationHooks are mandatory for the DOM-less SDK instance. Please refer to the ImplementationHooks section below for details.&lt;br /&gt;
&lt;br /&gt;
====Exposed Interface====&lt;br /&gt;
The exposed interface is as follows:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;code&amp;gt;`ggPM`&amp;lt;/code&amp;gt; - method to send messages to the Nielsen SDK&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;code&amp;gt;`processEvent`&amp;lt;/code&amp;gt; - method to send app state to the Nielsen SDK, e.g., focus, blur, appclose&lt;br /&gt;
=== Initialization Global Parameters ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!'''Parameter'''&lt;br /&gt;
!'''Description'''&lt;br /&gt;
!'''Value'''&lt;br /&gt;
|-&lt;br /&gt;
|apid&lt;br /&gt;
|UniqueID assigned to player/site.&lt;br /&gt;
|'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName&lt;br /&gt;
|Name of SDK instance&lt;br /&gt;
|&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|domlessEnv&lt;br /&gt;
|Type of Dom-less environment like ReactNative, Node, etc.&lt;br /&gt;
|&amp;quot;domlessEnv&amp;quot;: &amp;quot;1&amp;quot;, // For ReactNative&lt;br /&gt;
&amp;quot;domlessEnv&amp;quot;: &amp;quot;2&amp;quot;, // For Amazon&lt;br /&gt;
&lt;br /&gt;
&amp;quot;domlessEnv&amp;quot;: &amp;quot;3&amp;quot;, // For NodeJS&lt;br /&gt;
&lt;br /&gt;
“domlessEnv”: “4”, // For Custom&lt;br /&gt;
|-&lt;br /&gt;
|deviceId&lt;br /&gt;
|Device Identifier&lt;br /&gt;
|Alphanumeric string eg. &lt;br /&gt;
|-&lt;br /&gt;
|nol_sdkDebug&lt;br /&gt;
|Enables Nielsen console logging. Only required for testing&lt;br /&gt;
|&amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|optout&lt;br /&gt;
|User optout status&lt;br /&gt;
|&amp;quot;true&amp;quot;, &amp;quot;false&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_sha256&lt;br /&gt;
|SHA256-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_sha1&lt;br /&gt;
|SHA1-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;XvBniTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_md5&lt;br /&gt;
|MD5-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;JnIbdTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|uid2&lt;br /&gt;
|An identifier based on a user’s verifiable PII (e.g. hashed email). UID2.0 was initially created by The Trade Desk (TTD) and is now managed by Prebid.&lt;br /&gt;
|&amp;quot;MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|uid2_token&lt;br /&gt;
|Encrypted Unified ID 2.0&lt;br /&gt;
|&amp;quot;AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8Ql&lt;br /&gt;
DSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeK QI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhC xG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|luid&lt;br /&gt;
|Living Unit ID - Experian Household ID&lt;br /&gt;
'''Note: This parameter is applicable only for CTV and First Party Livestream data'''&lt;br /&gt;
|&amp;quot;B0EOFEDgD&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Implementation Hooks ===&lt;br /&gt;
This object captures the required entities for the DOM-less SDK to operate correctly. These are normally platform dependent and are expected to be passed on to the DOM-less SDK as part of its initialization. See below for the descriptions of each key.&lt;br /&gt;
&lt;br /&gt;
==== '''log''' ====&lt;br /&gt;
Log the DOM-less SDK messages to an external stream, e.g. the browser console, stdout.&lt;br /&gt;
&lt;br /&gt;
e.g. Log.debug('debug', 'NIELSEN TAGS EXPECTED TO FIRE:')&lt;br /&gt;
&lt;br /&gt;
===== Methods =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;info()&lt;br /&gt;
&lt;br /&gt;
Log.info(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
debug()&lt;br /&gt;
&lt;br /&gt;
Log.debug(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
warn()&lt;br /&gt;
&lt;br /&gt;
Log.warn(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
error()&lt;br /&gt;
&lt;br /&gt;
Log.error(label: string, ...message: string[]): void&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;label Required&lt;br /&gt;
&lt;br /&gt;
● string - severity type, e.g. info, debug, warn, error or custom label&lt;br /&gt;
&lt;br /&gt;
message Required&lt;br /&gt;
&lt;br /&gt;
● string - message that will be output to the console&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== storage ====&lt;br /&gt;
Persistent storage of key/values, similar in behavior to browser localStorage.&lt;br /&gt;
&lt;br /&gt;
e.g. storage.setItem('nol_lsid', 'umy3w4ik9usw2ppqmw2vkecckxfob1697308388')&lt;br /&gt;
&lt;br /&gt;
===== Methods =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;setItem()&lt;br /&gt;
&lt;br /&gt;
storage.setItem(key: string, value: string)&lt;br /&gt;
&lt;br /&gt;
getItem()&lt;br /&gt;
&lt;br /&gt;
storage.getItem(key: string)&lt;br /&gt;
&lt;br /&gt;
removeItem()&lt;br /&gt;
&lt;br /&gt;
storage.removeItem(key: string)&lt;br /&gt;
&lt;br /&gt;
clear()&lt;br /&gt;
&lt;br /&gt;
storage.clear()&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== fetch ====&lt;br /&gt;
Function to fetch resources from the network. Required for the transmission of the DOM-less SDK requests (pings) to the Nielsen endpoints.&lt;br /&gt;
&lt;br /&gt;
e.g. Fetch(resource: string, options: object)&lt;br /&gt;
&lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;resource Required&lt;br /&gt;
&lt;br /&gt;
● A string that provides the URL of the resource to fetch&lt;br /&gt;
&lt;br /&gt;
options Optional Object containing settings to apply to the request:&lt;br /&gt;
&lt;br /&gt;
method&lt;br /&gt;
&lt;br /&gt;
● string - request method: &amp;quot;GET&amp;quot;, &amp;quot;POST&amp;quot;. If one is not provided SDK will default to &amp;quot;GET&amp;quot;&lt;br /&gt;
&lt;br /&gt;
headers&lt;br /&gt;
&lt;br /&gt;
● object - headers to add to the outgoing request, an object literal with String values&lt;br /&gt;
&lt;br /&gt;
body&lt;br /&gt;
&lt;br /&gt;
● string - body to add to the request; SDK will send out string&lt;br /&gt;
&lt;br /&gt;
mode&lt;br /&gt;
&lt;br /&gt;
● string - mode for request: cors, no-cors, same-origin&lt;br /&gt;
&lt;br /&gt;
referrer&lt;br /&gt;
&lt;br /&gt;
● string - a string specifying the referrer of the request&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====='''''&amp;lt;pre style=&amp;quot;color: green; font-weight: bold; font-size: 20px&amp;quot;&amp;gt;Note: Implementation Hooks are mandatory for the DOM-less SDK to function as expected.&amp;lt;/pre&amp;gt;'''''=====&lt;br /&gt;
&lt;br /&gt;
==== Nielsen Debug Node.js Server for Event Tracking ====&lt;br /&gt;
We are excited to announce the beta version of our Debug Node.js server, designed to track requests and events sent from our Dom-less SDK using WebSocket connections. While this feature is not officially released, we are currently looking for users interested in beta testing.&lt;br /&gt;
&lt;br /&gt;
If you'd like to try this tool and provide feedback, please reach out to your Nielsen Technical Account Manager (TAM) for more information. Your insights would be invaluable in helping us refine this feature for a future release!&lt;br /&gt;
&lt;br /&gt;
== DOM-less SDK API Methods &amp;amp; Properties ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Method/Property&lt;br /&gt;
!Event #&lt;br /&gt;
!DTVR&lt;br /&gt;
!DAR&lt;br /&gt;
!DCR&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|[[play (Browser)|play]]&lt;br /&gt;
|5&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used when there is an ID3 fed product such as DTVR and the client does not want to send in all the CMS metadata that is sent in loadMetadata. This allows the client to send in at least the required “channel name” value associated to the ID3 feed. When the client passes in the channelName, they can change the CMS data stored by passing new values. If this event is not called then the “channel name” value populated will be the default value of “defaultChannelName”.&lt;br /&gt;
|-&lt;br /&gt;
|[[stop (Browser)|stop]]&lt;br /&gt;
|7&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used when switching between ad and content or content and ad.&lt;br /&gt;
|-&lt;br /&gt;
|[[loadMetadata (Browser)|loadMetadata]]&lt;br /&gt;
|15&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|Used when there is a preroll ad that needs to be associated with content metadata. The loadMetadata will first be called to populate the content metadata values and then the loadMetadata for ad metadata will be called. This allows sending a content ping with the ad info, even if the user bails out during the preroll ad.&lt;br /&gt;
|-&lt;br /&gt;
|[[setPlayheadPosition (Browser)|setPlayheadPosition]]&lt;br /&gt;
|49&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to send the playhead position.&lt;br /&gt;
|-&lt;br /&gt;
|[[sendID3 (Browser)|sendID3]]&lt;br /&gt;
|55&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|Used to send the ID3 metadata.&lt;br /&gt;
|-&lt;br /&gt;
|[[end (Browser)|end]]&lt;br /&gt;
|57&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|This is triggered 1) at the end of the content stream, 2) if the user switches to another piece of content 3) when the browser is refreshed or closed&lt;br /&gt;
|-&lt;br /&gt;
|[[setVolume (Browser)|setVolume]]&lt;br /&gt;
|61&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to pass in the player volume levels in %. Default value is -1.&lt;br /&gt;
|-&lt;br /&gt;
|[[staticstart (Browser)|staticstart]]&lt;br /&gt;
|14&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to send the metadata for the static page.&lt;br /&gt;
|-&lt;br /&gt;
|[[StaticEnd (Browser)|staticend]]&lt;br /&gt;
|56&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|In Single Page Application (SPA) it is imperative that staticend is called prior to the loading of new metadata. This allows the SDK to properly credit the previous section/content being viewed before measuring the new one.&lt;br /&gt;
|-&lt;br /&gt;
|[[onPaginate (Browser)|onPaginate]]&lt;br /&gt;
|30&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to initialize the SDK object&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Domless_SDK_API_Reference&amp;diff=6936</id>
		<title>Domless SDK API Reference</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Domless_SDK_API_Reference&amp;diff=6936"/>
		<updated>2025-11-25T13:17:19Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: /* Methods */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==License==&lt;br /&gt;
Nielsen SDK contains material that is protected by copyright laws, patent laws, trade secret laws, and by international treaty provisions and is Copyright © 2024 The Nielsen Company (US) LLC. All intellectual property rights and licenses therein are reserved by The Nielsen Company (US) LLC and its licensors. Please read the license agreement presented [https://engineeringportal.nielsen.com/wiki/Special:ClickThrough here], which must be accepted in order to download the Nielsen SDKs. For more information, reach out to your Nielsen Technical Account Manager(TAM).&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen DOM-less SDK provides APIs that allows our clients to integrate the Nielsen SDK in DOM-less environments, e.g., React Native, Node, etc.&lt;br /&gt;
&lt;br /&gt;
== DOM-less SDK Initialization ==&lt;br /&gt;
&lt;br /&gt;
=== Obtain the Nielsen Application ID (apid) ===&lt;br /&gt;
The Nielsen &amp;lt;code&amp;gt;apid&amp;lt;/code&amp;gt; is required to enable SDK functionality. Technical Account Manager will provide an apid for each player configuration. Browser SDK can support URLs that use any of the protocols – HTTPS and HTTP.&lt;br /&gt;
&lt;br /&gt;
=== Configure the DOM-less SDK ===&lt;br /&gt;
====Installation====&lt;br /&gt;
Install with &amp;lt;code&amp;gt;npm install &amp;lt;nowiki&amp;gt;https://github.com/NielsenDigitalSDK/bsdk-domless&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and import the &amp;lt;code&amp;gt;BsdkInstance&amp;lt;/code&amp;gt; into video player component&lt;br /&gt;
 import { BsdkInstance } from 'bsdk-domless'&lt;br /&gt;
======status.ok()======&lt;br /&gt;
Initialization of the instance can be done with &amp;lt;code&amp;gt;status.ok()&amp;lt;/code&amp;gt; function or use Promise handling approach&lt;br /&gt;
 const instance = await new BsdkInstance(appID, instanceName, instanceMetadata, implementationHooks);&lt;br /&gt;
 &lt;br /&gt;
 if (instance &amp;amp;&amp;amp; instance.status.ok()) {&lt;br /&gt;
     expect(instance).not.toBe(undefined);&lt;br /&gt;
     expect(instance.status.ok()).toBe(true);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: ImplementationHooks are mandatory for the DOM-less SDK instance. Please refer to the ImplementationHooks section below for details.&lt;br /&gt;
&lt;br /&gt;
====Exposed Interface====&lt;br /&gt;
The exposed interface is as follows:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;code&amp;gt;`ggPM`&amp;lt;/code&amp;gt; - method to send messages to the Nielsen SDK&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;code&amp;gt;`processEvent`&amp;lt;/code&amp;gt; - method to send app state to the Nielsen SDK, e.g., focus, blur, appclose&lt;br /&gt;
=== Initialization Global Parameters ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!'''Parameter'''&lt;br /&gt;
!'''Description'''&lt;br /&gt;
!'''Value'''&lt;br /&gt;
|-&lt;br /&gt;
|apid&lt;br /&gt;
|UniqueID assigned to player/site.&lt;br /&gt;
|'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName&lt;br /&gt;
|Name of SDK instance&lt;br /&gt;
|&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|domlessEnv&lt;br /&gt;
|Type of Dom-less environment like ReactNative, Node, etc.&lt;br /&gt;
|&amp;quot;domlessEnv&amp;quot;: &amp;quot;1&amp;quot;, // For ReactNative&lt;br /&gt;
&amp;quot;domlessEnv&amp;quot;: &amp;quot;2&amp;quot;, // For Amazon&lt;br /&gt;
&lt;br /&gt;
&amp;quot;domlessEnv&amp;quot;: &amp;quot;3&amp;quot;, // For NodeJS&lt;br /&gt;
&lt;br /&gt;
“domlessEnv”: “4”, // For Custom&lt;br /&gt;
|-&lt;br /&gt;
|deviceId&lt;br /&gt;
|Device Identifier&lt;br /&gt;
|Alphanumeric string eg. &lt;br /&gt;
|-&lt;br /&gt;
|nol_sdkDebug&lt;br /&gt;
|Enables Nielsen console logging. Only required for testing&lt;br /&gt;
|&amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|optout&lt;br /&gt;
|User optout status&lt;br /&gt;
|&amp;quot;true&amp;quot;, &amp;quot;false&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_sha256&lt;br /&gt;
|SHA256-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_sha1&lt;br /&gt;
|SHA1-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;XvBniTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_md5&lt;br /&gt;
|MD5-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;JnIbdTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|uid2&lt;br /&gt;
|An identifier based on a user’s verifiable PII (e.g. hashed email). UID2.0 was initially created by The Trade Desk (TTD) and is now managed by Prebid.&lt;br /&gt;
|&amp;quot;MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|uid2_token&lt;br /&gt;
|Encrypted Unified ID 2.0&lt;br /&gt;
|&amp;quot;AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8Ql&lt;br /&gt;
DSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeK QI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhC xG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|luid&lt;br /&gt;
|Living Unit ID - Experian Household ID&lt;br /&gt;
'''Note: This parameter is applicable only for CTV and First Party Livestream data'''&lt;br /&gt;
|&amp;quot;B0EOFEDgD&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Implementation Hooks ===&lt;br /&gt;
This object captures the required entities for the DOM-less SDK to operate correctly. These are normally platform dependent and are expected to be passed on to the DOM-less SDK as part of its initialization. See below for the descriptions of each key.&lt;br /&gt;
&lt;br /&gt;
==== '''log''' ====&lt;br /&gt;
Log the DOM-less SDK messages to an external stream, e.g. the browser console, stdout.&lt;br /&gt;
&lt;br /&gt;
e.g. Log.debug('debug', 'NIELSEN TAGS EXPECTED TO FIRE:')&lt;br /&gt;
&lt;br /&gt;
===== Methods =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;info()&lt;br /&gt;
&lt;br /&gt;
Log.info(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
debug()&lt;br /&gt;
&lt;br /&gt;
Log.debug(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
warn()&lt;br /&gt;
&lt;br /&gt;
Log.warn(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
error()&lt;br /&gt;
&lt;br /&gt;
Log.error(label: string, ...message: string[]): void&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;label Required&lt;br /&gt;
&lt;br /&gt;
● string - severity type, e.g. info, debug, warn, error or custom label&lt;br /&gt;
&lt;br /&gt;
message Required&lt;br /&gt;
&lt;br /&gt;
● string - message that will be output to the console&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== storage ====&lt;br /&gt;
Persistent storage of key/values, similar in behavior to browser localStorage.&lt;br /&gt;
&lt;br /&gt;
e.g. storage.set('nol_lsid', 'umy3w4ik9usw2ppqmw2vkecckxfob1697308388')&lt;br /&gt;
&lt;br /&gt;
===== Methods =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;setItem()&lt;br /&gt;
&lt;br /&gt;
storage.setItem(key: string, value: string)&lt;br /&gt;
&lt;br /&gt;
getItem()&lt;br /&gt;
&lt;br /&gt;
storage.getItem(key: string)&lt;br /&gt;
&lt;br /&gt;
removeItem()&lt;br /&gt;
&lt;br /&gt;
storage.removeItem(key: string)&lt;br /&gt;
&lt;br /&gt;
clear()&lt;br /&gt;
&lt;br /&gt;
storage.clear()&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== fetch ====&lt;br /&gt;
Function to fetch resources from the network. Required for the transmission of the DOM-less SDK requests (pings) to the Nielsen endpoints.&lt;br /&gt;
&lt;br /&gt;
e.g. Fetch(resource: string, options: object)&lt;br /&gt;
&lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;resource Required&lt;br /&gt;
&lt;br /&gt;
● A string that provides the URL of the resource to fetch&lt;br /&gt;
&lt;br /&gt;
options Optional Object containing settings to apply to the request:&lt;br /&gt;
&lt;br /&gt;
method&lt;br /&gt;
&lt;br /&gt;
● string - request method: &amp;quot;GET&amp;quot;, &amp;quot;POST&amp;quot;. If one is not provided SDK will default to &amp;quot;GET&amp;quot;&lt;br /&gt;
&lt;br /&gt;
headers&lt;br /&gt;
&lt;br /&gt;
● object - headers to add to the outgoing request, an object literal with String values&lt;br /&gt;
&lt;br /&gt;
body&lt;br /&gt;
&lt;br /&gt;
● string - body to add to the request; SDK will send out string&lt;br /&gt;
&lt;br /&gt;
mode&lt;br /&gt;
&lt;br /&gt;
● string - mode for request: cors, no-cors, same-origin&lt;br /&gt;
&lt;br /&gt;
referrer&lt;br /&gt;
&lt;br /&gt;
● string - a string specifying the referrer of the request&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====='''''&amp;lt;pre style=&amp;quot;color: green; font-weight: bold; font-size: 20px&amp;quot;&amp;gt;Note: Implementation Hooks are mandatory for the DOM-less SDK to function as expected.&amp;lt;/pre&amp;gt;'''''=====&lt;br /&gt;
&lt;br /&gt;
==== Nielsen Debug Node.js Server for Event Tracking ====&lt;br /&gt;
We are excited to announce the beta version of our Debug Node.js server, designed to track requests and events sent from our Dom-less SDK using WebSocket connections. While this feature is not officially released, we are currently looking for users interested in beta testing.&lt;br /&gt;
&lt;br /&gt;
If you'd like to try this tool and provide feedback, please reach out to your Nielsen Technical Account Manager (TAM) for more information. Your insights would be invaluable in helping us refine this feature for a future release!&lt;br /&gt;
&lt;br /&gt;
== DOM-less SDK API Methods &amp;amp; Properties ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Method/Property&lt;br /&gt;
!Event #&lt;br /&gt;
!DTVR&lt;br /&gt;
!DAR&lt;br /&gt;
!DCR&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|[[play (Browser)|play]]&lt;br /&gt;
|5&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used when there is an ID3 fed product such as DTVR and the client does not want to send in all the CMS metadata that is sent in loadMetadata. This allows the client to send in at least the required “channel name” value associated to the ID3 feed. When the client passes in the channelName, they can change the CMS data stored by passing new values. If this event is not called then the “channel name” value populated will be the default value of “defaultChannelName”.&lt;br /&gt;
|-&lt;br /&gt;
|[[stop (Browser)|stop]]&lt;br /&gt;
|7&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used when switching between ad and content or content and ad.&lt;br /&gt;
|-&lt;br /&gt;
|[[loadMetadata (Browser)|loadMetadata]]&lt;br /&gt;
|15&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|Used when there is a preroll ad that needs to be associated with content metadata. The loadMetadata will first be called to populate the content metadata values and then the loadMetadata for ad metadata will be called. This allows sending a content ping with the ad info, even if the user bails out during the preroll ad.&lt;br /&gt;
|-&lt;br /&gt;
|[[setPlayheadPosition (Browser)|setPlayheadPosition]]&lt;br /&gt;
|49&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to send the playhead position.&lt;br /&gt;
|-&lt;br /&gt;
|[[sendID3 (Browser)|sendID3]]&lt;br /&gt;
|55&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|Used to send the ID3 metadata.&lt;br /&gt;
|-&lt;br /&gt;
|[[end (Browser)|end]]&lt;br /&gt;
|57&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|This is triggered 1) at the end of the content stream, 2) if the user switches to another piece of content 3) when the browser is refreshed or closed&lt;br /&gt;
|-&lt;br /&gt;
|[[setVolume (Browser)|setVolume]]&lt;br /&gt;
|61&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to pass in the player volume levels in %. Default value is -1.&lt;br /&gt;
|-&lt;br /&gt;
|[[staticstart (Browser)|staticstart]]&lt;br /&gt;
|14&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to send the metadata for the static page.&lt;br /&gt;
|-&lt;br /&gt;
|[[StaticEnd (Browser)|staticend]]&lt;br /&gt;
|56&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|In Single Page Application (SPA) it is imperative that staticend is called prior to the loading of new metadata. This allows the SDK to properly credit the previous section/content being viewed before measuring the new one.&lt;br /&gt;
|-&lt;br /&gt;
|[[onPaginate (Browser)|onPaginate]]&lt;br /&gt;
|30&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to initialize the SDK object&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Domless_SDK_API_Reference&amp;diff=6935</id>
		<title>Domless SDK API Reference</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Domless_SDK_API_Reference&amp;diff=6935"/>
		<updated>2025-11-25T00:55:22Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: Replace Storage set, get and remove function names with setItem, getItem and removeItem.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==License==&lt;br /&gt;
Nielsen SDK contains material that is protected by copyright laws, patent laws, trade secret laws, and by international treaty provisions and is Copyright © 2024 The Nielsen Company (US) LLC. All intellectual property rights and licenses therein are reserved by The Nielsen Company (US) LLC and its licensors. Please read the license agreement presented [https://engineeringportal.nielsen.com/wiki/Special:ClickThrough here], which must be accepted in order to download the Nielsen SDKs. For more information, reach out to your Nielsen Technical Account Manager(TAM).&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen DOM-less SDK provides APIs that allows our clients to integrate the Nielsen SDK in DOM-less environments, e.g., React Native, Node, etc.&lt;br /&gt;
&lt;br /&gt;
== DOM-less SDK Initialization ==&lt;br /&gt;
&lt;br /&gt;
=== Obtain the Nielsen Application ID (apid) ===&lt;br /&gt;
The Nielsen &amp;lt;code&amp;gt;apid&amp;lt;/code&amp;gt; is required to enable SDK functionality. Technical Account Manager will provide an apid for each player configuration. Browser SDK can support URLs that use any of the protocols – HTTPS and HTTP.&lt;br /&gt;
&lt;br /&gt;
=== Configure the DOM-less SDK ===&lt;br /&gt;
====Installation====&lt;br /&gt;
Install with &amp;lt;code&amp;gt;npm install &amp;lt;nowiki&amp;gt;https://github.com/NielsenDigitalSDK/bsdk-domless&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and import the &amp;lt;code&amp;gt;BsdkInstance&amp;lt;/code&amp;gt; into video player component&lt;br /&gt;
 import { BsdkInstance } from 'bsdk-domless'&lt;br /&gt;
======status.ok()======&lt;br /&gt;
Initialization of the instance can be done with &amp;lt;code&amp;gt;status.ok()&amp;lt;/code&amp;gt; function or use Promise handling approach&lt;br /&gt;
 const instance = await new BsdkInstance(appID, instanceName, instanceMetadata, implementationHooks);&lt;br /&gt;
 &lt;br /&gt;
 if (instance &amp;amp;&amp;amp; instance.status.ok()) {&lt;br /&gt;
     expect(instance).not.toBe(undefined);&lt;br /&gt;
     expect(instance.status.ok()).toBe(true);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: ImplementationHooks are mandatory for the DOM-less SDK instance. Please refer to the ImplementationHooks section below for details.&lt;br /&gt;
&lt;br /&gt;
====Exposed Interface====&lt;br /&gt;
The exposed interface is as follows:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;code&amp;gt;`ggPM`&amp;lt;/code&amp;gt; - method to send messages to the Nielsen SDK&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;code&amp;gt;`processEvent`&amp;lt;/code&amp;gt; - method to send app state to the Nielsen SDK, e.g., focus, blur, appclose&lt;br /&gt;
=== Initialization Global Parameters ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!'''Parameter'''&lt;br /&gt;
!'''Description'''&lt;br /&gt;
!'''Value'''&lt;br /&gt;
|-&lt;br /&gt;
|apid&lt;br /&gt;
|UniqueID assigned to player/site.&lt;br /&gt;
|'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName&lt;br /&gt;
|Name of SDK instance&lt;br /&gt;
|&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|domlessEnv&lt;br /&gt;
|Type of Dom-less environment like ReactNative, Node, etc.&lt;br /&gt;
|&amp;quot;domlessEnv&amp;quot;: &amp;quot;1&amp;quot;, // For ReactNative&lt;br /&gt;
&amp;quot;domlessEnv&amp;quot;: &amp;quot;2&amp;quot;, // For Amazon&lt;br /&gt;
&lt;br /&gt;
&amp;quot;domlessEnv&amp;quot;: &amp;quot;3&amp;quot;, // For NodeJS&lt;br /&gt;
&lt;br /&gt;
“domlessEnv”: “4”, // For Custom&lt;br /&gt;
|-&lt;br /&gt;
|deviceId&lt;br /&gt;
|Device Identifier&lt;br /&gt;
|Alphanumeric string eg. &lt;br /&gt;
|-&lt;br /&gt;
|nol_sdkDebug&lt;br /&gt;
|Enables Nielsen console logging. Only required for testing&lt;br /&gt;
|&amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|optout&lt;br /&gt;
|User optout status&lt;br /&gt;
|&amp;quot;true&amp;quot;, &amp;quot;false&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_sha256&lt;br /&gt;
|SHA256-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_sha1&lt;br /&gt;
|SHA1-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;XvBniTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_md5&lt;br /&gt;
|MD5-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;JnIbdTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|uid2&lt;br /&gt;
|An identifier based on a user’s verifiable PII (e.g. hashed email). UID2.0 was initially created by The Trade Desk (TTD) and is now managed by Prebid.&lt;br /&gt;
|&amp;quot;MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|uid2_token&lt;br /&gt;
|Encrypted Unified ID 2.0&lt;br /&gt;
|&amp;quot;AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8Ql&lt;br /&gt;
DSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeK QI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhC xG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|luid&lt;br /&gt;
|Living Unit ID - Experian Household ID&lt;br /&gt;
'''Note: This parameter is applicable only for CTV and First Party Livestream data'''&lt;br /&gt;
|&amp;quot;B0EOFEDgD&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Implementation Hooks ===&lt;br /&gt;
This object captures the required entities for the DOM-less SDK to operate correctly. These are normally platform dependent and are expected to be passed on to the DOM-less SDK as part of its initialization. See below for the descriptions of each key.&lt;br /&gt;
&lt;br /&gt;
==== '''log''' ====&lt;br /&gt;
Log the DOM-less SDK messages to an external stream, e.g. the browser console, stdout.&lt;br /&gt;
&lt;br /&gt;
e.g. Log.debug('debug', 'NIELSEN TAGS EXPECTED TO FIRE:')&lt;br /&gt;
&lt;br /&gt;
===== Methods =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;info()&lt;br /&gt;
&lt;br /&gt;
Log.info(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
debug()&lt;br /&gt;
&lt;br /&gt;
Log.debug(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
warn()&lt;br /&gt;
&lt;br /&gt;
Log.warn(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
error()&lt;br /&gt;
&lt;br /&gt;
Log.error(label: string, ...message: string[]): void&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;label Required&lt;br /&gt;
&lt;br /&gt;
● string - severity type, e.g. info, debug, warn, error or custom label&lt;br /&gt;
&lt;br /&gt;
message Required&lt;br /&gt;
&lt;br /&gt;
● string - message that will be output to the console&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== storage ====&lt;br /&gt;
Persistent storage of key/values, similar in behavior to browser localStorage.&lt;br /&gt;
&lt;br /&gt;
e.g. storage.set('nol_lsid', 'umy3w4ik9usw2ppqmw2vkecckxfob1697308388')&lt;br /&gt;
&lt;br /&gt;
===== Methods =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;setItem()&lt;br /&gt;
&lt;br /&gt;
storage.set(key: string, value: string)&lt;br /&gt;
&lt;br /&gt;
getItem()&lt;br /&gt;
&lt;br /&gt;
storage.get(key: string)&lt;br /&gt;
&lt;br /&gt;
removeItem()&lt;br /&gt;
&lt;br /&gt;
storage.remove(key: string)&lt;br /&gt;
&lt;br /&gt;
clear()&lt;br /&gt;
&lt;br /&gt;
storage.clear()&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== fetch ====&lt;br /&gt;
Function to fetch resources from the network. Required for the transmission of the DOM-less SDK requests (pings) to the Nielsen endpoints.&lt;br /&gt;
&lt;br /&gt;
e.g. Fetch(resource: string, options: object)&lt;br /&gt;
&lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;resource Required&lt;br /&gt;
&lt;br /&gt;
● A string that provides the URL of the resource to fetch&lt;br /&gt;
&lt;br /&gt;
options Optional Object containing settings to apply to the request:&lt;br /&gt;
&lt;br /&gt;
method&lt;br /&gt;
&lt;br /&gt;
● string - request method: &amp;quot;GET&amp;quot;, &amp;quot;POST&amp;quot;. If one is not provided SDK will default to &amp;quot;GET&amp;quot;&lt;br /&gt;
&lt;br /&gt;
headers&lt;br /&gt;
&lt;br /&gt;
● object - headers to add to the outgoing request, an object literal with String values&lt;br /&gt;
&lt;br /&gt;
body&lt;br /&gt;
&lt;br /&gt;
● string - body to add to the request; SDK will send out string&lt;br /&gt;
&lt;br /&gt;
mode&lt;br /&gt;
&lt;br /&gt;
● string - mode for request: cors, no-cors, same-origin&lt;br /&gt;
&lt;br /&gt;
referrer&lt;br /&gt;
&lt;br /&gt;
● string - a string specifying the referrer of the request&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====='''''&amp;lt;pre style=&amp;quot;color: green; font-weight: bold; font-size: 20px&amp;quot;&amp;gt;Note: Implementation Hooks are mandatory for the DOM-less SDK to function as expected.&amp;lt;/pre&amp;gt;'''''=====&lt;br /&gt;
&lt;br /&gt;
==== Nielsen Debug Node.js Server for Event Tracking ====&lt;br /&gt;
We are excited to announce the beta version of our Debug Node.js server, designed to track requests and events sent from our Dom-less SDK using WebSocket connections. While this feature is not officially released, we are currently looking for users interested in beta testing.&lt;br /&gt;
&lt;br /&gt;
If you'd like to try this tool and provide feedback, please reach out to your Nielsen Technical Account Manager (TAM) for more information. Your insights would be invaluable in helping us refine this feature for a future release!&lt;br /&gt;
&lt;br /&gt;
== DOM-less SDK API Methods &amp;amp; Properties ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Method/Property&lt;br /&gt;
!Event #&lt;br /&gt;
!DTVR&lt;br /&gt;
!DAR&lt;br /&gt;
!DCR&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|[[play (Browser)|play]]&lt;br /&gt;
|5&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used when there is an ID3 fed product such as DTVR and the client does not want to send in all the CMS metadata that is sent in loadMetadata. This allows the client to send in at least the required “channel name” value associated to the ID3 feed. When the client passes in the channelName, they can change the CMS data stored by passing new values. If this event is not called then the “channel name” value populated will be the default value of “defaultChannelName”.&lt;br /&gt;
|-&lt;br /&gt;
|[[stop (Browser)|stop]]&lt;br /&gt;
|7&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used when switching between ad and content or content and ad.&lt;br /&gt;
|-&lt;br /&gt;
|[[loadMetadata (Browser)|loadMetadata]]&lt;br /&gt;
|15&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|Used when there is a preroll ad that needs to be associated with content metadata. The loadMetadata will first be called to populate the content metadata values and then the loadMetadata for ad metadata will be called. This allows sending a content ping with the ad info, even if the user bails out during the preroll ad.&lt;br /&gt;
|-&lt;br /&gt;
|[[setPlayheadPosition (Browser)|setPlayheadPosition]]&lt;br /&gt;
|49&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to send the playhead position.&lt;br /&gt;
|-&lt;br /&gt;
|[[sendID3 (Browser)|sendID3]]&lt;br /&gt;
|55&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|Used to send the ID3 metadata.&lt;br /&gt;
|-&lt;br /&gt;
|[[end (Browser)|end]]&lt;br /&gt;
|57&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|This is triggered 1) at the end of the content stream, 2) if the user switches to another piece of content 3) when the browser is refreshed or closed&lt;br /&gt;
|-&lt;br /&gt;
|[[setVolume (Browser)|setVolume]]&lt;br /&gt;
|61&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to pass in the player volume levels in %. Default value is -1.&lt;br /&gt;
|-&lt;br /&gt;
|[[staticstart (Browser)|staticstart]]&lt;br /&gt;
|14&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to send the metadata for the static page.&lt;br /&gt;
|-&lt;br /&gt;
|[[StaticEnd (Browser)|staticend]]&lt;br /&gt;
|56&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|In Single Page Application (SPA) it is imperative that staticend is called prior to the loading of new metadata. This allows the SDK to properly credit the previous section/content being viewed before measuring the new one.&lt;br /&gt;
|-&lt;br /&gt;
|[[onPaginate (Browser)|onPaginate]]&lt;br /&gt;
|30&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to initialize the SDK object&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Third_Party_Encoding_Facilities&amp;diff=6883</id>
		<title>Third Party Encoding Facilities</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Third_Party_Encoding_Facilities&amp;diff=6883"/>
		<updated>2025-08-28T17:12:25Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: Creating new page for Third Party Encoding Facilities&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a test page&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=TV&amp;diff=6882</id>
		<title>TV</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=TV&amp;diff=6882"/>
		<updated>2025-08-28T17:11:20Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: Adding section for Third Party Encoding Faclities&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:TV]]&lt;br /&gt;
{{Banner|Encoder Support|{{Breadcrumb|}} {{CurrentBreadcrumb}}}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 {{Alert|'''Download:''' '''https://nielsendownloads.digitalengsdk.com/tv/REMINDER_Spring_2019_DST.pdf Reminder: Daylight Savings Time (DST) changes November 3]''' &amp;lt;br&amp;gt; '''See also:''' '''[https://nielsendownloads-blue.digitalengsdk.com/tv/Quick_Reference_Guide_Spring_2019_DST.pdf Daylight Savings Time Quick Reference Guide Spring 2019]''' }}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{Alert|&lt;br /&gt;
'''Nielsen Encoder Installation and Configuration Policy 2022 Now Available:'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''Official release notification:  [https://nielsendownloads.digitalengsdk.com/tv/Encoding/Encoder+Policy+2022+-+04-01-22.pdf Nielsen Encoder Installation and Configuration Policy 2022]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--   --&amp;gt;&lt;br /&gt;
{{Alert|&lt;br /&gt;
'''Nielsen Encoder Installation and Configuration Policy 2022 Now Available:'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''Official release notification:  [https://nielsendownloads.digitalengsdk.com/tv/Nielsen-Encoder-Policy-Rev-H-2025-03.pdf.pdf Nielsen Encoder Installation and Configuration Policy 2025]&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 50px;&amp;quot; |&lt;br /&gt;
! Certified Vendors&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | &lt;br /&gt;
| '''[[Nielsen Encoder Certified Vendors]]'''&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | &lt;br /&gt;
| '''[[Nielsen Decoder Certified Vendors]]'''&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | &lt;br /&gt;
| '''[[PCM-to-ID3 Certified Vendors]]'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 50px;&amp;quot; |&lt;br /&gt;
! Third Party Encoding Facilities&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | &lt;br /&gt;
| '''[[Third Party Encoding Facilities]]'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 50px;&amp;quot; |&lt;br /&gt;
! Reference &amp;amp; Policy Supplements&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | {{SmallIcon|PDFIcon.png}}&lt;br /&gt;
| '''[https://nielsendownloads.digitalengsdk.com/tv/Nielsen-Encoder-Policy-Rev-H-2025-03.pdf.pdf Nielsen Encoder Installation and Configuration Policy 2025]'''&lt;br /&gt;
|-&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | {{SmallIcon|PDFIcon.png}}&lt;br /&gt;
| '''[https://nielsendownloads.digitalengsdk.com/tv/Encoding/Encoder+Policy+2022+-+04-01-22.pdf Nielsen Encoder Installation and Configuration Policy 2022]'''&lt;br /&gt;
|-&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | {{SmallIcon|PDFIcon.png}}&lt;br /&gt;
| '''[https://nielsendownloads-blue.digitalengsdk.com/tv/Encoding/Internet_Distribution_Policy_Rev_A.pdf Internet Distribution Policy]'''&lt;br /&gt;
|-&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | {{SmallIcon|PDFIcon.png}}&lt;br /&gt;
| '''[https://nielsendownloads.digitalengsdk.com/tv/Encoding/Nielsen+Encoder+Solutions+2023.pdf Nielsen Encoder Solutions 2023]'''&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | {{SmallIcon|PDFIcon.png}}&lt;br /&gt;
| '''[https://nielsendownloads.digitalengsdk.com/tv/Encoding/Nielsen+Encoder+Solutions+2024.pdf Nielsen Encoder Solutions 2024]'''&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | {{SmallIcon|PDFIcon.png}}&lt;br /&gt;
| '''[https://nielsendownloads-blue.digitalengsdk.com/tv/Encoding/MVPD%20provided%20Direct%20Feeds%20with%20Unique%20Commercial%20Content.pdf MVPD provided Direct Feeds with Unique Commercial Content]'''&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | {{SmallIcon|PDFIcon.png}}&lt;br /&gt;
| '''[https://nielsendownloads-blue.digitalengsdk.com/tv/Encoder%20Alert%20Distribution%20List%20Instructions_Final.pdf Nielsen Encoder Alert Distribution List - Instructions]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{CategoryIcon|EncodingIcon.png|TV Audio Encoding}}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 75px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 35%;&amp;quot; | Software&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS &lt;br /&gt;
! Download&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| {{SmallIcon|CircuitIcon.png}}&lt;br /&gt;
| '''[[NWE-3GA]]''' || {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=NWE-3GA Software package Rev 2.5.0.0 |dlid= 5a3f0ecbef6bfe4c9339fb8346a0064a645ebebf}} &amp;lt;small&amp;gt;''('''New!''')''&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
|-&lt;br /&gt;
| {{SmallIcon|CircuitIcon.png}}&lt;br /&gt;
| '''[[NWE-3GA]]''' || {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=NWE-3GA NWE-3G Software package Rev 2.3.0.9 |dlid=73aeefb5972bb1f556aa5093c14b981d223bec8e}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| {{SmallIcon|RackIcon.png}}&lt;br /&gt;
| '''[[NWE-TS]]'''&lt;br /&gt;
|| {{OSIcon|FirmwareIcon.png}} ||&lt;br /&gt;
&lt;br /&gt;
{{TVDownloadRequestLink|name=NWE-TS Firmware 4.8.1|dlid=ee2f22f3a7347b52627e2d393fab7f3d90d90943}} &amp;lt;small&amp;gt;''('''New!''')''&amp;lt;/small&amp;gt;&lt;br /&gt;
{{TVDownloadRequestLink|name=NWE-TS Firmware 4.6.10|dlid=31e04631784a2438fc41c81f34a49c33cd513ec6}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{TVDownloadRequestLink|name=NWE-TS Firmware 4.5.1|dlid=5126ebc2699eda28002ba6e2e84fb8a1031827f5}}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
| {{SmallIcon|RackIcon.png}}&lt;br /&gt;
| '''[[Multi-Channel Encoder]]'''&lt;br /&gt;
|| {{OSIcon|FirmwareIcon.png}} || &lt;br /&gt;
*[[Encoder Downloads| Multi-Channel Encoder v1.2.4]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| {{SmallIcon|VODIcon.png}}&lt;br /&gt;
| '''[[VOD Content Encoder]]'''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
*[[Encoder Downloads| VOD Content Encoder]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| {{SmallIcon|VODIcon.png}}&lt;br /&gt;
| '''[[VOD in TV Ratings]]'''  ''&amp;lt;small&amp;gt;(formerly RTVOD)&amp;lt;/small&amp;gt;''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
*[[Encoder Downloads| VOD in TV Ratings]] ''&amp;lt;small&amp;gt;(formerly RTVOD)&amp;lt;/small&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| {{SmallIcon|ComputerWaveIcon.png}}&lt;br /&gt;
| '''[[SpoTTrac®]]'''&lt;br /&gt;
|| {{OSIcon|FirmwareIcon.png}} || &lt;br /&gt;
*[[Encoder Downloads| SpoTTrac Firmware]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| {{SmallIcon|EncoderGrayIcon.png}}&lt;br /&gt;
| '''[[NAVE II]]'''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
*NAVE II Firmware v38&lt;br /&gt;
*NAVE II Manager&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| {{SmallIcon|EncoderGrayIcon.png}}&lt;br /&gt;
| '''[[NAVE IIC]]'''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
*NAVE IIC Firmware v3.4.15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{CategoryIcon|ID3Icon.png|ID3 Transcoding}}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 75px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 35%;&amp;quot; | Software&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS &lt;br /&gt;
! Download &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;| {{SmallIcon|ID3XcodeIcon.png}}&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;| '''[[ID3 Transcoders]]'''&lt;br /&gt;
''&amp;lt;small&amp;gt;(Click for Documentation, Software Updates, and Test Streams)&amp;lt;/small&amp;gt;''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 SDK (Windows) v2.3.2|dlid=ac5b0e72a84b1a6e86da1a8fe0a89e24083468eb}}&lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 SDK (Windows Visual Studio 2013) v2.3|dlid=533cee44e69c6859e56acd9cbb38334d6b215c00}}&lt;br /&gt;
|-&lt;br /&gt;
|| {{OSIcon|LinuxIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 SDK (Linux x64 GLIBC 2.12) v2.3.2|dlid=c499535f6ce9a0326a408b167079e01a0596e141}}&lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 SDK (Linux x64 GLIBC 2.17) v2.3.2|dlid=b353e404994a1d26726b196960efe40c30427571}}&lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 SDK (Linux x86 GLIBC 2.17) v2.3.2|dlid=f82dfbde6f5f68ccf677b63e32fc83e68fa82cd6}}&lt;br /&gt;
|-&lt;br /&gt;
|| {{OSIcon|macOSIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 SDK (MacOS) v2.3|dlid=3a9d04be165f39ac956278c8292cd1b87ce34b62}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;1&amp;quot;| {{SmallIcon|ID3DashIcon.png}}&lt;br /&gt;
|rowspan=&amp;quot;1&amp;quot;| '''[[ID3 in MPEG-DASH]]'''&lt;br /&gt;
''&amp;lt;small&amp;gt;(Click for Documentation, and Sample Audio Files)&amp;lt;/small&amp;gt;''&lt;br /&gt;
|| {{OSIcon|StaticIcon.png}} || &lt;br /&gt;
*[https://nielsendownloads-blue.digitalengsdk.com/tv/ID3%20Transcoding/ID3%20in%20MPEG-DASH/bbb-MPEG-DASH.zip Big Buck Bunny MPEG-DASH Nielsen Tagged]&lt;br /&gt;
*[https://nielsendownloads-blue.digitalengsdk.com/tv/ID3%20Transcoding/ID3%20in%20MPEG-DASH/nielsenconsumer-MPEG-DASH.zip Nielsen Consumer MPEG-DASH Nielsen Tagged]&lt;br /&gt;
*[https://nielsendownloads-blue.digitalengsdk.com/tv/ID3%20Transcoding/ID3%20in%20MPEG-DASH/nielsenxplatform-MPEG-DASH.zip Nielsen Cross Platform MPEG-DASH Nielsen Tagged]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;| {{SmallIcon|ID3ValidateIcon.png}} &lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;| '''[[PCM-to-ID3 Validator]]'''&lt;br /&gt;
''&amp;lt;small&amp;gt;(Click for Documentation, and Downloads)&amp;lt;/small&amp;gt;''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 Validator (Windows) v1.8|dlid=67d34c64d1ed349c1ad92ac47adf62c877f47fcb}}&lt;br /&gt;
|-&lt;br /&gt;
|| {{OSIcon|LinuxIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 Validator (CentOS) v1.7|dlid=dd6b62c76995aa7e1702c60e02076348ceaf573b}}&lt;br /&gt;
|-&lt;br /&gt;
|| {{OSIcon|macOSIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 Validator (MacOS) v1.7|dlid=3afc5a7ec29593e2eb47daa9746b6d16cbd785e1}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;| {{SmallIcon|ID3ValidateIcon.png}} &lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;| '''[[PCM-to-ID3 Validator SDK]]'''&lt;br /&gt;
''&amp;lt;small&amp;gt;(Click for Documentation, and Downloads)&amp;lt;/small&amp;gt;''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 Validator SDK (Windows) v1.8|dlid=78a936556ebc5caf57d2fc4d09de3a272ace9fea}}&lt;br /&gt;
|-&lt;br /&gt;
|| {{OSIcon|LinuxIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 Validator SDK (CentOS) v1.7|dlid=ccb9af4ef45cfcf7aa4406ca63ab3b7c6efdad11}}&lt;br /&gt;
|-&lt;br /&gt;
|| {{OSIcon|macOSIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 Validator SDK (MacOS) v1.7|dlid=05e99551d28ef4a65eab6168ad2872648346aab2}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{CategoryIcon|DiagnosisToolsIcon.png|Diagnostic Tools}}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 75px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 35%;&amp;quot; | Software&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS &lt;br /&gt;
! Download &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| {{SmallIcon|NACATIcon.png}} &lt;br /&gt;
|| '''[[Nielsen Audio Code Analysis Tool 3 for TV|Nielsen Audio Code Analysis Tool 3 (NACAT3)]]'''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=NACAT3 3.0.0.1|dlid=ce2cba3d4b4231a0978c632028c1a45479a8184d}} &amp;lt;small&amp;gt;''('''New!''')''&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| {{SmallIcon|NDICEIcon.png}}&lt;br /&gt;
|| '''[[Nielsen Digital Code Extractor]]'''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=Nielsen Digital Code Extractor Installer|dlid=c0eb8eb1802bd08956f6e215473ef1881274a6df}} &amp;lt;BR&amp;gt; (See special installation instructions in [[Nielsen Digital Code Extractor|guide]])&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;| {{SmallIcon|SDKIcon.png}} &lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;| '''[[Decoder SDK Monitor]]'''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=Decoder SDK Monitor (Windows vs2017) v1.4|dlid=b3ae411765cfa2b878c3f50c0824e61d81a58fbb}}&lt;br /&gt;
|-&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=Decoder SDK Monitor (Windows vs2015) v1.4|dlid=68d1fd697862e663a7aa2efc46377f053c983a5a}}&lt;br /&gt;
|-&lt;br /&gt;
|| {{OSIcon|LinuxIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=Decoder SDK Monitor (CentOS) v1.4|dlid=c978921ba90736bf7f2c82287a0a97af89109bec}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| {{SmallIcon|NDICEIcon.png}}&lt;br /&gt;
|| '''[[Nielsen Monitor Application]]'''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=Nielsen Monitor Application (Windows) v1.4|dlid=6ddf77a8f67dff67b4cbad1fee630ee80318b5bf}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Artifactory_Guide&amp;diff=6871</id>
		<title>Digital Measurement Android Artifactory Guide</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Digital_Measurement_Android_Artifactory_Guide&amp;diff=6871"/>
		<updated>2025-08-14T18:06:46Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: Update &amp;quot;grade&amp;quot; to &amp;quot;gradle&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{Breadcrumb|Digital Downloads}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
__NOTOC__&lt;br /&gt;
The Nielsen AppSDK can either be downloaded directly from the [http://engineeringportal.nielsen.com Engineering Portal], or can be integrated directly within an application through the use of a CocoaPod or Gradle.&lt;br /&gt;
&lt;br /&gt;
= How to install the Nielsen AppSDK using Gradle for Android =&lt;br /&gt;
Below are the steps which need to be performed by app developers to integrate the Nielsen App SDK within an Android application.&lt;br /&gt;
&lt;br /&gt;
== Add Nielsen Maven Repository ==&lt;br /&gt;
&lt;br /&gt;
Please add the Nielsen maven repository inside the repositories section of your app's module build.gradle file like below:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;android&amp;quot;&amp;gt;&lt;br /&gt;
repositories {&lt;br /&gt;
   //Copy below code inside repository section of app’s build.gradle file&lt;br /&gt;
maven { url 'https://raw.githubusercontent.com/NielsenDigitalSDK/nielsenappsdk-android/master/'&lt;br /&gt;
            }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
[[Image:AlertIcon.png|left|60px|link=|class=smallIcon]] Starting on Sept 21, 2021 the Nielsen SDK has moved to a public repository. Credentials are no longer required.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Add gradle dependency ==&lt;br /&gt;
&lt;br /&gt;
Please add Nielsen app SDK as compile time dependency inside build.gradle file as below&lt;br /&gt;
=== gradle 4.x and above ===&lt;br /&gt;
For gradle version starting with 4.x add the following line inside dependencies section of build.gradle file.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;implementation 'com.nielsenappsdk.${market}:${flavor}:${version}'&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
dependencies { ....&lt;br /&gt;
implementation 'com.nielsenappsdk.global:ad:+'  // Using + will provide the latest version&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== gradle prior to 4.x ===&lt;br /&gt;
For gradle version previous to 4.x add below line inside dependencies section of build.gradle file.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;compile 'com.nielsenappsdk.${market}:${flavor}:${version}'&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
dependencies { ....&lt;br /&gt;
compile 'com.nielsenappsdk.global:ad:+'  // Using + will provide the latest version&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Version and Flavor Control ==&lt;br /&gt;
With version 8.1.0.0+ of the Nielsen appSDK, it is possible to request a specific '''${flavor}''' that reads the '''Google Ad ID''', '''Android ID''', or is '''Kid app''' friendly (noID).  For example:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;implementation 'com.nielsenappsdk.${market}:${flavor}:${version}'&amp;lt;/source&amp;gt;&lt;br /&gt;
* if the flavor selected is equal to &amp;lt;code&amp;gt;ad&amp;lt;/code&amp;gt; the Nielsen SDK will try to obtain the googleAdID if the user has not opted out. &lt;br /&gt;
* If the flavor is &amp;lt;code&amp;gt;noad&amp;lt;/code&amp;gt; then the Nielsen SDK will attempt to obtain the AndroidID. &lt;br /&gt;
* If the flavor selected is &amp;lt;code&amp;gt;noid&amp;lt;/code&amp;gt; then the Nielsen SDK will not request any identifier which is required for many kid apps.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;To ensure backward compatability, &amp;lt;code&amp;gt; implementation 'com.nielsenappsdk:${market}:${version}'&amp;lt;/code&amp;gt; will continue to be supported.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! SDK  Version&lt;br /&gt;
! ${market}&lt;br /&gt;
! ${flavor}&lt;br /&gt;
! ${version}&lt;br /&gt;
! Examples&lt;br /&gt;
|-&lt;br /&gt;
| Appsdk 8.1.0.0+&lt;br /&gt;
|&amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;agf&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;ad&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;noad&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;noid&amp;lt;/code&amp;gt;&lt;br /&gt;
| + is most recent version&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;8.1.0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;'com.nielsenappsdk.global:ad:+'&amp;lt;br /&amp;gt;'com.nielsenappsdk.global:noad:+'&amp;lt;br /&amp;gt;'com.nielsenappsdk.global:noad:8.1.0.0'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| AppSDK 7 to 8.0.0.0&lt;br /&gt;
|&amp;lt;code&amp;gt;globalx&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;agf&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;agfx&amp;lt;/code&amp;gt;&lt;br /&gt;
|not used&lt;br /&gt;
| + is most recent version&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;7.1.0.0&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;8.0.0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;'com.nielsenappsdk:globalx:+'&amp;lt;br /&amp;gt;'com.nielsenappsdk:global:8.0.0.0'&amp;lt;br /&amp;gt;'com.nielsenappsdk:agf:8.0.0.0'&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;If using version control, a warning message will be displayed within the console trace during the build of your app,&lt;br /&gt;
and it will show all sdk versions released to-date, allowing a developer to select a more recent build if desired. &amp;lt;/blockquote&amp;gt; Starting with Version 8.x, the Nielsen SDK will only support Androidx.&lt;br /&gt;
&lt;br /&gt;
== Ensuring you have the latest release information ==&lt;br /&gt;
It is recommended to use &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; for &amp;lt;code&amp;gt;${version}&amp;lt;/code&amp;gt; to ensure you receive the most recent version of the NielsenSDK; however, if you are specifying the exact version of the SDK, please use only the first 3 digits.  EG: 8.1.0&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A sample if using AppSDK 8.1.0.0 + would be:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
dependencies { ....&lt;br /&gt;
implementation 'com.nielsenappsdk.global:ad:+'&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If using AppSDK 7 to 8.0.0.0&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
dependencies { ....&lt;br /&gt;
implementation 'com.nielsenappsdk:globalx:8.0.0'&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In addition, please add below gradle task inside your &amp;lt;code&amp;gt; build.gradle (Module:app)&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;build.gradle(Project:My-app)&amp;lt;/code&amp;gt; file to fetch latest release details of nielsen app sdk as below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Please note: The &amp;lt;code&amp;gt; build.gradle (Module:app)&amp;lt;/code&amp;gt;  can overwrite the &amp;lt;code&amp;gt;build.gradle(Project:My-app)&amp;lt;/code&amp;gt;.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;task NielsenSdkReleaseCheck {&lt;br /&gt;
    def p = ['curl',&amp;quot;https://raw.githubusercontent.com/NielsenDigitalSDK/&amp;quot; +&lt;br /&gt;
            &amp;quot;nielsenappsdk-android/master/com/nielsenappsdk/global/&amp;quot; +&lt;br /&gt;
            &amp;quot;NielsenAppSdk-ReadMe.md&amp;quot;].execute().text&lt;br /&gt;
    project.logger.log(LogLevel.ERROR,p)&lt;br /&gt;
}&lt;br /&gt;
preBuild.dependsOn('NielsenSdkReleaseCheck')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== App Suffix Reference ===&lt;br /&gt;
The Nielsen AppSDK has various configurations per market and distribution type, which can be determined by reviewing the [[Digital Measurement Android Suffix Guide|sdk suffix]].  The first part will be the SDK version: 3 digits for the major SDK version and 1 digit for the minor SDK version. EG: &amp;lt;code&amp;gt;aa.8.1.0.0_abc&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sync ==&lt;br /&gt;
&lt;br /&gt;
If you are finished with all previous steps then you can sync your build.gradle and after successful build you are ready to use Nielsen App SDK library in your code.&lt;br /&gt;
&lt;br /&gt;
== Sample file ==&lt;br /&gt;
The below is an example of a very basic app build.gradle file&lt;br /&gt;
&amp;lt;syntaxhighlight lang=Java&amp;gt;&lt;br /&gt;
plugins {&lt;br /&gt;
    id 'com.android.application'&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
android {&lt;br /&gt;
    compileSdkVersion 30&lt;br /&gt;
    buildToolsVersion &amp;quot;30.0.3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    defaultConfig {&lt;br /&gt;
        applicationId &amp;quot;com.nielsen.simplestandardandroidart&amp;quot;&lt;br /&gt;
        minSdkVersion 23&lt;br /&gt;
        targetSdkVersion 30&lt;br /&gt;
        versionCode 1&lt;br /&gt;
        versionName &amp;quot;1.0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        testInstrumentationRunner &amp;quot;androidx.test.runner.AndroidJUnitRunner&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    buildTypes {&lt;br /&gt;
        release {&lt;br /&gt;
            minifyEnabled false&lt;br /&gt;
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    repositories {&lt;br /&gt;
        //Copy below code inside repository section of app’s build.gradle file&lt;br /&gt;
        maven { url 'https://raw.githubusercontent.com/NielsenDigitalSDK/nielsenappsdk-android/master/'&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    compileOptions {&lt;br /&gt;
        sourceCompatibility JavaVersion.VERSION_1_8&lt;br /&gt;
        targetCompatibility JavaVersion.VERSION_1_8&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
dependencies {&lt;br /&gt;
&lt;br /&gt;
    implementation 'androidx.appcompat:appcompat:1.2.0'&lt;br /&gt;
    implementation 'com.google.android.material:material:1.1.0'&lt;br /&gt;
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'&lt;br /&gt;
    testImplementation 'junit:junit:4.+'&lt;br /&gt;
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'&lt;br /&gt;
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'&lt;br /&gt;
    implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'&lt;br /&gt;
    implementation 'com.google.android.gms:play-services-ads:20.3.0'&lt;br /&gt;
    implementation 'com.nielsenappsdk.global:ad:+'&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
task NielsenSdkReleaseCheck {&lt;br /&gt;
    def p = ['curl',&amp;quot;https://raw.githubusercontent.com/NielsenDigitalSDK/&amp;quot; +&lt;br /&gt;
            &amp;quot;nielsenappsdk-android/master/com/nielsenappsdk/global/&amp;quot; +&lt;br /&gt;
            &amp;quot;NielsenAppSdk-ReadMe.md&amp;quot;].execute().text&lt;br /&gt;
    project.logger.log(LogLevel.ERROR,p)&lt;br /&gt;
}&lt;br /&gt;
preBuild.dependsOn('NielsenSdkReleaseCheck')&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Template:Browser_Privacy_and_Opt-Out&amp;diff=6864</id>
		<title>Template:Browser Privacy and Opt-Out</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Template:Browser_Privacy_and_Opt-Out&amp;diff=6864"/>
		<updated>2025-08-05T20:46:45Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: Remove Opt Out Overview&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Privacy and Opt-Out ==&lt;br /&gt;
There are two primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# [[#User Opt Out|User Opt Out]] - Provide a link to the Nielsen Privacy Policy page when a User can make their selection&lt;br /&gt;
# [[#Initialization Opt Out|Initialization Opt Out]] - Global OptOut Parameter&lt;br /&gt;
&lt;br /&gt;
=== User Opt Out === &lt;br /&gt;
The site must provide a means for the user to opt-out of, or opt back into, Nielsen Measurement. A user can opt-out if they would prefer not to participate in any Nielsen online measurement research. To implement the User Opt-Out option, include the following two items in your privacy policy.&lt;br /&gt;
*A notice that the player (or page in relation to static measurement) includes proprietary measurement software that allows users to contribute to market research (such as Nielsen TV Ratings).&lt;br /&gt;
*A link to the Nielsen Digital Measurement Privacy Policy at https://www.nielsen.com/digitalprivacy&lt;br /&gt;
&lt;br /&gt;
On the Nielsen Digital Measurement Privacy Policy page, users can click Choices to read more detailed information about the measurement software, learn about their options with regard to Nielsen measurement, and, if they do not want to participate in Nielsen online measurement, click a link to opt-out.&lt;br /&gt;
&lt;br /&gt;
The following paragraph is a template for a Privacy Statement.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
The properties may feature Nielsen proprietary measurement software, which will allow users to contribute to market research, such as Nielsen TV Ratings. To learn more about the information that Nielsen software may collect and your choices with regard to it, please see the Nielsen Digital Measurement Privacy Policy at https://www.nielsen.com/digitalprivacy&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== User Opt Back In ====&lt;br /&gt;
Once users have opted-out, they can choose to opt back into Nielsen Measurement at anytime by selecting the opt back in link on the Nielsen Digital Privacy Policy page. When a user selects the link, they will be able to be measured.&lt;br /&gt;
&lt;br /&gt;
=== Initialization Opt Out ===&lt;br /&gt;
The BSDK600 now supports the ability to optout on initialization of the SDK by allowing an optout global parameter to be passed.  This optout will be maintained through the session of the SDK instance. Specifications and limitations are specified below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type&lt;br /&gt;
! Supported Values&lt;br /&gt;
! Notes&lt;br /&gt;
! Optout&lt;br /&gt;
|-&lt;br /&gt;
||optout||True, Yes, or 1|| Case is insensitive and can be string or bool&lt;br /&gt;
Example: nlsQ(&amp;quot;XXXXXXXX-BH45-JKY6-BKH7-67GJKY68GJK7&amp;quot;, &amp;quot;myInstance&amp;quot;, { optout: true});&lt;br /&gt;
|| Ping parameter will set uoo=true.&lt;br /&gt;
|-&lt;br /&gt;
||optout|| False, No, or 0 || Case is insensitive and can be string or bool&lt;br /&gt;
Example: nlsQ(&amp;quot;XXXXXXXX-BH45-JKY6-BKH7-67GJKY68GJK7&amp;quot;, &amp;quot;myInstance&amp;quot;, { optout: false});&lt;br /&gt;
|| Ping parameter will set uoo to blank.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
==== Example of using OptOut ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  optout: &amp;quot;true&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Template:Browser_Privacy_and_Opt-Out&amp;diff=6863</id>
		<title>Template:Browser Privacy and Opt-Out</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Template:Browser_Privacy_and_Opt-Out&amp;diff=6863"/>
		<updated>2025-08-05T20:45:34Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: Remove details of optout process&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Privacy and Opt-Out ==&lt;br /&gt;
There are two primary methods for implementing user Opt-out preferences:&lt;br /&gt;
# [[#User Opt Out|User Opt Out]] - Provide a link to the Nielsen Privacy Policy page when a User can make their selection&lt;br /&gt;
# [[#Initialization Opt Out|Initialization Opt Out]] - Global OptOut Parameter&lt;br /&gt;
&lt;br /&gt;
=== User Opt Out === &lt;br /&gt;
The site must provide a means for the user to opt-out of, or opt back into, Nielsen Measurement. A user can opt-out if they would prefer not to participate in any Nielsen online measurement research. To implement the User Opt-Out option, include the following two items in your privacy policy.&lt;br /&gt;
*A notice that the player (or page in relation to static measurement) includes proprietary measurement software that allows users to contribute to market research (such as Nielsen TV Ratings).&lt;br /&gt;
*A link to the Nielsen Digital Measurement Privacy Policy at https://www.nielsen.com/digitalprivacy&lt;br /&gt;
&lt;br /&gt;
On the Nielsen Digital Measurement Privacy Policy page, users can click Choices to read more detailed information about the measurement software, learn about their options with regard to Nielsen measurement, and, if they do not want to participate in Nielsen online measurement, click a link to opt-out.&lt;br /&gt;
&lt;br /&gt;
The following paragraph is a template for a Privacy Statement.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
The properties may feature Nielsen proprietary measurement software, which will allow users to contribute to market research, such as Nielsen TV Ratings. To learn more about the information that Nielsen software may collect and your choices with regard to it, please see the Nielsen Digital Measurement Privacy Policy at https://www.nielsen.com/digitalprivacy&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== User Opt Back In ====&lt;br /&gt;
Once users have opted-out, they can choose to opt back into Nielsen Measurement at anytime by selecting the opt back in link on the Nielsen Digital Privacy Policy page. When a user selects the link, they will be able to be measured.&lt;br /&gt;
&lt;br /&gt;
=== Initialization Opt Out ===&lt;br /&gt;
The BSDK600 now supports the ability to optout on initialization of the SDK by allowing an optout global parameter to be passed.  This optout will be maintained through the session of the SDK instance. Specifications and limitations are specified below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type&lt;br /&gt;
! Supported Values&lt;br /&gt;
! Notes&lt;br /&gt;
! Optout&lt;br /&gt;
|-&lt;br /&gt;
||optout||True, Yes, or 1|| Case is insensitive and can be string or bool&lt;br /&gt;
Example: nlsQ(&amp;quot;XXXXXXXX-BH45-JKY6-BKH7-67GJKY68GJK7&amp;quot;, &amp;quot;myInstance&amp;quot;, { optout: true});&lt;br /&gt;
|| Ping parameter will set uoo=true.&lt;br /&gt;
|-&lt;br /&gt;
||optout|| False, No, or 0 || Case is insensitive and can be string or bool&lt;br /&gt;
Example: nlsQ(&amp;quot;XXXXXXXX-BH45-JKY6-BKH7-67GJKY68GJK7&amp;quot;, &amp;quot;myInstance&amp;quot;, { optout: false});&lt;br /&gt;
|| Ping parameter will set uoo to blank.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
==== Example of using OptOut ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {&lt;br /&gt;
  nol_sdkDebug: &amp;quot;debug&amp;quot;,&lt;br /&gt;
  optout: &amp;quot;true&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Opt Out Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Browser Cookie&lt;br /&gt;
! uoo value in session ping&lt;br /&gt;
! Final Optout Status&lt;br /&gt;
|-&lt;br /&gt;
||Default Value || no uoo value or uoo=0 || Not Opted Out&lt;br /&gt;
|-&lt;br /&gt;
||Default Value || uoo=1 || Opted Out&lt;br /&gt;
|-&lt;br /&gt;
||TOTAL_OPTOUT || uoo=0 || Opted Out&lt;br /&gt;
|-&lt;br /&gt;
||TOTAL_OPTOUT || uoo=1 || Opted Out&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=TV&amp;diff=6860</id>
		<title>TV</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=TV&amp;diff=6860"/>
		<updated>2025-07-23T19:49:58Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: Changed link to Nielsen Audio Code Analysis Tool 3 to TV page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:TV]]&lt;br /&gt;
{{Banner|Encoder Support|{{Breadcrumb|}} {{CurrentBreadcrumb}}}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 {{Alert|'''Download:''' '''https://nielsendownloads.digitalengsdk.com/tv/REMINDER_Spring_2019_DST.pdf Reminder: Daylight Savings Time (DST) changes November 3]''' &amp;lt;br&amp;gt; '''See also:''' '''[https://nielsendownloads-blue.digitalengsdk.com/tv/Quick_Reference_Guide_Spring_2019_DST.pdf Daylight Savings Time Quick Reference Guide Spring 2019]''' }}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{Alert|&lt;br /&gt;
'''Nielsen Encoder Installation and Configuration Policy 2022 Now Available:'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''Official release notification:  [https://nielsendownloads.digitalengsdk.com/tv/Encoding/Encoder+Policy+2022+-+04-01-22.pdf Nielsen Encoder Installation and Configuration Policy 2022]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--   --&amp;gt;&lt;br /&gt;
{{Alert|&lt;br /&gt;
'''Nielsen Encoder Installation and Configuration Policy 2022 Now Available:'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''Official release notification:  [https://nielsendownloads.digitalengsdk.com/tv/Nielsen-Encoder-Policy-Rev-H-2025-03.pdf.pdf Nielsen Encoder Installation and Configuration Policy 2025]&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 50px;&amp;quot; |&lt;br /&gt;
! Certified Vendors&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | &lt;br /&gt;
| '''[[Nielsen Encoder Certified Vendors]]'''&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | &lt;br /&gt;
| '''[[Nielsen Decoder Certified Vendors]]'''&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | &lt;br /&gt;
| '''[[PCM-to-ID3 Certified Vendors]]'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 50px;&amp;quot; |&lt;br /&gt;
! Reference &amp;amp; Policy Supplements&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | {{SmallIcon|PDFIcon.png}}&lt;br /&gt;
| '''[https://nielsendownloads.digitalengsdk.com/tv/Nielsen-Encoder-Policy-Rev-H-2025-03.pdf.pdf Nielsen Encoder Installation and Configuration Policy 2025]'''&lt;br /&gt;
|-&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | {{SmallIcon|PDFIcon.png}}&lt;br /&gt;
| '''[https://nielsendownloads.digitalengsdk.com/tv/Encoding/Encoder+Policy+2022+-+04-01-22.pdf Nielsen Encoder Installation and Configuration Policy 2022]'''&lt;br /&gt;
|-&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | {{SmallIcon|PDFIcon.png}}&lt;br /&gt;
| '''[https://nielsendownloads-blue.digitalengsdk.com/tv/Encoding/Internet_Distribution_Policy_Rev_A.pdf Internet Distribution Policy]'''&lt;br /&gt;
|-&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | {{SmallIcon|PDFIcon.png}}&lt;br /&gt;
| '''[https://nielsendownloads.digitalengsdk.com/tv/Encoding/Nielsen+Encoder+Solutions+2023.pdf Nielsen Encoder Solutions 2023]'''&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | {{SmallIcon|PDFIcon.png}}&lt;br /&gt;
| '''[https://nielsendownloads.digitalengsdk.com/tv/Encoding/Nielsen+Encoder+Solutions+2024.pdf Nielsen Encoder Solutions 2024]'''&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | {{SmallIcon|PDFIcon.png}}&lt;br /&gt;
| '''[https://nielsendownloads-blue.digitalengsdk.com/tv/Encoding/MVPD%20provided%20Direct%20Feeds%20with%20Unique%20Commercial%20Content.pdf MVPD provided Direct Feeds with Unique Commercial Content]'''&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; | {{SmallIcon|PDFIcon.png}}&lt;br /&gt;
| '''[https://nielsendownloads-blue.digitalengsdk.com/tv/Encoder%20Alert%20Distribution%20List%20Instructions_Final.pdf Nielsen Encoder Alert Distribution List - Instructions]'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{CategoryIcon|EncodingIcon.png|TV Audio Encoding}}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 75px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 35%;&amp;quot; | Software&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS &lt;br /&gt;
! Download&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| {{SmallIcon|CircuitIcon.png}}&lt;br /&gt;
| '''[[NWE-3GA]]''' || {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=NWE-3GA Software package Rev 2.5.0.0 |dlid= 5a3f0ecbef6bfe4c9339fb8346a0064a645ebebf}} &amp;lt;small&amp;gt;''('''New!''')''&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
|-&lt;br /&gt;
| {{SmallIcon|CircuitIcon.png}}&lt;br /&gt;
| '''[[NWE-3GA]]''' || {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=NWE-3GA NWE-3G Software package Rev 2.3.0.9 |dlid=73aeefb5972bb1f556aa5093c14b981d223bec8e}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| {{SmallIcon|RackIcon.png}}&lt;br /&gt;
| '''[[NWE-TS]]'''&lt;br /&gt;
|| {{OSIcon|FirmwareIcon.png}} ||&lt;br /&gt;
&lt;br /&gt;
{{TVDownloadRequestLink|name=NWE-TS Firmware 4.8.1|dlid=ee2f22f3a7347b52627e2d393fab7f3d90d90943}} &amp;lt;small&amp;gt;''('''New!''')''&amp;lt;/small&amp;gt;&lt;br /&gt;
{{TVDownloadRequestLink|name=NWE-TS Firmware 4.6.10|dlid=31e04631784a2438fc41c81f34a49c33cd513ec6}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{TVDownloadRequestLink|name=NWE-TS Firmware 4.5.1|dlid=5126ebc2699eda28002ba6e2e84fb8a1031827f5}}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
| {{SmallIcon|RackIcon.png}}&lt;br /&gt;
| '''[[Multi-Channel Encoder]]'''&lt;br /&gt;
|| {{OSIcon|FirmwareIcon.png}} || &lt;br /&gt;
*[[Encoder Downloads| Multi-Channel Encoder v1.2.4]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| {{SmallIcon|VODIcon.png}}&lt;br /&gt;
| '''[[VOD Content Encoder]]'''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
*[[Encoder Downloads| VOD Content Encoder]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| {{SmallIcon|VODIcon.png}}&lt;br /&gt;
| '''[[VOD in TV Ratings]]'''  ''&amp;lt;small&amp;gt;(formerly RTVOD)&amp;lt;/small&amp;gt;''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
*[[Encoder Downloads| VOD in TV Ratings]] ''&amp;lt;small&amp;gt;(formerly RTVOD)&amp;lt;/small&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| {{SmallIcon|ComputerWaveIcon.png}}&lt;br /&gt;
| '''[[SpoTTrac®]]'''&lt;br /&gt;
|| {{OSIcon|FirmwareIcon.png}} || &lt;br /&gt;
*[[Encoder Downloads| SpoTTrac Firmware]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| {{SmallIcon|EncoderGrayIcon.png}}&lt;br /&gt;
| '''[[NAVE II]]'''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
*NAVE II Firmware v38&lt;br /&gt;
*NAVE II Manager&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| {{SmallIcon|EncoderGrayIcon.png}}&lt;br /&gt;
| '''[[NAVE IIC]]'''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
*NAVE IIC Firmware v3.4.15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{CategoryIcon|ID3Icon.png|ID3 Transcoding}}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 75px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 35%;&amp;quot; | Software&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS &lt;br /&gt;
! Download &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;| {{SmallIcon|ID3XcodeIcon.png}}&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;| '''[[ID3 Transcoders]]'''&lt;br /&gt;
''&amp;lt;small&amp;gt;(Click for Documentation, Software Updates, and Test Streams)&amp;lt;/small&amp;gt;''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 SDK (Windows) v2.3.2|dlid=ac5b0e72a84b1a6e86da1a8fe0a89e24083468eb}}&lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 SDK (Windows Visual Studio 2013) v2.3|dlid=533cee44e69c6859e56acd9cbb38334d6b215c00}}&lt;br /&gt;
|-&lt;br /&gt;
|| {{OSIcon|LinuxIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 SDK (Linux x64 GLIBC 2.12) v2.3.2|dlid=c499535f6ce9a0326a408b167079e01a0596e141}}&lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 SDK (Linux x64 GLIBC 2.17) v2.3.2|dlid=b353e404994a1d26726b196960efe40c30427571}}&lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 SDK (Linux x86 GLIBC 2.17) v2.3.2|dlid=f82dfbde6f5f68ccf677b63e32fc83e68fa82cd6}}&lt;br /&gt;
|-&lt;br /&gt;
|| {{OSIcon|macOSIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 SDK (MacOS) v2.3|dlid=3a9d04be165f39ac956278c8292cd1b87ce34b62}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;1&amp;quot;| {{SmallIcon|ID3DashIcon.png}}&lt;br /&gt;
|rowspan=&amp;quot;1&amp;quot;| '''[[ID3 in MPEG-DASH]]'''&lt;br /&gt;
''&amp;lt;small&amp;gt;(Click for Documentation, and Sample Audio Files)&amp;lt;/small&amp;gt;''&lt;br /&gt;
|| {{OSIcon|StaticIcon.png}} || &lt;br /&gt;
*[https://nielsendownloads-blue.digitalengsdk.com/tv/ID3%20Transcoding/ID3%20in%20MPEG-DASH/bbb-MPEG-DASH.zip Big Buck Bunny MPEG-DASH Nielsen Tagged]&lt;br /&gt;
*[https://nielsendownloads-blue.digitalengsdk.com/tv/ID3%20Transcoding/ID3%20in%20MPEG-DASH/nielsenconsumer-MPEG-DASH.zip Nielsen Consumer MPEG-DASH Nielsen Tagged]&lt;br /&gt;
*[https://nielsendownloads-blue.digitalengsdk.com/tv/ID3%20Transcoding/ID3%20in%20MPEG-DASH/nielsenxplatform-MPEG-DASH.zip Nielsen Cross Platform MPEG-DASH Nielsen Tagged]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;| {{SmallIcon|ID3ValidateIcon.png}} &lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;| '''[[PCM-to-ID3 Validator]]'''&lt;br /&gt;
''&amp;lt;small&amp;gt;(Click for Documentation, and Downloads)&amp;lt;/small&amp;gt;''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 Validator (Windows) v1.8|dlid=67d34c64d1ed349c1ad92ac47adf62c877f47fcb}}&lt;br /&gt;
|-&lt;br /&gt;
|| {{OSIcon|LinuxIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 Validator (CentOS) v1.7|dlid=dd6b62c76995aa7e1702c60e02076348ceaf573b}}&lt;br /&gt;
|-&lt;br /&gt;
|| {{OSIcon|macOSIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 Validator (MacOS) v1.7|dlid=3afc5a7ec29593e2eb47daa9746b6d16cbd785e1}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;| {{SmallIcon|ID3ValidateIcon.png}} &lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;| '''[[PCM-to-ID3 Validator SDK]]'''&lt;br /&gt;
''&amp;lt;small&amp;gt;(Click for Documentation, and Downloads)&amp;lt;/small&amp;gt;''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 Validator SDK (Windows) v1.8|dlid=78a936556ebc5caf57d2fc4d09de3a272ace9fea}}&lt;br /&gt;
|-&lt;br /&gt;
|| {{OSIcon|LinuxIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 Validator SDK (CentOS) v1.7|dlid=ccb9af4ef45cfcf7aa4406ca63ab3b7c6efdad11}}&lt;br /&gt;
|-&lt;br /&gt;
|| {{OSIcon|macOSIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=PCM-to-ID3 Validator SDK (MacOS) v1.7|dlid=05e99551d28ef4a65eab6168ad2872648346aab2}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{CategoryIcon|DiagnosisToolsIcon.png|Diagnostic Tools}}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 75px;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 35%;&amp;quot; | Software&lt;br /&gt;
! style=&amp;quot;width: 45px;&amp;quot; | OS &lt;br /&gt;
! Download &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| {{SmallIcon|NACATIcon.png}} &lt;br /&gt;
|| '''[[Nielsen Audio Code Analysis Tool 3 for TV|Nielsen Audio Code Analysis Tool 3 (NACAT3)]]'''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=NACAT3 3.0.0.1|dlid=ce2cba3d4b4231a0978c632028c1a45479a8184d}} &amp;lt;small&amp;gt;''('''New!''')''&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| {{SmallIcon|NDICEIcon.png}}&lt;br /&gt;
|| '''[[Nielsen Digital Code Extractor]]'''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=Nielsen Digital Code Extractor Installer|dlid=c0eb8eb1802bd08956f6e215473ef1881274a6df}} &amp;lt;BR&amp;gt; (See special installation instructions in [[Nielsen Digital Code Extractor|guide]])&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;| {{SmallIcon|SDKIcon.png}} &lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;| '''[[Decoder SDK Monitor]]'''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=Decoder SDK Monitor (Windows vs2017) v1.4|dlid=b3ae411765cfa2b878c3f50c0824e61d81a58fbb}}&lt;br /&gt;
|-&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=Decoder SDK Monitor (Windows vs2015) v1.4|dlid=68d1fd697862e663a7aa2efc46377f053c983a5a}}&lt;br /&gt;
|-&lt;br /&gt;
|| {{OSIcon|LinuxIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=Decoder SDK Monitor (CentOS) v1.4|dlid=c978921ba90736bf7f2c82287a0a97af89109bec}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| {{SmallIcon|NDICEIcon.png}}&lt;br /&gt;
|| '''[[Nielsen Monitor Application]]'''&lt;br /&gt;
|| {{OSIcon|WindowsIcon.png}} || &lt;br /&gt;
{{TVDownloadRequestLink|name=Nielsen Monitor Application (Windows) v1.4|dlid=6ddf77a8f67dff67b4cbad1fee630ee80318b5bf}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Nielsen_Audio_Code_Analysis_Tool_3_for_TV&amp;diff=6859</id>
		<title>Nielsen Audio Code Analysis Tool 3 for TV</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Nielsen_Audio_Code_Analysis_Tool_3_for_TV&amp;diff=6859"/>
		<updated>2025-07-23T18:58:29Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: /* Software Downloads */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:TV]]&lt;br /&gt;
{{Breadcrumb|}} {{Breadcrumb|TV}} {{CurrentBreadcrumb}}&lt;br /&gt;
&lt;br /&gt;
''' NACAT3® — Nielsen Audio Code Analysis Tool''' — The Nielsen Company has developed NACAT, a Microsoft® Windows 10/11 operating system (64-bit) PC tool to aid in diagnosing audio watermarks embedded in an audio stream.&lt;br /&gt;
&lt;br /&gt;
NACAT is a Graphical User Interface (GUI) application that captures audio, extracts Nielsen codes from that audio, decodes Nielsen audio codes (including UCC), and reports the extracted audio codes.&lt;br /&gt;
The Nielsen EVS department uses the NACAT application for monitoring, assisting in troubleshooting, and verifying NAVE encoder installations.&lt;br /&gt;
&lt;br /&gt;
'''This release has significant enhancements.'''&lt;br /&gt;
&lt;br /&gt;
This version incorporates Decoder SDK v6.0.16 with its underlying UCC/Commercial Codes and sub-minute capabilities.&lt;br /&gt;
&lt;br /&gt;
Enhancements include decode, display, and log both the left and right channels simultaneously for more complete monitoring. NACAT3® enables decoding of all 6 channels.&lt;br /&gt;
&lt;br /&gt;
NACAT 3 for Radio requires the use of a code mapping file (SIDMAP). To request a SIDMAP file that contains the mapping for your station/station groups audio codes, please email encoding@nielsen.com. You will need to provide the list of station call letters or station ownership for the codes you’re requesting.&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
*[https://nielsendownloads.digitalengsdk.com/radio/Diagnostic+Tools/NACAT3%C2%AE+%E2%80%94+Nielsen+Audio+Code+Analysis+Tool.pdf NACAT3® Product Overview]&lt;br /&gt;
&lt;br /&gt;
== Software Downloads ==&lt;br /&gt;
{{TVDownloadRequestLink|name=NACAT3 3.0.0.1|dlid=ce2cba3d4b4231a0978c632028c1a45479a8184d}}&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Nielsen_Audio_Code_Analysis_Tool_3_for_TV&amp;diff=6858</id>
		<title>Nielsen Audio Code Analysis Tool 3 for TV</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Nielsen_Audio_Code_Analysis_Tool_3_for_TV&amp;diff=6858"/>
		<updated>2025-07-23T18:45:17Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: NACAT3 - Nielsen Audio Code Analysis Tool page for TV&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:TV]]&lt;br /&gt;
{{Breadcrumb|}} {{Breadcrumb|TV}} {{CurrentBreadcrumb}}&lt;br /&gt;
&lt;br /&gt;
''' NACAT3® — Nielsen Audio Code Analysis Tool''' — The Nielsen Company has developed NACAT, a Microsoft® Windows 10/11 operating system (64-bit) PC tool to aid in diagnosing audio watermarks embedded in an audio stream.&lt;br /&gt;
&lt;br /&gt;
NACAT is a Graphical User Interface (GUI) application that captures audio, extracts Nielsen codes from that audio, decodes Nielsen audio codes (including UCC), and reports the extracted audio codes.&lt;br /&gt;
The Nielsen EVS department uses the NACAT application for monitoring, assisting in troubleshooting, and verifying NAVE encoder installations.&lt;br /&gt;
&lt;br /&gt;
'''This release has significant enhancements.'''&lt;br /&gt;
&lt;br /&gt;
This version incorporates Decoder SDK v6.0.16 with its underlying UCC/Commercial Codes and sub-minute capabilities.&lt;br /&gt;
&lt;br /&gt;
Enhancements include decode, display, and log both the left and right channels simultaneously for more complete monitoring. NACAT3® enables decoding of all 6 channels.&lt;br /&gt;
&lt;br /&gt;
NACAT 3 for Radio requires the use of a code mapping file (SIDMAP). To request a SIDMAP file that contains the mapping for your station/station groups audio codes, please email encoding@nielsen.com. You will need to provide the list of station call letters or station ownership for the codes you’re requesting.&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
*[https://nielsendownloads.digitalengsdk.com/radio/Diagnostic+Tools/NACAT3%C2%AE+%E2%80%94+Nielsen+Audio+Code+Analysis+Tool.pdf NACAT3® Product Overview]&lt;br /&gt;
&lt;br /&gt;
== Software Downloads ==&lt;br /&gt;
{{TVDownloadRequestLink|name=NACAT3 3.0.0.1|dlid=ce2cba3d4b4231a0978c632028c1a45479a8184d&amp;amp;section=r}}&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_Release_Notes&amp;diff=6813</id>
		<title>Browser SDK Release Notes</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_Release_Notes&amp;diff=6813"/>
		<updated>2025-07-15T16:26:42Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: Update Release notes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
== Release R1(v6.0.0.734) (07-08-2025) ==&lt;br /&gt;
&lt;br /&gt;
* Support for DTVR Subminute feature&lt;br /&gt;
&lt;br /&gt;
== Release V1(v6.0.110) (05-21-2024) ==&lt;br /&gt;
&lt;br /&gt;
* Suppression of v60/v52/v53 legacy pings&lt;br /&gt;
&lt;br /&gt;
== Release R2(v6.0.0.702) (10-30-2024) ==&lt;br /&gt;
&lt;br /&gt;
* 2nd release of DOMless SDK&lt;br /&gt;
* Support DCR Static&lt;br /&gt;
* Support Debug interface which can be used to view API calls and SDK pings&lt;br /&gt;
* Support caching of pings when network is not available&lt;br /&gt;
&lt;br /&gt;
== Release R1(v6.0.0.692) (07-31-2024) ==&lt;br /&gt;
&lt;br /&gt;
* DOMless SDK Release with support for Amazon, ReactNative and other DOM less platforms&lt;br /&gt;
&lt;br /&gt;
== Release R6(v6.0.0.673) (09-05-2023) ==&lt;br /&gt;
&lt;br /&gt;
* Fix for stream id of stream 2 is populated in the last duration ping of stream 1 when mandatory END is not called&lt;br /&gt;
&lt;br /&gt;
== Release R5(v6.0.0.673) (08-14-2023) (AGF Release) ==&lt;br /&gt;
&lt;br /&gt;
* Fix for stream id of stream 2 is populated in the last duration ping of stream 1 when mandatory END is not called&lt;br /&gt;
&lt;br /&gt;
== Release R4(v6.0.0.672) (08-01-2023) ==&lt;br /&gt;
&lt;br /&gt;
* Viewability build with support for Viewability and Audibility features&lt;br /&gt;
&lt;br /&gt;
== Release R3(v6.0.0.663) (05-30-2023) ==&lt;br /&gt;
&lt;br /&gt;
* Support to measure static on hbbtv with the iFrame fixes.&lt;br /&gt;
&lt;br /&gt;
== Release R2(v.6.0.0.648) (05-03-2023) (AGF Release) ==&lt;br /&gt;
&lt;br /&gt;
* Support to measure DCR static when browser sdk is initialized on parent page while video is played within the iFrame&lt;br /&gt;
* Fix to propagate correct starttm value in postroll content trailing ping&lt;br /&gt;
* Fix the 1st party cookie expiry date&lt;br /&gt;
* Fix first party id time to live parameter (nol_fpid_ttl) override&lt;br /&gt;
* Update the sessionURL in BSDK600 code with FPID parameters&lt;br /&gt;
* SIVT support for DCR &amp;amp; DTVR&lt;br /&gt;
* StaticEnd support for Hybrid App&lt;br /&gt;
&lt;br /&gt;
== Release R1.2(v6.0.0.662) (04-19-2023) ==&lt;br /&gt;
* Support to measure DCR static when browser sdk is initialized on parent page while video is played within the iFrame&lt;br /&gt;
* Support to measure DCR static on a Single Page Application when staticEnd is not called while navigating from one page to another&lt;br /&gt;
&lt;br /&gt;
== Release R1(v6.0.0.648) (03-06-2023) ==&lt;br /&gt;
* SIVT support for DCR &amp;amp; DTVR&lt;br /&gt;
* StaticEnd support for Hybrid App&lt;br /&gt;
&lt;br /&gt;
== Release R4(v6.0.0.623) (05-02-2022) ==&lt;br /&gt;
* Fix the 1st party cookie expiry date&lt;br /&gt;
* Fix first party id time to live parameter (nol_fpid_ttl) override&lt;br /&gt;
* Update the sessionURL in BSDK600 code with FPID parameters&lt;br /&gt;
&lt;br /&gt;
== Release R3(v6.0.0.618) (03-29-2022) ==&lt;br /&gt;
* Fix to measure dcr static while video is in focus and within an iFrame&lt;br /&gt;
* Fix to propagate correct starttm value in postroll content trailing ping&lt;br /&gt;
&lt;br /&gt;
== Release v6.0.0.355 ==&lt;br /&gt;
* Performance improvements through the use of cachable configuration via the Static Queue Snippet.&lt;br /&gt;
* Dynamic Configuration File&lt;br /&gt;
* Session Ping/UAID - A unique identifier of the device which allows for a single facebook ping per session.&lt;br /&gt;
* Support for iOS 12.2&lt;br /&gt;
&lt;br /&gt;
== Release 5.1.0 (Build 2) ==&lt;br /&gt;
*Support for DCR Static Lite Measurement&lt;br /&gt;
*Advanced Dynamic Script Initialization&lt;br /&gt;
*Removal of Configuration file dependency&lt;br /&gt;
&lt;br /&gt;
== Release 5.0.0 (Build 17) ==   &lt;br /&gt;
*Support for Nielsen Digital Content Ratings (DCR) product&lt;br /&gt;
*Support for measurement of static content&lt;br /&gt;
*Support for Ad measurement&lt;br /&gt;
*Support for Facebook Pings&lt;br /&gt;
*Support for multiple instances of the SDK&lt;br /&gt;
*General bug fix and performance improvements&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DTVR_Domless_SDK&amp;diff=6812</id>
		<title>DTVR Domless SDK</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DTVR_Domless_SDK&amp;diff=6812"/>
		<updated>2025-06-09T19:49:45Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: Add information about Implementation hooks&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== License ==&lt;br /&gt;
Nielsen SDK contains material that is protected by copyright laws, patent laws, trade secret laws, and by international treaty provisions and is Copyright © 2024 The Nielsen Company (US) LLC. All intellectual property rights and licenses therein are reserved by The Nielsen Company (US) LLC and its licensors. Please read the license agreement presented [[Special:ClickThrough|here]], which must be accepted in order to download the Nielsen SDKs. For more information, reach out to your Nielsen Technical Account Manager(TAM).&lt;br /&gt;
&lt;br /&gt;
== DOM-less SDK DTVR Video Introduction ==&lt;br /&gt;
The Nielsen DOM-less SDK is a Javascript based cross-platform library that clients can use to integrate the Nielsen Digital Content Rating or Digital TV Rating measurement in ReactNative or NodeJS apps.&lt;br /&gt;
&lt;br /&gt;
The Digital TV Ratings (DTVR) product provides content consumption measurement on client mobile apps or webpages. This measurement includes insight into the total time a user spent watching the tracked content, video player events, and much more. This example provides the steps to implement the DTVR Video product in a sample NodeJS app. It includes:&lt;br /&gt;
&lt;br /&gt;
* DOM-less SDK Initialization&lt;br /&gt;
* DTVR Metadata: information about the content being tracked&lt;br /&gt;
* DTVR Events/API calls&lt;br /&gt;
&lt;br /&gt;
By the end of this guide you will have the needed steps to integrate Nielsen's DOM-less SDK in your app.&lt;br /&gt;
&lt;br /&gt;
=== DOM-less SDK DTVR Video Step 1 - Obtain AppID ===&lt;br /&gt;
To begin using the DOM-less SDK you will need to obtain an Application ID (AppId)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&lt;br /&gt;
!Item&lt;br /&gt;
!Description&lt;br /&gt;
!Source&lt;br /&gt;
|-&lt;br /&gt;
|✅&lt;br /&gt;
|App ID (appid)&lt;br /&gt;
|Unique ID assigned to the player/site and configured by product&lt;br /&gt;
|Contact your Nielsen TAM&lt;br /&gt;
|}&lt;br /&gt;
The appid is a 37 character unique ID assigned to the player/site and configured by product and is required when creating a new instance of the DOM-less SDK on the app.&lt;br /&gt;
&lt;br /&gt;
Example: '''PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX'''&lt;br /&gt;
&lt;br /&gt;
=== DOM-less SDK DTVR Video Step 2 - SDK Initialization ===&lt;br /&gt;
This project is an API that allows clients to integrate the Nielsen SDK in DOM-less environments like React Native, NodeJS, etc.&lt;br /&gt;
 &lt;br /&gt;
Refer to the &amp;quot; [[Domless_SDK_API_Reference#DOM-less SDK Initialization|DOM-less SDK initialization]] &amp;quot; section in the [[Domless_SDK_API_Reference|DOM-less SDK API Reference Guide]].&lt;br /&gt;
&lt;br /&gt;
==== SDK Initialization ====&lt;br /&gt;
The following table contains the list of arguments that can be passed&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Parameter / Argument&lt;br /&gt;
!Description&lt;br /&gt;
!Source&lt;br /&gt;
!Required?&lt;br /&gt;
!Example&lt;br /&gt;
|-&lt;br /&gt;
|appid&lt;br /&gt;
|Unique Nielsen ID for the application. The ID is a GUID data type. If you did not receive your App ID, let us know and we will provide you.&lt;br /&gt;
|Nielsen-specified&lt;br /&gt;
|Yes&lt;br /&gt;
|PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
|instanceName&lt;br /&gt;
|DOM-less SDK instance name&lt;br /&gt;
|Client provided&lt;br /&gt;
|Yes&lt;br /&gt;
|String eg. abcdefg&lt;br /&gt;
|-&lt;br /&gt;
|appName&lt;br /&gt;
|Application name&lt;br /&gt;
|Client provided&lt;br /&gt;
|Yes&lt;br /&gt;
|appName: 'BSDK RN Sample App'&lt;br /&gt;
|-&lt;br /&gt;
|deviceId&lt;br /&gt;
|Device ID&lt;br /&gt;
|Client provided&lt;br /&gt;
|Yes&lt;br /&gt;
|deviceId: '38400000-8cf0-11bd-b23e-10b96e40000d'&lt;br /&gt;
|-&lt;br /&gt;
|nol_sdkDebug&lt;br /&gt;
|Enables Nielsen console logging. Only required for testing&lt;br /&gt;
|Client-provided&lt;br /&gt;
|No&lt;br /&gt;
|nol_sdkDebug: 'debug'&lt;br /&gt;
|-&lt;br /&gt;
|domlessEnv&lt;br /&gt;
|Specify the domless environment.&lt;br /&gt;
&amp;quot;1&amp;quot; for ReactNative &amp;quot;2&amp;quot; for Amazon &amp;quot;3&amp;quot; for NodeJS &amp;quot;4&amp;quot; for Custom&lt;br /&gt;
|Client-provided&lt;br /&gt;
|Yes&lt;br /&gt;
|domlessEnv: '1'&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Implementation Hooks====&lt;br /&gt;
Implementation hooks are essential for the DOM-less SDK to work as expected. Please refer to the &amp;quot;[[Domless_SDK_API_Reference#Implementation Hooks | Implementation Hooks]] &amp;quot; section in the [[Domless_SDK_API_Reference | DOM-less SDK API Reference Guide]].&lt;br /&gt;
&lt;br /&gt;
====Nielsen Debug Node.js Server for Event Tracking====&lt;br /&gt;
We are excited to announce the beta version of our Debug Node.js server, designed to track requests and events sent from our Dom-less SDK using WebSocket connections. While this feature is not officially released, we are currently looking for users interested in beta testing.&lt;br /&gt;
&lt;br /&gt;
If you'd like to try this tool and provide feedback, please reach out to your Nielsen Technical Account Manager (TAM) for more information. Your insights would be invaluable in helping us refine this feature for a future release!&lt;br /&gt;
&lt;br /&gt;
=== DOM-less SDK DTVR Video Step 3 - Create DTVR Metadata Object ===&lt;br /&gt;
&lt;br /&gt;
==== Events that can be passed to `ggPM` method ====&lt;br /&gt;
1. &amp;lt;code&amp;gt;loadMetadata&amp;lt;/code&amp;gt; - This event is used to send DTVR metadata to the Nielsen SDK. This event should be called when the video metadata is loaded.&lt;br /&gt;
     instance.ggPM('loadMetadata', {&lt;br /&gt;
         'type': 'content',&lt;br /&gt;
         'adModel': '1'&lt;br /&gt;
     });&lt;br /&gt;
2. &amp;lt;code&amp;gt;sendID3&amp;lt;/code&amp;gt; - This event is used to send the id3 event to the Nielsen SDK. This event should be called when the id3 event is triggered, passing the id3 data from the stream.&lt;br /&gt;
     instance.ggPM('sendID3', '&amp;lt;id3 metadata received&amp;gt;');&lt;br /&gt;
3. &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; - This event is used to send the end event to the Nielsen SDK. This event should be called when the video playback is finished, passing the playhead at that time.&lt;br /&gt;
     instance.ggPM('end', 300);&lt;br /&gt;
&lt;br /&gt;
====== Events that can be passed to and processed by &amp;lt;code&amp;gt;processEvent&amp;lt;/code&amp;gt; method ======&lt;br /&gt;
1. &amp;lt;code&amp;gt;`blur`&amp;lt;/code&amp;gt; - This event should be passed to processEvent when the app goes to the background.&lt;br /&gt;
     instance.processEvent({'type': 'blur', 'timestamp': Date.now()});&lt;br /&gt;
2. &amp;lt;code&amp;gt;`focus`&amp;lt;/code&amp;gt; - This event should be passed to processEvent when the app goes to the foreground.&lt;br /&gt;
     instance.processEvent({'type': 'focus', 'timestamp': Date.now()});&lt;br /&gt;
3. &amp;lt;code&amp;gt;`appclose`&amp;lt;/code&amp;gt; - This event should be passed prior to closing the app.&lt;br /&gt;
     instance.processEvent({'type': 'appclose', 'timestamp': Date.now()});&lt;br /&gt;
&lt;br /&gt;
===== ID3 Tags =====&lt;br /&gt;
ID3_Payload is the container to pass the retrieved ID3 tag from the stream. The player should look for 'PRIV' ID3 tags and send 'owner' field (which typically starts from &amp;quot;www.nielsen.com&amp;quot;) through this API. Refer to DTVR Event Listeners section below for more information.&lt;br /&gt;
&lt;br /&gt;
'''Sample ID3 Tags'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/X100zdCIGeIlgZnkYj6UvQ==/AAAB2Jz2_k74GXSzx4npHuI_&amp;lt;wbr /&amp;gt;JwJd3QSUpW30rDkGTcbHEzIMWleCzM-uvNOP9fzJcQMWQLJqzXMCAxParOb5sGijSV9dNM3QiBniJYGZ5GI-lL1fXTTN0IgZ4iWBmeRiPpS9AAAAAAAAAAAAAAAAAAAAAFJWFM5SVhTONNU=/00000/00000/00&lt;br /&gt;
&lt;br /&gt;
www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/R8WHe7pEBeqBhu8jTeXydg==/AAICoyitYqlxT7n6aZ0oMCGhe&amp;lt;wbr /&amp;gt;Fi4CXFp46AMUPZz1lMr_M9tr3_cjee1SHqxrOiVerMDLeyn9xzocZSKwi746Re8vNOtpNCAZjYABs_J0R25IHpvOc1HS8&amp;lt;wbr /&amp;gt;QHGgD5TgOJeS6gX100zdCIGeIlgZnkYj6UvVJWFNhSVhTiPE0=/00000/46016/00&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DOM-less SDK DTVR Step 4 - Basic Set of Events - Sample Playback ===&lt;br /&gt;
&lt;br /&gt;
==== Sample Nielsen BSDK-Domless NodeJS Example ====&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/NielsenDigitalSDK/bsdk-domless-samples/tree/main/nodejs Nielsen bsdk-domless NodeJS Repository Example]&lt;br /&gt;
&lt;br /&gt;
==== Sample DTVR Video Integration ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import { BsdkInstance } from 'bsdk-domless'; &lt;br /&gt;
const nsdkConfig = { &lt;br /&gt;
    app_id: 'PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX',&lt;br /&gt;
    instance_name: 'videoInstance',&lt;br /&gt;
};&lt;br /&gt;
const implementationHooks = { &lt;br /&gt;
    Log: {&lt;br /&gt;
        info: function (log: string) {&lt;br /&gt;
                console.info(log);&lt;br /&gt;
            },&lt;br /&gt;
        debug: function (log: string) {&lt;br /&gt;
                console.debug(log);&lt;br /&gt;
            },&lt;br /&gt;
        warn: function (log: string) {&lt;br /&gt;
                console.warn(log);&lt;br /&gt;
            },&lt;br /&gt;
        error: function (error: string) {&lt;br /&gt;
                console.error(error);&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
    Storage: {&lt;br /&gt;
        setItem: async function (key: any, value: string) {&lt;br /&gt;
            /** &lt;br /&gt;
            * Sets a string value for given key. This operation can either modify an existing entry,&lt;br /&gt;
            * if it did exist for given key, or add new one otherwise. &lt;br /&gt;
            * In order to store object value, you need to serialize it, e.g. using JSON.stringify().&lt;br /&gt;
            */&lt;br /&gt;
        },&lt;br /&gt;
        getItem: async function (key: any) {&lt;br /&gt;
            /**&lt;br /&gt;
            * Gets a string value for given key. This function can either return a string value for&lt;br /&gt;
            * existing key or return null otherwise. &lt;br /&gt;
            * In order to store object value, you need to deserialize it, e.g. using JSON.parse().&lt;br /&gt;
            */ &lt;br /&gt;
        },&lt;br /&gt;
        removeItem: async function (key: any) {&lt;br /&gt;
            /**&lt;br /&gt;
            * Removes item for a key, invokes (optional) callback once completed. &lt;br /&gt;
            */&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    Fetch: async function (url: string | URL | Request, options: any) {&lt;br /&gt;
        /** &lt;br /&gt;
        * We require that client pass in User-Agent header via options in Fetch request&lt;br /&gt;
        */&lt;br /&gt;
        const clientOpts = { &lt;br /&gt;
            headers: {&lt;br /&gt;
                &amp;quot;User-Agent&amp;quot;: &amp;quot;react-native-domless/1.6.7.42 Dalvik/2.1.0 (Linux; U; Android 5.1.1; Android SDK built for x86 Build/LMY48X)&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        const data = Object.assign(options, clientOpts);&lt;br /&gt;
        const response = await fetch(url, data);&lt;br /&gt;
        if (response.ok) {&lt;br /&gt;
            return response;&lt;br /&gt;
        } else {&lt;br /&gt;
            throw new Error('Request failed');&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    SetTimeout: function (callback: () =&amp;gt; void, timeout: number | undefined) {&lt;br /&gt;
        return setTimeout(callback, timeout);&lt;br /&gt;
    },&lt;br /&gt;
    SetInterval: function (callback: () =&amp;gt; void, interval: number | undefined) {&lt;br /&gt;
        return setInterval(callback, interval);&lt;br /&gt;
    },&lt;br /&gt;
    ClearTimeout: function (timeout: string | number | NodeJS.Timeout | undefined) {&lt;br /&gt;
        return clearTimeout(timeout); &lt;br /&gt;
    },&lt;br /&gt;
    ClearInterval: function (interval: string | number | NodeJS.Timeout | undefined) {&lt;br /&gt;
        return clearInterval(interval);&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
const nSdkInstance = new BsdkInstance(&lt;br /&gt;
    nsdkConfig.app_id,&lt;br /&gt;
    nsdkConfig.instance_name,&lt;br /&gt;
    {&lt;br /&gt;
        appName: 'BSDK RN Sample App',&lt;br /&gt;
        deviceId: 'testDeviceId',&lt;br /&gt;
        nol_sdkDebug: 'debug', // remove debug flag when going to production &lt;br /&gt;
        domlessEnv: // &amp;quot;1&amp;quot; for React Native | &amp;quot;2&amp;quot; for Amazon | &amp;quot;3&amp;quot; for NodeJS | &amp;quot;4&amp;quot; for Custom&lt;br /&gt;
        // reference SDK interface documentation&lt;br /&gt;
        // for additonal metadata properties&lt;br /&gt;
    },&lt;br /&gt;
    implementationHooks&lt;br /&gt;
); &lt;br /&gt;
// Sample VideoPlayer component&lt;br /&gt;
const VideoPlayer = (props) =&amp;gt; {&lt;br /&gt;
    /**&lt;br /&gt;
    * Implementation of video player component will vary across the board, for Nielsen DOM-less SDK integration&lt;br /&gt;
    * clients need only setup event listeners with corresponding ggPM() calls. &lt;br /&gt;
    * Please refer to chosen video player documentation on available events&lt;br /&gt;
    */&lt;br /&gt;
    const video = useRef&amp;lt;Video&amp;gt;(null);&lt;br /&gt;
    let previousPlayhead = 0; // keep track of previous playhead position&lt;br /&gt;
    let metadataLoaded = false; // in case of replay scenario set flag for metadata load &lt;br /&gt;
    // Sample video metadata &lt;br /&gt;
    const videometadata = {&lt;br /&gt;
        'type': 'content',&lt;br /&gt;
        'adModel': '1'&lt;br /&gt;
    }&lt;br /&gt;
    const setUpEventListeners = (): void =&amp;gt; {&lt;br /&gt;
        video.addEventListener('ended', onEnded);&lt;br /&gt;
        video.addEventListener('playing', onPlay);&lt;br /&gt;
        video.addEventListener('metadata', onMetadata )&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    const onEnded = () =&amp;gt; {&lt;br /&gt;
        // Nielsen SDK ggPM 'end' event&lt;br /&gt;
        if (nSdkInstance) {&lt;br /&gt;
        nSdkInstance.then((instance: any) =&amp;gt; {&lt;br /&gt;
            instance.ggPM('end', Math.round(video.currentTime));&lt;br /&gt;
            metadataLoaded = false;&lt;br /&gt;
        });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    // NOTE: some players may have an event when video metadata is loaded, recommended to use if available. E.g. loadedmetadata&lt;br /&gt;
    const onPlay = () =&amp;gt; {&lt;br /&gt;
        // Nielsen SDK ggPM 'loadMetadata' event&lt;br /&gt;
        if (nSdkInstance &amp;amp;&amp;amp; !metadataLoaded) {&lt;br /&gt;
            nSdkInstance.then((instance: any) =&amp;gt; {&lt;br /&gt;
                instance.ggPM('loadMetadata', videometadata);&lt;br /&gt;
                metadataLoaded = true;&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    // NOTE: retireval of ID3 tags will vary by player and is primarily used for DTVR measurement&lt;br /&gt;
    const onMetadata = (data) = {&lt;br /&gt;
        if (data.metadata &amp;amp;&amp;amp; data.metadata.key === 'PRIV') {&lt;br /&gt;
            nSdkInstance.then(instance =&amp;gt; {&lt;br /&gt;
            instance.ggPM('sendID3', data.metadata.info);&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    return (&lt;br /&gt;
        &amp;lt;View&amp;gt;&lt;br /&gt;
            &amp;lt;Video&lt;br /&gt;
                source={{ uri: 'https://www.w3schools.com/html/mov_bbb.mp4' }}&lt;br /&gt;
            /&amp;gt;&lt;br /&gt;
        &amp;lt;/View&amp;gt;&lt;br /&gt;
    );&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Domless_SDK_API_Reference&amp;diff=6811</id>
		<title>Domless SDK API Reference</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Domless_SDK_API_Reference&amp;diff=6811"/>
		<updated>2025-06-09T19:28:52Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: /* Note: Implementation Hooks are mandatory for the DOM-less SDK to function as expected. */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==License==&lt;br /&gt;
Nielsen SDK contains material that is protected by copyright laws, patent laws, trade secret laws, and by international treaty provisions and is Copyright © 2024 The Nielsen Company (US) LLC. All intellectual property rights and licenses therein are reserved by The Nielsen Company (US) LLC and its licensors. Please read the license agreement presented [https://engineeringportal.nielsen.com/wiki/Special:ClickThrough here], which must be accepted in order to download the Nielsen SDKs. For more information, reach out to your Nielsen Technical Account Manager(TAM).&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen DOM-less SDK provides APIs that allows our clients to integrate the Nielsen SDK in DOM-less environments, e.g., React Native, Node, etc.&lt;br /&gt;
&lt;br /&gt;
== DOM-less SDK Initialization ==&lt;br /&gt;
&lt;br /&gt;
=== Obtain the Nielsen Application ID (apid) ===&lt;br /&gt;
The Nielsen &amp;lt;code&amp;gt;apid&amp;lt;/code&amp;gt; is required to enable SDK functionality. Technical Account Manager will provide an apid for each player configuration. Browser SDK can support URLs that use any of the protocols – HTTPS and HTTP.&lt;br /&gt;
&lt;br /&gt;
=== Configure the DOM-less SDK ===&lt;br /&gt;
====Installation====&lt;br /&gt;
Install with &amp;lt;code&amp;gt;npm install &amp;lt;nowiki&amp;gt;https://github.com/NielsenDigitalSDK/bsdk-domless&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and import the &amp;lt;code&amp;gt;BsdkInstance&amp;lt;/code&amp;gt; into video player component&lt;br /&gt;
 import { BsdkInstance } from 'bsdk-domless'&lt;br /&gt;
======status.ok()======&lt;br /&gt;
Initialization of the instance can be done with &amp;lt;code&amp;gt;status.ok()&amp;lt;/code&amp;gt; function or use Promise handling approach&lt;br /&gt;
 const instance = await new BsdkInstance(appID, instanceName, instanceMetadata, implementationHooks);&lt;br /&gt;
 &lt;br /&gt;
 if (instance &amp;amp;&amp;amp; instance.status.ok()) {&lt;br /&gt;
     expect(instance).not.toBe(undefined);&lt;br /&gt;
     expect(instance.status.ok()).toBe(true);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: ImplementationHooks are mandatory for the DOM-less SDK instance. Please refer to the ImplementationHooks section below for details.&lt;br /&gt;
&lt;br /&gt;
====Exposed Interface====&lt;br /&gt;
The exposed interface is as follows:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;code&amp;gt;`ggPM`&amp;lt;/code&amp;gt; - method to send messages to the Nielsen SDK&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;code&amp;gt;`processEvent`&amp;lt;/code&amp;gt; - method to send app state to the Nielsen SDK, e.g., focus, blur, appclose&lt;br /&gt;
=== Initialization Global Parameters ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!'''Parameter'''&lt;br /&gt;
!'''Description'''&lt;br /&gt;
!'''Value'''&lt;br /&gt;
|-&lt;br /&gt;
|apid&lt;br /&gt;
|UniqueID assigned to player/site.&lt;br /&gt;
|'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName&lt;br /&gt;
|Name of SDK instance&lt;br /&gt;
|&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|domlessEnv&lt;br /&gt;
|Type of Dom-less environment like ReactNative, Node, etc.&lt;br /&gt;
|&amp;quot;domlessEnv&amp;quot;: &amp;quot;1&amp;quot;, // For ReactNative&lt;br /&gt;
&amp;quot;domlessEnv&amp;quot;: &amp;quot;2&amp;quot;, // For Amazon&lt;br /&gt;
&lt;br /&gt;
&amp;quot;domlessEnv&amp;quot;: &amp;quot;3&amp;quot;, // For NodeJS&lt;br /&gt;
&lt;br /&gt;
“domlessEnv”: “4”, // For Custom&lt;br /&gt;
|-&lt;br /&gt;
|deviceId&lt;br /&gt;
|Device Identifier&lt;br /&gt;
|Alphanumeric string eg. &lt;br /&gt;
|-&lt;br /&gt;
|nol_sdkDebug&lt;br /&gt;
|Enables Nielsen console logging. Only required for testing&lt;br /&gt;
|&amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|optout&lt;br /&gt;
|User optout status&lt;br /&gt;
|&amp;quot;true&amp;quot;, &amp;quot;false&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_sha256&lt;br /&gt;
|SHA256-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_sha1&lt;br /&gt;
|SHA1-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;XvBniTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_md5&lt;br /&gt;
|MD5-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;JnIbdTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|uid2&lt;br /&gt;
|An identifier based on a user’s verifiable PII (e.g. hashed email). UID2.0 was initially created by The Trade Desk (TTD) and is now managed by Prebid.&lt;br /&gt;
|&amp;quot;MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|uid2_token&lt;br /&gt;
|Encrypted Unified ID 2.0&lt;br /&gt;
|&amp;quot;AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8Ql&lt;br /&gt;
DSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeK QI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhC xG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|luid&lt;br /&gt;
|Living Unit ID - Experian Household ID&lt;br /&gt;
'''Note: This parameter is applicable only for CTV and First Party Livestream data'''&lt;br /&gt;
|&amp;quot;B0EOFEDgD&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Implementation Hooks ===&lt;br /&gt;
This object captures the required entities for the DOM-less SDK to operate correctly. These are normally platform dependent and are expected to be passed on to the DOM-less SDK as part of its initialization. See below for the descriptions of each key.&lt;br /&gt;
&lt;br /&gt;
==== '''log''' ====&lt;br /&gt;
Log the DOM-less SDK messages to an external stream, e.g. the browser console, stdout.&lt;br /&gt;
&lt;br /&gt;
e.g. Log.debug('debug', 'NIELSEN TAGS EXPECTED TO FIRE:')&lt;br /&gt;
&lt;br /&gt;
===== Methods =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;info()&lt;br /&gt;
&lt;br /&gt;
Log.info(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
debug()&lt;br /&gt;
&lt;br /&gt;
Log.debug(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
warn()&lt;br /&gt;
&lt;br /&gt;
Log.warn(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
error()&lt;br /&gt;
&lt;br /&gt;
Log.error(label: string, ...message: string[]): void&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;label Required&lt;br /&gt;
&lt;br /&gt;
● string - severity type, e.g. info, debug, warn, error or custom label&lt;br /&gt;
&lt;br /&gt;
message Required&lt;br /&gt;
&lt;br /&gt;
● string - message that will be output to the console&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== storage ====&lt;br /&gt;
Persistent storage of key/values, similar in behavior to browser localStorage.&lt;br /&gt;
&lt;br /&gt;
e.g. storage.set('nol_lsid', 'umy3w4ik9usw2ppqmw2vkecckxfob1697308388')&lt;br /&gt;
&lt;br /&gt;
===== Methods =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;set()&lt;br /&gt;
&lt;br /&gt;
storage.set(key: string, value: string)&lt;br /&gt;
&lt;br /&gt;
get()&lt;br /&gt;
&lt;br /&gt;
storage.get(key: string)&lt;br /&gt;
&lt;br /&gt;
remove()&lt;br /&gt;
&lt;br /&gt;
storage.remove(key: string)&lt;br /&gt;
&lt;br /&gt;
clear()&lt;br /&gt;
&lt;br /&gt;
storage.clear()&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== fetch ====&lt;br /&gt;
Function to fetch resources from the network. Required for the transmission of the DOM-less SDK requests (pings) to the Nielsen endpoints.&lt;br /&gt;
&lt;br /&gt;
e.g. Fetch(resource: string, options: object)&lt;br /&gt;
&lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;resource Required&lt;br /&gt;
&lt;br /&gt;
● A string that provides the URL of the resource to fetch&lt;br /&gt;
&lt;br /&gt;
options Optional Object containing settings to apply to the request:&lt;br /&gt;
&lt;br /&gt;
method&lt;br /&gt;
&lt;br /&gt;
● string - request method: &amp;quot;GET&amp;quot;, &amp;quot;POST&amp;quot;. If one is not provided SDK will default to &amp;quot;GET&amp;quot;&lt;br /&gt;
&lt;br /&gt;
headers&lt;br /&gt;
&lt;br /&gt;
● object - headers to add to the outgoing request, an object literal with String values&lt;br /&gt;
&lt;br /&gt;
body&lt;br /&gt;
&lt;br /&gt;
● string - body to add to the request; SDK will send out string&lt;br /&gt;
&lt;br /&gt;
mode&lt;br /&gt;
&lt;br /&gt;
● string - mode for request: cors, no-cors, same-origin&lt;br /&gt;
&lt;br /&gt;
referrer&lt;br /&gt;
&lt;br /&gt;
● string - a string specifying the referrer of the request&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====='''''&amp;lt;pre style=&amp;quot;color: green; font-weight: bold; font-size: 20px&amp;quot;&amp;gt;Note: Implementation Hooks are mandatory for the DOM-less SDK to function as expected.&amp;lt;/pre&amp;gt;'''''=====&lt;br /&gt;
&lt;br /&gt;
==== Nielsen Debug Node.js Server for Event Tracking ====&lt;br /&gt;
We are excited to announce the beta version of our Debug Node.js server, designed to track requests and events sent from our Dom-less SDK using WebSocket connections. While this feature is not officially released, we are currently looking for users interested in beta testing.&lt;br /&gt;
&lt;br /&gt;
If you'd like to try this tool and provide feedback, please reach out to your Nielsen Technical Account Manager (TAM) for more information. Your insights would be invaluable in helping us refine this feature for a future release!&lt;br /&gt;
&lt;br /&gt;
== DOM-less SDK API Methods &amp;amp; Properties ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Method/Property&lt;br /&gt;
!Event #&lt;br /&gt;
!DTVR&lt;br /&gt;
!DAR&lt;br /&gt;
!DCR&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|[[play (Browser)|play]]&lt;br /&gt;
|5&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used when there is an ID3 fed product such as DTVR and the client does not want to send in all the CMS metadata that is sent in loadMetadata. This allows the client to send in at least the required “channel name” value associated to the ID3 feed. When the client passes in the channelName, they can change the CMS data stored by passing new values. If this event is not called then the “channel name” value populated will be the default value of “defaultChannelName”.&lt;br /&gt;
|-&lt;br /&gt;
|[[stop (Browser)|stop]]&lt;br /&gt;
|7&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used when switching between ad and content or content and ad.&lt;br /&gt;
|-&lt;br /&gt;
|[[loadMetadata (Browser)|loadMetadata]]&lt;br /&gt;
|15&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|Used when there is a preroll ad that needs to be associated with content metadata. The loadMetadata will first be called to populate the content metadata values and then the loadMetadata for ad metadata will be called. This allows sending a content ping with the ad info, even if the user bails out during the preroll ad.&lt;br /&gt;
|-&lt;br /&gt;
|[[setPlayheadPosition (Browser)|setPlayheadPosition]]&lt;br /&gt;
|49&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to send the playhead position.&lt;br /&gt;
|-&lt;br /&gt;
|[[sendID3 (Browser)|sendID3]]&lt;br /&gt;
|55&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|Used to send the ID3 metadata.&lt;br /&gt;
|-&lt;br /&gt;
|[[end (Browser)|end]]&lt;br /&gt;
|57&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|This is triggered 1) at the end of the content stream, 2) if the user switches to another piece of content 3) when the browser is refreshed or closed&lt;br /&gt;
|-&lt;br /&gt;
|[[setVolume (Browser)|setVolume]]&lt;br /&gt;
|61&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to pass in the player volume levels in %. Default value is -1.&lt;br /&gt;
|-&lt;br /&gt;
|[[staticstart (Browser)|staticstart]]&lt;br /&gt;
|14&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to send the metadata for the static page.&lt;br /&gt;
|-&lt;br /&gt;
|[[StaticEnd (Browser)|staticend]]&lt;br /&gt;
|56&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|In Single Page Application (SPA) it is imperative that staticend is called prior to the loading of new metadata. This allows the SDK to properly credit the previous section/content being viewed before measuring the new one.&lt;br /&gt;
|-&lt;br /&gt;
|[[onPaginate (Browser)|onPaginate]]&lt;br /&gt;
|30&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to initialize the SDK object&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Domless_SDK_API_Reference&amp;diff=6810</id>
		<title>Domless SDK API Reference</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Domless_SDK_API_Reference&amp;diff=6810"/>
		<updated>2025-06-09T19:28:24Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: Add color&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==License==&lt;br /&gt;
Nielsen SDK contains material that is protected by copyright laws, patent laws, trade secret laws, and by international treaty provisions and is Copyright © 2024 The Nielsen Company (US) LLC. All intellectual property rights and licenses therein are reserved by The Nielsen Company (US) LLC and its licensors. Please read the license agreement presented [https://engineeringportal.nielsen.com/wiki/Special:ClickThrough here], which must be accepted in order to download the Nielsen SDKs. For more information, reach out to your Nielsen Technical Account Manager(TAM).&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen DOM-less SDK provides APIs that allows our clients to integrate the Nielsen SDK in DOM-less environments, e.g., React Native, Node, etc.&lt;br /&gt;
&lt;br /&gt;
== DOM-less SDK Initialization ==&lt;br /&gt;
&lt;br /&gt;
=== Obtain the Nielsen Application ID (apid) ===&lt;br /&gt;
The Nielsen &amp;lt;code&amp;gt;apid&amp;lt;/code&amp;gt; is required to enable SDK functionality. Technical Account Manager will provide an apid for each player configuration. Browser SDK can support URLs that use any of the protocols – HTTPS and HTTP.&lt;br /&gt;
&lt;br /&gt;
=== Configure the DOM-less SDK ===&lt;br /&gt;
====Installation====&lt;br /&gt;
Install with &amp;lt;code&amp;gt;npm install &amp;lt;nowiki&amp;gt;https://github.com/NielsenDigitalSDK/bsdk-domless&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and import the &amp;lt;code&amp;gt;BsdkInstance&amp;lt;/code&amp;gt; into video player component&lt;br /&gt;
 import { BsdkInstance } from 'bsdk-domless'&lt;br /&gt;
======status.ok()======&lt;br /&gt;
Initialization of the instance can be done with &amp;lt;code&amp;gt;status.ok()&amp;lt;/code&amp;gt; function or use Promise handling approach&lt;br /&gt;
 const instance = await new BsdkInstance(appID, instanceName, instanceMetadata, implementationHooks);&lt;br /&gt;
 &lt;br /&gt;
 if (instance &amp;amp;&amp;amp; instance.status.ok()) {&lt;br /&gt;
     expect(instance).not.toBe(undefined);&lt;br /&gt;
     expect(instance.status.ok()).toBe(true);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: ImplementationHooks are mandatory for the DOM-less SDK instance. Please refer to the ImplementationHooks section below for details.&lt;br /&gt;
&lt;br /&gt;
====Exposed Interface====&lt;br /&gt;
The exposed interface is as follows:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;code&amp;gt;`ggPM`&amp;lt;/code&amp;gt; - method to send messages to the Nielsen SDK&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;code&amp;gt;`processEvent`&amp;lt;/code&amp;gt; - method to send app state to the Nielsen SDK, e.g., focus, blur, appclose&lt;br /&gt;
=== Initialization Global Parameters ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!'''Parameter'''&lt;br /&gt;
!'''Description'''&lt;br /&gt;
!'''Value'''&lt;br /&gt;
|-&lt;br /&gt;
|apid&lt;br /&gt;
|UniqueID assigned to player/site.&lt;br /&gt;
|'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName&lt;br /&gt;
|Name of SDK instance&lt;br /&gt;
|&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|domlessEnv&lt;br /&gt;
|Type of Dom-less environment like ReactNative, Node, etc.&lt;br /&gt;
|&amp;quot;domlessEnv&amp;quot;: &amp;quot;1&amp;quot;, // For ReactNative&lt;br /&gt;
&amp;quot;domlessEnv&amp;quot;: &amp;quot;2&amp;quot;, // For Amazon&lt;br /&gt;
&lt;br /&gt;
&amp;quot;domlessEnv&amp;quot;: &amp;quot;3&amp;quot;, // For NodeJS&lt;br /&gt;
&lt;br /&gt;
“domlessEnv”: “4”, // For Custom&lt;br /&gt;
|-&lt;br /&gt;
|deviceId&lt;br /&gt;
|Device Identifier&lt;br /&gt;
|Alphanumeric string eg. &lt;br /&gt;
|-&lt;br /&gt;
|nol_sdkDebug&lt;br /&gt;
|Enables Nielsen console logging. Only required for testing&lt;br /&gt;
|&amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|optout&lt;br /&gt;
|User optout status&lt;br /&gt;
|&amp;quot;true&amp;quot;, &amp;quot;false&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_sha256&lt;br /&gt;
|SHA256-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_sha1&lt;br /&gt;
|SHA1-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;XvBniTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_md5&lt;br /&gt;
|MD5-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;JnIbdTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|uid2&lt;br /&gt;
|An identifier based on a user’s verifiable PII (e.g. hashed email). UID2.0 was initially created by The Trade Desk (TTD) and is now managed by Prebid.&lt;br /&gt;
|&amp;quot;MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|uid2_token&lt;br /&gt;
|Encrypted Unified ID 2.0&lt;br /&gt;
|&amp;quot;AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8Ql&lt;br /&gt;
DSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeK QI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhC xG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|luid&lt;br /&gt;
|Living Unit ID - Experian Household ID&lt;br /&gt;
'''Note: This parameter is applicable only for CTV and First Party Livestream data'''&lt;br /&gt;
|&amp;quot;B0EOFEDgD&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Implementation Hooks ===&lt;br /&gt;
This object captures the required entities for the DOM-less SDK to operate correctly. These are normally platform dependent and are expected to be passed on to the DOM-less SDK as part of its initialization. See below for the descriptions of each key.&lt;br /&gt;
&lt;br /&gt;
==== '''log''' ====&lt;br /&gt;
Log the DOM-less SDK messages to an external stream, e.g. the browser console, stdout.&lt;br /&gt;
&lt;br /&gt;
e.g. Log.debug('debug', 'NIELSEN TAGS EXPECTED TO FIRE:')&lt;br /&gt;
&lt;br /&gt;
===== Methods =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;info()&lt;br /&gt;
&lt;br /&gt;
Log.info(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
debug()&lt;br /&gt;
&lt;br /&gt;
Log.debug(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
warn()&lt;br /&gt;
&lt;br /&gt;
Log.warn(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
error()&lt;br /&gt;
&lt;br /&gt;
Log.error(label: string, ...message: string[]): void&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;label Required&lt;br /&gt;
&lt;br /&gt;
● string - severity type, e.g. info, debug, warn, error or custom label&lt;br /&gt;
&lt;br /&gt;
message Required&lt;br /&gt;
&lt;br /&gt;
● string - message that will be output to the console&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== storage ====&lt;br /&gt;
Persistent storage of key/values, similar in behavior to browser localStorage.&lt;br /&gt;
&lt;br /&gt;
e.g. storage.set('nol_lsid', 'umy3w4ik9usw2ppqmw2vkecckxfob1697308388')&lt;br /&gt;
&lt;br /&gt;
===== Methods =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;set()&lt;br /&gt;
&lt;br /&gt;
storage.set(key: string, value: string)&lt;br /&gt;
&lt;br /&gt;
get()&lt;br /&gt;
&lt;br /&gt;
storage.get(key: string)&lt;br /&gt;
&lt;br /&gt;
remove()&lt;br /&gt;
&lt;br /&gt;
storage.remove(key: string)&lt;br /&gt;
&lt;br /&gt;
clear()&lt;br /&gt;
&lt;br /&gt;
storage.clear()&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== fetch ====&lt;br /&gt;
Function to fetch resources from the network. Required for the transmission of the DOM-less SDK requests (pings) to the Nielsen endpoints.&lt;br /&gt;
&lt;br /&gt;
e.g. Fetch(resource: string, options: object)&lt;br /&gt;
&lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;resource Required&lt;br /&gt;
&lt;br /&gt;
● A string that provides the URL of the resource to fetch&lt;br /&gt;
&lt;br /&gt;
options Optional Object containing settings to apply to the request:&lt;br /&gt;
&lt;br /&gt;
method&lt;br /&gt;
&lt;br /&gt;
● string - request method: &amp;quot;GET&amp;quot;, &amp;quot;POST&amp;quot;. If one is not provided SDK will default to &amp;quot;GET&amp;quot;&lt;br /&gt;
&lt;br /&gt;
headers&lt;br /&gt;
&lt;br /&gt;
● object - headers to add to the outgoing request, an object literal with String values&lt;br /&gt;
&lt;br /&gt;
body&lt;br /&gt;
&lt;br /&gt;
● string - body to add to the request; SDK will send out string&lt;br /&gt;
&lt;br /&gt;
mode&lt;br /&gt;
&lt;br /&gt;
● string - mode for request: cors, no-cors, same-origin&lt;br /&gt;
&lt;br /&gt;
referrer&lt;br /&gt;
&lt;br /&gt;
● string - a string specifying the referrer of the request&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====='''''&amp;lt;pre style=&amp;quot;color: purple; font-weight: bold; font-size: 20px&amp;quot;&amp;gt;Note: Implementation Hooks are mandatory for the DOM-less SDK to function as expected.&amp;lt;/pre&amp;gt;'''''=====&lt;br /&gt;
&lt;br /&gt;
==== Nielsen Debug Node.js Server for Event Tracking ====&lt;br /&gt;
We are excited to announce the beta version of our Debug Node.js server, designed to track requests and events sent from our Dom-less SDK using WebSocket connections. While this feature is not officially released, we are currently looking for users interested in beta testing.&lt;br /&gt;
&lt;br /&gt;
If you'd like to try this tool and provide feedback, please reach out to your Nielsen Technical Account Manager (TAM) for more information. Your insights would be invaluable in helping us refine this feature for a future release!&lt;br /&gt;
&lt;br /&gt;
== DOM-less SDK API Methods &amp;amp; Properties ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Method/Property&lt;br /&gt;
!Event #&lt;br /&gt;
!DTVR&lt;br /&gt;
!DAR&lt;br /&gt;
!DCR&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|[[play (Browser)|play]]&lt;br /&gt;
|5&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used when there is an ID3 fed product such as DTVR and the client does not want to send in all the CMS metadata that is sent in loadMetadata. This allows the client to send in at least the required “channel name” value associated to the ID3 feed. When the client passes in the channelName, they can change the CMS data stored by passing new values. If this event is not called then the “channel name” value populated will be the default value of “defaultChannelName”.&lt;br /&gt;
|-&lt;br /&gt;
|[[stop (Browser)|stop]]&lt;br /&gt;
|7&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used when switching between ad and content or content and ad.&lt;br /&gt;
|-&lt;br /&gt;
|[[loadMetadata (Browser)|loadMetadata]]&lt;br /&gt;
|15&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|Used when there is a preroll ad that needs to be associated with content metadata. The loadMetadata will first be called to populate the content metadata values and then the loadMetadata for ad metadata will be called. This allows sending a content ping with the ad info, even if the user bails out during the preroll ad.&lt;br /&gt;
|-&lt;br /&gt;
|[[setPlayheadPosition (Browser)|setPlayheadPosition]]&lt;br /&gt;
|49&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to send the playhead position.&lt;br /&gt;
|-&lt;br /&gt;
|[[sendID3 (Browser)|sendID3]]&lt;br /&gt;
|55&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|Used to send the ID3 metadata.&lt;br /&gt;
|-&lt;br /&gt;
|[[end (Browser)|end]]&lt;br /&gt;
|57&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|This is triggered 1) at the end of the content stream, 2) if the user switches to another piece of content 3) when the browser is refreshed or closed&lt;br /&gt;
|-&lt;br /&gt;
|[[setVolume (Browser)|setVolume]]&lt;br /&gt;
|61&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to pass in the player volume levels in %. Default value is -1.&lt;br /&gt;
|-&lt;br /&gt;
|[[staticstart (Browser)|staticstart]]&lt;br /&gt;
|14&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to send the metadata for the static page.&lt;br /&gt;
|-&lt;br /&gt;
|[[StaticEnd (Browser)|staticend]]&lt;br /&gt;
|56&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|In Single Page Application (SPA) it is imperative that staticend is called prior to the loading of new metadata. This allows the SDK to properly credit the previous section/content being viewed before measuring the new one.&lt;br /&gt;
|-&lt;br /&gt;
|[[onPaginate (Browser)|onPaginate]]&lt;br /&gt;
|30&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to initialize the SDK object&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Video_Domless_SDK&amp;diff=6809</id>
		<title>DCR Video Domless SDK</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Video_Domless_SDK&amp;diff=6809"/>
		<updated>2025-06-09T18:48:01Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: /* Implementation Hooks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== License ==&lt;br /&gt;
Nielsen SDK contains material that is protected by copyright laws, patent laws, trade secret laws, and by international treaty provisions and is Copyright © 2024 The Nielsen Company (US) LLC. All intellectual property rights and licenses therein are reserved by The Nielsen Company (US) LLC and its licensors. Please read the license agreement presented [[Special:ClickThrough|here]], which must be accepted in order to download the Nielsen SDKs. For more information, reach out to your Nielsen Technical Account Manager(TAM).&lt;br /&gt;
&lt;br /&gt;
== DOM-less SDK DCR Video Introduction ==&lt;br /&gt;
The Nielsen DOM-less SDK is a Javascript based cross-platform library that clients can use to integrate the Nielsen Digital Content Rating or Digital TV Rating measurement in apps for dom-less platforms like ReactNative, NodeJS etc. apps. &lt;br /&gt;
&lt;br /&gt;
The Digital Content Ratings (DCR) Video product provides content consumption measurement on client mobile apps or webpages. This measurement includes insight into the total time a user spent watching the tracked content, video player events, and much more. This example provides the steps to implement the DCR Video product in a sample NodeJS app. It includes:&lt;br /&gt;
&lt;br /&gt;
* DOM-less SDK Initialization&lt;br /&gt;
* DCR Video Metadata: information about the content being tracked&lt;br /&gt;
* DCR Video Events/API calls&lt;br /&gt;
&lt;br /&gt;
By the end of this guide you will have the needed steps to integrate Nielsen's DOM-less SDK in your app.&lt;br /&gt;
&lt;br /&gt;
=== DOM-less SDK DCR Video Step 1 - Obtain AppID ===&lt;br /&gt;
To begin using the DOM-less SDK you will need to obtain an Application ID (AppId)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&lt;br /&gt;
!Item&lt;br /&gt;
!Description&lt;br /&gt;
!Source&lt;br /&gt;
|-&lt;br /&gt;
|✅&lt;br /&gt;
|App ID (appid)&lt;br /&gt;
|Unique ID assigned to the player/site and configured by product&lt;br /&gt;
|Contact your Nielsen TAM&lt;br /&gt;
|}&lt;br /&gt;
The appid is a 37 character unique ID assigned to the player/site and configured by product and is required when creating a new instance of the DOM-less SDK on the app.&lt;br /&gt;
&lt;br /&gt;
Example: '''PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX'''&lt;br /&gt;
&lt;br /&gt;
=== DOM-less SDK DCR Video Step 2 - SDK Initialization ===&lt;br /&gt;
This project is an API that allows clients to integrate the Nielsen SDK in DOM-less environments like React Native, NodeJS, etc.&lt;br /&gt;
&lt;br /&gt;
Refer to the &amp;quot;[[Domless_SDK_API_Reference#DOM-less SDK Initialization | DOM-less SDK initialization]] &amp;quot; section in the [[Domless_SDK_API_Reference | DOM-less SDK API Reference Guide]].&lt;br /&gt;
&lt;br /&gt;
==== SDK Initialization ====&lt;br /&gt;
The following table contains the list of arguments that can be passed &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Parameter / Argument&lt;br /&gt;
!Description&lt;br /&gt;
!Source&lt;br /&gt;
!Required?&lt;br /&gt;
!Example&lt;br /&gt;
|-&lt;br /&gt;
|appid&lt;br /&gt;
|Unique Nielsen ID for the application. The ID is a GUID data type. If you did not receive your App ID, let us know and we will provide you.&lt;br /&gt;
|Nielsen-specified&lt;br /&gt;
|Yes&lt;br /&gt;
|PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
|instanceName&lt;br /&gt;
|DOM-less SDK instance name &lt;br /&gt;
|Client provided&lt;br /&gt;
|Yes&lt;br /&gt;
|String eg. abcdefg&lt;br /&gt;
|-&lt;br /&gt;
|appName&lt;br /&gt;
|Application name&lt;br /&gt;
|Client provided&lt;br /&gt;
|Yes&lt;br /&gt;
|appName: 'BSDK RN Sample App'&lt;br /&gt;
|-&lt;br /&gt;
|deviceId&lt;br /&gt;
|Device ID&lt;br /&gt;
|Client provided&lt;br /&gt;
|Yes&lt;br /&gt;
|deviceId: '38400000-8cf0-11bd-b23e-10b96e40000d'&lt;br /&gt;
|-&lt;br /&gt;
|nol_sdkDebug&lt;br /&gt;
|Enables Nielsen console logging. Only required for testing&lt;br /&gt;
|Client-provided&lt;br /&gt;
|No&lt;br /&gt;
|nol_sdkDebug: 'debug'&lt;br /&gt;
|-&lt;br /&gt;
|domlessEnv&lt;br /&gt;
|Specify the domless environment. &lt;br /&gt;
&amp;quot;1&amp;quot; for ReactNative&lt;br /&gt;
&amp;quot;2&amp;quot; for Amazon&lt;br /&gt;
&amp;quot;3&amp;quot; for NodeJS&lt;br /&gt;
&amp;quot;4&amp;quot; for Custom&lt;br /&gt;
|Client-provided&lt;br /&gt;
|Yes&lt;br /&gt;
|domlessEnv: '1'&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Implementation Hooks====&lt;br /&gt;
Implementation hooks are essential for the DOM-less SDK to work as expected. Please refer to the &amp;quot;[[Domless_SDK_API_Reference#Implementation Hooks | Implementation Hooks]] &amp;quot; section in the [[Domless_SDK_API_Reference | DOM-less SDK API Reference Guide]].&lt;br /&gt;
&lt;br /&gt;
====Nielsen Debug Node.js Server for Event Tracking====&lt;br /&gt;
We are excited to announce the beta version of our Debug Node.js server, designed to track requests and events sent from our Dom-less SDK using WebSocket connections. While this feature is not officially released, we are currently looking for users interested in beta testing.&lt;br /&gt;
&lt;br /&gt;
If you'd like to try this tool and provide feedback, please reach out to your Nielsen Technical Account Manager (TAM) for more information. Your insights would be invaluable in helping us refine this feature for a future release!&lt;br /&gt;
&lt;br /&gt;
=== DOM-less SDK DCR Video Step 3 - Create DCR Video Content Metadata Object ===&lt;br /&gt;
&lt;br /&gt;
==== Events that can be passed to `ggPM` method ====&lt;br /&gt;
1. &amp;lt;code&amp;gt;loadMetadata&amp;lt;/code&amp;gt; - This event is used to send DCR Video metadata to the Nielsen SDK. This event should be called when the video metadata is loaded.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    instance.ggPM('loadMetadata', {&lt;br /&gt;
&lt;br /&gt;
        'type': 'content',&lt;br /&gt;
        'assetid': 'VID-123456',&lt;br /&gt;
        'program': 'program name',&lt;br /&gt;
        'title': 'episode title with season and episode number',&lt;br /&gt;
        'length': 'length in seconds',&lt;br /&gt;
        'airdate': '20210321 09:00:00',&lt;br /&gt;
        'isfullepisode': 'y',&lt;br /&gt;
        'adloadtype': '2',&lt;br /&gt;
        'segB': 'custom segment B', // optional&lt;br /&gt;
        'segC': 'custom segment C', // optional&lt;br /&gt;
        'crossId1': 'Standard Episode ID', // optional&lt;br /&gt;
        'crossId2': 'Content Originator' //optional&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;code&amp;gt;setPlayheadPosition&amp;lt;/code&amp;gt; - This event is used to send the current playhead position to the Nielsen SDK. This event should be called when the video is playing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    instance.ggPM('setPlayheadPosition', 10);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; - This event is used to send the end event to the Nielsen SDK. This event should be called when the video playback is finished, passing the playhead at that time.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    instance.ggPM('end', 300);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; - This event is used to send the stop event to the Nielsen SDK. This event should be called when transitioning from ads to content and content to ads, passing the playhead at that time.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    instance.ggPM('stop', 120);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;code&amp;gt;updateMetadata&amp;lt;/code&amp;gt; - This event allows updating metadata for the content or ad that is being played.&lt;br /&gt;
This event cannot be used to update values for type, vidtype, or assetid parameters.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    instance.ggPM('updateMetadata', {&lt;br /&gt;
       length: 90,&lt;br /&gt;
       segC: &amp;quot;My segC&amp;quot;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== Events that can be passed to and processed by &amp;lt;code&amp;gt;processEvent&amp;lt;/code&amp;gt; method ======&lt;br /&gt;
1. &amp;lt;code&amp;gt;`blur`&amp;lt;/code&amp;gt; - This event should be passed to processEvent when the app goes to the background.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    instance.processEvent({'type': 'blur', 'timestamp': Date.now()});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;code&amp;gt;`focus`&amp;lt;/code&amp;gt; - This event should be passed to processEvent when the app goes to the foreground.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    instance.processEvent({'type': 'focus', 'timestamp': Date.now()});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;code&amp;gt;`appclose`&amp;lt;/code&amp;gt; - This event should be passed prior to closing the app.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    instance.processEvent({'type': 'appclose', 'timestamp': Date.now()});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DOM-less SDK DCR Video Step 4 - Basic Set of Events - Sample Playback ===&lt;br /&gt;
&lt;br /&gt;
==== Sample Nielsen BSDK-Domless NodeJS Example ====&lt;br /&gt;
*[https://github.com/NielsenDigitalSDK/bsdk-domless-samples/tree/main/nodejs Nielsen bsdk-domless NodeJS Example]&lt;br /&gt;
&lt;br /&gt;
==== Sample DCR Video Integration ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import { BsdkInstance } from 'bsdk-domless';&lt;br /&gt;
&lt;br /&gt;
const nsdkConfig = {&lt;br /&gt;
    app_id: 'PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX',&lt;br /&gt;
    instance_name: 'videoInstance',&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const implementationHooks = {&lt;br /&gt;
    Log: {&lt;br /&gt;
             info: function (log: string) {&lt;br /&gt;
         		        console.info(log);&lt;br /&gt;
		     },&lt;br /&gt;
		     debug: function (log: string) {&lt;br /&gt;
                        console.debug(log);&lt;br /&gt;
		     },&lt;br /&gt;
             warn: function (log: string) {&lt;br /&gt;
                        console.warn(log);&lt;br /&gt;
		     },&lt;br /&gt;
             error: function (error: string) {&lt;br /&gt;
                        console.error(error);&lt;br /&gt;
		     } &lt;br /&gt;
	     },&lt;br /&gt;
	Storage: {&lt;br /&gt;
		setItem: async function (key: any, value: string) {&lt;br /&gt;
            /**&lt;br /&gt;
             * Sets a string value for given key. This operation can either modify an existing entry,&lt;br /&gt;
             * if it did exist for given key, or add new one otherwise.&lt;br /&gt;
             * In order to store object value, you need to serialize it, e.g. using JSON.stringify().&lt;br /&gt;
            */&lt;br /&gt;
        },&lt;br /&gt;
		getItem: async function (key: any) {&lt;br /&gt;
            /**&lt;br /&gt;
             * Gets a string value for given key. This function can either return a string value for &lt;br /&gt;
             * existing key or return null otherwise.&lt;br /&gt;
             * In order to store object value, you need to deserialize it, e.g. using JSON.parse().&lt;br /&gt;
            */&lt;br /&gt;
        },&lt;br /&gt;
		removeItem: async function (key: any) {&lt;br /&gt;
            /**&lt;br /&gt;
             * Removes item for a key, invokes (optional) callback once completed.&lt;br /&gt;
            */&lt;br /&gt;
        }&lt;br /&gt;
	  },&lt;br /&gt;
	Fetch: async function (url: string | URL | Request, options: any) {&lt;br /&gt;
        /**&lt;br /&gt;
        * We require that client pass in User-Agent header via options in Fetch request&lt;br /&gt;
        */&lt;br /&gt;
        const clientOpts = {&lt;br /&gt;
			headers: {&lt;br /&gt;
				&amp;quot;User-Agent&amp;quot;: &amp;quot;react-native-domless/1.6.7.42 Dalvik/2.1.0 (Linux; U; Android 5.1.1; Android SDK built for x86 Build/LMY48X)&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		const data = Object.assign(options, clientOpts);&lt;br /&gt;
		const response = await fetch(url, data);&lt;br /&gt;
		if (response.ok) {&lt;br /&gt;
			return response;&lt;br /&gt;
		} else {&lt;br /&gt;
			throw new Error('Request failed');&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
    SetTimeout: function (callback: () =&amp;gt; void, timeout: number | undefined) {&lt;br /&gt;
        return setTimeout(callback, timeout);	},&lt;br /&gt;
    SetInterval: function (callback: () =&amp;gt; void, interval: number | undefined) {&lt;br /&gt;
        return setInterval(callback, interval);&lt;br /&gt;
    },&lt;br /&gt;
    ClearTimeout: function (timeout: string | number | NodeJS.Timeout | undefined) {&lt;br /&gt;
        clearTimeout(timeout);&lt;br /&gt;
    },&lt;br /&gt;
    ClearInterval: function (interval: string | number | NodeJS.Timeout | undefined) {&lt;br /&gt;
        clearInterval(interval);&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const nSdkInstance = new BsdkInstance(&lt;br /&gt;
    nsdkConfig.app_id,&lt;br /&gt;
    nsdkConfig.instance_name,&lt;br /&gt;
    {&lt;br /&gt;
        appName: 'BSDK RN Sample App',&lt;br /&gt;
        deviceId: 'testDeviceId',&lt;br /&gt;
        nol_sdkDebug: 'debug', // remove debug flag when going to production&lt;br /&gt;
        domlessEnv: // &amp;quot;1&amp;quot; for React Native | &amp;quot;2&amp;quot; for Amazon | &amp;quot;3&amp;quot; for NodeJS | &amp;quot;4&amp;quot; for Custom&lt;br /&gt;
        // reference SDK interface documentation&lt;br /&gt;
        // for additonal metadata properties&lt;br /&gt;
    },&lt;br /&gt;
    implementationHooks );&lt;br /&gt;
&lt;br /&gt;
// Sample VideoPlayer component &lt;br /&gt;
const VideoPlayer = (props) =&amp;gt; {&lt;br /&gt;
/**&lt;br /&gt;
* Implementation of video player component will vary across the board, for Nielsen DOM-less SDK integration&lt;br /&gt;
* clients need only setup event listeners with corresponding ggPM() calls.&lt;br /&gt;
* &lt;br /&gt;
* Please refer to chosen video player documentation on available events&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
const video = useRef&amp;lt;Video&amp;gt;(null);&lt;br /&gt;
let previousPlayhead = 0; // keep track of previous playhead position&lt;br /&gt;
let metadataLoaded = false; // in case of replay scenario set flag for metadata load&lt;br /&gt;
&lt;br /&gt;
// Sample video metadata&lt;br /&gt;
const videometadata = {&lt;br /&gt;
        'type': 'content',&lt;br /&gt;
        'assetid': 'VID-123456',&lt;br /&gt;
        'program': 'program name',&lt;br /&gt;
        'title': 'episode title with season and episode number',&lt;br /&gt;
        'length': 'length in seconds',&lt;br /&gt;
        'airdate': '20210321 09:00:00',&lt;br /&gt;
        'isfullepisode': 'y',&lt;br /&gt;
        'adloadtype': '2',&lt;br /&gt;
        'segB': 'custom segment B', // optional&lt;br /&gt;
        'segC': 'custom segment C', // optional&lt;br /&gt;
        'crossId1': 'Standard Episode ID', // optional&lt;br /&gt;
        'crossId2': 'Content Originator' //optional&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
const setUpEventListeners = (): void =&amp;gt; {&lt;br /&gt;
     video.addEventListener('ended', onEnded);&lt;br /&gt;
     video.addEventListener('timeupdate', onTimeUpdate);&lt;br /&gt;
     video.addEventListener('playing', onPlay);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const onEnded = () =&amp;gt; {&lt;br /&gt;
    // Nielsen SDK ggPM 'end' event&lt;br /&gt;
    if (nSdkInstance) {&lt;br /&gt;
        nSdkInstance.then((instance: any) =&amp;gt; {&lt;br /&gt;
            instance.ggPM('end', Math.round(video.currentTime));&lt;br /&gt;
            metadataLoaded = false;&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const onTimeUpdate = () =&amp;gt; {&lt;br /&gt;
    const currPlayhead = Math.round(video.current?.currentTime!);&lt;br /&gt;
    if (currPlayhead &amp;gt; 0 &amp;amp;&amp;amp; currPlayhead !== previousPlayhead) {&lt;br /&gt;
        previousPlayhead = currPlayhead;&lt;br /&gt;
        // Nielsen SDK ggPM 'setPlayheadPosition' event&lt;br /&gt;
        if (nSdkInstance) {&lt;br /&gt;
            nSdkInstance.then((instance: any) =&amp;gt; {&lt;br /&gt;
                instance.ggPM('setPlayheadPosition', currPlayhead);&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// NOTE: some players may have an event when video metadata is loaded, recommended to use if available. E.g. loadedmetadata&lt;br /&gt;
const onPlay = () =&amp;gt; {&lt;br /&gt;
    // Nielsen SDK ggPM 'loadmetadata' event&lt;br /&gt;
    if (nSdkInstance &amp;amp;&amp;amp; !metadataLoaded) {&lt;br /&gt;
        nSdkInstance.then((instance: any) =&amp;gt; {&lt;br /&gt;
            instance.ggPM('loadMetadata', videometadata);&lt;br /&gt;
            metadataLoaded = true;&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
return (&lt;br /&gt;
       &amp;lt;View&amp;gt;&lt;br /&gt;
          &amp;lt;Video&lt;br /&gt;
                 source={{ uri: 'https://www.w3schools.com/html/mov_bbb.mp4' }}&lt;br /&gt;
             /&amp;gt;&lt;br /&gt;
      &amp;lt;/View&amp;gt;&lt;br /&gt;
  );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Video_Domless_SDK&amp;diff=6808</id>
		<title>DCR Video Domless SDK</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Video_Domless_SDK&amp;diff=6808"/>
		<updated>2025-06-06T19:22:20Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: Implementationhooks&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== License ==&lt;br /&gt;
Nielsen SDK contains material that is protected by copyright laws, patent laws, trade secret laws, and by international treaty provisions and is Copyright © 2024 The Nielsen Company (US) LLC. All intellectual property rights and licenses therein are reserved by The Nielsen Company (US) LLC and its licensors. Please read the license agreement presented [[Special:ClickThrough|here]], which must be accepted in order to download the Nielsen SDKs. For more information, reach out to your Nielsen Technical Account Manager(TAM).&lt;br /&gt;
&lt;br /&gt;
== DOM-less SDK DCR Video Introduction ==&lt;br /&gt;
The Nielsen DOM-less SDK is a Javascript based cross-platform library that clients can use to integrate the Nielsen Digital Content Rating or Digital TV Rating measurement in apps for dom-less platforms like ReactNative, NodeJS etc. apps. &lt;br /&gt;
&lt;br /&gt;
The Digital Content Ratings (DCR) Video product provides content consumption measurement on client mobile apps or webpages. This measurement includes insight into the total time a user spent watching the tracked content, video player events, and much more. This example provides the steps to implement the DCR Video product in a sample NodeJS app. It includes:&lt;br /&gt;
&lt;br /&gt;
* DOM-less SDK Initialization&lt;br /&gt;
* DCR Video Metadata: information about the content being tracked&lt;br /&gt;
* DCR Video Events/API calls&lt;br /&gt;
&lt;br /&gt;
By the end of this guide you will have the needed steps to integrate Nielsen's DOM-less SDK in your app.&lt;br /&gt;
&lt;br /&gt;
=== DOM-less SDK DCR Video Step 1 - Obtain AppID ===&lt;br /&gt;
To begin using the DOM-less SDK you will need to obtain an Application ID (AppId)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&lt;br /&gt;
!Item&lt;br /&gt;
!Description&lt;br /&gt;
!Source&lt;br /&gt;
|-&lt;br /&gt;
|✅&lt;br /&gt;
|App ID (appid)&lt;br /&gt;
|Unique ID assigned to the player/site and configured by product&lt;br /&gt;
|Contact your Nielsen TAM&lt;br /&gt;
|}&lt;br /&gt;
The appid is a 37 character unique ID assigned to the player/site and configured by product and is required when creating a new instance of the DOM-less SDK on the app.&lt;br /&gt;
&lt;br /&gt;
Example: '''PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX'''&lt;br /&gt;
&lt;br /&gt;
=== DOM-less SDK DCR Video Step 2 - SDK Initialization ===&lt;br /&gt;
This project is an API that allows clients to integrate the Nielsen SDK in DOM-less environments like React Native, NodeJS, etc.&lt;br /&gt;
&lt;br /&gt;
Refer to the &amp;quot;[[Domless_SDK_API_Reference#DOM-less SDK Initialization | DOM-less SDK initialization]] &amp;quot; section in the [[Domless_SDK_API_Reference | DOM-less SDK API Reference Guide]].&lt;br /&gt;
&lt;br /&gt;
==== SDK Initialization ====&lt;br /&gt;
The following table contains the list of arguments that can be passed &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Parameter / Argument&lt;br /&gt;
!Description&lt;br /&gt;
!Source&lt;br /&gt;
!Required?&lt;br /&gt;
!Example&lt;br /&gt;
|-&lt;br /&gt;
|appid&lt;br /&gt;
|Unique Nielsen ID for the application. The ID is a GUID data type. If you did not receive your App ID, let us know and we will provide you.&lt;br /&gt;
|Nielsen-specified&lt;br /&gt;
|Yes&lt;br /&gt;
|PXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;br /&gt;
|-&lt;br /&gt;
|instanceName&lt;br /&gt;
|DOM-less SDK instance name &lt;br /&gt;
|Client provided&lt;br /&gt;
|Yes&lt;br /&gt;
|String eg. abcdefg&lt;br /&gt;
|-&lt;br /&gt;
|appName&lt;br /&gt;
|Application name&lt;br /&gt;
|Client provided&lt;br /&gt;
|Yes&lt;br /&gt;
|appName: 'BSDK RN Sample App'&lt;br /&gt;
|-&lt;br /&gt;
|deviceId&lt;br /&gt;
|Device ID&lt;br /&gt;
|Client provided&lt;br /&gt;
|Yes&lt;br /&gt;
|deviceId: '38400000-8cf0-11bd-b23e-10b96e40000d'&lt;br /&gt;
|-&lt;br /&gt;
|nol_sdkDebug&lt;br /&gt;
|Enables Nielsen console logging. Only required for testing&lt;br /&gt;
|Client-provided&lt;br /&gt;
|No&lt;br /&gt;
|nol_sdkDebug: 'debug'&lt;br /&gt;
|-&lt;br /&gt;
|domlessEnv&lt;br /&gt;
|Specify the domless environment. &lt;br /&gt;
&amp;quot;1&amp;quot; for ReactNative&lt;br /&gt;
&amp;quot;2&amp;quot; for Amazon&lt;br /&gt;
&amp;quot;3&amp;quot; for NodeJS&lt;br /&gt;
&amp;quot;4&amp;quot; for Custom&lt;br /&gt;
|Client-provided&lt;br /&gt;
|Yes&lt;br /&gt;
|domlessEnv: '1'&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Implementation Hooks====&lt;br /&gt;
Implementation hooks are essential for the DOM-less SDK to work as expected. Please refer to the &amp;quot;[[Domless_SDK_API_Reference#ImplementationHooks | ImplementationHooks]] &amp;quot; section in the [[Domless_SDK_API_Reference | DOM-less SDK API Reference Guide]].&lt;br /&gt;
&lt;br /&gt;
====Nielsen Debug Node.js Server for Event Tracking====&lt;br /&gt;
We are excited to announce the beta version of our Debug Node.js server, designed to track requests and events sent from our Dom-less SDK using WebSocket connections. While this feature is not officially released, we are currently looking for users interested in beta testing.&lt;br /&gt;
&lt;br /&gt;
If you'd like to try this tool and provide feedback, please reach out to your Nielsen Technical Account Manager (TAM) for more information. Your insights would be invaluable in helping us refine this feature for a future release!&lt;br /&gt;
&lt;br /&gt;
=== DOM-less SDK DCR Video Step 3 - Create DCR Video Content Metadata Object ===&lt;br /&gt;
&lt;br /&gt;
==== Events that can be passed to `ggPM` method ====&lt;br /&gt;
1. &amp;lt;code&amp;gt;loadMetadata&amp;lt;/code&amp;gt; - This event is used to send DCR Video metadata to the Nielsen SDK. This event should be called when the video metadata is loaded.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    instance.ggPM('loadMetadata', {&lt;br /&gt;
&lt;br /&gt;
        'type': 'content',&lt;br /&gt;
        'assetid': 'VID-123456',&lt;br /&gt;
        'program': 'program name',&lt;br /&gt;
        'title': 'episode title with season and episode number',&lt;br /&gt;
        'length': 'length in seconds',&lt;br /&gt;
        'airdate': '20210321 09:00:00',&lt;br /&gt;
        'isfullepisode': 'y',&lt;br /&gt;
        'adloadtype': '2',&lt;br /&gt;
        'segB': 'custom segment B', // optional&lt;br /&gt;
        'segC': 'custom segment C', // optional&lt;br /&gt;
        'crossId1': 'Standard Episode ID', // optional&lt;br /&gt;
        'crossId2': 'Content Originator' //optional&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;code&amp;gt;setPlayheadPosition&amp;lt;/code&amp;gt; - This event is used to send the current playhead position to the Nielsen SDK. This event should be called when the video is playing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    instance.ggPM('setPlayheadPosition', 10);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; - This event is used to send the end event to the Nielsen SDK. This event should be called when the video playback is finished, passing the playhead at that time.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    instance.ggPM('end', 300);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; - This event is used to send the stop event to the Nielsen SDK. This event should be called when transitioning from ads to content and content to ads, passing the playhead at that time.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    instance.ggPM('stop', 120);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;code&amp;gt;updateMetadata&amp;lt;/code&amp;gt; - This event allows updating metadata for the content or ad that is being played.&lt;br /&gt;
This event cannot be used to update values for type, vidtype, or assetid parameters.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    instance.ggPM('updateMetadata', {&lt;br /&gt;
       length: 90,&lt;br /&gt;
       segC: &amp;quot;My segC&amp;quot;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== Events that can be passed to and processed by &amp;lt;code&amp;gt;processEvent&amp;lt;/code&amp;gt; method ======&lt;br /&gt;
1. &amp;lt;code&amp;gt;`blur`&amp;lt;/code&amp;gt; - This event should be passed to processEvent when the app goes to the background.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    instance.processEvent({'type': 'blur', 'timestamp': Date.now()});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;code&amp;gt;`focus`&amp;lt;/code&amp;gt; - This event should be passed to processEvent when the app goes to the foreground.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    instance.processEvent({'type': 'focus', 'timestamp': Date.now()});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;code&amp;gt;`appclose`&amp;lt;/code&amp;gt; - This event should be passed prior to closing the app.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    instance.processEvent({'type': 'appclose', 'timestamp': Date.now()});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DOM-less SDK DCR Video Step 4 - Basic Set of Events - Sample Playback ===&lt;br /&gt;
&lt;br /&gt;
==== Sample Nielsen BSDK-Domless NodeJS Example ====&lt;br /&gt;
*[https://github.com/NielsenDigitalSDK/bsdk-domless-samples/tree/main/nodejs Nielsen bsdk-domless NodeJS Example]&lt;br /&gt;
&lt;br /&gt;
==== Sample DCR Video Integration ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import { BsdkInstance } from 'bsdk-domless';&lt;br /&gt;
&lt;br /&gt;
const nsdkConfig = {&lt;br /&gt;
    app_id: 'PXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX',&lt;br /&gt;
    instance_name: 'videoInstance',&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const implementationHooks = {&lt;br /&gt;
    Log: {&lt;br /&gt;
             info: function (log: string) {&lt;br /&gt;
         		        console.info(log);&lt;br /&gt;
		     },&lt;br /&gt;
		     debug: function (log: string) {&lt;br /&gt;
                        console.debug(log);&lt;br /&gt;
		     },&lt;br /&gt;
             warn: function (log: string) {&lt;br /&gt;
                        console.warn(log);&lt;br /&gt;
		     },&lt;br /&gt;
             error: function (error: string) {&lt;br /&gt;
                        console.error(error);&lt;br /&gt;
		     } &lt;br /&gt;
	     },&lt;br /&gt;
	Storage: {&lt;br /&gt;
		setItem: async function (key: any, value: string) {&lt;br /&gt;
            /**&lt;br /&gt;
             * Sets a string value for given key. This operation can either modify an existing entry,&lt;br /&gt;
             * if it did exist for given key, or add new one otherwise.&lt;br /&gt;
             * In order to store object value, you need to serialize it, e.g. using JSON.stringify().&lt;br /&gt;
            */&lt;br /&gt;
        },&lt;br /&gt;
		getItem: async function (key: any) {&lt;br /&gt;
            /**&lt;br /&gt;
             * Gets a string value for given key. This function can either return a string value for &lt;br /&gt;
             * existing key or return null otherwise.&lt;br /&gt;
             * In order to store object value, you need to deserialize it, e.g. using JSON.parse().&lt;br /&gt;
            */&lt;br /&gt;
        },&lt;br /&gt;
		removeItem: async function (key: any) {&lt;br /&gt;
            /**&lt;br /&gt;
             * Removes item for a key, invokes (optional) callback once completed.&lt;br /&gt;
            */&lt;br /&gt;
        }&lt;br /&gt;
	  },&lt;br /&gt;
	Fetch: async function (url: string | URL | Request, options: any) {&lt;br /&gt;
        /**&lt;br /&gt;
        * We require that client pass in User-Agent header via options in Fetch request&lt;br /&gt;
        */&lt;br /&gt;
        const clientOpts = {&lt;br /&gt;
			headers: {&lt;br /&gt;
				&amp;quot;User-Agent&amp;quot;: &amp;quot;react-native-domless/1.6.7.42 Dalvik/2.1.0 (Linux; U; Android 5.1.1; Android SDK built for x86 Build/LMY48X)&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		const data = Object.assign(options, clientOpts);&lt;br /&gt;
		const response = await fetch(url, data);&lt;br /&gt;
		if (response.ok) {&lt;br /&gt;
			return response;&lt;br /&gt;
		} else {&lt;br /&gt;
			throw new Error('Request failed');&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
    SetTimeout: function (callback: () =&amp;gt; void, timeout: number | undefined) {&lt;br /&gt;
        return setTimeout(callback, timeout);	},&lt;br /&gt;
    SetInterval: function (callback: () =&amp;gt; void, interval: number | undefined) {&lt;br /&gt;
        return setInterval(callback, interval);&lt;br /&gt;
    },&lt;br /&gt;
    ClearTimeout: function (timeout: string | number | NodeJS.Timeout | undefined) {&lt;br /&gt;
        clearTimeout(timeout);&lt;br /&gt;
    },&lt;br /&gt;
    ClearInterval: function (interval: string | number | NodeJS.Timeout | undefined) {&lt;br /&gt;
        clearInterval(interval);&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const nSdkInstance = new BsdkInstance(&lt;br /&gt;
    nsdkConfig.app_id,&lt;br /&gt;
    nsdkConfig.instance_name,&lt;br /&gt;
    {&lt;br /&gt;
        appName: 'BSDK RN Sample App',&lt;br /&gt;
        deviceId: 'testDeviceId',&lt;br /&gt;
        nol_sdkDebug: 'debug', // remove debug flag when going to production&lt;br /&gt;
        domlessEnv: // &amp;quot;1&amp;quot; for React Native | &amp;quot;2&amp;quot; for Amazon | &amp;quot;3&amp;quot; for NodeJS | &amp;quot;4&amp;quot; for Custom&lt;br /&gt;
        // reference SDK interface documentation&lt;br /&gt;
        // for additonal metadata properties&lt;br /&gt;
    },&lt;br /&gt;
    implementationHooks );&lt;br /&gt;
&lt;br /&gt;
// Sample VideoPlayer component &lt;br /&gt;
const VideoPlayer = (props) =&amp;gt; {&lt;br /&gt;
/**&lt;br /&gt;
* Implementation of video player component will vary across the board, for Nielsen DOM-less SDK integration&lt;br /&gt;
* clients need only setup event listeners with corresponding ggPM() calls.&lt;br /&gt;
* &lt;br /&gt;
* Please refer to chosen video player documentation on available events&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
const video = useRef&amp;lt;Video&amp;gt;(null);&lt;br /&gt;
let previousPlayhead = 0; // keep track of previous playhead position&lt;br /&gt;
let metadataLoaded = false; // in case of replay scenario set flag for metadata load&lt;br /&gt;
&lt;br /&gt;
// Sample video metadata&lt;br /&gt;
const videometadata = {&lt;br /&gt;
        'type': 'content',&lt;br /&gt;
        'assetid': 'VID-123456',&lt;br /&gt;
        'program': 'program name',&lt;br /&gt;
        'title': 'episode title with season and episode number',&lt;br /&gt;
        'length': 'length in seconds',&lt;br /&gt;
        'airdate': '20210321 09:00:00',&lt;br /&gt;
        'isfullepisode': 'y',&lt;br /&gt;
        'adloadtype': '2',&lt;br /&gt;
        'segB': 'custom segment B', // optional&lt;br /&gt;
        'segC': 'custom segment C', // optional&lt;br /&gt;
        'crossId1': 'Standard Episode ID', // optional&lt;br /&gt;
        'crossId2': 'Content Originator' //optional&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
const setUpEventListeners = (): void =&amp;gt; {&lt;br /&gt;
     video.addEventListener('ended', onEnded);&lt;br /&gt;
     video.addEventListener('timeupdate', onTimeUpdate);&lt;br /&gt;
     video.addEventListener('playing', onPlay);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const onEnded = () =&amp;gt; {&lt;br /&gt;
    // Nielsen SDK ggPM 'end' event&lt;br /&gt;
    if (nSdkInstance) {&lt;br /&gt;
        nSdkInstance.then((instance: any) =&amp;gt; {&lt;br /&gt;
            instance.ggPM('end', Math.round(video.currentTime));&lt;br /&gt;
            metadataLoaded = false;&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const onTimeUpdate = () =&amp;gt; {&lt;br /&gt;
    const currPlayhead = Math.round(video.current?.currentTime!);&lt;br /&gt;
    if (currPlayhead &amp;gt; 0 &amp;amp;&amp;amp; currPlayhead !== previousPlayhead) {&lt;br /&gt;
        previousPlayhead = currPlayhead;&lt;br /&gt;
        // Nielsen SDK ggPM 'setPlayheadPosition' event&lt;br /&gt;
        if (nSdkInstance) {&lt;br /&gt;
            nSdkInstance.then((instance: any) =&amp;gt; {&lt;br /&gt;
                instance.ggPM('setPlayheadPosition', currPlayhead);&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// NOTE: some players may have an event when video metadata is loaded, recommended to use if available. E.g. loadedmetadata&lt;br /&gt;
const onPlay = () =&amp;gt; {&lt;br /&gt;
    // Nielsen SDK ggPM 'loadmetadata' event&lt;br /&gt;
    if (nSdkInstance &amp;amp;&amp;amp; !metadataLoaded) {&lt;br /&gt;
        nSdkInstance.then((instance: any) =&amp;gt; {&lt;br /&gt;
            instance.ggPM('loadMetadata', videometadata);&lt;br /&gt;
            metadataLoaded = true;&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
return (&lt;br /&gt;
       &amp;lt;View&amp;gt;&lt;br /&gt;
          &amp;lt;Video&lt;br /&gt;
                 source={{ uri: 'https://www.w3schools.com/html/mov_bbb.mp4' }}&lt;br /&gt;
             /&amp;gt;&lt;br /&gt;
      &amp;lt;/View&amp;gt;&lt;br /&gt;
  );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Domless_SDK_API_Reference&amp;diff=6807</id>
		<title>Domless SDK API Reference</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Domless_SDK_API_Reference&amp;diff=6807"/>
		<updated>2025-06-06T19:17:17Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: Add implementation hooks&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==License==&lt;br /&gt;
Nielsen SDK contains material that is protected by copyright laws, patent laws, trade secret laws, and by international treaty provisions and is Copyright © 2024 The Nielsen Company (US) LLC. All intellectual property rights and licenses therein are reserved by The Nielsen Company (US) LLC and its licensors. Please read the license agreement presented [https://engineeringportal.nielsen.com/wiki/Special:ClickThrough here], which must be accepted in order to download the Nielsen SDKs. For more information, reach out to your Nielsen Technical Account Manager(TAM).&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen DOM-less SDK provides APIs that allows our clients to integrate the Nielsen SDK in DOM-less environments, e.g., React Native, Node, etc.&lt;br /&gt;
&lt;br /&gt;
== DOM-less SDK Initialization ==&lt;br /&gt;
&lt;br /&gt;
=== Obtain the Nielsen Application ID (apid) ===&lt;br /&gt;
The Nielsen &amp;lt;code&amp;gt;apid&amp;lt;/code&amp;gt; is required to enable SDK functionality. Technical Account Manager will provide an apid for each player configuration. Browser SDK can support URLs that use any of the protocols – HTTPS and HTTP.&lt;br /&gt;
&lt;br /&gt;
=== Configure the DOM-less SDK ===&lt;br /&gt;
====Installation====&lt;br /&gt;
Install with &amp;lt;code&amp;gt;npm install &amp;lt;nowiki&amp;gt;https://github.com/NielsenDigitalSDK/bsdk-domless&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and import the &amp;lt;code&amp;gt;BsdkInstance&amp;lt;/code&amp;gt; into video player component&lt;br /&gt;
 import { BsdkInstance } from 'bsdk-domless'&lt;br /&gt;
======status.ok()======&lt;br /&gt;
Initialization of the instance can be done with &amp;lt;code&amp;gt;status.ok()&amp;lt;/code&amp;gt; function or use Promise handling approach&lt;br /&gt;
 const instance = await new BsdkInstance(appID, instanceName, instanceMetadata, implementationHooks);&lt;br /&gt;
 &lt;br /&gt;
 if (instance &amp;amp;&amp;amp; instance.status.ok()) {&lt;br /&gt;
     expect(instance).not.toBe(undefined);&lt;br /&gt;
     expect(instance.status.ok()).toBe(true);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: ImplementationHooks are mandatory for the DOM-less SDK instance. Please refer to the ImplementationHooks section below for details.&lt;br /&gt;
&lt;br /&gt;
====Exposed Interface====&lt;br /&gt;
The exposed interface is as follows:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;code&amp;gt;`ggPM`&amp;lt;/code&amp;gt; - method to send messages to the Nielsen SDK&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;code&amp;gt;`processEvent`&amp;lt;/code&amp;gt; - method to send app state to the Nielsen SDK, e.g., focus, blur, appclose&lt;br /&gt;
=== Initialization Global Parameters ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!'''Parameter'''&lt;br /&gt;
!'''Description'''&lt;br /&gt;
!'''Value'''&lt;br /&gt;
|-&lt;br /&gt;
|apid&lt;br /&gt;
|UniqueID assigned to player/site.&lt;br /&gt;
|'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName&lt;br /&gt;
|Name of SDK instance&lt;br /&gt;
|&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|domlessEnv&lt;br /&gt;
|Type of Dom-less environment like ReactNative, Node, etc.&lt;br /&gt;
|&amp;quot;domlessEnv&amp;quot;: &amp;quot;1&amp;quot;, // For ReactNative&lt;br /&gt;
&amp;quot;domlessEnv&amp;quot;: &amp;quot;2&amp;quot;, // For Amazon&lt;br /&gt;
&lt;br /&gt;
&amp;quot;domlessEnv&amp;quot;: &amp;quot;3&amp;quot;, // For NodeJS&lt;br /&gt;
&lt;br /&gt;
“domlessEnv”: “4”, // For Custom&lt;br /&gt;
|-&lt;br /&gt;
|deviceId&lt;br /&gt;
|Device Identifier&lt;br /&gt;
|Alphanumeric string eg. &lt;br /&gt;
|-&lt;br /&gt;
|nol_sdkDebug&lt;br /&gt;
|Enables Nielsen console logging. Only required for testing&lt;br /&gt;
|&amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|optout&lt;br /&gt;
|User optout status&lt;br /&gt;
|&amp;quot;true&amp;quot;, &amp;quot;false&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_sha256&lt;br /&gt;
|SHA256-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_sha1&lt;br /&gt;
|SHA1-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;XvBniTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_md5&lt;br /&gt;
|MD5-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;JnIbdTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|uid2&lt;br /&gt;
|An identifier based on a user’s verifiable PII (e.g. hashed email). UID2.0 was initially created by The Trade Desk (TTD) and is now managed by Prebid.&lt;br /&gt;
|&amp;quot;MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|uid2_token&lt;br /&gt;
|Encrypted Unified ID 2.0&lt;br /&gt;
|&amp;quot;AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8Ql&lt;br /&gt;
DSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeK QI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhC xG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|luid&lt;br /&gt;
|Living Unit ID - Experian Household ID&lt;br /&gt;
'''Note: This parameter is applicable only for CTV and First Party Livestream data'''&lt;br /&gt;
|&amp;quot;B0EOFEDgD&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Implementation Hooks ===&lt;br /&gt;
This object captures the required entities for the DOM-less SDK to operate correctly. These are normally platform dependent and are expected to be passed on to the DOM-less SDK as part of its initialization. See below for the descriptions of each key.&lt;br /&gt;
&lt;br /&gt;
==== '''log''' ====&lt;br /&gt;
Log the DOM-less SDK messages to an external stream, e.g. the browser console, stdout.&lt;br /&gt;
&lt;br /&gt;
e.g. Log.debug('debug', 'NIELSEN TAGS EXPECTED TO FIRE:')&lt;br /&gt;
&lt;br /&gt;
===== Methods =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;info()&lt;br /&gt;
&lt;br /&gt;
Log.info(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
debug()&lt;br /&gt;
&lt;br /&gt;
Log.debug(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
warn()&lt;br /&gt;
&lt;br /&gt;
Log.warn(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
error()&lt;br /&gt;
&lt;br /&gt;
Log.error(label: string, ...message: string[]): void&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;label Required&lt;br /&gt;
&lt;br /&gt;
● string - severity type, e.g. info, debug, warn, error or custom label&lt;br /&gt;
&lt;br /&gt;
message Required&lt;br /&gt;
&lt;br /&gt;
● string - message that will be output to the console&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== storage ====&lt;br /&gt;
Persistent storage of key/values, similar in behavior to browser localStorage.&lt;br /&gt;
&lt;br /&gt;
e.g. storage.set('nol_lsid', 'umy3w4ik9usw2ppqmw2vkecckxfob1697308388')&lt;br /&gt;
&lt;br /&gt;
===== Methods =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;set()&lt;br /&gt;
&lt;br /&gt;
storage.set(key: string, value: string)&lt;br /&gt;
&lt;br /&gt;
get()&lt;br /&gt;
&lt;br /&gt;
storage.get(key: string)&lt;br /&gt;
&lt;br /&gt;
remove()&lt;br /&gt;
&lt;br /&gt;
storage.remove(key: string)&lt;br /&gt;
&lt;br /&gt;
clear()&lt;br /&gt;
&lt;br /&gt;
storage.clear()&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== fetch ====&lt;br /&gt;
Function to fetch resources from the network. Required for the transmission of the DOM-less SDK requests (pings) to the Nielsen endpoints.&lt;br /&gt;
&lt;br /&gt;
e.g. Fetch(resource: string, options: object)&lt;br /&gt;
&lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;resource Required&lt;br /&gt;
&lt;br /&gt;
● A string that provides the URL of the resource to fetch&lt;br /&gt;
&lt;br /&gt;
options Optional Object containing settings to apply to the request:&lt;br /&gt;
&lt;br /&gt;
method&lt;br /&gt;
&lt;br /&gt;
● string - request method: &amp;quot;GET&amp;quot;, &amp;quot;POST&amp;quot;. If one is not provided SDK will default to &amp;quot;GET&amp;quot;&lt;br /&gt;
&lt;br /&gt;
headers&lt;br /&gt;
&lt;br /&gt;
● object - headers to add to the outgoing request, an object literal with String values&lt;br /&gt;
&lt;br /&gt;
body&lt;br /&gt;
&lt;br /&gt;
● string - body to add to the request; SDK will send out string&lt;br /&gt;
&lt;br /&gt;
mode&lt;br /&gt;
&lt;br /&gt;
● string - mode for request: cors, no-cors, same-origin&lt;br /&gt;
&lt;br /&gt;
referrer&lt;br /&gt;
&lt;br /&gt;
● string - a string specifying the referrer of the request&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== '''''Note: ImplementationHooks are mandatory for the DOM-less SDK to function as expected.''''' =====&lt;br /&gt;
&lt;br /&gt;
==== Nielsen Debug Node.js Server for Event Tracking ====&lt;br /&gt;
We are excited to announce the beta version of our Debug Node.js server, designed to track requests and events sent from our Dom-less SDK using WebSocket connections. While this feature is not officially released, we are currently looking for users interested in beta testing.&lt;br /&gt;
&lt;br /&gt;
If you'd like to try this tool and provide feedback, please reach out to your Nielsen Technical Account Manager (TAM) for more information. Your insights would be invaluable in helping us refine this feature for a future release!&lt;br /&gt;
&lt;br /&gt;
== DOM-less SDK API Methods &amp;amp; Properties ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Method/Property&lt;br /&gt;
!Event #&lt;br /&gt;
!DTVR&lt;br /&gt;
!DAR&lt;br /&gt;
!DCR&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|[[play (Browser)|play]]&lt;br /&gt;
|5&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used when there is an ID3 fed product such as DTVR and the client does not want to send in all the CMS metadata that is sent in loadMetadata. This allows the client to send in at least the required “channel name” value associated to the ID3 feed. When the client passes in the channelName, they can change the CMS data stored by passing new values. If this event is not called then the “channel name” value populated will be the default value of “defaultChannelName”.&lt;br /&gt;
|-&lt;br /&gt;
|[[stop (Browser)|stop]]&lt;br /&gt;
|7&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used when switching between ad and content or content and ad.&lt;br /&gt;
|-&lt;br /&gt;
|[[loadMetadata (Browser)|loadMetadata]]&lt;br /&gt;
|15&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|Used when there is a preroll ad that needs to be associated with content metadata. The loadMetadata will first be called to populate the content metadata values and then the loadMetadata for ad metadata will be called. This allows sending a content ping with the ad info, even if the user bails out during the preroll ad.&lt;br /&gt;
|-&lt;br /&gt;
|[[setPlayheadPosition (Browser)|setPlayheadPosition]]&lt;br /&gt;
|49&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to send the playhead position.&lt;br /&gt;
|-&lt;br /&gt;
|[[sendID3 (Browser)|sendID3]]&lt;br /&gt;
|55&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|Used to send the ID3 metadata.&lt;br /&gt;
|-&lt;br /&gt;
|[[end (Browser)|end]]&lt;br /&gt;
|57&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|This is triggered 1) at the end of the content stream, 2) if the user switches to another piece of content 3) when the browser is refreshed or closed&lt;br /&gt;
|-&lt;br /&gt;
|[[setVolume (Browser)|setVolume]]&lt;br /&gt;
|61&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to pass in the player volume levels in %. Default value is -1.&lt;br /&gt;
|-&lt;br /&gt;
|[[staticstart (Browser)|staticstart]]&lt;br /&gt;
|14&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to send the metadata for the static page.&lt;br /&gt;
|-&lt;br /&gt;
|[[StaticEnd (Browser)|staticend]]&lt;br /&gt;
|56&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|In Single Page Application (SPA) it is imperative that staticend is called prior to the loading of new metadata. This allows the SDK to properly credit the previous section/content being viewed before measuring the new one.&lt;br /&gt;
|-&lt;br /&gt;
|[[onPaginate (Browser)|onPaginate]]&lt;br /&gt;
|30&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to initialize the SDK object&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Domless_SDK_API_Reference&amp;diff=6806</id>
		<title>Domless SDK API Reference</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Domless_SDK_API_Reference&amp;diff=6806"/>
		<updated>2025-06-06T19:09:42Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: /* Implementation Hooks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==License==&lt;br /&gt;
Nielsen SDK contains material that is protected by copyright laws, patent laws, trade secret laws, and by international treaty provisions and is Copyright © 2024 The Nielsen Company (US) LLC. All intellectual property rights and licenses therein are reserved by The Nielsen Company (US) LLC and its licensors. Please read the license agreement presented [https://engineeringportal.nielsen.com/wiki/Special:ClickThrough here], which must be accepted in order to download the Nielsen SDKs. For more information, reach out to your Nielsen Technical Account Manager(TAM).&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen DOM-less SDK provides APIs that allows our clients to integrate the Nielsen SDK in DOM-less environments, e.g., React Native, Node, etc.&lt;br /&gt;
&lt;br /&gt;
== DOM-less SDK Initialization ==&lt;br /&gt;
&lt;br /&gt;
=== Obtain the Nielsen Application ID (apid) ===&lt;br /&gt;
The Nielsen &amp;lt;code&amp;gt;apid&amp;lt;/code&amp;gt; is required to enable SDK functionality. Technical Account Manager will provide an apid for each player configuration. Browser SDK can support URLs that use any of the protocols – HTTPS and HTTP.&lt;br /&gt;
&lt;br /&gt;
=== Configure the DOM-less SDK ===&lt;br /&gt;
====Installation====&lt;br /&gt;
Install with &amp;lt;code&amp;gt;npm install &amp;lt;nowiki&amp;gt;https://github.com/NielsenDigitalSDK/bsdk-domless&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and import the &amp;lt;code&amp;gt;BsdkInstance&amp;lt;/code&amp;gt; into video player component&lt;br /&gt;
 import { BsdkInstance } from 'bsdk-domless'&lt;br /&gt;
======status.ok()======&lt;br /&gt;
Initialization of the instance can be done with &amp;lt;code&amp;gt;status.ok()&amp;lt;/code&amp;gt; function or use Promise handling approach&lt;br /&gt;
 const instance = await new BsdkInstance(appID, instanceName, instanceMetadata, implementationHooks);&lt;br /&gt;
 &lt;br /&gt;
 if (instance &amp;amp;&amp;amp; instance.status.ok()) {&lt;br /&gt;
     expect(instance).not.toBe(undefined);&lt;br /&gt;
     expect(instance.status.ok()).toBe(true);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====Exposed Interface====&lt;br /&gt;
The exposed interface is as follows:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;code&amp;gt;`ggPM`&amp;lt;/code&amp;gt; - method to send messages to the Nielsen SDK&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;code&amp;gt;`processEvent`&amp;lt;/code&amp;gt; - method to send app state to the Nielsen SDK, e.g., focus, blur, appclose&lt;br /&gt;
=== Initialization Global Parameters ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!'''Parameter'''&lt;br /&gt;
!'''Description'''&lt;br /&gt;
!'''Value'''&lt;br /&gt;
|-&lt;br /&gt;
|apid&lt;br /&gt;
|UniqueID assigned to player/site.&lt;br /&gt;
|'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName&lt;br /&gt;
|Name of SDK instance&lt;br /&gt;
|&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|domlessEnv&lt;br /&gt;
|Type of Dom-less environment like ReactNative, Node, etc.&lt;br /&gt;
|&amp;quot;domlessEnv&amp;quot;: &amp;quot;1&amp;quot;, // For ReactNative&lt;br /&gt;
&amp;quot;domlessEnv&amp;quot;: &amp;quot;2&amp;quot;, // For Amazon&lt;br /&gt;
&lt;br /&gt;
&amp;quot;domlessEnv&amp;quot;: &amp;quot;3&amp;quot;, // For NodeJS&lt;br /&gt;
&lt;br /&gt;
“domlessEnv”: “4”, // For Custom&lt;br /&gt;
|-&lt;br /&gt;
|deviceId&lt;br /&gt;
|Device Identifier&lt;br /&gt;
|Alphanumeric string eg. &lt;br /&gt;
|-&lt;br /&gt;
|nol_sdkDebug&lt;br /&gt;
|Enables Nielsen console logging. Only required for testing&lt;br /&gt;
|&amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|optout&lt;br /&gt;
|User optout status&lt;br /&gt;
|&amp;quot;true&amp;quot;, &amp;quot;false&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_sha256&lt;br /&gt;
|SHA256-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_sha1&lt;br /&gt;
|SHA1-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;XvBniTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_md5&lt;br /&gt;
|MD5-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;JnIbdTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|uid2&lt;br /&gt;
|An identifier based on a user’s verifiable PII (e.g. hashed email). UID2.0 was initially created by The Trade Desk (TTD) and is now managed by Prebid.&lt;br /&gt;
|&amp;quot;MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|uid2_token&lt;br /&gt;
|Encrypted Unified ID 2.0&lt;br /&gt;
|&amp;quot;AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8Ql&lt;br /&gt;
DSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeK QI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhC xG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|luid&lt;br /&gt;
|Living Unit ID - Experian Household ID&lt;br /&gt;
'''Note: This parameter is applicable only for CTV and First Party Livestream data'''&lt;br /&gt;
|&amp;quot;B0EOFEDgD&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Implementation Hooks ===&lt;br /&gt;
This object captures the required entities for the DOM-less SDK to operate correctly. These are normally platform dependent and are expected to be passed on to the DOM-less SDK as part of its initialization. See below for the descriptions of each key.&lt;br /&gt;
&lt;br /&gt;
==== '''log''' ====&lt;br /&gt;
Log the DOM-less SDK messages to an external stream, e.g. the browser console, stdout.&lt;br /&gt;
&lt;br /&gt;
e.g. Log.debug('debug', 'NIELSEN TAGS EXPECTED TO FIRE:')&lt;br /&gt;
&lt;br /&gt;
===== Methods =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;info()&lt;br /&gt;
&lt;br /&gt;
Log.info(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
debug()&lt;br /&gt;
&lt;br /&gt;
Log.debug(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
warn()&lt;br /&gt;
&lt;br /&gt;
Log.warn(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
error()&lt;br /&gt;
&lt;br /&gt;
Log.error(label: string, ...message: string[]): void&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;label Required&lt;br /&gt;
&lt;br /&gt;
● string - severity type, e.g. info, debug, warn, error or custom label&lt;br /&gt;
&lt;br /&gt;
message Required&lt;br /&gt;
&lt;br /&gt;
● string - message that will be output to the console&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== storage ====&lt;br /&gt;
Persistent storage of key/values, similar in behavior to browser localStorage.&lt;br /&gt;
&lt;br /&gt;
e.g. storage.set('nol_lsid', 'umy3w4ik9usw2ppqmw2vkecckxfob1697308388')&lt;br /&gt;
&lt;br /&gt;
===== Methods =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;set()&lt;br /&gt;
&lt;br /&gt;
storage.set(key: string, value: string)&lt;br /&gt;
&lt;br /&gt;
get()&lt;br /&gt;
&lt;br /&gt;
storage.get(key: string)&lt;br /&gt;
&lt;br /&gt;
remove()&lt;br /&gt;
&lt;br /&gt;
storage.remove(key: string)&lt;br /&gt;
&lt;br /&gt;
clear()&lt;br /&gt;
&lt;br /&gt;
storage.clear()&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== fetch ====&lt;br /&gt;
Function to fetch resources from the network. Required for the transmission of the DOM-less SDK requests (pings) to the Nielsen endpoints.&lt;br /&gt;
&lt;br /&gt;
e.g. Fetch(resource: string, options: object)&lt;br /&gt;
&lt;br /&gt;
===== Parameters =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;resource Required&lt;br /&gt;
&lt;br /&gt;
● A string that provides the URL of the resource to fetch&lt;br /&gt;
&lt;br /&gt;
options Optional Object containing settings to apply to the request:&lt;br /&gt;
&lt;br /&gt;
method&lt;br /&gt;
&lt;br /&gt;
● string - request method: &amp;quot;GET&amp;quot;, &amp;quot;POST&amp;quot;. If one is not provided SDK will default to &amp;quot;GET&amp;quot;&lt;br /&gt;
&lt;br /&gt;
headers&lt;br /&gt;
&lt;br /&gt;
● object - headers to add to the outgoing request, an object literal with String values&lt;br /&gt;
&lt;br /&gt;
body&lt;br /&gt;
&lt;br /&gt;
● string - body to add to the request; SDK will send out string&lt;br /&gt;
&lt;br /&gt;
mode&lt;br /&gt;
&lt;br /&gt;
● string - mode for request: cors, no-cors, same-origin&lt;br /&gt;
&lt;br /&gt;
referrer&lt;br /&gt;
&lt;br /&gt;
● string - a string specifying the referrer of the request&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== '''''Note: ImplementationHooks are mandatory for the DOM-less SDK to function as expected.''''' =====&lt;br /&gt;
&lt;br /&gt;
==== Nielsen Debug Node.js Server for Event Tracking ====&lt;br /&gt;
We are excited to announce the beta version of our Debug Node.js server, designed to track requests and events sent from our Dom-less SDK using WebSocket connections. While this feature is not officially released, we are currently looking for users interested in beta testing.&lt;br /&gt;
&lt;br /&gt;
If you'd like to try this tool and provide feedback, please reach out to your Nielsen Technical Account Manager (TAM) for more information. Your insights would be invaluable in helping us refine this feature for a future release!&lt;br /&gt;
&lt;br /&gt;
== DOM-less SDK API Methods &amp;amp; Properties ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Method/Property&lt;br /&gt;
!Event #&lt;br /&gt;
!DTVR&lt;br /&gt;
!DAR&lt;br /&gt;
!DCR&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|[[play (Browser)|play]]&lt;br /&gt;
|5&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used when there is an ID3 fed product such as DTVR and the client does not want to send in all the CMS metadata that is sent in loadMetadata. This allows the client to send in at least the required “channel name” value associated to the ID3 feed. When the client passes in the channelName, they can change the CMS data stored by passing new values. If this event is not called then the “channel name” value populated will be the default value of “defaultChannelName”.&lt;br /&gt;
|-&lt;br /&gt;
|[[stop (Browser)|stop]]&lt;br /&gt;
|7&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used when switching between ad and content or content and ad.&lt;br /&gt;
|-&lt;br /&gt;
|[[loadMetadata (Browser)|loadMetadata]]&lt;br /&gt;
|15&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|Used when there is a preroll ad that needs to be associated with content metadata. The loadMetadata will first be called to populate the content metadata values and then the loadMetadata for ad metadata will be called. This allows sending a content ping with the ad info, even if the user bails out during the preroll ad.&lt;br /&gt;
|-&lt;br /&gt;
|[[setPlayheadPosition (Browser)|setPlayheadPosition]]&lt;br /&gt;
|49&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to send the playhead position.&lt;br /&gt;
|-&lt;br /&gt;
|[[sendID3 (Browser)|sendID3]]&lt;br /&gt;
|55&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|Used to send the ID3 metadata.&lt;br /&gt;
|-&lt;br /&gt;
|[[end (Browser)|end]]&lt;br /&gt;
|57&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|This is triggered 1) at the end of the content stream, 2) if the user switches to another piece of content 3) when the browser is refreshed or closed&lt;br /&gt;
|-&lt;br /&gt;
|[[setVolume (Browser)|setVolume]]&lt;br /&gt;
|61&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to pass in the player volume levels in %. Default value is -1.&lt;br /&gt;
|-&lt;br /&gt;
|[[staticstart (Browser)|staticstart]]&lt;br /&gt;
|14&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to send the metadata for the static page.&lt;br /&gt;
|-&lt;br /&gt;
|[[StaticEnd (Browser)|staticend]]&lt;br /&gt;
|56&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|In Single Page Application (SPA) it is imperative that staticend is called prior to the loading of new metadata. This allows the SDK to properly credit the previous section/content being viewed before measuring the new one.&lt;br /&gt;
|-&lt;br /&gt;
|[[onPaginate (Browser)|onPaginate]]&lt;br /&gt;
|30&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to initialize the SDK object&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Domless_SDK_API_Reference&amp;diff=6805</id>
		<title>Domless SDK API Reference</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Domless_SDK_API_Reference&amp;diff=6805"/>
		<updated>2025-06-06T18:57:12Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: Add information about implementation hooks&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==License==&lt;br /&gt;
Nielsen SDK contains material that is protected by copyright laws, patent laws, trade secret laws, and by international treaty provisions and is Copyright © 2024 The Nielsen Company (US) LLC. All intellectual property rights and licenses therein are reserved by The Nielsen Company (US) LLC and its licensors. Please read the license agreement presented [https://engineeringportal.nielsen.com/wiki/Special:ClickThrough here], which must be accepted in order to download the Nielsen SDKs. For more information, reach out to your Nielsen Technical Account Manager(TAM).&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Nielsen DOM-less SDK provides APIs that allows our clients to integrate the Nielsen SDK in DOM-less environments, e.g., React Native, Node, etc.&lt;br /&gt;
&lt;br /&gt;
== DOM-less SDK Initialization ==&lt;br /&gt;
&lt;br /&gt;
=== Obtain the Nielsen Application ID (apid) ===&lt;br /&gt;
The Nielsen &amp;lt;code&amp;gt;apid&amp;lt;/code&amp;gt; is required to enable SDK functionality. Technical Account Manager will provide an apid for each player configuration. Browser SDK can support URLs that use any of the protocols – HTTPS and HTTP.&lt;br /&gt;
&lt;br /&gt;
=== Configure the DOM-less SDK ===&lt;br /&gt;
====Installation====&lt;br /&gt;
Install with &amp;lt;code&amp;gt;npm install &amp;lt;nowiki&amp;gt;https://github.com/NielsenDigitalSDK/bsdk-domless&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and import the &amp;lt;code&amp;gt;BsdkInstance&amp;lt;/code&amp;gt; into video player component&lt;br /&gt;
 import { BsdkInstance } from 'bsdk-domless'&lt;br /&gt;
======status.ok()======&lt;br /&gt;
Initialization of the instance can be done with &amp;lt;code&amp;gt;status.ok()&amp;lt;/code&amp;gt; function or use Promise handling approach&lt;br /&gt;
 const instance = await new BsdkInstance(appID, instanceName, instanceMetadata, implementationHooks);&lt;br /&gt;
 &lt;br /&gt;
 if (instance &amp;amp;&amp;amp; instance.status.ok()) {&lt;br /&gt;
     expect(instance).not.toBe(undefined);&lt;br /&gt;
     expect(instance.status.ok()).toBe(true);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====Exposed Interface====&lt;br /&gt;
The exposed interface is as follows:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;code&amp;gt;`ggPM`&amp;lt;/code&amp;gt; - method to send messages to the Nielsen SDK&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;code&amp;gt;`processEvent`&amp;lt;/code&amp;gt; - method to send app state to the Nielsen SDK, e.g., focus, blur, appclose&lt;br /&gt;
=== Initialization Global Parameters ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!'''Parameter'''&lt;br /&gt;
!'''Description'''&lt;br /&gt;
!'''Value'''&lt;br /&gt;
|-&lt;br /&gt;
|apid&lt;br /&gt;
|UniqueID assigned to player/site.&lt;br /&gt;
|'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
|instanceName&lt;br /&gt;
|Name of SDK instance&lt;br /&gt;
|&amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|domlessEnv&lt;br /&gt;
|Type of Dom-less environment like ReactNative, Node, etc.&lt;br /&gt;
|&amp;quot;domlessEnv&amp;quot;: &amp;quot;1&amp;quot;, // For ReactNative&lt;br /&gt;
&amp;quot;domlessEnv&amp;quot;: &amp;quot;2&amp;quot;, // For Amazon&lt;br /&gt;
&lt;br /&gt;
&amp;quot;domlessEnv&amp;quot;: &amp;quot;3&amp;quot;, // For NodeJS&lt;br /&gt;
&lt;br /&gt;
“domlessEnv”: “4”, // For Custom&lt;br /&gt;
|-&lt;br /&gt;
|deviceId&lt;br /&gt;
|Device Identifier&lt;br /&gt;
|Alphanumeric string eg. &lt;br /&gt;
|-&lt;br /&gt;
|nol_sdkDebug&lt;br /&gt;
|Enables Nielsen console logging. Only required for testing&lt;br /&gt;
|&amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|optout&lt;br /&gt;
|User optout status&lt;br /&gt;
|&amp;quot;true&amp;quot;, &amp;quot;false&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_sha256&lt;br /&gt;
|SHA256-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_sha1&lt;br /&gt;
|SHA1-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;XvBniTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|hem_md5&lt;br /&gt;
|MD5-hashed email address (client-supplied unique 32-character hexadecimal string)&lt;br /&gt;
|&amp;quot;JnIbdTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|uid2&lt;br /&gt;
|An identifier based on a user’s verifiable PII (e.g. hashed email). UID2.0 was initially created by The Trade Desk (TTD) and is now managed by Prebid.&lt;br /&gt;
|&amp;quot;MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|uid2_token&lt;br /&gt;
|Encrypted Unified ID 2.0&lt;br /&gt;
|&amp;quot;AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8Ql&lt;br /&gt;
DSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeK QI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhC xG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|luid&lt;br /&gt;
|Living Unit ID - Experian Household ID&lt;br /&gt;
'''Note: This parameter is applicable only for CTV and First Party Livestream data'''&lt;br /&gt;
|&amp;quot;B0EOFEDgD&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Implementation Hooks ====&lt;br /&gt;
This object captures the required entities for the DOM-less SDK to operate correctly. These are normally platform dependent and are expected to be passed on to the DOM-less SDK as part of its initialization. See below for the descriptions of each key.&lt;br /&gt;
&lt;br /&gt;
'''log'''&lt;br /&gt;
&lt;br /&gt;
Log the DOM-less SDK messages to an external stream, e.g. the browser console, stdout.&lt;br /&gt;
&lt;br /&gt;
e.g. Log.debug('debug', 'NIELSEN TAGS EXPECTED TO FIRE:')&lt;br /&gt;
&lt;br /&gt;
Methods&lt;br /&gt;
&lt;br /&gt;
info()&lt;br /&gt;
&lt;br /&gt;
Log.info(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
debug()&lt;br /&gt;
&lt;br /&gt;
Log.debug(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
warn()&lt;br /&gt;
&lt;br /&gt;
Log.warn(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
error()&lt;br /&gt;
&lt;br /&gt;
Log.error(label: string, ...message: string[]): void&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
&lt;br /&gt;
label Required&lt;br /&gt;
&lt;br /&gt;
● string - severity type, e.g. info, debug, warn, error or custom label&lt;br /&gt;
&lt;br /&gt;
message Required&lt;br /&gt;
&lt;br /&gt;
● string - message that will be output to the console&lt;br /&gt;
&lt;br /&gt;
storage&lt;br /&gt;
&lt;br /&gt;
Persistent storage of key/values, similar in behavior to browser localStorage.&lt;br /&gt;
&lt;br /&gt;
e.g. storage.set('nol_lsid', 'umy3w4ik9usw2ppqmw2vkecckxfob1697308388')&lt;br /&gt;
&lt;br /&gt;
Methods&lt;br /&gt;
&lt;br /&gt;
set()&lt;br /&gt;
&lt;br /&gt;
storage.set(key: string, value: string)&lt;br /&gt;
&lt;br /&gt;
get()&lt;br /&gt;
&lt;br /&gt;
storage.get(key: string)&lt;br /&gt;
&lt;br /&gt;
remove()&lt;br /&gt;
&lt;br /&gt;
storage.remove(key: string)&lt;br /&gt;
&lt;br /&gt;
clear()&lt;br /&gt;
&lt;br /&gt;
storage.clear()&lt;br /&gt;
&lt;br /&gt;
fetch&lt;br /&gt;
&lt;br /&gt;
Function to fetch resources from the network. Required for the transmission of BSDK pings.&lt;br /&gt;
&lt;br /&gt;
Fetch(resource: string, options: object)&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
&lt;br /&gt;
resource Required&lt;br /&gt;
&lt;br /&gt;
● A string that provides the URL of the resource to fetch&lt;br /&gt;
&lt;br /&gt;
options Optional Object containing settings to apply to the request:&lt;br /&gt;
&lt;br /&gt;
method&lt;br /&gt;
&lt;br /&gt;
● string - request method: &amp;quot;GET&amp;quot;, &amp;quot;POST&amp;quot;. If one is not provided SDK will default to &amp;quot;GET&amp;quot;&lt;br /&gt;
&lt;br /&gt;
headers&lt;br /&gt;
&lt;br /&gt;
● object - headers to add to the outgoing request, an object literal with String values&lt;br /&gt;
&lt;br /&gt;
body&lt;br /&gt;
&lt;br /&gt;
● string - body to add to the request; SDK will send out string&lt;br /&gt;
&lt;br /&gt;
mode&lt;br /&gt;
&lt;br /&gt;
● string - mode for request: cors, no-cors, same-origin&lt;br /&gt;
&lt;br /&gt;
referrer&lt;br /&gt;
&lt;br /&gt;
● string - a string specifying the referrer of the request&lt;br /&gt;
&lt;br /&gt;
==== Nielsen Debug Node.js Server for Event Tracking ====&lt;br /&gt;
We are excited to announce the beta version of our Debug Node.js server, designed to track requests and events sent from our Dom-less SDK using WebSocket connections. While this feature is not officially released, we are currently looking for users interested in beta testing.&lt;br /&gt;
&lt;br /&gt;
If you'd like to try this tool and provide feedback, please reach out to your Nielsen Technical Account Manager (TAM) for more information. Your insights would be invaluable in helping us refine this feature for a future release!&lt;br /&gt;
&lt;br /&gt;
== DOM-less SDK API Methods &amp;amp; Properties ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Method/Property&lt;br /&gt;
!Event #&lt;br /&gt;
!DTVR&lt;br /&gt;
!DAR&lt;br /&gt;
!DCR&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|[[play (Browser)|play]]&lt;br /&gt;
|5&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used when there is an ID3 fed product such as DTVR and the client does not want to send in all the CMS metadata that is sent in loadMetadata. This allows the client to send in at least the required “channel name” value associated to the ID3 feed. When the client passes in the channelName, they can change the CMS data stored by passing new values. If this event is not called then the “channel name” value populated will be the default value of “defaultChannelName”.&lt;br /&gt;
|-&lt;br /&gt;
|[[stop (Browser)|stop]]&lt;br /&gt;
|7&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used when switching between ad and content or content and ad.&lt;br /&gt;
|-&lt;br /&gt;
|[[loadMetadata (Browser)|loadMetadata]]&lt;br /&gt;
|15&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|✔&lt;br /&gt;
|Used when there is a preroll ad that needs to be associated with content metadata. The loadMetadata will first be called to populate the content metadata values and then the loadMetadata for ad metadata will be called. This allows sending a content ping with the ad info, even if the user bails out during the preroll ad.&lt;br /&gt;
|-&lt;br /&gt;
|[[setPlayheadPosition (Browser)|setPlayheadPosition]]&lt;br /&gt;
|49&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to send the playhead position.&lt;br /&gt;
|-&lt;br /&gt;
|[[sendID3 (Browser)|sendID3]]&lt;br /&gt;
|55&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|Used to send the ID3 metadata.&lt;br /&gt;
|-&lt;br /&gt;
|[[end (Browser)|end]]&lt;br /&gt;
|57&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|This is triggered 1) at the end of the content stream, 2) if the user switches to another piece of content 3) when the browser is refreshed or closed&lt;br /&gt;
|-&lt;br /&gt;
|[[setVolume (Browser)|setVolume]]&lt;br /&gt;
|61&lt;br /&gt;
|✔&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to pass in the player volume levels in %. Default value is -1.&lt;br /&gt;
|-&lt;br /&gt;
|[[staticstart (Browser)|staticstart]]&lt;br /&gt;
|14&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to send the metadata for the static page.&lt;br /&gt;
|-&lt;br /&gt;
|[[StaticEnd (Browser)|staticend]]&lt;br /&gt;
|56&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|In Single Page Application (SPA) it is imperative that staticend is called prior to the loading of new metadata. This allows the SDK to properly credit the previous section/content being viewed before measuring the new one.&lt;br /&gt;
|-&lt;br /&gt;
|[[onPaginate (Browser)|onPaginate]]&lt;br /&gt;
|30&lt;br /&gt;
|✘&lt;br /&gt;
|✘&lt;br /&gt;
|✔&lt;br /&gt;
|Used to initialize the SDK object&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_API_Reference&amp;diff=6804</id>
		<title>Browser SDK API Reference</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_API_Reference&amp;diff=6804"/>
		<updated>2025-05-30T14:18:47Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: Updatemetadata/35 is not applicable to DTVR but only for DCRVideo &amp;amp; VRI&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Setting up Development Environment ==&lt;br /&gt;
=== Step 1: Configure Content Management System (CMS) ===&lt;br /&gt;
Configure CMS to send the required values (see table below). Any internal CMS_variable names can be used for passing the data.&lt;br /&gt;
&lt;br /&gt;
Ensure to capture these CMS_variable names in the SDK Configuration Form.&lt;br /&gt;
&lt;br /&gt;
For more information on setting variable names, see the SDK Configuration Form included within the SDK package.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Required Data !! Description !! Value&lt;br /&gt;
|-&lt;br /&gt;
| dataSrc || Used when both CMS metadata and ID3 data are present in the player. Setting this field tells the SDK whether to use the CMS metadata or the ID3 payload to derive the pings || cms&lt;br /&gt;
|-&lt;br /&gt;
| type || Type of asset: ad or content || preroll, midroll, postroll, or content&lt;br /&gt;
|-&lt;br /&gt;
| assetid || unique ID assigned to asset || custom &amp;lt;br&amp;gt;(no [[Special Characters]])&lt;br /&gt;
|-&lt;br /&gt;
| OCR Tag || OCR tag provided by Nielsen for implementation on the ad unit || Complete OCR URL&lt;br /&gt;
|-&lt;br /&gt;
| program || Name of program (25 character limit) || custom&lt;br /&gt;
|-&lt;br /&gt;
| title || Episode title (40 character limit) || custom&lt;br /&gt;
|-&lt;br /&gt;
| length || Length of content in seconds || Length in seconds, 0 for live stream&lt;br /&gt;
|-&lt;br /&gt;
| adloadtype || Type of ad load || &amp;quot;1&amp;quot; - Linear &amp;quot;2&amp;quot; - Dynamic(default)&lt;br /&gt;
|-&lt;br /&gt;
| hasAds || Identify if content includes Ads ||  &amp;quot;0&amp;quot; - no ads &amp;quot;1&amp;quot; - includes ads &amp;quot;2&amp;quot; - unknown(default)&lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode || Full episode flag	|| &amp;quot;y&amp;quot; - full episode &amp;quot;n&amp;quot; - non full episode&lt;br /&gt;
|-&lt;br /&gt;
| segA || Segment A (this is not available for video reporting as the episode title is reported) || custom value&lt;br /&gt;
|-&lt;br /&gt;
| segB || Custom segment B || custom value&lt;br /&gt;
|-&lt;br /&gt;
| segC || Custom segment C || custom value&lt;br /&gt;
|-&lt;br /&gt;
| crossId1 || Standard episode ID || custom value&lt;br /&gt;
|-&lt;br /&gt;
| crossId2 || Content originator (required only for distributors) || custom value&lt;br /&gt;
|-&lt;br /&gt;
| airdate || Original air date and time in Eastern Time. For non-US countries, it should be local time. || YYYYMMDD HH24:MI:SS&lt;br /&gt;
|-&lt;br /&gt;
| containerId || HTML DOM element of the Player container (for Viewability&amp;amp;Audibility feature only) || custom value &lt;br /&gt;
|-&lt;br /&gt;
|luid&lt;br /&gt;
|Living Unit ID - Experian Household ID&lt;br /&gt;
'''Note: This parameter is applicable only for CTV and First Party Livestream data'''&lt;br /&gt;
|&amp;quot;B0EOFEDgD&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Complete the Nielsen SDK Configuration Form ===&lt;br /&gt;
The SDK is designed to map the &amp;lt;code&amp;gt;CMS_variable names&amp;lt;/code&amp;gt;. To support the custom mapping, the developer is required to complete the SDK Configuration Form. The form will be provided during onboarding along with this guide.&lt;br /&gt;
&lt;br /&gt;
== Initialization ==&lt;br /&gt;
=== Obtain the Nielsen Application ID (apid) and Browser SDK URLs ===&lt;br /&gt;
The Nielsen &amp;lt;code&amp;gt;apid&amp;lt;/code&amp;gt; is required to enable SDK functionality. Technical Account Manager will provide an apid for each player configuration.  &lt;br /&gt;
Browser SDK can support URLs that use any of the protocols – HTTPS and HTTP.  &lt;br /&gt;
&lt;br /&gt;
=== Configure Browser SDK ===&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
&lt;br /&gt;
'''Add Static Queue Snippet'''&lt;br /&gt;
&lt;br /&gt;
*Add Static Queue Snippet&lt;br /&gt;
*Create SDK Instance&lt;br /&gt;
&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
'''Create SDK Instance'''&lt;br /&gt;
&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
'''Initialization API Call'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When creating an instance, pass the following three values:&lt;br /&gt;
&lt;br /&gt;
=== SDK Initialization – Global Parameters &amp;lt;span class=&amp;quot;anchor&amp;quot; id=&amp;quot;SDK Initialization Global Parameters&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameters !! Description !! Value&lt;br /&gt;
|-&lt;br /&gt;
| apid || UniqueID assigned to player/site. || 	'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
| instanceName || Name of SDK instance || &amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug || Enables Nielsen console logging. Only required for testing || &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| containerId || HTML DOM element id of the player container. Only for Viewability &amp;amp; Audibility feature. || {containerId: &amp;quot;playerId1&amp;quot;}&lt;br /&gt;
|-&lt;br /&gt;
| hem_sha256 || SHA256-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| hem_sha1 || SHA1-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;XvBniTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| hem_md5 || MD5-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;JnIbdTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| uid2 || An identifier based on a user’s verifiable PII (e.g. hashed email). UID2.0 was initially created by The Trade Desk (TTD) and is now managed by Prebid. || &amp;quot;MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| uid2_token || Encrypted Unified ID 2.0 || &amp;quot;AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8Ql&lt;br /&gt;
DSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeK&lt;br /&gt;
QI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhC&lt;br /&gt;
xG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{example_bsdk_init}}&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Configuration'''&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
  var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;,&amp;quot;nlsnInstance&amp;quot;, {nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multiple SDK Instances ===&lt;br /&gt;
The Browser SDK allows instantiating multiple instances of the object, which can be used simultaneously without any problems, however they must be instantiated with their own unique instance names. There is no maximum number of instances that is enforced in the browser.&lt;br /&gt;
&lt;br /&gt;
The below examples will make use of the same AppId, however using different AppIds will work as well. The principles below follow the same initialization rules stated above for a single instance and simply require a unique instance name and variable name with which the returned instance is assigned.&lt;br /&gt;
&lt;br /&gt;
For more information around the possible parameters that can be passed as well as deeper descriptions for the API calls, please refer to the section on  [[#SDK Initialization Global Parameters|'''SDK Initialization - Global Parameters''']].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Example of 2 instances on the same page'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Add Static Queue Snippet&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    !function (e, n) {&lt;br /&gt;
      function t(e) {&lt;br /&gt;
        return &amp;quot;object&amp;quot; == typeof e ? JSON.parse(JSON.stringify(e)) : e&lt;br /&gt;
      }&lt;br /&gt;
      e[n] = e[n] ||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ: function (o, r, c) {&lt;br /&gt;
          var s = e.document,&lt;br /&gt;
            a = s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async = 1,&lt;br /&gt;
            a.src = (&amp;quot;http:&amp;quot; === e.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + o + &amp;quot;.js#name=&amp;quot; + r + &amp;quot;&amp;amp;ns=&amp;quot; + n;&lt;br /&gt;
          var i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a, i),&lt;br /&gt;
            e[n][r] = e[n][r] || {&lt;br /&gt;
              g: c || {},&lt;br /&gt;
              ggPM: function (o, c, s, a, i) { e[n][r].q = e[n][r].q || []; try { var l = t([o, c, s, a, i]); e[n][r].q.push(l) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } },&lt;br /&gt;
              trackEvent: function (o) { e[n][r].te = e[n][r].te || []; try { var c = t(o); e[n][r].te.push(c) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } }&lt;br /&gt;
            },&lt;br /&gt;
            e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    //Create SDK Instance(s)&lt;br /&gt;
    // Notice the unique instance name given to each instance below and the unique variable name for each instance&lt;br /&gt;
    var nSdkInstanceLive = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;instanceLive&amp;quot;, {&lt;br /&gt;
        nol_sdkDebug: 'debug',&lt;br /&gt;
        optout: 'false'&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    var nSdkInstanceVod = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;instanceVod&amp;quot;, {&lt;br /&gt;
        nol_sdkDebug: 'debug',&lt;br /&gt;
        optout: 'false'&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Example of 2 instances using a parent page and iFrame'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Parent Page (index.html)&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;ie=edge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;DCR Static/DCR Video&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    /* NLSQUEUE build v*/&lt;br /&gt;
    !function(e,n){&lt;br /&gt;
    function t(e){&lt;br /&gt;
      return&amp;quot;object&amp;quot;==typeof e?JSON.parse(JSON.stringify(e)):e&lt;br /&gt;
    }&lt;br /&gt;
    e[n]=e[n]||&lt;br /&gt;
    {&lt;br /&gt;
      nlsQ:function(o,r,c){&lt;br /&gt;
        var s=e.document,&lt;br /&gt;
        a=s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
        a.async=1,&lt;br /&gt;
        a.src=(&amp;quot;http:&amp;quot;===e.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+o+&amp;quot;.js#name=&amp;quot;+r+&amp;quot;&amp;amp;ns=&amp;quot;+n;&lt;br /&gt;
        var i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
        return i.parentNode.insertBefore(a,i),&lt;br /&gt;
        e[n][r]=e[n][r]||{g:c||{},&lt;br /&gt;
        ggPM:function(o,c,s,a,i){e[n][r].q=e[n][r].q||[];try{var l=t([o,c,s,a,i]);e[n][r].q.push(l)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}},&lt;br /&gt;
        trackEvent:function(o){e[n][r].te=e[n][r].te||[];try{var c=t(o);e[n][r].te.push(c)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}}},&lt;br /&gt;
        e[n][r]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // SDK Initialization&lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;staticPage&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: 'debug',&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Static Metadata &lt;br /&gt;
    var staticMetadata = {&lt;br /&gt;
      assetid: 'staticTestPage',&lt;br /&gt;
      type: 'static'&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    // Event 'staticstart' call&lt;br /&gt;
    nSdkInstance.ggPM(14, staticMetadata);&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;h1&amp;gt;DCR Static on Parent/DCR Video in iFrame&amp;lt;/h1&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Static measurement is current on parent page when window is in focus&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;iframe src=&amp;quot;./dcr-video.html&amp;quot; frameborder=&amp;quot;0&amp;quot; width=&amp;quot;650&amp;quot; height=&amp;quot;500&amp;quot; style=&amp;quot;background-color: rgb(42, 217, 248);&amp;quot; id=&amp;quot;video-iframe&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Nested iFrame Referenced on Parent Page (dcr-video.html)&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;ie=edge&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;iFrame Same Source&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
    /* NLSQUEUE build v*/&lt;br /&gt;
    !function(e,n){&lt;br /&gt;
      function t(e){&lt;br /&gt;
        return&amp;quot;object&amp;quot;==typeof e?JSON.parse(JSON.stringify(e)):e&lt;br /&gt;
      }&lt;br /&gt;
      e[n]=e[n]||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ:function(o,r,c){&lt;br /&gt;
          var s=e.document,&lt;br /&gt;
          a=s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async=1,&lt;br /&gt;
          a.src=(&amp;quot;http:&amp;quot;===e.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+o+&amp;quot;.js#name=&amp;quot;+r+&amp;quot;&amp;amp;ns=&amp;quot;+n;&lt;br /&gt;
          var i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a,i),&lt;br /&gt;
          e[n][r]=e[n][r]||{g:c||{},&lt;br /&gt;
          ggPM:function(o,c,s,a,i){e[n][r].q=e[n][r].q||[];try{var l=t([o,c,s,a,i]);e[n][r].q.push(l)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}},&lt;br /&gt;
          trackEvent:function(o){e[n][r].te=e[n][r].te||[];try{var c=t(o);e[n][r].te.push(c)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}}},&lt;br /&gt;
          e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // SDK Initialization&lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;videoPlayer&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: 'debug',&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    var contentMetadata = {&lt;br /&gt;
        type: &amp;quot;content&amp;quot;,&lt;br /&gt;
        length: &amp;quot;300&amp;quot;,&lt;br /&gt;
        title: &amp;quot;Skydiving Across Europe&amp;quot;,&lt;br /&gt;
        program: &amp;quot;latacg&amp;quot;,&lt;br /&gt;
        censuscategory: &amp;quot;Enlisted&amp;quot;,&lt;br /&gt;
        assetid: &amp;quot;204558915992&amp;quot;,&lt;br /&gt;
        section: &amp;quot;ProgramAsset8&amp;quot;,&lt;br /&gt;
        tv: &amp;quot;true&amp;quot;,&lt;br /&gt;
        adModel: &amp;quot;0&amp;quot;,&lt;br /&gt;
        dataSrc: &amp;quot;cms&amp;quot;,&lt;br /&gt;
        segA: &amp;quot;S07E04:NBC&amp;quot;,&lt;br /&gt;
        segB: &amp;quot;teams&amp;quot;,&lt;br /&gt;
        segC:&amp;quot;AtlanataFalcons&amp;quot;,&lt;br /&gt;
      }&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;I'm iframe SDK DCR Video measurement, DCR static measurement should continue when clicking &amp;quot;play&amp;quot; on video&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;main&amp;gt;&lt;br /&gt;
      &amp;lt;video&lt;br /&gt;
      controls&lt;br /&gt;
      src=&amp;quot;https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4&amp;quot;&lt;br /&gt;
      poster=&amp;quot;https://peach.blender.org/wp-content/uploads/title_anouncement.jpg?x11217&amp;quot;&lt;br /&gt;
      width=&amp;quot;620&amp;quot;&amp;gt;&lt;br /&gt;
      Sorry, your browser doesn't support embedded videos, but don't worry, you can&lt;br /&gt;
      &amp;lt;a href=&amp;quot;https://archive.org/details/BigBuckBunny_124&amp;quot;&amp;gt;download it&amp;lt;/a&amp;gt;&lt;br /&gt;
      and watch it with your favorite video player!&lt;br /&gt;
    &amp;lt;/video&amp;gt;&lt;br /&gt;
    &amp;lt;/main&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;../player.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SDK Initialization to measure the Viewability &amp;amp; Audibility ===&lt;br /&gt;
To support viewability metrics in the web page the integrator has to provide a tag value of the player view to let Nielsen SDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in the as string while initializing the Nielsen browser SDK.&lt;br /&gt;
&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{containerId: &amp;lt;playerElementID&amp;gt;, nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Initialization for Viewability'''&lt;br /&gt;
&lt;br /&gt;
Your configuration should include the Static Queue Snippet and an SDK Instance for your unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Add Static Queue Snippet&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    ! function(t, n) {&lt;br /&gt;
        t[n] = t[n] || {&lt;br /&gt;
            nlsQ: function(e, o, c, r, s, i) {&lt;br /&gt;
                return s = t.document,&lt;br /&gt;
                    r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
                    r.async = 1,&lt;br /&gt;
                    r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + o + &amp;quot;&amp;amp;ns=&amp;quot; + n,&lt;br /&gt;
                    i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
                    i.parentNode.insertBefore(r, i),&lt;br /&gt;
                    t[n][o] = t[n][o] || {&lt;br /&gt;
                        g: c || {},&lt;br /&gt;
                        ggPM: function(e, c, r, s, i) {&lt;br /&gt;
                            (t[n][o].q = t[n][o].q || []).push([e, c, r, s, i])&lt;br /&gt;
                        }&lt;br /&gt;
                    }, t[n][o]&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    (window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
//Create SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {containerId: “player1”, nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser SDK API Methods &amp;amp; Properties ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method / Property !! Event # !! DTVR !! DAR !! DCR !! Description&lt;br /&gt;
|-&lt;br /&gt;
| [[loadMetadata (Browser)|loadMetadata]] || 15 || ✔ || ✔ || ✔ || Used when there is a preroll ad that needs to be associated with content metadata. The loadMetadata will first be called to populate the content metadata values and then the loadMetadata for ad metadata will be called. This allows sending a content ping with the ad info, even if the user bails out during the preroll ad.&lt;br /&gt;
|-&lt;br /&gt;
| [[play (Browser)|play]] || 5 || ✔ || ✘ || ✔ || Used when there is an ID3 fed product such as DTVR and the client does not want to send in all the CMS metadata that is sent in loadMetadata. This allows the client to send in at least the required “channel name” value associated to the ID3 feed. When the client passes in the channelName, they can change the CMS data stored by passing new values. If this event is not called then the “channel name” value populated will be the default value of “defaultChannelName”.&lt;br /&gt;
|-&lt;br /&gt;
| [[sendID3 (Browser)|sendID3]] || 55 || ✔ || ✘ || ✘ || Used to send the ID3 metadata.&lt;br /&gt;
|-&lt;br /&gt;
| [[setPlayheadPosition (Browser)|setPlayheadPosition]] || 49 || ✘ || ✘ || ✔ || Used to send the playhead position.&lt;br /&gt;
|-&lt;br /&gt;
| [[stop (Browser)|stop]] || 7 || ✘ || ✘ || ✔ || Used when switching between ad and content or content and ad.&lt;br /&gt;
|-&lt;br /&gt;
| [[end (Browser)|end]] || 57 || ✔ || ✘ || ✔ || This is triggered 1) at the end of the content stream, 2) if the user switches to another piece of content 3) when the browser is refreshed or closed&lt;br /&gt;
|-&lt;br /&gt;
| [[staticstart (Browser)|staticstart]] || 14 || ✘ || ✘ || ✔ || Used to send the metadata for the static page.&lt;br /&gt;
|-&lt;br /&gt;
| [[StaticEnd (Browser)|staticend]] || 56 || ✘ || ✘ || ✔ || In Single Page Application (SPA) it is imperative that staticend is called prior to the loading of new metadata. This allows the Browser SDK to properly credit the previous section/content being viewed before measuring the new one.&lt;br /&gt;
|-&lt;br /&gt;
| [[updateOTT (Browser)|updateOTT]] || - || ✘ || ✘ || ✔ || Used to notify Browser SDK that the remote OTT device (like Google ChromeCast, Roku, Amazon FireTV, etc.) is connected / disconnected (change of OTT status).&lt;br /&gt;
|-&lt;br /&gt;
| [[ onPaginate (Browser)|onPaginate]] || 30 || ✘ || ✘ || ✔ || Used to create a new instance of the SDK object&lt;br /&gt;
|-&lt;br /&gt;
| [[updateMetadata (Browser)|updateMetadata]] || 35 || ✘ || ✘ || ✔ || This event is used for updating metadata parameters for the content or ad that is being played.&lt;br /&gt;
|-&lt;br /&gt;
| [[setVolume_(Browser)|setVolume]] || 61 || ✔ || ✘ || ✔ || Used to pass in the player volume levels in %. Default value is -1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Retrieving ID3 Tags ==&lt;br /&gt;
The video player must have the ability to extract ID3 tags and supply them to the Browser SDK, based on the HLS standard.&lt;br /&gt;
*An ID3 tag spans two PES packets.&lt;br /&gt;
**In the first PES packet, look for www.nielsen.com, this is the start of the ID3 tag. Continue to parse the first PES packet until the undefined char &amp;quot;\ufffd&amp;quot; is found. This forms the first half of the ID3 tag&lt;br /&gt;
**In the second PES packet, identify the end pattern – a regEx of /(\/\d+){3}/ and look to remove the lowest index of either &amp;quot;\x00&amp;quot; and/or &amp;quot;\ufffd&amp;quot;. Now the second packet has been appended and the demarcation of the Nielsen-specific data has been defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Follow the procedure below, to extract Nielsen ID3 tags from an MPEG-2 transport stream (including HLS streams).&lt;br /&gt;
#Parse the Program Map Table (PMT) to find the PID of the metadata stream. Confirm the presence of the metadata descriptor described in section 2.3.3 of Apple’s “HTTP Live Streaming Metadata Spec.pdf”. Only private streams with metadata descriptor present should be considered as ID3-tag metadata streams.&lt;br /&gt;
#Parse the HLS/Transport stream for any '''PES header''' with the PID found in step 1.&lt;br /&gt;
#Follow standard MPEG-2 parsing procedures to locate the start of the payload of the PES packet.&lt;br /&gt;
#Copy the PES payload into a buffer.&lt;br /&gt;
#The ID3 tag spans 2 PES packets. Parse the stream for the next packet whose PID is set to the PID found in step 1. Typically the ID3 Tag is of 249 bytes. The steps below guide towards extraction of the ID3 tag&lt;br /&gt;
##In the first PES packet, look for &amp;quot;www.nielsen.com&amp;quot; , this is the start of the ID3 tag. Keep on parsing the first PES packet until the undefined char &amp;quot;\ufffd&amp;quot; is found. This forms the first half of the ID3 tag&lt;br /&gt;
##In the second PES packet, identify the end pattern, a regEx of /(\/\d+){3}/ and look to remove the lowest index of either “\x00” and/or “\ufffd”. Now the second packet has been appended and the demarcation of the Nielsen specific data has been defined. This segment can be simply substringed.&lt;br /&gt;
##Concatenate this substringed segment with the payload derived from the first packet get the ID3 payload.&lt;br /&gt;
#Check the length of the contents in the buffer to make sure that it is equal to the size of a Nielsen ID3 tag.&lt;br /&gt;
#Ensure that the ID3 byte array is converted into the string and escape it, so that the SDK can consume it.&lt;br /&gt;
Repeat steps 2 through 7 for all ID3 tags in the stream.&lt;br /&gt;
&lt;br /&gt;
'''References'''&lt;br /&gt;
*[http://www.iso.org/iso/catalogue_detail?csnumber=44169. ISO/IEC 13818-1:2007] Information technology – Generic coding of moving pictures and associated audio information: Systems&lt;br /&gt;
*https://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/HTTP_Live_Streaming_Metadata_Spec/&lt;br /&gt;
&lt;br /&gt;
=== Sample ID3 tags ===&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/X100zdCIGeIlgZnkYj6UvQ==/AAAB2Jz2_k74GXSzx4npHuI_&amp;lt;wbr /&amp;gt;JwJd3QSUpW30rDkGTcbHEzIMWleCzM-uvNOP9fzJcQMWQLJqzXMCAxParOb5sGijSV9dNM3QiBniJYGZ5GI-lL1fXTTN0IgZ4iWBmeRiPpS9AAAAAAAAAAAAAAAAAAAAAFJWFM5SVhTONNU=/00000/00000/00&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/R8WHe7pEBeqBhu8jTeXydg==/AAICoyitYqlxT7n6aZ0oMCGhe&amp;lt;wbr /&amp;gt;Fi4CXFp46AMUPZz1lMr_M9tr3_cjee1SHqxrOiVerMDLeyn9xzocZSKwi746Re8vNOtpNCAZjYABs_J0R25IHpvOc1HS8&amp;lt;wbr /&amp;gt;QHGgD5TgOJeS6gX100zdCIGeIlgZnkYj6UvVJWFNhSVhTiPE0=/00000/46016/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': ID3 tags are not applicable for International (Germany)&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser Opt-Out Implementation ==&lt;br /&gt;
The site in which video content is being measure via Nielsen methodology must provide the means for the user to opt-out of, or opt back into Nielsen Measurement.&lt;br /&gt;
&lt;br /&gt;
For Browser-based applications, opt-out setting is stored via Nielsen cookie. Therefore, it is only necessary that users be made aware of measurement opt-out by incorporating the template below in the user interface.&lt;br /&gt;
&lt;br /&gt;
=== Sample Opt Out Template ===&lt;br /&gt;
Our properties may feature Nielsen’s proprietary measurement software which will allow to contribute to market research, like Nielsen’s TV Ratings. To learn more about this information, see https://www.nielsen.com/digitalprivacy. Nielsen’s software may collect your choices with regards to it.&lt;br /&gt;
&lt;br /&gt;
== Nielsen Privacy Requirements ==&lt;br /&gt;
Privacy protections that Nielsen ensures to have with each App SDK integration are as follows.&lt;br /&gt;
*Disclosure of viewership data collection in EULA / Privacy Policy&lt;br /&gt;
*A link in the EULA/Privacy policy, or in another conspicuous location within the App, to a Nielsen-hosted web page outlining what Nielsen is collecting and how it is being used&lt;br /&gt;
*Method for users to opt-out of Nielsen measurement, any time while using the application&lt;br /&gt;
&lt;br /&gt;
=== Ratings Data Flow ===&lt;br /&gt;
Every view of creditable and watermarked content is measured by Nielsen.&lt;br /&gt;
[[File:RatingsDataFlow.png]]&lt;br /&gt;
&lt;br /&gt;
'''Information NOT Shared'''&lt;br /&gt;
* '''With Nielsen'''&lt;br /&gt;
** User's Identity&lt;br /&gt;
* '''With Data Provider'''&lt;br /&gt;
** Content information&lt;br /&gt;
** Whether user is viewing an ad or video content&lt;br /&gt;
** Player used to play the streaming (audio / video, etc.)&lt;br /&gt;
** Values being de-duped / aggregating for&lt;br /&gt;
&lt;br /&gt;
Nielsen collects only what it needs for audience measurement. Every view of creditable, watermarked content will be measured by Nielsen.&lt;br /&gt;
&lt;br /&gt;
=== Data Collected ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type of Information !! Parameter !! Transmitted to Nielsen? !! Sent to Provider?&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; | Nielsen ID3 Watermark&lt;br /&gt;
|-&lt;br /&gt;
| FinalDistributor Timestamp || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Program Content Timestamp || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Mobile Breakout Code || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Commercial Credit Code – Linear or Dynamic || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Time ShiftedViewing Code || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Segment Number || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Segment View Pattern || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;7&amp;quot; | Device/App Info&lt;br /&gt;
|-&lt;br /&gt;
| Device OSVersion || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| Device Model || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Cache Buster || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| SDKDisabled Flag || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| ServerCode || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Channel or URL || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; | Nielsen Identifiers&lt;br /&gt;
|-&lt;br /&gt;
| Client ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Campaign ID || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| Nielsen Unique Device ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Application ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| DeviceGroup (ex. Tablet, Smartphone, Desktop) || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| OS Group (ex. Android, iOS, Windows) || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| SDKVersion || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| IP Address for DMA, Country Code || Yes || Yes &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': Data is hashed, and encrypted using AES 128 before transmission to data provider.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Viewability_Data_Collected}}&lt;br /&gt;
&lt;br /&gt;
==== Example ping sent to provider ====&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://provider.com/cgi-bin/brandlift.php&amp;lt;/nowiki&amp;gt;?campaign_id=ff12725d724fac7934cf6003f096b4cd&amp;lt;wbr /&amp;gt;&amp;amp;placement_id=a4164b8fba9ee7c873a9c72c7091bb58&amp;lt;wbr /&amp;gt;&amp;amp;creative_id=25280139b61a947e127a52f56c8a2fdd&amp;lt;wbr /&amp;gt;&amp;amp;segment1=9000&amp;lt;wbr /&amp;gt;&amp;amp;segment2=41&amp;lt;wbr /&amp;gt;&amp;amp;segment3=iOS&amp;lt;wbr /&amp;gt;&amp;amp;OSVer=iOS6.1&amp;lt;wbr /&amp;gt;&amp;amp;c9=&amp;lt;wbr /&amp;gt;&amp;amp;devgrp=tablet&amp;lt;wbr /&amp;gt;&amp;amp;h=f5f243fe6d&amp;lt;wbr /&amp;gt;&amp;amp;rnd=1376971827360&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This ping passes the following parameters to the provider:&lt;br /&gt;
* Campaign ID – (campaign, placement, creative)&lt;br /&gt;
* Country Code&lt;br /&gt;
* DMA&lt;br /&gt;
* OS Group (ex. iOS, Android)&lt;br /&gt;
* DeviceOS Version&lt;br /&gt;
* Device Advertiser ID&lt;br /&gt;
* DeviceGroup (ex. Tablet, Smartphone, Desktop)&lt;br /&gt;
* Cache Buster&lt;br /&gt;
&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
=== Opt-Out Implementation ===&lt;br /&gt;
The site must provide the means for the user to opt-out of, or opt back into Nielsen Measurement.&lt;br /&gt;
&lt;br /&gt;
'''Sample Opt Out Template'''&lt;br /&gt;
&lt;br /&gt;
Our properties may feature Nielsen’s proprietary measurement software which will allow to contribute to market research, like Nielsen’s TV Ratings. To learn more about this information, please [http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html| click here]. Nielsen’s software may collect your choices with regards to it.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
See [[Digital Measurement Testing#Testing Browser Implementation|Digital Measurement Testing - Testing Browser Implementation]].&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Video_%26_Static_Cloud_API&amp;diff=6803</id>
		<title>DCR Video &amp; Static Cloud API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Video_%26_Static_Cloud_API&amp;diff=6803"/>
		<updated>2025-04-23T21:23:18Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: /* Send UAID Ping */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
This guide shows you how to integrate the Nielsen Cloud API to enable Digital Content Ratings (DCR), and fuel other measurement products on your over-the-top (OTT) Apps.&lt;br /&gt;
*For Roku Apps, please see [[DCR Video &amp;amp; Static Roku Cloud API]]&lt;br /&gt;
*For Mobile Apps, please see [[DCR Video &amp;amp; Static Mobile Cloud API]]&lt;br /&gt;
&lt;br /&gt;
==Prerequisites==&lt;br /&gt;
To get started, you will need a Nielsen App ID. The App ID is a unique ID assigned to your app. This will be provided to you upon starting the integration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Integration==&lt;br /&gt;
We will cover the steps for constructing the Cloud API Calls.&lt;br /&gt;
&lt;br /&gt;
===Request Overview===&lt;br /&gt;
&lt;br /&gt;
====URL Structure====&lt;br /&gt;
&lt;br /&gt;
The Cloud API Calls are HTTPS GET Requests with the URL structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;[endpoint]/[appid]/[sessionID]/a?b=[payload]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The URL includes the following components:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;[endpoint]&amp;lt;/code&amp;gt;: location of data collection environment&lt;br /&gt;
*&amp;lt;code&amp;gt;[appid]&amp;lt;/code&amp;gt;: provided App ID&lt;br /&gt;
*&amp;lt;code&amp;gt;[sessionID]&amp;lt;/code&amp;gt;: unique value for each user session&lt;br /&gt;
*&amp;lt;code&amp;gt;[payload]&amp;lt;/code&amp;gt;: metadata and events&lt;br /&gt;
&lt;br /&gt;
====Endpoint====&lt;br /&gt;
&lt;br /&gt;
There are endpoints for testing and production:&lt;br /&gt;
&lt;br /&gt;
*Testing: &amp;lt;code&amp;gt;https://sandbox2-cloudapi.imrworldwide.com/nmapi/v2/&amp;lt;/code&amp;gt;&lt;br /&gt;
*Production: &amp;lt;code&amp;gt;https://cloudapi.imrworldwide.com/nmapi/v2/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
During testing, all calls should be pointed to the testing endpoint. We will review the update to the production endpoint during the Go Live section of this guide.&lt;br /&gt;
&lt;br /&gt;
====URL Example====&lt;br /&gt;
As you move through the integration steps, you can reference the below URL structure with the expanded payload:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
https://sandbox2-cloudapi.imrworldwide.com/nmapi/v2/[appid]/[sessionID]/a?b=&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;devInfo&amp;quot;: [deviceInfo],&lt;br /&gt;
  &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
    &amp;quot;static&amp;quot;: [static_metadata],&lt;br /&gt;
    &amp;quot;content&amp;quot;: [content_metadata],&lt;br /&gt;
    &amp;quot;ad&amp;quot;: [ad metadata]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;event&amp;quot;: [event],&lt;br /&gt;
  &amp;quot;position&amp;quot;: [playhead_position],&lt;br /&gt;
  &amp;quot;type&amp;quot;: [asset type],&lt;br /&gt;
  &amp;quot;utc&amp;quot;: [Unix time in ms]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Create Session ID and send UAID ping===&lt;br /&gt;
A unique Session ID &amp;lt;code&amp;gt;[sessionID]&amp;lt;/code&amp;gt; must be created upon app launch and provided in the URL. This will allow measurement to occur for the entire duration that a user is within the app.&lt;br /&gt;
&lt;br /&gt;
A Session ID needs to be completely unique so it is recommended to use a version 4 UUID or another method of your choosing to guarantee there are no repeats.&lt;br /&gt;
&lt;br /&gt;
Upon exiting the app, the session will need to be terminated using the delete event. Sessions will automatically expire after 30 minutes of cloud inactivity.&lt;br /&gt;
&lt;br /&gt;
==== Send UAID Ping ====&lt;br /&gt;
An UAID Ping must be sent using the created unique Session ID &amp;lt;code&amp;gt;[sessionID]&amp;lt;/code&amp;gt; upon start of the first stream playback.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;https://[sessionID].redinuid.imrworldwide.com/ &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Define URL Structure===&lt;br /&gt;
Define the URL structure using your provided &amp;lt;code&amp;gt;[appid]&amp;lt;/code&amp;gt; and a unique &amp;lt;code&amp;gt;[sessionID]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;https://sandbox2-cloudapi.imrworldwide.com/nmapi/v2/[appid]/[sessionID]/a?b=[payload]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Configure Payload===&lt;br /&gt;
&lt;br /&gt;
All Cloud API requests must contain the following payload data:&lt;br /&gt;
&lt;br /&gt;
*''devInfo'': device and app info&lt;br /&gt;
*''metadata'': asset metadata&lt;br /&gt;
*''event metadata'': type of event&lt;br /&gt;
&lt;br /&gt;
The payload can be passed through key-values using the Nielsen reserved keys. The specific keys and descriptions are highlighted in the tables included in this section.&lt;br /&gt;
&lt;br /&gt;
'''Payload Example'''&lt;br /&gt;
&lt;br /&gt;
The example below should be referenced when following the steps for configuring the request payload.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// 3.1 Configure Payload: devInfo &lt;br /&gt;
payload = {&lt;br /&gt;
    &amp;quot;devInfo&amp;quot;: {&lt;br /&gt;
        &amp;quot;devId&amp;quot;: &amp;quot;AD-ID&amp;quot;,&lt;br /&gt;
        &amp;quot;hem_sha256&amp;quot;: &amp;quot;55C06A30DAA5D5F382FDEB8C702EC57875CC9D91A7C78BB620053FD81DC4335C&amp;quot;,&lt;br /&gt;
        &amp;quot;uid2&amp;quot;: &amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;,&lt;br /&gt;
        &amp;quot;uid2_token&amp;quot;: &amp;quot;7be25cf9-8c40-5cc2-871e-19bf41940288MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=uid_token=AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8QlDSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeKQI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhCxG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;,&lt;br /&gt;
        &amp;quot;apn&amp;quot;: &amp;quot;AppName&amp;quot;,&lt;br /&gt;
        &amp;quot;apv&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
        &amp;quot;uoo&amp;quot;: &amp;quot;false&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    // 3.2 Configure Payload: metadata&lt;br /&gt;
    &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
        &amp;quot;static&amp;quot;: {}, // object for measuring static content&lt;br /&gt;
        &amp;quot;content&amp;quot;: { // object for measuring video content&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, // &amp;quot;content&amp;quot; for video&lt;br /&gt;
            &amp;quot;assetid&amp;quot;: &amp;quot;VIDEO-ID123&amp;quot;, // unique ID for video&lt;br /&gt;
            &amp;quot;isfullepisode&amp;quot;: &amp;quot;y&amp;quot;, // full episode flag&lt;br /&gt;
            &amp;quot;program&amp;quot;: &amp;quot;Program Name&amp;quot;, // program name&lt;br /&gt;
            &amp;quot;title&amp;quot;: &amp;quot;Episode Title S3 - EP1&amp;quot;, // episode name&lt;br /&gt;
            &amp;quot;length&amp;quot;: &amp;quot;1800&amp;quot;, // content duration in seconds&lt;br /&gt;
            &amp;quot;segB&amp;quot;: &amp;quot;Custom Segment B&amp;quot;, // custom segment&lt;br /&gt;
            &amp;quot;segC&amp;quot;: &amp;quot;Custom Segment C&amp;quot;, // custom segment&lt;br /&gt;
            &amp;quot;crossId1&amp;quot;: &amp;quot;Standard Episode ID&amp;quot;, // episode ID&lt;br /&gt;
            &amp;quot;crossId2&amp;quot;: &amp;quot;Content Originator ID&amp;quot;, // content orginator (required for distributors)&lt;br /&gt;
            &amp;quot;airdate&amp;quot;: &amp;quot;20161013 20:00:00&amp;quot;, // airdate&lt;br /&gt;
            &amp;quot;adloadtype&amp;quot;: &amp;quot;2&amp;quot; //ad load flag&lt;br /&gt;
            &amp;quot;hasAds&amp;quot;: &amp;quot;1&amp;quot;, // content contains ads = 1 / no ads = 0&lt;br /&gt;
            &amp;quot;progen&amp;quot;: &amp;quot;CV&amp;quot; // program genre abbreviation&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;ad&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;preroll&amp;quot;, // type of ad&lt;br /&gt;
            &amp;quot;assetid&amp;quot;: &amp;quot;AD-ID123&amp;quot; // unique ID for ad&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    // 3.3 Configure Payload: events&lt;br /&gt;
    &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, //event name&lt;br /&gt;
    &amp;quot;position&amp;quot;: &amp;quot;300&amp;quot;, // position in seconds&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, //&amp;quot;content&amp;quot; or &amp;quot;ad&amp;quot;&lt;br /&gt;
    &amp;quot;utc&amp;quot;: &amp;quot;1456448742000&amp;quot; //unix timestamp in milliseconds &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Configure Payload: devInfo=====&lt;br /&gt;
An object &amp;lt;code&amp;gt;&amp;quot;devInfo&amp;quot;&amp;lt;/code&amp;gt; will need to be created to capture App and Device information.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys !! Description !! Values !! Required&lt;br /&gt;
|-&lt;br /&gt;
| devId || unique ID to identify user (e.g. Advertising ID, Roku Device ID) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| hem_sha256 || SHA-256 hashed email Note: email normalization rules applied before hashing || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| uid2 || Trade Desk Unified ID 2.0 This should be the unencrypted, non-tokenized UID2.0 in the clear || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| uid2_token ||Trade Desk Unified ID 2.0 UID2 token || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| apn || app name || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| apv || app build version || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| uoo || device opt-out status || &amp;lt;code&amp;gt;&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;false&amp;quot;&amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Example devInfo Object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// create devInfo object&lt;br /&gt;
&amp;quot;devInfo&amp;quot;: {&lt;br /&gt;
  &amp;quot;devId&amp;quot;: &amp;quot;AD-ID&amp;quot;,&lt;br /&gt;
  &amp;quot;hem_sha256&amp;quot;: &amp;quot;55C06A30DAA5D5F382FDEB8C702EC57875CC9D91A7C78BB620053FD81DC4335C&amp;quot;,&lt;br /&gt;
  &amp;quot;uid2&amp;quot;: &amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;,&lt;br /&gt;
  &amp;quot;uid2_token&amp;quot;: &amp;quot;7be25cf9-8c40-5cc2-871e-19bf41940288MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=uid_token=AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8QlDSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeKQI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhCxG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;,&lt;br /&gt;
  &amp;quot;apn&amp;quot;: &amp;quot;AppName&amp;quot;,&lt;br /&gt;
  &amp;quot;apv&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
  &amp;quot;uoo&amp;quot;: &amp;quot;false&amp;quot;&lt;br /&gt;
},&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3.2 Configure Payload: metadata ====&lt;br /&gt;
Asset metadata can be passed through &amp;lt;code&amp;gt;&amp;quot;metadata&amp;quot;&amp;lt;/code&amp;gt;. There are two asset types: &amp;lt;code&amp;gt;&amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; for video and &amp;lt;code&amp;gt;&amp;quot;ad&amp;quot;&amp;lt;/code&amp;gt; for ads. The metadata received for each asset is used for classification and reporting.&lt;br /&gt;
&lt;br /&gt;
You will need to set up &amp;lt;code&amp;gt;&amp;quot;metadata&amp;quot;&amp;lt;/code&amp;gt; objects for &amp;lt;code&amp;gt;&amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;quot;ad&amp;quot;&amp;lt;/code&amp;gt; with the required Nielsen keys as shown in the sample code below.&lt;br /&gt;
&lt;br /&gt;
===== Content Metadata =====&lt;br /&gt;
Content metadata should remain constant throughout the entirety of an episode/clip including when ads play.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys !! Description !! Values !! Required&lt;br /&gt;
|-&lt;br /&gt;
| type || type of asset || &amp;lt;code&amp;gt;&amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| assetid || unique ID assigned to asset || custom &amp;lt;br&amp;gt;(no [[Special Characters]]) || Yes&lt;br /&gt;
|-&lt;br /&gt;
| program ||name of program (25 character limit) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| title ||name of program (25 character limit) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| length || length of content in seconds || &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| airdate || the airdate in the linear TV || YYYYMMDD HH24:MI:SS || Yes&lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode || full episode flag || &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- non full episode || Yes&lt;br /&gt;
|-&lt;br /&gt;
| crossId1 || standard episode ID || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| crossId2 || content originator (only required for distributors) || Nielsen || No&lt;br /&gt;
|-&lt;br /&gt;
| adloadtype || type of ad load:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;1&amp;quot;&amp;lt;/code&amp;gt; Linear – matches TV ad load&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;2&amp;quot;&amp;lt;/code&amp;gt; Dynamic – Dynamic Ad Insertion (DAI)&lt;br /&gt;
|| &amp;lt;code&amp;gt;&amp;quot;2&amp;quot;&amp;lt;/code&amp;gt; - DCR measures content with dynamic ads || Yes&lt;br /&gt;
|-&lt;br /&gt;
| hasAds || ads indicator&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;1&amp;quot;&amp;lt;/code&amp;gt;: ads included&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;0&amp;quot;&amp;lt;/code&amp;gt;: ads not included&lt;br /&gt;
|| &amp;lt;code&amp;gt;&amp;quot;1&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;0&amp;quot;&amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| subbrand || sub brand override || Nielsen || No&lt;br /&gt;
|-&lt;br /&gt;
| progen || program genre abbreviation - see [[DCR OTT Genre List]] for accepted values || &amp;lt;code&amp;gt;&amp;quot;CV&amp;quot;&amp;lt;/code&amp;gt; for Comedy Variety || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Example Content Object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang='json'&amp;gt;// create content object&lt;br /&gt;
&amp;quot;content&amp;quot;: {&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;: &amp;quot;VIDEO-ID123&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;: &amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;: &amp;quot;Program Name&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;Episode Title S3 - EP1&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;: &amp;quot;1800&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;: &amp;quot;Custom Segment B&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;: &amp;quot;Custom Segment C&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;: &amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot;: &amp;quot;Content Originator ID&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;: &amp;quot;20161013 20:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
    &amp;quot;hasAds&amp;quot;: &amp;quot;1&amp;quot;, &lt;br /&gt;
    &amp;quot;subbrand&amp;quot;: &amp;quot;c05&amp;quot;,&lt;br /&gt;
    &amp;quot;progen&amp;quot;: &amp;quot;CV&amp;quot;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Ad Metadata =====&lt;br /&gt;
The ad metadata should be passed for each individual ad.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys !! Description !! Values !! Required&lt;br /&gt;
|-&lt;br /&gt;
| type || type of ad || &amp;lt;code&amp;gt;&amp;quot;preroll&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;midroll&amp;quot;&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;&amp;quot;postroll&amp;quot;&amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| assetid || unique ID assigned to ad || custom || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Example Ad Object =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// create ad object&lt;br /&gt;
&amp;quot;ad&amp;quot;: {&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;preroll&amp;quot;,&lt;br /&gt;
  &amp;quot;assetid&amp;quot;: &amp;quot;AD-ID123&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configure Payload: Events ===&lt;br /&gt;
&lt;br /&gt;
The last part of the payload is for enabling events so content is measured correctly when viewed. The events and required parameters are included below.&lt;br /&gt;
&lt;br /&gt;
==== Event Types ====&lt;br /&gt;
&lt;br /&gt;
The available events are:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;playhead&amp;quot;&amp;lt;/code&amp;gt; || Playhead position in seconds, must be passed as a whole number every 10 seconds. The final playhead position should be sent before an asset has changed to properly capture full duration. When content is paused, stop passing playhead position until content is resumed. On playhead scrubbing, send current playhead position, followed by the playhead position the user scrubs to. For Live streams, you may use Unix Time (in seconds) as the playhead position. Note that ad playheads must also use Unix Time if Unix Time is used for content playheads.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;complete&amp;quot;&amp;lt;/code&amp;gt; || The complete event must be sent when the content has completed full playback. Before calling the complete event, a final playhead update with the final position is required to be sent to receive full duration credit. For Live streams, a complete event must be sent at program boundaries.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;delete&amp;quot;&amp;lt;/code&amp;gt; || The delete event is optional and can be sent when the viewing session is terminated (typically on App close). A new session ID must be generated after sending a delete event. Delete should not be sent on app interruptions or foreground/background events. All creditable duration will be summarized for all asset types when delete occurs (content and ads).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Event Parameters =====&lt;br /&gt;
&lt;br /&gt;
The following parameters need to be passed when calling events:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Description !! Value !! Required&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;event&amp;quot;&amp;lt;/code&amp;gt; || event type || &amp;lt;code&amp;gt;&amp;quot;playhead&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;complete&amp;quot;&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;&amp;quot;delete&amp;quot;&amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;position&amp;quot;&amp;lt;/code&amp;gt; || playhead position in seconds or Unix time in seconds || &amp;lt;code&amp;gt;&amp;quot;300&amp;quot;&amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;type&amp;quot;&amp;lt;/code&amp;gt; || asset type || &amp;lt;code&amp;gt;&amp;quot;content&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;ad&amp;quot;&amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;utc&amp;quot;&amp;lt;/code&amp;gt; || Unix timestamp in milliseconds. Must be passed every 10 seconds. || &amp;lt;code&amp;gt;&amp;quot;1472760000000&amp;quot;&amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Example Event =====&lt;br /&gt;
You can call events by passing values in the required parameters:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;devInfo&amp;quot;: [deviceInfo],&lt;br /&gt;
  &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
    &amp;quot;static&amp;quot;: [static metadata],&lt;br /&gt;
    &amp;quot;content&amp;quot;: [content metadata],&lt;br /&gt;
    &amp;quot;ad&amp;quot;: [ad metadata]&lt;br /&gt;
  },&lt;br /&gt;
  // Event Parameters&lt;br /&gt;
  &amp;quot;event&amp;quot;: [event], // event name&lt;br /&gt;
  &amp;quot;position&amp;quot;: [playheadPosition], //position in seconds&lt;br /&gt;
  &amp;quot;type&amp;quot;: [asset type], // values are &amp;quot;content&amp;quot; or &amp;quot;ad&amp;quot;&lt;br /&gt;
  &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot; //unix timestamp in milliseconds&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note:''' The full payload including &amp;quot;devInfo&amp;quot; and &amp;quot;metadata&amp;quot; must be populated in each event request.&lt;br /&gt;
&lt;br /&gt;
===== Sample Event Lifecycle =====&lt;br /&gt;
The sample event lifecycle can be used as a reference for identifying the order for calling events and values to pass.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Start of Session: session ID created when App is opened&lt;br /&gt;
&lt;br /&gt;
// Preroll&lt;br /&gt;
Ad Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
 &lt;br /&gt;
// Content&lt;br /&gt;
Content Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Midroll&lt;br /&gt;
Midroll Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Content resumes at 15 minutes&lt;br /&gt;
Content Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;900&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Content completes at 30 minutes&lt;br /&gt;
Complete {&amp;quot;event&amp;quot;: &amp;quot;complete&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;1800&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
 &lt;br /&gt;
// Postroll&lt;br /&gt;
Ad Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
//End of Session: The delete event should be called when the App is exited. The values for position and type not required to be passed.&lt;br /&gt;
Delete { &amp;quot;event&amp;quot;: &amp;quot;delete&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Sample Event Lifecycle - Detailed Storyline'''&lt;br /&gt;
This detailed event sequence provides additional insight for the correct events to call when handling certain playback scenarios.&lt;br /&gt;
&amp;lt;syntaxhighlight lang='javascript'&amp;gt;// SESSION STARTS&lt;br /&gt;
// Start of Session: session ID created when App is opened&lt;br /&gt;
&lt;br /&gt;
// PREROLL&lt;br /&gt;
// Preroll Start - Start each Ad with a position of &amp;quot;0&amp;quot;, resetting to '0' for each Ad, and Ad break.&lt;br /&gt;
Ad Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Preroll Stop - End each Ad with the final position of the Ad.&lt;br /&gt;
Ad Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;15&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472761500000&amp;quot;}&lt;br /&gt;
 &lt;br /&gt;
// CONTENT &lt;br /&gt;
// Content Start - Start new content streams with a position of &amp;quot;0&amp;quot; incrementing the position every 10 seconds.&lt;br /&gt;
Content Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472761500000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Content Stop Before Ad Break - Send a playhead update including the current content positon before an Ad break.&lt;br /&gt;
Content Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;299&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472787400000&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
// MIDROLL&lt;br /&gt;
// Midroll Start - Start each Ad with a position of &amp;quot;0&amp;quot;, resetting to '0' for each Ad, and Ad break.&lt;br /&gt;
Midroll Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472787500000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Midroll Stop - End each Ad with the final position of the Ad.&lt;br /&gt;
Ad Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;60&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472793500000&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
// CONTENT&lt;br /&gt;
// Content resumes at 5 minutes - Send playhead update with the current resumed position, and begin incrimenting the positon every 10 seconds.&lt;br /&gt;
Content Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;300&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472799500000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Content completes at 10:12 - Make sure to send in the playhead event with the final content position before sending the complete event.&lt;br /&gt;
Final Content Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;612&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472830700000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
Complete {&amp;quot;event&amp;quot;: &amp;quot;complete&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;612&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472830800000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// POSTROLL&lt;br /&gt;
// Postroll Start - Start each Ad with a position of &amp;quot;0&amp;quot;, resetting to '0' for each Ad, and Ad break.&lt;br /&gt;
Ad Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472830900000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Postroll Stop - End each Ad with the final position of the Ad.&lt;br /&gt;
Ad Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;45&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472835300000&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
// SESSION ENDS&lt;br /&gt;
&lt;br /&gt;
//End of Session: The delete event should be called when the App is exited. The values for position and type not required to be passed.&lt;br /&gt;
Delete { &amp;quot;event&amp;quot;: &amp;quot;delete&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472835400000&amp;quot;} &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Handling Playhead=====&lt;br /&gt;
Calling &amp;lt;code&amp;gt;&amp;quot;playhead&amp;quot;&amp;lt;/code&amp;gt; is critical for accurate duration crediting. You can reference the below guidance to determine the correct playhead position to pass depending on the playback scenario.&lt;br /&gt;
&lt;br /&gt;
'''Playhead: General'''&lt;br /&gt;
* Playhead position must start at 0 for each new asset, and be passed at least every 10 seconds.&lt;br /&gt;
* Final postion must be sent at the end of content or an ad&lt;br /&gt;
* Playheads should be sent in seconds only, not milliseconds&lt;br /&gt;
&lt;br /&gt;
'''Playhead: Ads'''&lt;br /&gt;
* The final position must be sent when switching from content to ad, or ad to content.&lt;br /&gt;
* Each ad playhead position should be 0 at ad start.&lt;br /&gt;
* For Ad Pods, playhead must be called, and reset to 0 for each individual ad. &lt;br /&gt;
* The last content position before an Ad should be sent before switching to Ads.&lt;br /&gt;
* When content has resumed following an ad break, the playhead position update must continue where the previous content segment left off.&lt;br /&gt;
&lt;br /&gt;
'''Playhead: User Actions'''&lt;br /&gt;
* Upon user scrubbing, the current position must be sent before a user scrubs, and the new position should be sent where the user lands, and begin sending in the 10 second updates thereafter.&lt;br /&gt;
* On pause, send the current position and then discontinue sending playhead event updates.&lt;br /&gt;
* If a user exits a stream early, the last current position must be sent in a playhead update to receive accurate duration.&lt;br /&gt;
&lt;br /&gt;
===== Interruption Scenarios =====&lt;br /&gt;
&lt;br /&gt;
As part of configuring events, you will need to handle all possible interruption scenarios such as:&lt;br /&gt;
&lt;br /&gt;
*Wi-Fi OFF / ON&lt;br /&gt;
*App going Background / Foreground (Video players only, not for Audio players)&lt;br /&gt;
*App Crash or Exit&lt;br /&gt;
&lt;br /&gt;
When playback is interrupted, the app needs to send delete immediately.&lt;br /&gt;
&lt;br /&gt;
Once playback resumes, a new session will need to be created with a unique session ID. All of the required metadata and events will need to be sent.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' The session will automatically timeout after 30 minutes of inactivity.&lt;br /&gt;
&lt;br /&gt;
=== Example Request ===&lt;br /&gt;
&lt;br /&gt;
Now that we walked through the Cloud API integration steps, your requests should have the following components: Session ID, App ID, and Payload. You can reference the example below when your reviewing your integration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// 1. Create Session ID&lt;br /&gt;
sessionID = dfc7dc6a-66a7-4705-9fba-adaaf7e3d5e0  // Example sessionID created using a UUID Generator&lt;br /&gt;
&lt;br /&gt;
// 2. Define URL Structure with App ID and Session ID&lt;br /&gt;
sessionURL = https://sandbox2-cloudapi.imrworldwide.com/nmapi/v2/[appid]/[sessionID]/a?b=&lt;br /&gt;
&lt;br /&gt;
// 3. Configure Payload&lt;br /&gt;
// 3.1 Configure Payload: devInfo &lt;br /&gt;
payload = {&lt;br /&gt;
 &amp;quot;devInfo&amp;quot;: {&lt;br /&gt;
   &amp;quot;devId&amp;quot;: &amp;quot;AD-ID&amp;quot;, &lt;br /&gt;
   &amp;quot;apn&amp;quot;: &amp;quot;AppName&amp;quot;,&lt;br /&gt;
   &amp;quot;apv&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
   &amp;quot;uoo&amp;quot;: &amp;quot;false&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &lt;br /&gt;
  // 3.2 Configure Payload: metadata&lt;br /&gt;
  &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
    &amp;quot;static&amp;quot;: {}, // object for measuring static content&lt;br /&gt;
    &amp;quot;content&amp;quot;: { // object for measuring video content&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, // &amp;quot;content&amp;quot; for video&lt;br /&gt;
      &amp;quot;assetid&amp;quot;: &amp;quot;VIDEO-ID123&amp;quot;, // unique ID for video&lt;br /&gt;
      &amp;quot;isfullepisode&amp;quot;: &amp;quot;y&amp;quot;, // full episode flag&lt;br /&gt;
      &amp;quot;program&amp;quot;: &amp;quot;Program Name&amp;quot;, // program name&lt;br /&gt;
      &amp;quot;title&amp;quot;: &amp;quot;Episode Title S3 - EP1&amp;quot;, // episode name&lt;br /&gt;
      &amp;quot;length&amp;quot;: &amp;quot;1800&amp;quot;, // content duration in seconds&lt;br /&gt;
      &amp;quot;segB&amp;quot;: &amp;quot;Custom Segment B&amp;quot;, // custom segment&lt;br /&gt;
      &amp;quot;segC&amp;quot;: &amp;quot;Custom Segment C&amp;quot;, // custom segment&lt;br /&gt;
      &amp;quot;crossId1&amp;quot;: &amp;quot;Standard Episode ID&amp;quot;, // episode ID&lt;br /&gt;
      &amp;quot;crossId2&amp;quot;: &amp;quot;Content Originator ID&amp;quot;, // content orginator (required for distributors)&lt;br /&gt;
      &amp;quot;airdate&amp;quot;: &amp;quot;20161013 20:00:00&amp;quot;, // airdate&lt;br /&gt;
      &amp;quot;adloadtype&amp;quot;: &amp;quot;2&amp;quot;, // ad load flag&lt;br /&gt;
      &amp;quot;hasAds&amp;quot;: &amp;quot;1&amp;quot;, // content contains ads = 1 / no ads = 0&lt;br /&gt;
      &amp;quot;progen&amp;quot;: &amp;quot;CV&amp;quot; // program genre abbreviation&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;ad&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;preroll&amp;quot;, // type of ad&lt;br /&gt;
      &amp;quot;assetid&amp;quot;: &amp;quot;AD-ID123&amp;quot; // unique ID for ad&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
    &lt;br /&gt;
  // 3.3 Configure Payload: events&lt;br /&gt;
  &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, //event name&lt;br /&gt;
  &amp;quot;position&amp;quot;: &amp;quot;300&amp;quot;, // position in seconds&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, //&amp;quot;content&amp;quot; or &amp;quot;ad&amp;quot;&lt;br /&gt;
  &amp;quot;utc&amp;quot;: &amp;quot;1456448742000&amp;quot; //unix timestamp in milliseconds &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Append payload to URL&lt;br /&gt;
var image = new Image()&lt;br /&gt;
image.onerror = function() {&lt;br /&gt;
  // wait and send again&lt;br /&gt;
}&lt;br /&gt;
(new Image).src = sessionURL+encodeURIComponent(JSON.stringify(payload));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To ensure that the GET request does not receive a CORS issue, make sure to use the IMAGE request in conjunction with the content-type &amp;quot;text/plain&amp;quot; so CORS preflight is not triggered, causing the request to be rejected.&lt;br /&gt;
&lt;br /&gt;
==== Enable Debug Logging ====&lt;br /&gt;
&lt;br /&gt;
Now that you have set up the Cloud API requests, you can enable debug logging to validate your integration. Enabling debug logging is required for Nielsen certification.&lt;br /&gt;
&lt;br /&gt;
==== GET Request ====&lt;br /&gt;
&lt;br /&gt;
Display GET Request to console using a name to identify each event (e.g. playhead).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&amp;quot;Event&amp;quot;, image); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Payload ====&lt;br /&gt;
&lt;br /&gt;
Output payload to identify required metadata and events.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&amp;quot;Event Payload&amp;quot;, payload); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HTTPS Response Code ====&lt;br /&gt;
&lt;br /&gt;
Confirm request was completed by viewing HTTPS response code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
code = msg.GetResponseCode();&lt;br /&gt;
console.log(&amp;quot;Response Code&amp;quot;, code); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can reference the HTTPS Response Code table when reviewing your requests:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Status Code !! Status Text !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; || OK || request received&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;403&amp;lt;/code&amp;gt; || Forbidden || invalid App ID&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt; || Not Found || JSON issue&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Opt-Out ==&lt;br /&gt;
Your app must provide a means for the user to Opt-Out, or Opt-In to Nielsen Measurement. This requirement can be fulfilled by checking the device OS for the user's setting of &amp;quot;Limit Ad Tracking&amp;quot; or similar option. If the device offers &amp;quot;Limit Ad Tracking&amp;quot; settings, you should set &amp;lt;code&amp;gt;uoo=true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;uoo=false&amp;lt;/code&amp;gt; depending on the user's privacy setting. Also, ensure that the &amp;lt;code&amp;gt;devId&amp;lt;/code&amp;gt; is set to a blank value if the user elects to opt-out.&lt;br /&gt;
&lt;br /&gt;
If the device does not have OS-level &amp;quot;Do Not Track&amp;quot; settings, you can implement opt-out by creating an Opt-Out/Opt-In button, toggle switch, or slider within the app &amp;quot;Settings&amp;quot;, or &amp;quot;About&amp;quot; section to allow the user selection.&lt;br /&gt;
&lt;br /&gt;
[[File:Nielsen Opt-Out.png|link=]]&lt;br /&gt;
&lt;br /&gt;
You will need to store the User Opt-Out (uoo) status, so that it can be retrieved and populated in the &amp;lt;code&amp;gt;&amp;quot;devInfo&amp;quot;&amp;lt;/code&amp;gt; metadata which will be sent in every Cloud API event (playhead, complete, &amp;amp; delete). &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! uoo Key !! Description !! Values&lt;br /&gt;
|-&lt;br /&gt;
| uoo || Device is Opted-In to Nielsen Measurement (Recommended Default Setting) || &amp;lt;code&amp;gt;&amp;quot;false&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| uoo || Device is Opted-Out of Nielsen Measurement || &amp;lt;code&amp;gt;&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== devInfo Opt-In JSON Payload Example =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;devInfo&amp;quot;: {&lt;br /&gt;
    &amp;quot;apn&amp;quot;: &amp;quot;Cloud API Sample App&amp;quot;,&lt;br /&gt;
    &amp;quot;apv&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;devId&amp;quot;: &amp;quot;7be25cf9-8c40-5cc2-871e-19bf41940288&amp;quot;,&lt;br /&gt;
    &amp;quot;uoo&amp;quot;: &amp;quot;false&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== devInfo Opt-Out JSON Payload Example =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;quot;devInfo&amp;quot;: {&lt;br /&gt;
    &amp;quot;apn&amp;quot;: &amp;quot;Cloud API Sample App&amp;quot;,&lt;br /&gt;
    &amp;quot;apv&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;devId&amp;quot;: &amp;quot;&amp;quot;, //devId must be blank when a user elects to Opt-Out.&lt;br /&gt;
    &amp;quot;uoo&amp;quot;: &amp;quot;true&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Privacy Information Template To Include In Opt-Out Screen =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Additionally, all applications must display the Nielsen privacy policy within their application, typically in the Settings/About screen of your application. The Nielsen privacy policy text is listed below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''''ABOUT NIELSEN MEASUREMENT'''''&lt;br /&gt;
&lt;br /&gt;
Television and the way we watch it have come a long way since Nielsen began measuring TV audiences in 1950. Today, the ability to watch our favorite shows at any time and on multiple devices amplifies the need for exceptionally adept and flexible audience measurement capabilities.&lt;br /&gt;
&lt;br /&gt;
Consumers are changing with the times, and the same goes for us. As technology continues to evolve and media companies try new ways to attract viewers, understanding what consumers are watching — and what they're watching on — is more important than ever. Today, viewing video is a personal and mobile experience — anytime and anywhere. Our capabilities provide relevant metrics that are necessary to inform successful marketing and programming and drive continued growth. As a global information and measurement leader, we are committed to protecting the privacy and security of the data we collect, process and use. While our digital measurement products are not used to identify you in any way, they help us and our clients measure and analyze how consumers engage with media across online, mobile and emerging technologies, and offer insights into consumer behavior.&lt;br /&gt;
&lt;br /&gt;
'''''YOUR CHOICES'''''&lt;br /&gt;
&lt;br /&gt;
Nielsen believes that you should have a choice about whether to contribute to our research and insights. To opt out or opt in to Nielsen measurement, please toggle your &amp;quot;Limit Ad Tracking&amp;quot; (or similar setting) on your device, or make the appropriate selection within the application's settings. If you have this app on more than one device, you will need to opt out of this app on each device. To learn more about our digital measurement products and your choices in regard to them, please visit https://www.nielsen.com/digitalprivacy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
Before providing an app build to Nielsen for testing, it is important to run validation checks once you have enabled debug logging.&lt;br /&gt;
&lt;br /&gt;
=== Payload Validation ===&lt;br /&gt;
&lt;br /&gt;
Ensure that all of the required payload data is populating while testing several videos. The following areas are critical to measurement:&lt;br /&gt;
*devInfo&lt;br /&gt;
*Asset metadata for both content, and ads&lt;br /&gt;
*Events&lt;br /&gt;
*Opt-Out status&lt;br /&gt;
&lt;br /&gt;
=== Player Events ===&lt;br /&gt;
Review event calls:&lt;br /&gt;
&lt;br /&gt;
==== playhead ====&lt;br /&gt;
*Playhead position updates every 10 seconds starting at position '0' for each new asset.&lt;br /&gt;
*Final playhead position is sent on content, or ad before switching between assets.&lt;br /&gt;
*Content metadata remains constant throughout an episode, or clip play.&lt;br /&gt;
*Ad metadata is populated appropriately for each individual ad.&lt;br /&gt;
*Playhead position update resumes for content after an ad break, and resets to 0 for each individual ad.&lt;br /&gt;
*For scrubbing, last current position should be sent while scrubbing occurs, and the new position should also be sent where the user scrubs to.&lt;br /&gt;
*Exiting a stream early should execute the last current position in a playhead update to receive accurate duration.&lt;br /&gt;
*Upon pause, the current position should be sent, and playhead updates should stop incrementing until resume play occurs.&lt;br /&gt;
&lt;br /&gt;
==== complete ====&lt;br /&gt;
*Check that the complete event executes upon content complete after the final playhead update is sent&lt;br /&gt;
*Do not execute the complete event for ads&lt;br /&gt;
&lt;br /&gt;
==== delete ====&lt;br /&gt;
*Check to see that the delete event occurs upon app exit, if the platform has the necessary exit callback events.&lt;br /&gt;
&lt;br /&gt;
==== GET Request Format ====&lt;br /&gt;
*Ensure that the event payloads are formatted in JSON&lt;br /&gt;
*Check to see that each of the Cloud API GET requests are properly encoded&lt;br /&gt;
&lt;br /&gt;
==== HTTPS Response ====&lt;br /&gt;
*Make sure that each of the Cloud API Get requests are received by the Nielsen Cloud API properly through use of the HTTPS Response Code outputs enabled in console.&lt;br /&gt;
&lt;br /&gt;
==== Opt-Out ====&lt;br /&gt;
*Test the &amp;quot;uoo&amp;quot; key gets populated accurately for both Opt-In and Opt-Out selections by validating the Cloud API events called after the user Opt-Out/Opt-In selection.&lt;br /&gt;
*Test that the devId field is populated with a blank value if a user has elected to Opt-Out. For example: &amp;quot;devId&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
*If the device supports &amp;quot;Limit Ad Tracking&amp;quot; or has device &amp;quot;Opt-Out&amp;quot; settings, test that uoo=true, and that devId is set to a blank value if enabled in the device settings.&lt;br /&gt;
&lt;br /&gt;
== Go Live ==&lt;br /&gt;
After your integration has been certified, you will need to: Change Endpoint and Disable Logging.&lt;br /&gt;
&lt;br /&gt;
'''Change Endpoint:''' You will need to update to the production endpoint:&lt;br /&gt;
&lt;br /&gt;
*Testing: &amp;lt;code&amp;gt;https://sandbox2-cloudapi.imrworldwide.com/nmapi/v2/&amp;lt;/code&amp;gt;&lt;br /&gt;
*Production: &amp;lt;code&amp;gt;https://cloudapi.imrworldwide.com/nmapi/v2/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your production URL structure should now be:&lt;br /&gt;
&amp;lt;code&amp;gt;https://cloudapi.imrworldwide.com/nmapi/v2/[appid]/[sessionID]/a?b=[payload]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Disable Logging:''' You can now disable debug logging&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Video_%26_Static_Cloud_API&amp;diff=6802</id>
		<title>DCR Video &amp; Static Cloud API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Video_%26_Static_Cloud_API&amp;diff=6802"/>
		<updated>2025-04-23T21:20:56Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: /* Send UAID Ping */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
This guide shows you how to integrate the Nielsen Cloud API to enable Digital Content Ratings (DCR), and fuel other measurement products on your over-the-top (OTT) Apps.&lt;br /&gt;
*For Roku Apps, please see [[DCR Video &amp;amp; Static Roku Cloud API]]&lt;br /&gt;
*For Mobile Apps, please see [[DCR Video &amp;amp; Static Mobile Cloud API]]&lt;br /&gt;
&lt;br /&gt;
==Prerequisites==&lt;br /&gt;
To get started, you will need a Nielsen App ID. The App ID is a unique ID assigned to your app. This will be provided to you upon starting the integration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Integration==&lt;br /&gt;
We will cover the steps for constructing the Cloud API Calls.&lt;br /&gt;
&lt;br /&gt;
===Request Overview===&lt;br /&gt;
&lt;br /&gt;
====URL Structure====&lt;br /&gt;
&lt;br /&gt;
The Cloud API Calls are HTTPS GET Requests with the URL structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;[endpoint]/[appid]/[sessionID]/a?b=[payload]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The URL includes the following components:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;[endpoint]&amp;lt;/code&amp;gt;: location of data collection environment&lt;br /&gt;
*&amp;lt;code&amp;gt;[appid]&amp;lt;/code&amp;gt;: provided App ID&lt;br /&gt;
*&amp;lt;code&amp;gt;[sessionID]&amp;lt;/code&amp;gt;: unique value for each user session&lt;br /&gt;
*&amp;lt;code&amp;gt;[payload]&amp;lt;/code&amp;gt;: metadata and events&lt;br /&gt;
&lt;br /&gt;
====Endpoint====&lt;br /&gt;
&lt;br /&gt;
There are endpoints for testing and production:&lt;br /&gt;
&lt;br /&gt;
*Testing: &amp;lt;code&amp;gt;https://sandbox2-cloudapi.imrworldwide.com/nmapi/v2/&amp;lt;/code&amp;gt;&lt;br /&gt;
*Production: &amp;lt;code&amp;gt;https://cloudapi.imrworldwide.com/nmapi/v2/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
During testing, all calls should be pointed to the testing endpoint. We will review the update to the production endpoint during the Go Live section of this guide.&lt;br /&gt;
&lt;br /&gt;
====URL Example====&lt;br /&gt;
As you move through the integration steps, you can reference the below URL structure with the expanded payload:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
https://sandbox2-cloudapi.imrworldwide.com/nmapi/v2/[appid]/[sessionID]/a?b=&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;devInfo&amp;quot;: [deviceInfo],&lt;br /&gt;
  &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
    &amp;quot;static&amp;quot;: [static_metadata],&lt;br /&gt;
    &amp;quot;content&amp;quot;: [content_metadata],&lt;br /&gt;
    &amp;quot;ad&amp;quot;: [ad metadata]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;event&amp;quot;: [event],&lt;br /&gt;
  &amp;quot;position&amp;quot;: [playhead_position],&lt;br /&gt;
  &amp;quot;type&amp;quot;: [asset type],&lt;br /&gt;
  &amp;quot;utc&amp;quot;: [Unix time in ms]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Create Session ID and send UAID ping===&lt;br /&gt;
A unique Session ID &amp;lt;code&amp;gt;[sessionID]&amp;lt;/code&amp;gt; must be created upon app launch and provided in the URL. This will allow measurement to occur for the entire duration that a user is within the app.&lt;br /&gt;
&lt;br /&gt;
A Session ID needs to be completely unique so it is recommended to use a version 4 UUID or another method of your choosing to guarantee there are no repeats.&lt;br /&gt;
&lt;br /&gt;
Upon exiting the app, the session will need to be terminated using the delete event. Sessions will automatically expire after 30 minutes of cloud inactivity.&lt;br /&gt;
&lt;br /&gt;
==== Send UAID Ping ====&lt;br /&gt;
An UAID Ping must be sent using the created unique Session ID &amp;lt;code&amp;gt;[sessionID]&amp;lt;/code&amp;gt; upon start of the first stream playback.&lt;br /&gt;
 &amp;lt;code&amp;gt;https://[sessionID].redinuid.imrworldwide&amp;lt;nowiki/&amp;gt;.com/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Define URL Structure===&lt;br /&gt;
Define the URL structure using your provided &amp;lt;code&amp;gt;[appid]&amp;lt;/code&amp;gt; and a unique &amp;lt;code&amp;gt;[sessionID]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;https://sandbox2-cloudapi.imrworldwide.com/nmapi/v2/[appid]/[sessionID]/a?b=[payload]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Configure Payload===&lt;br /&gt;
&lt;br /&gt;
All Cloud API requests must contain the following payload data:&lt;br /&gt;
&lt;br /&gt;
*''devInfo'': device and app info&lt;br /&gt;
*''metadata'': asset metadata&lt;br /&gt;
*''event metadata'': type of event&lt;br /&gt;
&lt;br /&gt;
The payload can be passed through key-values using the Nielsen reserved keys. The specific keys and descriptions are highlighted in the tables included in this section.&lt;br /&gt;
&lt;br /&gt;
'''Payload Example'''&lt;br /&gt;
&lt;br /&gt;
The example below should be referenced when following the steps for configuring the request payload.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// 3.1 Configure Payload: devInfo &lt;br /&gt;
payload = {&lt;br /&gt;
    &amp;quot;devInfo&amp;quot;: {&lt;br /&gt;
        &amp;quot;devId&amp;quot;: &amp;quot;AD-ID&amp;quot;,&lt;br /&gt;
        &amp;quot;hem_sha256&amp;quot;: &amp;quot;55C06A30DAA5D5F382FDEB8C702EC57875CC9D91A7C78BB620053FD81DC4335C&amp;quot;,&lt;br /&gt;
        &amp;quot;uid2&amp;quot;: &amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;,&lt;br /&gt;
        &amp;quot;uid2_token&amp;quot;: &amp;quot;7be25cf9-8c40-5cc2-871e-19bf41940288MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=uid_token=AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8QlDSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeKQI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhCxG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;,&lt;br /&gt;
        &amp;quot;apn&amp;quot;: &amp;quot;AppName&amp;quot;,&lt;br /&gt;
        &amp;quot;apv&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
        &amp;quot;uoo&amp;quot;: &amp;quot;false&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    // 3.2 Configure Payload: metadata&lt;br /&gt;
    &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
        &amp;quot;static&amp;quot;: {}, // object for measuring static content&lt;br /&gt;
        &amp;quot;content&amp;quot;: { // object for measuring video content&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, // &amp;quot;content&amp;quot; for video&lt;br /&gt;
            &amp;quot;assetid&amp;quot;: &amp;quot;VIDEO-ID123&amp;quot;, // unique ID for video&lt;br /&gt;
            &amp;quot;isfullepisode&amp;quot;: &amp;quot;y&amp;quot;, // full episode flag&lt;br /&gt;
            &amp;quot;program&amp;quot;: &amp;quot;Program Name&amp;quot;, // program name&lt;br /&gt;
            &amp;quot;title&amp;quot;: &amp;quot;Episode Title S3 - EP1&amp;quot;, // episode name&lt;br /&gt;
            &amp;quot;length&amp;quot;: &amp;quot;1800&amp;quot;, // content duration in seconds&lt;br /&gt;
            &amp;quot;segB&amp;quot;: &amp;quot;Custom Segment B&amp;quot;, // custom segment&lt;br /&gt;
            &amp;quot;segC&amp;quot;: &amp;quot;Custom Segment C&amp;quot;, // custom segment&lt;br /&gt;
            &amp;quot;crossId1&amp;quot;: &amp;quot;Standard Episode ID&amp;quot;, // episode ID&lt;br /&gt;
            &amp;quot;crossId2&amp;quot;: &amp;quot;Content Originator ID&amp;quot;, // content orginator (required for distributors)&lt;br /&gt;
            &amp;quot;airdate&amp;quot;: &amp;quot;20161013 20:00:00&amp;quot;, // airdate&lt;br /&gt;
            &amp;quot;adloadtype&amp;quot;: &amp;quot;2&amp;quot; //ad load flag&lt;br /&gt;
            &amp;quot;hasAds&amp;quot;: &amp;quot;1&amp;quot;, // content contains ads = 1 / no ads = 0&lt;br /&gt;
            &amp;quot;progen&amp;quot;: &amp;quot;CV&amp;quot; // program genre abbreviation&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;ad&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;preroll&amp;quot;, // type of ad&lt;br /&gt;
            &amp;quot;assetid&amp;quot;: &amp;quot;AD-ID123&amp;quot; // unique ID for ad&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    // 3.3 Configure Payload: events&lt;br /&gt;
    &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, //event name&lt;br /&gt;
    &amp;quot;position&amp;quot;: &amp;quot;300&amp;quot;, // position in seconds&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, //&amp;quot;content&amp;quot; or &amp;quot;ad&amp;quot;&lt;br /&gt;
    &amp;quot;utc&amp;quot;: &amp;quot;1456448742000&amp;quot; //unix timestamp in milliseconds &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Configure Payload: devInfo=====&lt;br /&gt;
An object &amp;lt;code&amp;gt;&amp;quot;devInfo&amp;quot;&amp;lt;/code&amp;gt; will need to be created to capture App and Device information.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys !! Description !! Values !! Required&lt;br /&gt;
|-&lt;br /&gt;
| devId || unique ID to identify user (e.g. Advertising ID, Roku Device ID) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| hem_sha256 || SHA-256 hashed email Note: email normalization rules applied before hashing || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| uid2 || Trade Desk Unified ID 2.0 This should be the unencrypted, non-tokenized UID2.0 in the clear || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| uid2_token ||Trade Desk Unified ID 2.0 UID2 token || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| apn || app name || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| apv || app build version || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| uoo || device opt-out status || &amp;lt;code&amp;gt;&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;false&amp;quot;&amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Example devInfo Object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// create devInfo object&lt;br /&gt;
&amp;quot;devInfo&amp;quot;: {&lt;br /&gt;
  &amp;quot;devId&amp;quot;: &amp;quot;AD-ID&amp;quot;,&lt;br /&gt;
  &amp;quot;hem_sha256&amp;quot;: &amp;quot;55C06A30DAA5D5F382FDEB8C702EC57875CC9D91A7C78BB620053FD81DC4335C&amp;quot;,&lt;br /&gt;
  &amp;quot;uid2&amp;quot;: &amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;,&lt;br /&gt;
  &amp;quot;uid2_token&amp;quot;: &amp;quot;7be25cf9-8c40-5cc2-871e-19bf41940288MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=uid_token=AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8QlDSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeKQI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhCxG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;,&lt;br /&gt;
  &amp;quot;apn&amp;quot;: &amp;quot;AppName&amp;quot;,&lt;br /&gt;
  &amp;quot;apv&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
  &amp;quot;uoo&amp;quot;: &amp;quot;false&amp;quot;&lt;br /&gt;
},&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3.2 Configure Payload: metadata ====&lt;br /&gt;
Asset metadata can be passed through &amp;lt;code&amp;gt;&amp;quot;metadata&amp;quot;&amp;lt;/code&amp;gt;. There are two asset types: &amp;lt;code&amp;gt;&amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; for video and &amp;lt;code&amp;gt;&amp;quot;ad&amp;quot;&amp;lt;/code&amp;gt; for ads. The metadata received for each asset is used for classification and reporting.&lt;br /&gt;
&lt;br /&gt;
You will need to set up &amp;lt;code&amp;gt;&amp;quot;metadata&amp;quot;&amp;lt;/code&amp;gt; objects for &amp;lt;code&amp;gt;&amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;quot;ad&amp;quot;&amp;lt;/code&amp;gt; with the required Nielsen keys as shown in the sample code below.&lt;br /&gt;
&lt;br /&gt;
===== Content Metadata =====&lt;br /&gt;
Content metadata should remain constant throughout the entirety of an episode/clip including when ads play.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys !! Description !! Values !! Required&lt;br /&gt;
|-&lt;br /&gt;
| type || type of asset || &amp;lt;code&amp;gt;&amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| assetid || unique ID assigned to asset || custom &amp;lt;br&amp;gt;(no [[Special Characters]]) || Yes&lt;br /&gt;
|-&lt;br /&gt;
| program ||name of program (25 character limit) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| title ||name of program (25 character limit) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| length || length of content in seconds || &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| airdate || the airdate in the linear TV || YYYYMMDD HH24:MI:SS || Yes&lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode || full episode flag || &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- non full episode || Yes&lt;br /&gt;
|-&lt;br /&gt;
| crossId1 || standard episode ID || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| crossId2 || content originator (only required for distributors) || Nielsen || No&lt;br /&gt;
|-&lt;br /&gt;
| adloadtype || type of ad load:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;1&amp;quot;&amp;lt;/code&amp;gt; Linear – matches TV ad load&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;2&amp;quot;&amp;lt;/code&amp;gt; Dynamic – Dynamic Ad Insertion (DAI)&lt;br /&gt;
|| &amp;lt;code&amp;gt;&amp;quot;2&amp;quot;&amp;lt;/code&amp;gt; - DCR measures content with dynamic ads || Yes&lt;br /&gt;
|-&lt;br /&gt;
| hasAds || ads indicator&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;1&amp;quot;&amp;lt;/code&amp;gt;: ads included&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;0&amp;quot;&amp;lt;/code&amp;gt;: ads not included&lt;br /&gt;
|| &amp;lt;code&amp;gt;&amp;quot;1&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;0&amp;quot;&amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| subbrand || sub brand override || Nielsen || No&lt;br /&gt;
|-&lt;br /&gt;
| progen || program genre abbreviation - see [[DCR OTT Genre List]] for accepted values || &amp;lt;code&amp;gt;&amp;quot;CV&amp;quot;&amp;lt;/code&amp;gt; for Comedy Variety || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Example Content Object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang='json'&amp;gt;// create content object&lt;br /&gt;
&amp;quot;content&amp;quot;: {&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;: &amp;quot;VIDEO-ID123&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;: &amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;: &amp;quot;Program Name&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;Episode Title S3 - EP1&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;: &amp;quot;1800&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;: &amp;quot;Custom Segment B&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;: &amp;quot;Custom Segment C&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;: &amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot;: &amp;quot;Content Originator ID&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;: &amp;quot;20161013 20:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
    &amp;quot;hasAds&amp;quot;: &amp;quot;1&amp;quot;, &lt;br /&gt;
    &amp;quot;subbrand&amp;quot;: &amp;quot;c05&amp;quot;,&lt;br /&gt;
    &amp;quot;progen&amp;quot;: &amp;quot;CV&amp;quot;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Ad Metadata =====&lt;br /&gt;
The ad metadata should be passed for each individual ad.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys !! Description !! Values !! Required&lt;br /&gt;
|-&lt;br /&gt;
| type || type of ad || &amp;lt;code&amp;gt;&amp;quot;preroll&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;midroll&amp;quot;&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;&amp;quot;postroll&amp;quot;&amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| assetid || unique ID assigned to ad || custom || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Example Ad Object =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// create ad object&lt;br /&gt;
&amp;quot;ad&amp;quot;: {&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;preroll&amp;quot;,&lt;br /&gt;
  &amp;quot;assetid&amp;quot;: &amp;quot;AD-ID123&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configure Payload: Events ===&lt;br /&gt;
&lt;br /&gt;
The last part of the payload is for enabling events so content is measured correctly when viewed. The events and required parameters are included below.&lt;br /&gt;
&lt;br /&gt;
==== Event Types ====&lt;br /&gt;
&lt;br /&gt;
The available events are:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;playhead&amp;quot;&amp;lt;/code&amp;gt; || Playhead position in seconds, must be passed as a whole number every 10 seconds. The final playhead position should be sent before an asset has changed to properly capture full duration. When content is paused, stop passing playhead position until content is resumed. On playhead scrubbing, send current playhead position, followed by the playhead position the user scrubs to. For Live streams, you may use Unix Time (in seconds) as the playhead position. Note that ad playheads must also use Unix Time if Unix Time is used for content playheads.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;complete&amp;quot;&amp;lt;/code&amp;gt; || The complete event must be sent when the content has completed full playback. Before calling the complete event, a final playhead update with the final position is required to be sent to receive full duration credit. For Live streams, a complete event must be sent at program boundaries.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;delete&amp;quot;&amp;lt;/code&amp;gt; || The delete event is optional and can be sent when the viewing session is terminated (typically on App close). A new session ID must be generated after sending a delete event. Delete should not be sent on app interruptions or foreground/background events. All creditable duration will be summarized for all asset types when delete occurs (content and ads).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Event Parameters =====&lt;br /&gt;
&lt;br /&gt;
The following parameters need to be passed when calling events:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Description !! Value !! Required&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;event&amp;quot;&amp;lt;/code&amp;gt; || event type || &amp;lt;code&amp;gt;&amp;quot;playhead&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;complete&amp;quot;&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;&amp;quot;delete&amp;quot;&amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;position&amp;quot;&amp;lt;/code&amp;gt; || playhead position in seconds or Unix time in seconds || &amp;lt;code&amp;gt;&amp;quot;300&amp;quot;&amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;type&amp;quot;&amp;lt;/code&amp;gt; || asset type || &amp;lt;code&amp;gt;&amp;quot;content&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;ad&amp;quot;&amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;utc&amp;quot;&amp;lt;/code&amp;gt; || Unix timestamp in milliseconds. Must be passed every 10 seconds. || &amp;lt;code&amp;gt;&amp;quot;1472760000000&amp;quot;&amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Example Event =====&lt;br /&gt;
You can call events by passing values in the required parameters:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;devInfo&amp;quot;: [deviceInfo],&lt;br /&gt;
  &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
    &amp;quot;static&amp;quot;: [static metadata],&lt;br /&gt;
    &amp;quot;content&amp;quot;: [content metadata],&lt;br /&gt;
    &amp;quot;ad&amp;quot;: [ad metadata]&lt;br /&gt;
  },&lt;br /&gt;
  // Event Parameters&lt;br /&gt;
  &amp;quot;event&amp;quot;: [event], // event name&lt;br /&gt;
  &amp;quot;position&amp;quot;: [playheadPosition], //position in seconds&lt;br /&gt;
  &amp;quot;type&amp;quot;: [asset type], // values are &amp;quot;content&amp;quot; or &amp;quot;ad&amp;quot;&lt;br /&gt;
  &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot; //unix timestamp in milliseconds&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note:''' The full payload including &amp;quot;devInfo&amp;quot; and &amp;quot;metadata&amp;quot; must be populated in each event request.&lt;br /&gt;
&lt;br /&gt;
===== Sample Event Lifecycle =====&lt;br /&gt;
The sample event lifecycle can be used as a reference for identifying the order for calling events and values to pass.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Start of Session: session ID created when App is opened&lt;br /&gt;
&lt;br /&gt;
// Preroll&lt;br /&gt;
Ad Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
 &lt;br /&gt;
// Content&lt;br /&gt;
Content Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Midroll&lt;br /&gt;
Midroll Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Content resumes at 15 minutes&lt;br /&gt;
Content Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;900&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Content completes at 30 minutes&lt;br /&gt;
Complete {&amp;quot;event&amp;quot;: &amp;quot;complete&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;1800&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
 &lt;br /&gt;
// Postroll&lt;br /&gt;
Ad Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
//End of Session: The delete event should be called when the App is exited. The values for position and type not required to be passed.&lt;br /&gt;
Delete { &amp;quot;event&amp;quot;: &amp;quot;delete&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Sample Event Lifecycle - Detailed Storyline'''&lt;br /&gt;
This detailed event sequence provides additional insight for the correct events to call when handling certain playback scenarios.&lt;br /&gt;
&amp;lt;syntaxhighlight lang='javascript'&amp;gt;// SESSION STARTS&lt;br /&gt;
// Start of Session: session ID created when App is opened&lt;br /&gt;
&lt;br /&gt;
// PREROLL&lt;br /&gt;
// Preroll Start - Start each Ad with a position of &amp;quot;0&amp;quot;, resetting to '0' for each Ad, and Ad break.&lt;br /&gt;
Ad Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Preroll Stop - End each Ad with the final position of the Ad.&lt;br /&gt;
Ad Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;15&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472761500000&amp;quot;}&lt;br /&gt;
 &lt;br /&gt;
// CONTENT &lt;br /&gt;
// Content Start - Start new content streams with a position of &amp;quot;0&amp;quot; incrementing the position every 10 seconds.&lt;br /&gt;
Content Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472761500000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Content Stop Before Ad Break - Send a playhead update including the current content positon before an Ad break.&lt;br /&gt;
Content Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;299&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472787400000&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
// MIDROLL&lt;br /&gt;
// Midroll Start - Start each Ad with a position of &amp;quot;0&amp;quot;, resetting to '0' for each Ad, and Ad break.&lt;br /&gt;
Midroll Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472787500000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Midroll Stop - End each Ad with the final position of the Ad.&lt;br /&gt;
Ad Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;60&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472793500000&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
// CONTENT&lt;br /&gt;
// Content resumes at 5 minutes - Send playhead update with the current resumed position, and begin incrimenting the positon every 10 seconds.&lt;br /&gt;
Content Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;300&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472799500000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Content completes at 10:12 - Make sure to send in the playhead event with the final content position before sending the complete event.&lt;br /&gt;
Final Content Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;612&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472830700000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
Complete {&amp;quot;event&amp;quot;: &amp;quot;complete&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;612&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472830800000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// POSTROLL&lt;br /&gt;
// Postroll Start - Start each Ad with a position of &amp;quot;0&amp;quot;, resetting to '0' for each Ad, and Ad break.&lt;br /&gt;
Ad Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472830900000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Postroll Stop - End each Ad with the final position of the Ad.&lt;br /&gt;
Ad Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;45&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472835300000&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
// SESSION ENDS&lt;br /&gt;
&lt;br /&gt;
//End of Session: The delete event should be called when the App is exited. The values for position and type not required to be passed.&lt;br /&gt;
Delete { &amp;quot;event&amp;quot;: &amp;quot;delete&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472835400000&amp;quot;} &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Handling Playhead=====&lt;br /&gt;
Calling &amp;lt;code&amp;gt;&amp;quot;playhead&amp;quot;&amp;lt;/code&amp;gt; is critical for accurate duration crediting. You can reference the below guidance to determine the correct playhead position to pass depending on the playback scenario.&lt;br /&gt;
&lt;br /&gt;
'''Playhead: General'''&lt;br /&gt;
* Playhead position must start at 0 for each new asset, and be passed at least every 10 seconds.&lt;br /&gt;
* Final postion must be sent at the end of content or an ad&lt;br /&gt;
* Playheads should be sent in seconds only, not milliseconds&lt;br /&gt;
&lt;br /&gt;
'''Playhead: Ads'''&lt;br /&gt;
* The final position must be sent when switching from content to ad, or ad to content.&lt;br /&gt;
* Each ad playhead position should be 0 at ad start.&lt;br /&gt;
* For Ad Pods, playhead must be called, and reset to 0 for each individual ad. &lt;br /&gt;
* The last content position before an Ad should be sent before switching to Ads.&lt;br /&gt;
* When content has resumed following an ad break, the playhead position update must continue where the previous content segment left off.&lt;br /&gt;
&lt;br /&gt;
'''Playhead: User Actions'''&lt;br /&gt;
* Upon user scrubbing, the current position must be sent before a user scrubs, and the new position should be sent where the user lands, and begin sending in the 10 second updates thereafter.&lt;br /&gt;
* On pause, send the current position and then discontinue sending playhead event updates.&lt;br /&gt;
* If a user exits a stream early, the last current position must be sent in a playhead update to receive accurate duration.&lt;br /&gt;
&lt;br /&gt;
===== Interruption Scenarios =====&lt;br /&gt;
&lt;br /&gt;
As part of configuring events, you will need to handle all possible interruption scenarios such as:&lt;br /&gt;
&lt;br /&gt;
*Wi-Fi OFF / ON&lt;br /&gt;
*App going Background / Foreground (Video players only, not for Audio players)&lt;br /&gt;
*App Crash or Exit&lt;br /&gt;
&lt;br /&gt;
When playback is interrupted, the app needs to send delete immediately.&lt;br /&gt;
&lt;br /&gt;
Once playback resumes, a new session will need to be created with a unique session ID. All of the required metadata and events will need to be sent.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' The session will automatically timeout after 30 minutes of inactivity.&lt;br /&gt;
&lt;br /&gt;
=== Example Request ===&lt;br /&gt;
&lt;br /&gt;
Now that we walked through the Cloud API integration steps, your requests should have the following components: Session ID, App ID, and Payload. You can reference the example below when your reviewing your integration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// 1. Create Session ID&lt;br /&gt;
sessionID = dfc7dc6a-66a7-4705-9fba-adaaf7e3d5e0  // Example sessionID created using a UUID Generator&lt;br /&gt;
&lt;br /&gt;
// 2. Define URL Structure with App ID and Session ID&lt;br /&gt;
sessionURL = https://sandbox2-cloudapi.imrworldwide.com/nmapi/v2/[appid]/[sessionID]/a?b=&lt;br /&gt;
&lt;br /&gt;
// 3. Configure Payload&lt;br /&gt;
// 3.1 Configure Payload: devInfo &lt;br /&gt;
payload = {&lt;br /&gt;
 &amp;quot;devInfo&amp;quot;: {&lt;br /&gt;
   &amp;quot;devId&amp;quot;: &amp;quot;AD-ID&amp;quot;, &lt;br /&gt;
   &amp;quot;apn&amp;quot;: &amp;quot;AppName&amp;quot;,&lt;br /&gt;
   &amp;quot;apv&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
   &amp;quot;uoo&amp;quot;: &amp;quot;false&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &lt;br /&gt;
  // 3.2 Configure Payload: metadata&lt;br /&gt;
  &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
    &amp;quot;static&amp;quot;: {}, // object for measuring static content&lt;br /&gt;
    &amp;quot;content&amp;quot;: { // object for measuring video content&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, // &amp;quot;content&amp;quot; for video&lt;br /&gt;
      &amp;quot;assetid&amp;quot;: &amp;quot;VIDEO-ID123&amp;quot;, // unique ID for video&lt;br /&gt;
      &amp;quot;isfullepisode&amp;quot;: &amp;quot;y&amp;quot;, // full episode flag&lt;br /&gt;
      &amp;quot;program&amp;quot;: &amp;quot;Program Name&amp;quot;, // program name&lt;br /&gt;
      &amp;quot;title&amp;quot;: &amp;quot;Episode Title S3 - EP1&amp;quot;, // episode name&lt;br /&gt;
      &amp;quot;length&amp;quot;: &amp;quot;1800&amp;quot;, // content duration in seconds&lt;br /&gt;
      &amp;quot;segB&amp;quot;: &amp;quot;Custom Segment B&amp;quot;, // custom segment&lt;br /&gt;
      &amp;quot;segC&amp;quot;: &amp;quot;Custom Segment C&amp;quot;, // custom segment&lt;br /&gt;
      &amp;quot;crossId1&amp;quot;: &amp;quot;Standard Episode ID&amp;quot;, // episode ID&lt;br /&gt;
      &amp;quot;crossId2&amp;quot;: &amp;quot;Content Originator ID&amp;quot;, // content orginator (required for distributors)&lt;br /&gt;
      &amp;quot;airdate&amp;quot;: &amp;quot;20161013 20:00:00&amp;quot;, // airdate&lt;br /&gt;
      &amp;quot;adloadtype&amp;quot;: &amp;quot;2&amp;quot;, // ad load flag&lt;br /&gt;
      &amp;quot;hasAds&amp;quot;: &amp;quot;1&amp;quot;, // content contains ads = 1 / no ads = 0&lt;br /&gt;
      &amp;quot;progen&amp;quot;: &amp;quot;CV&amp;quot; // program genre abbreviation&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;ad&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;preroll&amp;quot;, // type of ad&lt;br /&gt;
      &amp;quot;assetid&amp;quot;: &amp;quot;AD-ID123&amp;quot; // unique ID for ad&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
    &lt;br /&gt;
  // 3.3 Configure Payload: events&lt;br /&gt;
  &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, //event name&lt;br /&gt;
  &amp;quot;position&amp;quot;: &amp;quot;300&amp;quot;, // position in seconds&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, //&amp;quot;content&amp;quot; or &amp;quot;ad&amp;quot;&lt;br /&gt;
  &amp;quot;utc&amp;quot;: &amp;quot;1456448742000&amp;quot; //unix timestamp in milliseconds &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Append payload to URL&lt;br /&gt;
var image = new Image()&lt;br /&gt;
image.onerror = function() {&lt;br /&gt;
  // wait and send again&lt;br /&gt;
}&lt;br /&gt;
(new Image).src = sessionURL+encodeURIComponent(JSON.stringify(payload));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To ensure that the GET request does not receive a CORS issue, make sure to use the IMAGE request in conjunction with the content-type &amp;quot;text/plain&amp;quot; so CORS preflight is not triggered, causing the request to be rejected.&lt;br /&gt;
&lt;br /&gt;
==== Enable Debug Logging ====&lt;br /&gt;
&lt;br /&gt;
Now that you have set up the Cloud API requests, you can enable debug logging to validate your integration. Enabling debug logging is required for Nielsen certification.&lt;br /&gt;
&lt;br /&gt;
==== GET Request ====&lt;br /&gt;
&lt;br /&gt;
Display GET Request to console using a name to identify each event (e.g. playhead).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&amp;quot;Event&amp;quot;, image); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Payload ====&lt;br /&gt;
&lt;br /&gt;
Output payload to identify required metadata and events.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&amp;quot;Event Payload&amp;quot;, payload); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HTTPS Response Code ====&lt;br /&gt;
&lt;br /&gt;
Confirm request was completed by viewing HTTPS response code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
code = msg.GetResponseCode();&lt;br /&gt;
console.log(&amp;quot;Response Code&amp;quot;, code); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can reference the HTTPS Response Code table when reviewing your requests:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Status Code !! Status Text !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; || OK || request received&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;403&amp;lt;/code&amp;gt; || Forbidden || invalid App ID&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt; || Not Found || JSON issue&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Opt-Out ==&lt;br /&gt;
Your app must provide a means for the user to Opt-Out, or Opt-In to Nielsen Measurement. This requirement can be fulfilled by checking the device OS for the user's setting of &amp;quot;Limit Ad Tracking&amp;quot; or similar option. If the device offers &amp;quot;Limit Ad Tracking&amp;quot; settings, you should set &amp;lt;code&amp;gt;uoo=true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;uoo=false&amp;lt;/code&amp;gt; depending on the user's privacy setting. Also, ensure that the &amp;lt;code&amp;gt;devId&amp;lt;/code&amp;gt; is set to a blank value if the user elects to opt-out.&lt;br /&gt;
&lt;br /&gt;
If the device does not have OS-level &amp;quot;Do Not Track&amp;quot; settings, you can implement opt-out by creating an Opt-Out/Opt-In button, toggle switch, or slider within the app &amp;quot;Settings&amp;quot;, or &amp;quot;About&amp;quot; section to allow the user selection.&lt;br /&gt;
&lt;br /&gt;
[[File:Nielsen Opt-Out.png|link=]]&lt;br /&gt;
&lt;br /&gt;
You will need to store the User Opt-Out (uoo) status, so that it can be retrieved and populated in the &amp;lt;code&amp;gt;&amp;quot;devInfo&amp;quot;&amp;lt;/code&amp;gt; metadata which will be sent in every Cloud API event (playhead, complete, &amp;amp; delete). &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! uoo Key !! Description !! Values&lt;br /&gt;
|-&lt;br /&gt;
| uoo || Device is Opted-In to Nielsen Measurement (Recommended Default Setting) || &amp;lt;code&amp;gt;&amp;quot;false&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| uoo || Device is Opted-Out of Nielsen Measurement || &amp;lt;code&amp;gt;&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== devInfo Opt-In JSON Payload Example =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;devInfo&amp;quot;: {&lt;br /&gt;
    &amp;quot;apn&amp;quot;: &amp;quot;Cloud API Sample App&amp;quot;,&lt;br /&gt;
    &amp;quot;apv&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;devId&amp;quot;: &amp;quot;7be25cf9-8c40-5cc2-871e-19bf41940288&amp;quot;,&lt;br /&gt;
    &amp;quot;uoo&amp;quot;: &amp;quot;false&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== devInfo Opt-Out JSON Payload Example =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;quot;devInfo&amp;quot;: {&lt;br /&gt;
    &amp;quot;apn&amp;quot;: &amp;quot;Cloud API Sample App&amp;quot;,&lt;br /&gt;
    &amp;quot;apv&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;devId&amp;quot;: &amp;quot;&amp;quot;, //devId must be blank when a user elects to Opt-Out.&lt;br /&gt;
    &amp;quot;uoo&amp;quot;: &amp;quot;true&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Privacy Information Template To Include In Opt-Out Screen =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Additionally, all applications must display the Nielsen privacy policy within their application, typically in the Settings/About screen of your application. The Nielsen privacy policy text is listed below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''''ABOUT NIELSEN MEASUREMENT'''''&lt;br /&gt;
&lt;br /&gt;
Television and the way we watch it have come a long way since Nielsen began measuring TV audiences in 1950. Today, the ability to watch our favorite shows at any time and on multiple devices amplifies the need for exceptionally adept and flexible audience measurement capabilities.&lt;br /&gt;
&lt;br /&gt;
Consumers are changing with the times, and the same goes for us. As technology continues to evolve and media companies try new ways to attract viewers, understanding what consumers are watching — and what they're watching on — is more important than ever. Today, viewing video is a personal and mobile experience — anytime and anywhere. Our capabilities provide relevant metrics that are necessary to inform successful marketing and programming and drive continued growth. As a global information and measurement leader, we are committed to protecting the privacy and security of the data we collect, process and use. While our digital measurement products are not used to identify you in any way, they help us and our clients measure and analyze how consumers engage with media across online, mobile and emerging technologies, and offer insights into consumer behavior.&lt;br /&gt;
&lt;br /&gt;
'''''YOUR CHOICES'''''&lt;br /&gt;
&lt;br /&gt;
Nielsen believes that you should have a choice about whether to contribute to our research and insights. To opt out or opt in to Nielsen measurement, please toggle your &amp;quot;Limit Ad Tracking&amp;quot; (or similar setting) on your device, or make the appropriate selection within the application's settings. If you have this app on more than one device, you will need to opt out of this app on each device. To learn more about our digital measurement products and your choices in regard to them, please visit https://www.nielsen.com/digitalprivacy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
Before providing an app build to Nielsen for testing, it is important to run validation checks once you have enabled debug logging.&lt;br /&gt;
&lt;br /&gt;
=== Payload Validation ===&lt;br /&gt;
&lt;br /&gt;
Ensure that all of the required payload data is populating while testing several videos. The following areas are critical to measurement:&lt;br /&gt;
*devInfo&lt;br /&gt;
*Asset metadata for both content, and ads&lt;br /&gt;
*Events&lt;br /&gt;
*Opt-Out status&lt;br /&gt;
&lt;br /&gt;
=== Player Events ===&lt;br /&gt;
Review event calls:&lt;br /&gt;
&lt;br /&gt;
==== playhead ====&lt;br /&gt;
*Playhead position updates every 10 seconds starting at position '0' for each new asset.&lt;br /&gt;
*Final playhead position is sent on content, or ad before switching between assets.&lt;br /&gt;
*Content metadata remains constant throughout an episode, or clip play.&lt;br /&gt;
*Ad metadata is populated appropriately for each individual ad.&lt;br /&gt;
*Playhead position update resumes for content after an ad break, and resets to 0 for each individual ad.&lt;br /&gt;
*For scrubbing, last current position should be sent while scrubbing occurs, and the new position should also be sent where the user scrubs to.&lt;br /&gt;
*Exiting a stream early should execute the last current position in a playhead update to receive accurate duration.&lt;br /&gt;
*Upon pause, the current position should be sent, and playhead updates should stop incrementing until resume play occurs.&lt;br /&gt;
&lt;br /&gt;
==== complete ====&lt;br /&gt;
*Check that the complete event executes upon content complete after the final playhead update is sent&lt;br /&gt;
*Do not execute the complete event for ads&lt;br /&gt;
&lt;br /&gt;
==== delete ====&lt;br /&gt;
*Check to see that the delete event occurs upon app exit, if the platform has the necessary exit callback events.&lt;br /&gt;
&lt;br /&gt;
==== GET Request Format ====&lt;br /&gt;
*Ensure that the event payloads are formatted in JSON&lt;br /&gt;
*Check to see that each of the Cloud API GET requests are properly encoded&lt;br /&gt;
&lt;br /&gt;
==== HTTPS Response ====&lt;br /&gt;
*Make sure that each of the Cloud API Get requests are received by the Nielsen Cloud API properly through use of the HTTPS Response Code outputs enabled in console.&lt;br /&gt;
&lt;br /&gt;
==== Opt-Out ====&lt;br /&gt;
*Test the &amp;quot;uoo&amp;quot; key gets populated accurately for both Opt-In and Opt-Out selections by validating the Cloud API events called after the user Opt-Out/Opt-In selection.&lt;br /&gt;
*Test that the devId field is populated with a blank value if a user has elected to Opt-Out. For example: &amp;quot;devId&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
*If the device supports &amp;quot;Limit Ad Tracking&amp;quot; or has device &amp;quot;Opt-Out&amp;quot; settings, test that uoo=true, and that devId is set to a blank value if enabled in the device settings.&lt;br /&gt;
&lt;br /&gt;
== Go Live ==&lt;br /&gt;
After your integration has been certified, you will need to: Change Endpoint and Disable Logging.&lt;br /&gt;
&lt;br /&gt;
'''Change Endpoint:''' You will need to update to the production endpoint:&lt;br /&gt;
&lt;br /&gt;
*Testing: &amp;lt;code&amp;gt;https://sandbox2-cloudapi.imrworldwide.com/nmapi/v2/&amp;lt;/code&amp;gt;&lt;br /&gt;
*Production: &amp;lt;code&amp;gt;https://cloudapi.imrworldwide.com/nmapi/v2/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your production URL structure should now be:&lt;br /&gt;
&amp;lt;code&amp;gt;https://cloudapi.imrworldwide.com/nmapi/v2/[appid]/[sessionID]/a?b=[payload]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Disable Logging:''' You can now disable debug logging&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=DCR_Video_%26_Static_Cloud_API&amp;diff=6801</id>
		<title>DCR Video &amp; Static Cloud API</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=DCR_Video_%26_Static_Cloud_API&amp;diff=6801"/>
		<updated>2025-04-23T21:14:43Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: Send UAID ping documentation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
This guide shows you how to integrate the Nielsen Cloud API to enable Digital Content Ratings (DCR), and fuel other measurement products on your over-the-top (OTT) Apps.&lt;br /&gt;
*For Roku Apps, please see [[DCR Video &amp;amp; Static Roku Cloud API]]&lt;br /&gt;
*For Mobile Apps, please see [[DCR Video &amp;amp; Static Mobile Cloud API]]&lt;br /&gt;
&lt;br /&gt;
==Prerequisites==&lt;br /&gt;
To get started, you will need a Nielsen App ID. The App ID is a unique ID assigned to your app. This will be provided to you upon starting the integration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Integration==&lt;br /&gt;
We will cover the steps for constructing the Cloud API Calls.&lt;br /&gt;
&lt;br /&gt;
===Request Overview===&lt;br /&gt;
&lt;br /&gt;
====URL Structure====&lt;br /&gt;
&lt;br /&gt;
The Cloud API Calls are HTTPS GET Requests with the URL structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;[endpoint]/[appid]/[sessionID]/a?b=[payload]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The URL includes the following components:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;[endpoint]&amp;lt;/code&amp;gt;: location of data collection environment&lt;br /&gt;
*&amp;lt;code&amp;gt;[appid]&amp;lt;/code&amp;gt;: provided App ID&lt;br /&gt;
*&amp;lt;code&amp;gt;[sessionID]&amp;lt;/code&amp;gt;: unique value for each user session&lt;br /&gt;
*&amp;lt;code&amp;gt;[payload]&amp;lt;/code&amp;gt;: metadata and events&lt;br /&gt;
&lt;br /&gt;
====Endpoint====&lt;br /&gt;
&lt;br /&gt;
There are endpoints for testing and production:&lt;br /&gt;
&lt;br /&gt;
*Testing: &amp;lt;code&amp;gt;https://sandbox2-cloudapi.imrworldwide.com/nmapi/v2/&amp;lt;/code&amp;gt;&lt;br /&gt;
*Production: &amp;lt;code&amp;gt;https://cloudapi.imrworldwide.com/nmapi/v2/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
During testing, all calls should be pointed to the testing endpoint. We will review the update to the production endpoint during the Go Live section of this guide.&lt;br /&gt;
&lt;br /&gt;
====URL Example====&lt;br /&gt;
As you move through the integration steps, you can reference the below URL structure with the expanded payload:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
https://sandbox2-cloudapi.imrworldwide.com/nmapi/v2/[appid]/[sessionID]/a?b=&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;devInfo&amp;quot;: [deviceInfo],&lt;br /&gt;
  &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
    &amp;quot;static&amp;quot;: [static_metadata],&lt;br /&gt;
    &amp;quot;content&amp;quot;: [content_metadata],&lt;br /&gt;
    &amp;quot;ad&amp;quot;: [ad metadata]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;event&amp;quot;: [event],&lt;br /&gt;
  &amp;quot;position&amp;quot;: [playhead_position],&lt;br /&gt;
  &amp;quot;type&amp;quot;: [asset type],&lt;br /&gt;
  &amp;quot;utc&amp;quot;: [Unix time in ms]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Create Session ID and send UAID ping===&lt;br /&gt;
A unique Session ID &amp;lt;code&amp;gt;[sessionID]&amp;lt;/code&amp;gt; must be created upon app launch and provided in the URL. This will allow measurement to occur for the entire duration that a user is within the app.&lt;br /&gt;
&lt;br /&gt;
A Session ID needs to be completely unique so it is recommended to use a version 4 UUID or another method of your choosing to guarantee there are no repeats.&lt;br /&gt;
&lt;br /&gt;
Upon exiting the app, the session will need to be terminated using the delete event. Sessions will automatically expire after 30 minutes of cloud inactivity.&lt;br /&gt;
&lt;br /&gt;
==== Send UAID Ping ====&lt;br /&gt;
An UAID Ping must be sent using the created unique Session ID &amp;lt;code&amp;gt;[sessionID]&amp;lt;/code&amp;gt; upon start of the first stream playback.&lt;br /&gt;
 https://&amp;amp;#x5B;sessionID&amp;amp;#x5D;.redinuid.imrworldwide&amp;lt;nowiki/&amp;gt;.com/&lt;br /&gt;
&lt;br /&gt;
===Define URL Structure===&lt;br /&gt;
Define the URL structure using your provided &amp;lt;code&amp;gt;[appid]&amp;lt;/code&amp;gt; and a unique &amp;lt;code&amp;gt;[sessionID]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;https://sandbox2-cloudapi.imrworldwide.com/nmapi/v2/[appid]/[sessionID]/a?b=[payload]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Configure Payload===&lt;br /&gt;
&lt;br /&gt;
All Cloud API requests must contain the following payload data:&lt;br /&gt;
&lt;br /&gt;
*''devInfo'': device and app info&lt;br /&gt;
*''metadata'': asset metadata&lt;br /&gt;
*''event metadata'': type of event&lt;br /&gt;
&lt;br /&gt;
The payload can be passed through key-values using the Nielsen reserved keys. The specific keys and descriptions are highlighted in the tables included in this section.&lt;br /&gt;
&lt;br /&gt;
'''Payload Example'''&lt;br /&gt;
&lt;br /&gt;
The example below should be referenced when following the steps for configuring the request payload.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// 3.1 Configure Payload: devInfo &lt;br /&gt;
payload = {&lt;br /&gt;
    &amp;quot;devInfo&amp;quot;: {&lt;br /&gt;
        &amp;quot;devId&amp;quot;: &amp;quot;AD-ID&amp;quot;,&lt;br /&gt;
        &amp;quot;hem_sha256&amp;quot;: &amp;quot;55C06A30DAA5D5F382FDEB8C702EC57875CC9D91A7C78BB620053FD81DC4335C&amp;quot;,&lt;br /&gt;
        &amp;quot;uid2&amp;quot;: &amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;,&lt;br /&gt;
        &amp;quot;uid2_token&amp;quot;: &amp;quot;7be25cf9-8c40-5cc2-871e-19bf41940288MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=uid_token=AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8QlDSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeKQI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhCxG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;,&lt;br /&gt;
        &amp;quot;apn&amp;quot;: &amp;quot;AppName&amp;quot;,&lt;br /&gt;
        &amp;quot;apv&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
        &amp;quot;uoo&amp;quot;: &amp;quot;false&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    // 3.2 Configure Payload: metadata&lt;br /&gt;
    &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
        &amp;quot;static&amp;quot;: {}, // object for measuring static content&lt;br /&gt;
        &amp;quot;content&amp;quot;: { // object for measuring video content&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, // &amp;quot;content&amp;quot; for video&lt;br /&gt;
            &amp;quot;assetid&amp;quot;: &amp;quot;VIDEO-ID123&amp;quot;, // unique ID for video&lt;br /&gt;
            &amp;quot;isfullepisode&amp;quot;: &amp;quot;y&amp;quot;, // full episode flag&lt;br /&gt;
            &amp;quot;program&amp;quot;: &amp;quot;Program Name&amp;quot;, // program name&lt;br /&gt;
            &amp;quot;title&amp;quot;: &amp;quot;Episode Title S3 - EP1&amp;quot;, // episode name&lt;br /&gt;
            &amp;quot;length&amp;quot;: &amp;quot;1800&amp;quot;, // content duration in seconds&lt;br /&gt;
            &amp;quot;segB&amp;quot;: &amp;quot;Custom Segment B&amp;quot;, // custom segment&lt;br /&gt;
            &amp;quot;segC&amp;quot;: &amp;quot;Custom Segment C&amp;quot;, // custom segment&lt;br /&gt;
            &amp;quot;crossId1&amp;quot;: &amp;quot;Standard Episode ID&amp;quot;, // episode ID&lt;br /&gt;
            &amp;quot;crossId2&amp;quot;: &amp;quot;Content Originator ID&amp;quot;, // content orginator (required for distributors)&lt;br /&gt;
            &amp;quot;airdate&amp;quot;: &amp;quot;20161013 20:00:00&amp;quot;, // airdate&lt;br /&gt;
            &amp;quot;adloadtype&amp;quot;: &amp;quot;2&amp;quot; //ad load flag&lt;br /&gt;
            &amp;quot;hasAds&amp;quot;: &amp;quot;1&amp;quot;, // content contains ads = 1 / no ads = 0&lt;br /&gt;
            &amp;quot;progen&amp;quot;: &amp;quot;CV&amp;quot; // program genre abbreviation&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;ad&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;preroll&amp;quot;, // type of ad&lt;br /&gt;
            &amp;quot;assetid&amp;quot;: &amp;quot;AD-ID123&amp;quot; // unique ID for ad&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    // 3.3 Configure Payload: events&lt;br /&gt;
    &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, //event name&lt;br /&gt;
    &amp;quot;position&amp;quot;: &amp;quot;300&amp;quot;, // position in seconds&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, //&amp;quot;content&amp;quot; or &amp;quot;ad&amp;quot;&lt;br /&gt;
    &amp;quot;utc&amp;quot;: &amp;quot;1456448742000&amp;quot; //unix timestamp in milliseconds &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Configure Payload: devInfo=====&lt;br /&gt;
An object &amp;lt;code&amp;gt;&amp;quot;devInfo&amp;quot;&amp;lt;/code&amp;gt; will need to be created to capture App and Device information.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys !! Description !! Values !! Required&lt;br /&gt;
|-&lt;br /&gt;
| devId || unique ID to identify user (e.g. Advertising ID, Roku Device ID) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| hem_sha256 || SHA-256 hashed email Note: email normalization rules applied before hashing || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| uid2 || Trade Desk Unified ID 2.0 This should be the unencrypted, non-tokenized UID2.0 in the clear || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| uid2_token ||Trade Desk Unified ID 2.0 UID2 token || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| apn || app name || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| apv || app build version || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| uoo || device opt-out status || &amp;lt;code&amp;gt;&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;false&amp;quot;&amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Example devInfo Object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// create devInfo object&lt;br /&gt;
&amp;quot;devInfo&amp;quot;: {&lt;br /&gt;
  &amp;quot;devId&amp;quot;: &amp;quot;AD-ID&amp;quot;,&lt;br /&gt;
  &amp;quot;hem_sha256&amp;quot;: &amp;quot;55C06A30DAA5D5F382FDEB8C702EC57875CC9D91A7C78BB620053FD81DC4335C&amp;quot;,&lt;br /&gt;
  &amp;quot;uid2&amp;quot;: &amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;,&lt;br /&gt;
  &amp;quot;uid2_token&amp;quot;: &amp;quot;7be25cf9-8c40-5cc2-871e-19bf41940288MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=uid_token=AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8QlDSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeKQI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhCxG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;,&lt;br /&gt;
  &amp;quot;apn&amp;quot;: &amp;quot;AppName&amp;quot;,&lt;br /&gt;
  &amp;quot;apv&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
  &amp;quot;uoo&amp;quot;: &amp;quot;false&amp;quot;&lt;br /&gt;
},&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3.2 Configure Payload: metadata ====&lt;br /&gt;
Asset metadata can be passed through &amp;lt;code&amp;gt;&amp;quot;metadata&amp;quot;&amp;lt;/code&amp;gt;. There are two asset types: &amp;lt;code&amp;gt;&amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; for video and &amp;lt;code&amp;gt;&amp;quot;ad&amp;quot;&amp;lt;/code&amp;gt; for ads. The metadata received for each asset is used for classification and reporting.&lt;br /&gt;
&lt;br /&gt;
You will need to set up &amp;lt;code&amp;gt;&amp;quot;metadata&amp;quot;&amp;lt;/code&amp;gt; objects for &amp;lt;code&amp;gt;&amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;quot;ad&amp;quot;&amp;lt;/code&amp;gt; with the required Nielsen keys as shown in the sample code below.&lt;br /&gt;
&lt;br /&gt;
===== Content Metadata =====&lt;br /&gt;
Content metadata should remain constant throughout the entirety of an episode/clip including when ads play.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys !! Description !! Values !! Required&lt;br /&gt;
|-&lt;br /&gt;
| type || type of asset || &amp;lt;code&amp;gt;&amp;quot;content&amp;quot;&amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| assetid || unique ID assigned to asset || custom &amp;lt;br&amp;gt;(no [[Special Characters]]) || Yes&lt;br /&gt;
|-&lt;br /&gt;
| program ||name of program (25 character limit) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| title ||name of program (25 character limit) || custom || Yes&lt;br /&gt;
|-&lt;br /&gt;
| length || length of content in seconds || &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; (0 for live stream) || Yes&lt;br /&gt;
|-&lt;br /&gt;
| segB || custom segment B || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| segC || custom segment C || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| airdate || the airdate in the linear TV || YYYYMMDD HH24:MI:SS || Yes&lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode || full episode flag || &amp;lt;code&amp;gt;&amp;quot;y&amp;quot;&amp;lt;/code&amp;gt;- full episode, &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;- non full episode || Yes&lt;br /&gt;
|-&lt;br /&gt;
| crossId1 || standard episode ID || custom || No&lt;br /&gt;
|-&lt;br /&gt;
| crossId2 || content originator (only required for distributors) || Nielsen || No&lt;br /&gt;
|-&lt;br /&gt;
| adloadtype || type of ad load:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;1&amp;quot;&amp;lt;/code&amp;gt; Linear – matches TV ad load&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;2&amp;quot;&amp;lt;/code&amp;gt; Dynamic – Dynamic Ad Insertion (DAI)&lt;br /&gt;
|| &amp;lt;code&amp;gt;&amp;quot;2&amp;quot;&amp;lt;/code&amp;gt; - DCR measures content with dynamic ads || Yes&lt;br /&gt;
|-&lt;br /&gt;
| hasAds || ads indicator&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;1&amp;quot;&amp;lt;/code&amp;gt;: ads included&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;0&amp;quot;&amp;lt;/code&amp;gt;: ads not included&lt;br /&gt;
|| &amp;lt;code&amp;gt;&amp;quot;1&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;0&amp;quot;&amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| subbrand || sub brand override || Nielsen || No&lt;br /&gt;
|-&lt;br /&gt;
| progen || program genre abbreviation - see [[DCR OTT Genre List]] for accepted values || &amp;lt;code&amp;gt;&amp;quot;CV&amp;quot;&amp;lt;/code&amp;gt; for Comedy Variety || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Example Content Object'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang='json'&amp;gt;// create content object&lt;br /&gt;
&amp;quot;content&amp;quot;: {&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
    &amp;quot;assetid&amp;quot;: &amp;quot;VIDEO-ID123&amp;quot;,&lt;br /&gt;
    &amp;quot;isfullepisode&amp;quot;: &amp;quot;y&amp;quot;,&lt;br /&gt;
    &amp;quot;program&amp;quot;: &amp;quot;Program Name&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;Episode Title S3 - EP1&amp;quot;,&lt;br /&gt;
    &amp;quot;length&amp;quot;: &amp;quot;1800&amp;quot;,&lt;br /&gt;
    &amp;quot;segB&amp;quot;: &amp;quot;Custom Segment B&amp;quot;,&lt;br /&gt;
    &amp;quot;segC&amp;quot;: &amp;quot;Custom Segment C&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId1&amp;quot;: &amp;quot;Standard Episode ID&amp;quot;,&lt;br /&gt;
    &amp;quot;crossId2&amp;quot;: &amp;quot;Content Originator ID&amp;quot;,&lt;br /&gt;
    &amp;quot;airdate&amp;quot;: &amp;quot;20161013 20:00:00&amp;quot;,&lt;br /&gt;
    &amp;quot;adloadtype&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
    &amp;quot;hasAds&amp;quot;: &amp;quot;1&amp;quot;, &lt;br /&gt;
    &amp;quot;subbrand&amp;quot;: &amp;quot;c05&amp;quot;,&lt;br /&gt;
    &amp;quot;progen&amp;quot;: &amp;quot;CV&amp;quot;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Ad Metadata =====&lt;br /&gt;
The ad metadata should be passed for each individual ad.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keys !! Description !! Values !! Required&lt;br /&gt;
|-&lt;br /&gt;
| type || type of ad || &amp;lt;code&amp;gt;&amp;quot;preroll&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;midroll&amp;quot;&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;&amp;quot;postroll&amp;quot;&amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| assetid || unique ID assigned to ad || custom || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Example Ad Object =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// create ad object&lt;br /&gt;
&amp;quot;ad&amp;quot;: {&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;preroll&amp;quot;,&lt;br /&gt;
  &amp;quot;assetid&amp;quot;: &amp;quot;AD-ID123&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configure Payload: Events ===&lt;br /&gt;
&lt;br /&gt;
The last part of the payload is for enabling events so content is measured correctly when viewed. The events and required parameters are included below.&lt;br /&gt;
&lt;br /&gt;
==== Event Types ====&lt;br /&gt;
&lt;br /&gt;
The available events are:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;playhead&amp;quot;&amp;lt;/code&amp;gt; || Playhead position in seconds, must be passed as a whole number every 10 seconds. The final playhead position should be sent before an asset has changed to properly capture full duration. When content is paused, stop passing playhead position until content is resumed. On playhead scrubbing, send current playhead position, followed by the playhead position the user scrubs to. For Live streams, you may use Unix Time (in seconds) as the playhead position. Note that ad playheads must also use Unix Time if Unix Time is used for content playheads.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;complete&amp;quot;&amp;lt;/code&amp;gt; || The complete event must be sent when the content has completed full playback. Before calling the complete event, a final playhead update with the final position is required to be sent to receive full duration credit. For Live streams, a complete event must be sent at program boundaries.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;delete&amp;quot;&amp;lt;/code&amp;gt; || The delete event is optional and can be sent when the viewing session is terminated (typically on App close). A new session ID must be generated after sending a delete event. Delete should not be sent on app interruptions or foreground/background events. All creditable duration will be summarized for all asset types when delete occurs (content and ads).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Event Parameters =====&lt;br /&gt;
&lt;br /&gt;
The following parameters need to be passed when calling events:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Description !! Value !! Required&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;event&amp;quot;&amp;lt;/code&amp;gt; || event type || &amp;lt;code&amp;gt;&amp;quot;playhead&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;complete&amp;quot;&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;&amp;quot;delete&amp;quot;&amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;position&amp;quot;&amp;lt;/code&amp;gt; || playhead position in seconds or Unix time in seconds || &amp;lt;code&amp;gt;&amp;quot;300&amp;quot;&amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;type&amp;quot;&amp;lt;/code&amp;gt; || asset type || &amp;lt;code&amp;gt;&amp;quot;content&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;ad&amp;quot;&amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;utc&amp;quot;&amp;lt;/code&amp;gt; || Unix timestamp in milliseconds. Must be passed every 10 seconds. || &amp;lt;code&amp;gt;&amp;quot;1472760000000&amp;quot;&amp;lt;/code&amp;gt; || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Example Event =====&lt;br /&gt;
You can call events by passing values in the required parameters:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;devInfo&amp;quot;: [deviceInfo],&lt;br /&gt;
  &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
    &amp;quot;static&amp;quot;: [static metadata],&lt;br /&gt;
    &amp;quot;content&amp;quot;: [content metadata],&lt;br /&gt;
    &amp;quot;ad&amp;quot;: [ad metadata]&lt;br /&gt;
  },&lt;br /&gt;
  // Event Parameters&lt;br /&gt;
  &amp;quot;event&amp;quot;: [event], // event name&lt;br /&gt;
  &amp;quot;position&amp;quot;: [playheadPosition], //position in seconds&lt;br /&gt;
  &amp;quot;type&amp;quot;: [asset type], // values are &amp;quot;content&amp;quot; or &amp;quot;ad&amp;quot;&lt;br /&gt;
  &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot; //unix timestamp in milliseconds&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note:''' The full payload including &amp;quot;devInfo&amp;quot; and &amp;quot;metadata&amp;quot; must be populated in each event request.&lt;br /&gt;
&lt;br /&gt;
===== Sample Event Lifecycle =====&lt;br /&gt;
The sample event lifecycle can be used as a reference for identifying the order for calling events and values to pass.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Start of Session: session ID created when App is opened&lt;br /&gt;
&lt;br /&gt;
// Preroll&lt;br /&gt;
Ad Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
 &lt;br /&gt;
// Content&lt;br /&gt;
Content Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Midroll&lt;br /&gt;
Midroll Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Content resumes at 15 minutes&lt;br /&gt;
Content Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;900&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Content completes at 30 minutes&lt;br /&gt;
Complete {&amp;quot;event&amp;quot;: &amp;quot;complete&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;1800&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
 &lt;br /&gt;
// Postroll&lt;br /&gt;
Ad Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
//End of Session: The delete event should be called when the App is exited. The values for position and type not required to be passed.&lt;br /&gt;
Delete { &amp;quot;event&amp;quot;: &amp;quot;delete&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Sample Event Lifecycle - Detailed Storyline'''&lt;br /&gt;
This detailed event sequence provides additional insight for the correct events to call when handling certain playback scenarios.&lt;br /&gt;
&amp;lt;syntaxhighlight lang='javascript'&amp;gt;// SESSION STARTS&lt;br /&gt;
// Start of Session: session ID created when App is opened&lt;br /&gt;
&lt;br /&gt;
// PREROLL&lt;br /&gt;
// Preroll Start - Start each Ad with a position of &amp;quot;0&amp;quot;, resetting to '0' for each Ad, and Ad break.&lt;br /&gt;
Ad Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472760000000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Preroll Stop - End each Ad with the final position of the Ad.&lt;br /&gt;
Ad Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;15&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472761500000&amp;quot;}&lt;br /&gt;
 &lt;br /&gt;
// CONTENT &lt;br /&gt;
// Content Start - Start new content streams with a position of &amp;quot;0&amp;quot; incrementing the position every 10 seconds.&lt;br /&gt;
Content Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472761500000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Content Stop Before Ad Break - Send a playhead update including the current content positon before an Ad break.&lt;br /&gt;
Content Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;299&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472787400000&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
// MIDROLL&lt;br /&gt;
// Midroll Start - Start each Ad with a position of &amp;quot;0&amp;quot;, resetting to '0' for each Ad, and Ad break.&lt;br /&gt;
Midroll Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472787500000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Midroll Stop - End each Ad with the final position of the Ad.&lt;br /&gt;
Ad Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;60&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472793500000&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
// CONTENT&lt;br /&gt;
// Content resumes at 5 minutes - Send playhead update with the current resumed position, and begin incrimenting the positon every 10 seconds.&lt;br /&gt;
Content Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;300&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472799500000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Content completes at 10:12 - Make sure to send in the playhead event with the final content position before sending the complete event.&lt;br /&gt;
Final Content Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;612&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472830700000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
Complete {&amp;quot;event&amp;quot;: &amp;quot;complete&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;612&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472830800000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// POSTROLL&lt;br /&gt;
// Postroll Start - Start each Ad with a position of &amp;quot;0&amp;quot;, resetting to '0' for each Ad, and Ad break.&lt;br /&gt;
Ad Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;0&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472830900000&amp;quot;} &lt;br /&gt;
&lt;br /&gt;
// Postroll Stop - End each Ad with the final position of the Ad.&lt;br /&gt;
Ad Playhead {&amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;45&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;ad&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472835300000&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
// SESSION ENDS&lt;br /&gt;
&lt;br /&gt;
//End of Session: The delete event should be called when the App is exited. The values for position and type not required to be passed.&lt;br /&gt;
Delete { &amp;quot;event&amp;quot;: &amp;quot;delete&amp;quot;, &amp;quot;position&amp;quot;: &amp;quot;&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;, &amp;quot;utc&amp;quot;: &amp;quot;1472835400000&amp;quot;} &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Handling Playhead=====&lt;br /&gt;
Calling &amp;lt;code&amp;gt;&amp;quot;playhead&amp;quot;&amp;lt;/code&amp;gt; is critical for accurate duration crediting. You can reference the below guidance to determine the correct playhead position to pass depending on the playback scenario.&lt;br /&gt;
&lt;br /&gt;
'''Playhead: General'''&lt;br /&gt;
* Playhead position must start at 0 for each new asset, and be passed at least every 10 seconds.&lt;br /&gt;
* Final postion must be sent at the end of content or an ad&lt;br /&gt;
* Playheads should be sent in seconds only, not milliseconds&lt;br /&gt;
&lt;br /&gt;
'''Playhead: Ads'''&lt;br /&gt;
* The final position must be sent when switching from content to ad, or ad to content.&lt;br /&gt;
* Each ad playhead position should be 0 at ad start.&lt;br /&gt;
* For Ad Pods, playhead must be called, and reset to 0 for each individual ad. &lt;br /&gt;
* The last content position before an Ad should be sent before switching to Ads.&lt;br /&gt;
* When content has resumed following an ad break, the playhead position update must continue where the previous content segment left off.&lt;br /&gt;
&lt;br /&gt;
'''Playhead: User Actions'''&lt;br /&gt;
* Upon user scrubbing, the current position must be sent before a user scrubs, and the new position should be sent where the user lands, and begin sending in the 10 second updates thereafter.&lt;br /&gt;
* On pause, send the current position and then discontinue sending playhead event updates.&lt;br /&gt;
* If a user exits a stream early, the last current position must be sent in a playhead update to receive accurate duration.&lt;br /&gt;
&lt;br /&gt;
===== Interruption Scenarios =====&lt;br /&gt;
&lt;br /&gt;
As part of configuring events, you will need to handle all possible interruption scenarios such as:&lt;br /&gt;
&lt;br /&gt;
*Wi-Fi OFF / ON&lt;br /&gt;
*App going Background / Foreground (Video players only, not for Audio players)&lt;br /&gt;
*App Crash or Exit&lt;br /&gt;
&lt;br /&gt;
When playback is interrupted, the app needs to send delete immediately.&lt;br /&gt;
&lt;br /&gt;
Once playback resumes, a new session will need to be created with a unique session ID. All of the required metadata and events will need to be sent.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' The session will automatically timeout after 30 minutes of inactivity.&lt;br /&gt;
&lt;br /&gt;
=== Example Request ===&lt;br /&gt;
&lt;br /&gt;
Now that we walked through the Cloud API integration steps, your requests should have the following components: Session ID, App ID, and Payload. You can reference the example below when your reviewing your integration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// 1. Create Session ID&lt;br /&gt;
sessionID = dfc7dc6a-66a7-4705-9fba-adaaf7e3d5e0  // Example sessionID created using a UUID Generator&lt;br /&gt;
&lt;br /&gt;
// 2. Define URL Structure with App ID and Session ID&lt;br /&gt;
sessionURL = https://sandbox2-cloudapi.imrworldwide.com/nmapi/v2/[appid]/[sessionID]/a?b=&lt;br /&gt;
&lt;br /&gt;
// 3. Configure Payload&lt;br /&gt;
// 3.1 Configure Payload: devInfo &lt;br /&gt;
payload = {&lt;br /&gt;
 &amp;quot;devInfo&amp;quot;: {&lt;br /&gt;
   &amp;quot;devId&amp;quot;: &amp;quot;AD-ID&amp;quot;, &lt;br /&gt;
   &amp;quot;apn&amp;quot;: &amp;quot;AppName&amp;quot;,&lt;br /&gt;
   &amp;quot;apv&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;br /&gt;
   &amp;quot;uoo&amp;quot;: &amp;quot;false&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &lt;br /&gt;
  // 3.2 Configure Payload: metadata&lt;br /&gt;
  &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
    &amp;quot;static&amp;quot;: {}, // object for measuring static content&lt;br /&gt;
    &amp;quot;content&amp;quot;: { // object for measuring video content&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, // &amp;quot;content&amp;quot; for video&lt;br /&gt;
      &amp;quot;assetid&amp;quot;: &amp;quot;VIDEO-ID123&amp;quot;, // unique ID for video&lt;br /&gt;
      &amp;quot;isfullepisode&amp;quot;: &amp;quot;y&amp;quot;, // full episode flag&lt;br /&gt;
      &amp;quot;program&amp;quot;: &amp;quot;Program Name&amp;quot;, // program name&lt;br /&gt;
      &amp;quot;title&amp;quot;: &amp;quot;Episode Title S3 - EP1&amp;quot;, // episode name&lt;br /&gt;
      &amp;quot;length&amp;quot;: &amp;quot;1800&amp;quot;, // content duration in seconds&lt;br /&gt;
      &amp;quot;segB&amp;quot;: &amp;quot;Custom Segment B&amp;quot;, // custom segment&lt;br /&gt;
      &amp;quot;segC&amp;quot;: &amp;quot;Custom Segment C&amp;quot;, // custom segment&lt;br /&gt;
      &amp;quot;crossId1&amp;quot;: &amp;quot;Standard Episode ID&amp;quot;, // episode ID&lt;br /&gt;
      &amp;quot;crossId2&amp;quot;: &amp;quot;Content Originator ID&amp;quot;, // content orginator (required for distributors)&lt;br /&gt;
      &amp;quot;airdate&amp;quot;: &amp;quot;20161013 20:00:00&amp;quot;, // airdate&lt;br /&gt;
      &amp;quot;adloadtype&amp;quot;: &amp;quot;2&amp;quot;, // ad load flag&lt;br /&gt;
      &amp;quot;hasAds&amp;quot;: &amp;quot;1&amp;quot;, // content contains ads = 1 / no ads = 0&lt;br /&gt;
      &amp;quot;progen&amp;quot;: &amp;quot;CV&amp;quot; // program genre abbreviation&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;ad&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;preroll&amp;quot;, // type of ad&lt;br /&gt;
      &amp;quot;assetid&amp;quot;: &amp;quot;AD-ID123&amp;quot; // unique ID for ad&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
    &lt;br /&gt;
  // 3.3 Configure Payload: events&lt;br /&gt;
  &amp;quot;event&amp;quot;: &amp;quot;playhead&amp;quot;, //event name&lt;br /&gt;
  &amp;quot;position&amp;quot;: &amp;quot;300&amp;quot;, // position in seconds&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;, //&amp;quot;content&amp;quot; or &amp;quot;ad&amp;quot;&lt;br /&gt;
  &amp;quot;utc&amp;quot;: &amp;quot;1456448742000&amp;quot; //unix timestamp in milliseconds &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Append payload to URL&lt;br /&gt;
var image = new Image()&lt;br /&gt;
image.onerror = function() {&lt;br /&gt;
  // wait and send again&lt;br /&gt;
}&lt;br /&gt;
(new Image).src = sessionURL+encodeURIComponent(JSON.stringify(payload));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To ensure that the GET request does not receive a CORS issue, make sure to use the IMAGE request in conjunction with the content-type &amp;quot;text/plain&amp;quot; so CORS preflight is not triggered, causing the request to be rejected.&lt;br /&gt;
&lt;br /&gt;
==== Enable Debug Logging ====&lt;br /&gt;
&lt;br /&gt;
Now that you have set up the Cloud API requests, you can enable debug logging to validate your integration. Enabling debug logging is required for Nielsen certification.&lt;br /&gt;
&lt;br /&gt;
==== GET Request ====&lt;br /&gt;
&lt;br /&gt;
Display GET Request to console using a name to identify each event (e.g. playhead).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&amp;quot;Event&amp;quot;, image); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Payload ====&lt;br /&gt;
&lt;br /&gt;
Output payload to identify required metadata and events.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(&amp;quot;Event Payload&amp;quot;, payload); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HTTPS Response Code ====&lt;br /&gt;
&lt;br /&gt;
Confirm request was completed by viewing HTTPS response code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
code = msg.GetResponseCode();&lt;br /&gt;
console.log(&amp;quot;Response Code&amp;quot;, code); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can reference the HTTPS Response Code table when reviewing your requests:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Status Code !! Status Text !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; || OK || request received&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;403&amp;lt;/code&amp;gt; || Forbidden || invalid App ID&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt; || Not Found || JSON issue&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Opt-Out ==&lt;br /&gt;
Your app must provide a means for the user to Opt-Out, or Opt-In to Nielsen Measurement. This requirement can be fulfilled by checking the device OS for the user's setting of &amp;quot;Limit Ad Tracking&amp;quot; or similar option. If the device offers &amp;quot;Limit Ad Tracking&amp;quot; settings, you should set &amp;lt;code&amp;gt;uoo=true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;uoo=false&amp;lt;/code&amp;gt; depending on the user's privacy setting. Also, ensure that the &amp;lt;code&amp;gt;devId&amp;lt;/code&amp;gt; is set to a blank value if the user elects to opt-out.&lt;br /&gt;
&lt;br /&gt;
If the device does not have OS-level &amp;quot;Do Not Track&amp;quot; settings, you can implement opt-out by creating an Opt-Out/Opt-In button, toggle switch, or slider within the app &amp;quot;Settings&amp;quot;, or &amp;quot;About&amp;quot; section to allow the user selection.&lt;br /&gt;
&lt;br /&gt;
[[File:Nielsen Opt-Out.png|link=]]&lt;br /&gt;
&lt;br /&gt;
You will need to store the User Opt-Out (uoo) status, so that it can be retrieved and populated in the &amp;lt;code&amp;gt;&amp;quot;devInfo&amp;quot;&amp;lt;/code&amp;gt; metadata which will be sent in every Cloud API event (playhead, complete, &amp;amp; delete). &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! uoo Key !! Description !! Values&lt;br /&gt;
|-&lt;br /&gt;
| uoo || Device is Opted-In to Nielsen Measurement (Recommended Default Setting) || &amp;lt;code&amp;gt;&amp;quot;false&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| uoo || Device is Opted-Out of Nielsen Measurement || &amp;lt;code&amp;gt;&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== devInfo Opt-In JSON Payload Example =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;devInfo&amp;quot;: {&lt;br /&gt;
    &amp;quot;apn&amp;quot;: &amp;quot;Cloud API Sample App&amp;quot;,&lt;br /&gt;
    &amp;quot;apv&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;devId&amp;quot;: &amp;quot;7be25cf9-8c40-5cc2-871e-19bf41940288&amp;quot;,&lt;br /&gt;
    &amp;quot;uoo&amp;quot;: &amp;quot;false&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== devInfo Opt-Out JSON Payload Example =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;quot;devInfo&amp;quot;: {&lt;br /&gt;
    &amp;quot;apn&amp;quot;: &amp;quot;Cloud API Sample App&amp;quot;,&lt;br /&gt;
    &amp;quot;apv&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;devId&amp;quot;: &amp;quot;&amp;quot;, //devId must be blank when a user elects to Opt-Out.&lt;br /&gt;
    &amp;quot;uoo&amp;quot;: &amp;quot;true&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Privacy Information Template To Include In Opt-Out Screen =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Additionally, all applications must display the Nielsen privacy policy within their application, typically in the Settings/About screen of your application. The Nielsen privacy policy text is listed below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''''ABOUT NIELSEN MEASUREMENT'''''&lt;br /&gt;
&lt;br /&gt;
Television and the way we watch it have come a long way since Nielsen began measuring TV audiences in 1950. Today, the ability to watch our favorite shows at any time and on multiple devices amplifies the need for exceptionally adept and flexible audience measurement capabilities.&lt;br /&gt;
&lt;br /&gt;
Consumers are changing with the times, and the same goes for us. As technology continues to evolve and media companies try new ways to attract viewers, understanding what consumers are watching — and what they're watching on — is more important than ever. Today, viewing video is a personal and mobile experience — anytime and anywhere. Our capabilities provide relevant metrics that are necessary to inform successful marketing and programming and drive continued growth. As a global information and measurement leader, we are committed to protecting the privacy and security of the data we collect, process and use. While our digital measurement products are not used to identify you in any way, they help us and our clients measure and analyze how consumers engage with media across online, mobile and emerging technologies, and offer insights into consumer behavior.&lt;br /&gt;
&lt;br /&gt;
'''''YOUR CHOICES'''''&lt;br /&gt;
&lt;br /&gt;
Nielsen believes that you should have a choice about whether to contribute to our research and insights. To opt out or opt in to Nielsen measurement, please toggle your &amp;quot;Limit Ad Tracking&amp;quot; (or similar setting) on your device, or make the appropriate selection within the application's settings. If you have this app on more than one device, you will need to opt out of this app on each device. To learn more about our digital measurement products and your choices in regard to them, please visit https://www.nielsen.com/digitalprivacy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
Before providing an app build to Nielsen for testing, it is important to run validation checks once you have enabled debug logging.&lt;br /&gt;
&lt;br /&gt;
=== Payload Validation ===&lt;br /&gt;
&lt;br /&gt;
Ensure that all of the required payload data is populating while testing several videos. The following areas are critical to measurement:&lt;br /&gt;
*devInfo&lt;br /&gt;
*Asset metadata for both content, and ads&lt;br /&gt;
*Events&lt;br /&gt;
*Opt-Out status&lt;br /&gt;
&lt;br /&gt;
=== Player Events ===&lt;br /&gt;
Review event calls:&lt;br /&gt;
&lt;br /&gt;
==== playhead ====&lt;br /&gt;
*Playhead position updates every 10 seconds starting at position '0' for each new asset.&lt;br /&gt;
*Final playhead position is sent on content, or ad before switching between assets.&lt;br /&gt;
*Content metadata remains constant throughout an episode, or clip play.&lt;br /&gt;
*Ad metadata is populated appropriately for each individual ad.&lt;br /&gt;
*Playhead position update resumes for content after an ad break, and resets to 0 for each individual ad.&lt;br /&gt;
*For scrubbing, last current position should be sent while scrubbing occurs, and the new position should also be sent where the user scrubs to.&lt;br /&gt;
*Exiting a stream early should execute the last current position in a playhead update to receive accurate duration.&lt;br /&gt;
*Upon pause, the current position should be sent, and playhead updates should stop incrementing until resume play occurs.&lt;br /&gt;
&lt;br /&gt;
==== complete ====&lt;br /&gt;
*Check that the complete event executes upon content complete after the final playhead update is sent&lt;br /&gt;
*Do not execute the complete event for ads&lt;br /&gt;
&lt;br /&gt;
==== delete ====&lt;br /&gt;
*Check to see that the delete event occurs upon app exit, if the platform has the necessary exit callback events.&lt;br /&gt;
&lt;br /&gt;
==== GET Request Format ====&lt;br /&gt;
*Ensure that the event payloads are formatted in JSON&lt;br /&gt;
*Check to see that each of the Cloud API GET requests are properly encoded&lt;br /&gt;
&lt;br /&gt;
==== HTTPS Response ====&lt;br /&gt;
*Make sure that each of the Cloud API Get requests are received by the Nielsen Cloud API properly through use of the HTTPS Response Code outputs enabled in console.&lt;br /&gt;
&lt;br /&gt;
==== Opt-Out ====&lt;br /&gt;
*Test the &amp;quot;uoo&amp;quot; key gets populated accurately for both Opt-In and Opt-Out selections by validating the Cloud API events called after the user Opt-Out/Opt-In selection.&lt;br /&gt;
*Test that the devId field is populated with a blank value if a user has elected to Opt-Out. For example: &amp;quot;devId&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
*If the device supports &amp;quot;Limit Ad Tracking&amp;quot; or has device &amp;quot;Opt-Out&amp;quot; settings, test that uoo=true, and that devId is set to a blank value if enabled in the device settings.&lt;br /&gt;
&lt;br /&gt;
== Go Live ==&lt;br /&gt;
After your integration has been certified, you will need to: Change Endpoint and Disable Logging.&lt;br /&gt;
&lt;br /&gt;
'''Change Endpoint:''' You will need to update to the production endpoint:&lt;br /&gt;
&lt;br /&gt;
*Testing: &amp;lt;code&amp;gt;https://sandbox2-cloudapi.imrworldwide.com/nmapi/v2/&amp;lt;/code&amp;gt;&lt;br /&gt;
*Production: &amp;lt;code&amp;gt;https://cloudapi.imrworldwide.com/nmapi/v2/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your production URL structure should now be:&lt;br /&gt;
&amp;lt;code&amp;gt;https://cloudapi.imrworldwide.com/nmapi/v2/[appid]/[sessionID]/a?b=[payload]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Disable Logging:''' You can now disable debug logging&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_API_Reference&amp;diff=6795</id>
		<title>Browser SDK API Reference</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_API_Reference&amp;diff=6795"/>
		<updated>2024-12-11T20:17:13Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: /* Multiple SDK Instances */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Setting up Development Environment ==&lt;br /&gt;
=== Step 1: Configure Content Management System (CMS) ===&lt;br /&gt;
Configure CMS to send the required values (see table below). Any internal CMS_variable names can be used for passing the data.&lt;br /&gt;
&lt;br /&gt;
Ensure to capture these CMS_variable names in the SDK Configuration Form.&lt;br /&gt;
&lt;br /&gt;
For more information on setting variable names, see the SDK Configuration Form included within the SDK package.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Required Data !! Description !! Value&lt;br /&gt;
|-&lt;br /&gt;
| dataSrc || Used when both CMS metadata and ID3 data are present in the player. Setting this field tells the SDK whether to use the CMS metadata or the ID3 payload to derive the pings || cms&lt;br /&gt;
|-&lt;br /&gt;
| type || Type of asset: ad or content || preroll, midroll, postroll, or content&lt;br /&gt;
|-&lt;br /&gt;
| assetid || unique ID assigned to asset || custom &amp;lt;br&amp;gt;(no [[Special Characters]])&lt;br /&gt;
|-&lt;br /&gt;
| OCR Tag || OCR tag provided by Nielsen for implementation on the ad unit || Complete OCR URL&lt;br /&gt;
|-&lt;br /&gt;
| program || Name of program (25 character limit) || custom&lt;br /&gt;
|-&lt;br /&gt;
| title || Episode title (40 character limit) || custom&lt;br /&gt;
|-&lt;br /&gt;
| length || Length of content in seconds || Length in seconds, 0 for live stream&lt;br /&gt;
|-&lt;br /&gt;
| adloadtype || Type of ad load || &amp;quot;1&amp;quot; - Linear &amp;quot;2&amp;quot; - Dynamic(default)&lt;br /&gt;
|-&lt;br /&gt;
| hasAds || Identify if content includes Ads ||  &amp;quot;0&amp;quot; - no ads &amp;quot;1&amp;quot; - includes ads &amp;quot;2&amp;quot; - unknown(default)&lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode || Full episode flag	|| &amp;quot;y&amp;quot; - full episode &amp;quot;n&amp;quot; - non full episode&lt;br /&gt;
|-&lt;br /&gt;
| segA || Segment A (this is not available for video reporting as the episode title is reported) || custom value&lt;br /&gt;
|-&lt;br /&gt;
| segB || Custom segment B || custom value&lt;br /&gt;
|-&lt;br /&gt;
| segC || Custom segment C || custom value&lt;br /&gt;
|-&lt;br /&gt;
| crossId1 || Standard episode ID || custom value&lt;br /&gt;
|-&lt;br /&gt;
| crossId2 || Content originator (required only for distributors) || custom value&lt;br /&gt;
|-&lt;br /&gt;
| airdate || Original air date and time in Eastern Time. For non-US countries, it should be local time. || YYYYMMDD HH24:MI:SS&lt;br /&gt;
|-&lt;br /&gt;
| containerId || HTML DOM element of the Player container (for Viewability&amp;amp;Audibility feature only) || custom value &lt;br /&gt;
|-&lt;br /&gt;
|luid&lt;br /&gt;
|Living Unit ID - Experian Household ID&lt;br /&gt;
'''Note: This parameter is applicable only for CTV and First Party Livestream data'''&lt;br /&gt;
|&amp;quot;B0EOFEDgD&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Complete the Nielsen SDK Configuration Form ===&lt;br /&gt;
The SDK is designed to map the &amp;lt;code&amp;gt;CMS_variable names&amp;lt;/code&amp;gt;. To support the custom mapping, the developer is required to complete the SDK Configuration Form. The form will be provided during onboarding along with this guide.&lt;br /&gt;
&lt;br /&gt;
== Initialization ==&lt;br /&gt;
=== Obtain the Nielsen Application ID (apid) and Browser SDK URLs ===&lt;br /&gt;
The Nielsen &amp;lt;code&amp;gt;apid&amp;lt;/code&amp;gt; is required to enable SDK functionality. Technical Account Manager will provide an apid for each player configuration.  &lt;br /&gt;
Browser SDK can support URLs that use any of the protocols – HTTPS and HTTP.  &lt;br /&gt;
&lt;br /&gt;
=== Configure Browser SDK ===&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
&lt;br /&gt;
'''Add Static Queue Snippet'''&lt;br /&gt;
&lt;br /&gt;
*Add Static Queue Snippet&lt;br /&gt;
*Create SDK Instance&lt;br /&gt;
&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
'''Create SDK Instance'''&lt;br /&gt;
&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
'''Initialization API Call'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When creating an instance, pass the following three values:&lt;br /&gt;
&lt;br /&gt;
=== SDK Initialization – Global Parameters &amp;lt;span class=&amp;quot;anchor&amp;quot; id=&amp;quot;SDK Initialization Global Parameters&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameters !! Description !! Value&lt;br /&gt;
|-&lt;br /&gt;
| apid || UniqueID assigned to player/site. || 	'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
| instanceName || Name of SDK instance || &amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug || Enables Nielsen console logging. Only required for testing || &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| containerId || HTML DOM element id of the player container. Only for Viewability &amp;amp; Audibility feature. || {containerId: &amp;quot;playerId1&amp;quot;}&lt;br /&gt;
|-&lt;br /&gt;
| hem_sha256 || SHA256-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| hem_sha1 || SHA1-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;XvBniTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| hem_md5 || MD5-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;JnIbdTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| uid2 || An identifier based on a user’s verifiable PII (e.g. hashed email). UID2.0 was initially created by The Trade Desk (TTD) and is now managed by Prebid. || &amp;quot;MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| uid2_token || Encrypted Unified ID 2.0 || &amp;quot;AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8Ql&lt;br /&gt;
DSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeK&lt;br /&gt;
QI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhC&lt;br /&gt;
xG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{example_bsdk_init}}&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Configuration'''&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
  var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;,&amp;quot;nlsnInstance&amp;quot;, {nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multiple SDK Instances ===&lt;br /&gt;
The Browser SDK allows instantiating multiple instances of the object, which can be used simultaneously without any problems, however they must be instantiated with their own unique instance names. There is no maximum number of instances that is enforced in the browser.&lt;br /&gt;
&lt;br /&gt;
The below examples will make use of the same AppId, however using different AppIds will work as well. The principles below follow the same initialization rules stated above for a single instance and simply require a unique instance name and variable name with which the returned instance is assigned.&lt;br /&gt;
&lt;br /&gt;
For more information around the possible parameters that can be passed as well as deeper descriptions for the API calls, please refer to the section on  [[#SDK Initialization Global Parameters|'''SDK Initialization - Global Parameters''']].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Example of 2 instances on the same page'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Add Static Queue Snippet&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    !function (e, n) {&lt;br /&gt;
      function t(e) {&lt;br /&gt;
        return &amp;quot;object&amp;quot; == typeof e ? JSON.parse(JSON.stringify(e)) : e&lt;br /&gt;
      }&lt;br /&gt;
      e[n] = e[n] ||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ: function (o, r, c) {&lt;br /&gt;
          var s = e.document,&lt;br /&gt;
            a = s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async = 1,&lt;br /&gt;
            a.src = (&amp;quot;http:&amp;quot; === e.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + o + &amp;quot;.js#name=&amp;quot; + r + &amp;quot;&amp;amp;ns=&amp;quot; + n;&lt;br /&gt;
          var i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a, i),&lt;br /&gt;
            e[n][r] = e[n][r] || {&lt;br /&gt;
              g: c || {},&lt;br /&gt;
              ggPM: function (o, c, s, a, i) { e[n][r].q = e[n][r].q || []; try { var l = t([o, c, s, a, i]); e[n][r].q.push(l) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } },&lt;br /&gt;
              trackEvent: function (o) { e[n][r].te = e[n][r].te || []; try { var c = t(o); e[n][r].te.push(c) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } }&lt;br /&gt;
            },&lt;br /&gt;
            e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    //Create SDK Instance(s)&lt;br /&gt;
    // Notice the unique instance name given to each instance below and the unique variable name for each instance&lt;br /&gt;
    var nSdkInstanceLive = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;instanceLive&amp;quot;, {&lt;br /&gt;
        nol_sdkDebug: 'debug',&lt;br /&gt;
        optout: 'false'&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    var nSdkInstanceVod = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;instanceVod&amp;quot;, {&lt;br /&gt;
        nol_sdkDebug: 'debug',&lt;br /&gt;
        optout: 'false'&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Example of 2 instances using a parent page and iFrame'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Parent Page (index.html)&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;ie=edge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;DCR Static/DCR Video&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    /* NLSQUEUE build v*/&lt;br /&gt;
    !function(e,n){&lt;br /&gt;
    function t(e){&lt;br /&gt;
      return&amp;quot;object&amp;quot;==typeof e?JSON.parse(JSON.stringify(e)):e&lt;br /&gt;
    }&lt;br /&gt;
    e[n]=e[n]||&lt;br /&gt;
    {&lt;br /&gt;
      nlsQ:function(o,r,c){&lt;br /&gt;
        var s=e.document,&lt;br /&gt;
        a=s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
        a.async=1,&lt;br /&gt;
        a.src=(&amp;quot;http:&amp;quot;===e.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+o+&amp;quot;.js#name=&amp;quot;+r+&amp;quot;&amp;amp;ns=&amp;quot;+n;&lt;br /&gt;
        var i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
        return i.parentNode.insertBefore(a,i),&lt;br /&gt;
        e[n][r]=e[n][r]||{g:c||{},&lt;br /&gt;
        ggPM:function(o,c,s,a,i){e[n][r].q=e[n][r].q||[];try{var l=t([o,c,s,a,i]);e[n][r].q.push(l)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}},&lt;br /&gt;
        trackEvent:function(o){e[n][r].te=e[n][r].te||[];try{var c=t(o);e[n][r].te.push(c)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}}},&lt;br /&gt;
        e[n][r]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // SDK Initialization&lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;staticPage&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: 'debug',&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Static Metadata &lt;br /&gt;
    var staticMetadata = {&lt;br /&gt;
      assetid: 'staticTestPage',&lt;br /&gt;
      type: 'static'&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    // Event 'staticstart' call&lt;br /&gt;
    nSdkInstance.ggPM(14, staticMetadata);&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;h1&amp;gt;DCR Static on Parent/DCR Video in iFrame&amp;lt;/h1&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Static measurement is current on parent page when window is in focus&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;iframe src=&amp;quot;./dcr-video.html&amp;quot; frameborder=&amp;quot;0&amp;quot; width=&amp;quot;650&amp;quot; height=&amp;quot;500&amp;quot; style=&amp;quot;background-color: rgb(42, 217, 248);&amp;quot; id=&amp;quot;video-iframe&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Nested iFrame Referenced on Parent Page (dcr-video.html)&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;ie=edge&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;iFrame Same Source&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
    /* NLSQUEUE build v*/&lt;br /&gt;
    !function(e,n){&lt;br /&gt;
      function t(e){&lt;br /&gt;
        return&amp;quot;object&amp;quot;==typeof e?JSON.parse(JSON.stringify(e)):e&lt;br /&gt;
      }&lt;br /&gt;
      e[n]=e[n]||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ:function(o,r,c){&lt;br /&gt;
          var s=e.document,&lt;br /&gt;
          a=s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async=1,&lt;br /&gt;
          a.src=(&amp;quot;http:&amp;quot;===e.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+o+&amp;quot;.js#name=&amp;quot;+r+&amp;quot;&amp;amp;ns=&amp;quot;+n;&lt;br /&gt;
          var i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a,i),&lt;br /&gt;
          e[n][r]=e[n][r]||{g:c||{},&lt;br /&gt;
          ggPM:function(o,c,s,a,i){e[n][r].q=e[n][r].q||[];try{var l=t([o,c,s,a,i]);e[n][r].q.push(l)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}},&lt;br /&gt;
          trackEvent:function(o){e[n][r].te=e[n][r].te||[];try{var c=t(o);e[n][r].te.push(c)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}}},&lt;br /&gt;
          e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // SDK Initialization&lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;videoPlayer&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: 'debug',&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    var contentMetadata = {&lt;br /&gt;
        type: &amp;quot;content&amp;quot;,&lt;br /&gt;
        length: &amp;quot;300&amp;quot;,&lt;br /&gt;
        title: &amp;quot;Skydiving Across Europe&amp;quot;,&lt;br /&gt;
        program: &amp;quot;latacg&amp;quot;,&lt;br /&gt;
        censuscategory: &amp;quot;Enlisted&amp;quot;,&lt;br /&gt;
        assetid: &amp;quot;204558915992&amp;quot;,&lt;br /&gt;
        section: &amp;quot;ProgramAsset8&amp;quot;,&lt;br /&gt;
        tv: &amp;quot;true&amp;quot;,&lt;br /&gt;
        adModel: &amp;quot;0&amp;quot;,&lt;br /&gt;
        dataSrc: &amp;quot;cms&amp;quot;,&lt;br /&gt;
        segA: &amp;quot;S07E04:NBC&amp;quot;,&lt;br /&gt;
        segB: &amp;quot;teams&amp;quot;,&lt;br /&gt;
        segC:&amp;quot;AtlanataFalcons&amp;quot;,&lt;br /&gt;
      }&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;I'm iframe SDK DCR Video measurement, DCR static measurement should continue when clicking &amp;quot;play&amp;quot; on video&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;main&amp;gt;&lt;br /&gt;
      &amp;lt;video&lt;br /&gt;
      controls&lt;br /&gt;
      src=&amp;quot;https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4&amp;quot;&lt;br /&gt;
      poster=&amp;quot;https://peach.blender.org/wp-content/uploads/title_anouncement.jpg?x11217&amp;quot;&lt;br /&gt;
      width=&amp;quot;620&amp;quot;&amp;gt;&lt;br /&gt;
      Sorry, your browser doesn't support embedded videos, but don't worry, you can&lt;br /&gt;
      &amp;lt;a href=&amp;quot;https://archive.org/details/BigBuckBunny_124&amp;quot;&amp;gt;download it&amp;lt;/a&amp;gt;&lt;br /&gt;
      and watch it with your favorite video player!&lt;br /&gt;
    &amp;lt;/video&amp;gt;&lt;br /&gt;
    &amp;lt;/main&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;../player.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SDK Initialization to measure the Viewability &amp;amp; Audibility ===&lt;br /&gt;
To support viewability metrics in the web page the integrator has to provide a tag value of the player view to let Nielsen SDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in the as string while initializing the Nielsen browser SDK.&lt;br /&gt;
&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{containerId: &amp;lt;playerElementID&amp;gt;, nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Initialization for Viewability'''&lt;br /&gt;
&lt;br /&gt;
Your configuration should include the Static Queue Snippet and an SDK Instance for your unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Add Static Queue Snippet&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    ! function(t, n) {&lt;br /&gt;
        t[n] = t[n] || {&lt;br /&gt;
            nlsQ: function(e, o, c, r, s, i) {&lt;br /&gt;
                return s = t.document,&lt;br /&gt;
                    r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
                    r.async = 1,&lt;br /&gt;
                    r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + o + &amp;quot;&amp;amp;ns=&amp;quot; + n,&lt;br /&gt;
                    i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
                    i.parentNode.insertBefore(r, i),&lt;br /&gt;
                    t[n][o] = t[n][o] || {&lt;br /&gt;
                        g: c || {},&lt;br /&gt;
                        ggPM: function(e, c, r, s, i) {&lt;br /&gt;
                            (t[n][o].q = t[n][o].q || []).push([e, c, r, s, i])&lt;br /&gt;
                        }&lt;br /&gt;
                    }, t[n][o]&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    (window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
//Create SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {containerId: “player1”, nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser SDK API Methods &amp;amp; Properties ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method / Property !! Event # !! DTVR !! DAR !! DCR !! Description&lt;br /&gt;
|-&lt;br /&gt;
| [[loadMetadata (Browser)|loadMetadata]] || 15 || ✔ || ✔ || ✔ || Used when there is a preroll ad that needs to be associated with content metadata. The loadMetadata will first be called to populate the content metadata values and then the loadMetadata for ad metadata will be called. This allows sending a content ping with the ad info, even if the user bails out during the preroll ad.&lt;br /&gt;
|-&lt;br /&gt;
| [[play (Browser)|play]] || 5 || ✔ || ✘ || ✔ || Used when there is an ID3 fed product such as DTVR and the client does not want to send in all the CMS metadata that is sent in loadMetadata. This allows the client to send in at least the required “channel name” value associated to the ID3 feed. When the client passes in the channelName, they can change the CMS data stored by passing new values. If this event is not called then the “channel name” value populated will be the default value of “defaultChannelName”.&lt;br /&gt;
|-&lt;br /&gt;
| [[sendID3 (Browser)|sendID3]] || 55 || ✔ || ✘ || ✘ || Used to send the ID3 metadata.&lt;br /&gt;
|-&lt;br /&gt;
| [[setPlayheadPosition (Browser)|setPlayheadPosition]] || 49 || ✘ || ✘ || ✔ || Used to send the playhead position.&lt;br /&gt;
|-&lt;br /&gt;
| [[stop (Browser)|stop]] || 7 || ✘ || ✘ || ✔ || Used when switching between ad and content or content and ad.&lt;br /&gt;
|-&lt;br /&gt;
| [[end (Browser)|end]] || 57 || ✔ || ✘ || ✔ || This is triggered 1) at the end of the content stream, 2) if the user switches to another piece of content 3) when the browser is refreshed or closed&lt;br /&gt;
|-&lt;br /&gt;
| [[staticstart (Browser)|staticstart]] || 14 || ✘ || ✘ || ✔ || Used to send the metadata for the static page.&lt;br /&gt;
|-&lt;br /&gt;
| [[StaticEnd (Browser)|staticend]] || 56 || ✘ || ✘ || ✔ || In Single Page Application (SPA) it is imperative that staticend is called prior to the loading of new metadata. This allows the Browser SDK to properly credit the previous section/content being viewed before measuring the new one.&lt;br /&gt;
|-&lt;br /&gt;
| [[updateOTT (Browser)|updateOTT]] || - || ✘ || ✘ || ✔ || Used to notify Browser SDK that the remote OTT device (like Google ChromeCast, Roku, Amazon FireTV, etc.) is connected / disconnected (change of OTT status).&lt;br /&gt;
|-&lt;br /&gt;
| [[ onPaginate (Browser)|onPaginate]] || 30 || ✘ || ✘ || ✔ || Used to create a new instance of the SDK object&lt;br /&gt;
|-&lt;br /&gt;
| [[updateMetadata (Browser)|updateMetadata]] || 35 || ✔ || ✔ || ✔ || This event is used for updating metadata parameters for the content or ad that is being played.&lt;br /&gt;
|-&lt;br /&gt;
| [[setVolume_(Browser)|setVolume]] || 61 || ✔ || ✘ || ✔ || Used to pass in the player volume levels in %. Default value is -1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Retrieving ID3 Tags ==&lt;br /&gt;
The video player must have the ability to extract ID3 tags and supply them to the Browser SDK, based on the HLS standard.&lt;br /&gt;
*An ID3 tag spans two PES packets.&lt;br /&gt;
**In the first PES packet, look for www.nielsen.com, this is the start of the ID3 tag. Continue to parse the first PES packet until the undefined char &amp;quot;\ufffd&amp;quot; is found. This forms the first half of the ID3 tag&lt;br /&gt;
**In the second PES packet, identify the end pattern – a regEx of /(\/\d+){3}/ and look to remove the lowest index of either &amp;quot;\x00&amp;quot; and/or &amp;quot;\ufffd&amp;quot;. Now the second packet has been appended and the demarcation of the Nielsen-specific data has been defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Follow the procedure below, to extract Nielsen ID3 tags from an MPEG-2 transport stream (including HLS streams).&lt;br /&gt;
#Parse the Program Map Table (PMT) to find the PID of the metadata stream. Confirm the presence of the metadata descriptor described in section 2.3.3 of Apple’s “HTTP Live Streaming Metadata Spec.pdf”. Only private streams with metadata descriptor present should be considered as ID3-tag metadata streams.&lt;br /&gt;
#Parse the HLS/Transport stream for any '''PES header''' with the PID found in step 1.&lt;br /&gt;
#Follow standard MPEG-2 parsing procedures to locate the start of the payload of the PES packet.&lt;br /&gt;
#Copy the PES payload into a buffer.&lt;br /&gt;
#The ID3 tag spans 2 PES packets. Parse the stream for the next packet whose PID is set to the PID found in step 1. Typically the ID3 Tag is of 249 bytes. The steps below guide towards extraction of the ID3 tag&lt;br /&gt;
##In the first PES packet, look for &amp;quot;www.nielsen.com&amp;quot; , this is the start of the ID3 tag. Keep on parsing the first PES packet until the undefined char &amp;quot;\ufffd&amp;quot; is found. This forms the first half of the ID3 tag&lt;br /&gt;
##In the second PES packet, identify the end pattern, a regEx of /(\/\d+){3}/ and look to remove the lowest index of either “\x00” and/or “\ufffd”. Now the second packet has been appended and the demarcation of the Nielsen specific data has been defined. This segment can be simply substringed.&lt;br /&gt;
##Concatenate this substringed segment with the payload derived from the first packet get the ID3 payload.&lt;br /&gt;
#Check the length of the contents in the buffer to make sure that it is equal to the size of a Nielsen ID3 tag.&lt;br /&gt;
#Ensure that the ID3 byte array is converted into the string and escape it, so that the SDK can consume it.&lt;br /&gt;
Repeat steps 2 through 7 for all ID3 tags in the stream.&lt;br /&gt;
&lt;br /&gt;
'''References'''&lt;br /&gt;
*[http://www.iso.org/iso/catalogue_detail?csnumber=44169. ISO/IEC 13818-1:2007] Information technology – Generic coding of moving pictures and associated audio information: Systems&lt;br /&gt;
*https://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/HTTP_Live_Streaming_Metadata_Spec/&lt;br /&gt;
&lt;br /&gt;
=== Sample ID3 tags ===&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/X100zdCIGeIlgZnkYj6UvQ==/AAAB2Jz2_k74GXSzx4npHuI_&amp;lt;wbr /&amp;gt;JwJd3QSUpW30rDkGTcbHEzIMWleCzM-uvNOP9fzJcQMWQLJqzXMCAxParOb5sGijSV9dNM3QiBniJYGZ5GI-lL1fXTTN0IgZ4iWBmeRiPpS9AAAAAAAAAAAAAAAAAAAAAFJWFM5SVhTONNU=/00000/00000/00&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/R8WHe7pEBeqBhu8jTeXydg==/AAICoyitYqlxT7n6aZ0oMCGhe&amp;lt;wbr /&amp;gt;Fi4CXFp46AMUPZz1lMr_M9tr3_cjee1SHqxrOiVerMDLeyn9xzocZSKwi746Re8vNOtpNCAZjYABs_J0R25IHpvOc1HS8&amp;lt;wbr /&amp;gt;QHGgD5TgOJeS6gX100zdCIGeIlgZnkYj6UvVJWFNhSVhTiPE0=/00000/46016/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': ID3 tags are not applicable for International (Germany)&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser Opt-Out Implementation ==&lt;br /&gt;
The site in which video content is being measure via Nielsen methodology must provide the means for the user to opt-out of, or opt back into Nielsen Measurement.&lt;br /&gt;
&lt;br /&gt;
For Browser-based applications, opt-out setting is stored via Nielsen cookie. Therefore, it is only necessary that users be made aware of measurement opt-out by incorporating the template below in the user interface.&lt;br /&gt;
&lt;br /&gt;
=== Sample Opt Out Template ===&lt;br /&gt;
Our properties may feature Nielsen’s proprietary measurement software which will allow to contribute to market research, like Nielsen’s TV Ratings. To learn more about this information, see https://www.nielsen.com/digitalprivacy. Nielsen’s software may collect your choices with regards to it.&lt;br /&gt;
&lt;br /&gt;
== Nielsen Privacy Requirements ==&lt;br /&gt;
Privacy protections that Nielsen ensures to have with each App SDK integration are as follows.&lt;br /&gt;
*Disclosure of viewership data collection in EULA / Privacy Policy&lt;br /&gt;
*A link in the EULA/Privacy policy, or in another conspicuous location within the App, to a Nielsen-hosted web page outlining what Nielsen is collecting and how it is being used&lt;br /&gt;
*Method for users to opt-out of Nielsen measurement, any time while using the application&lt;br /&gt;
&lt;br /&gt;
=== Ratings Data Flow ===&lt;br /&gt;
Every view of creditable and watermarked content is measured by Nielsen.&lt;br /&gt;
[[File:RatingsDataFlow.png]]&lt;br /&gt;
&lt;br /&gt;
'''Information NOT Shared'''&lt;br /&gt;
* '''With Nielsen'''&lt;br /&gt;
** User's Identity&lt;br /&gt;
* '''With Data Provider'''&lt;br /&gt;
** Content information&lt;br /&gt;
** Whether user is viewing an ad or video content&lt;br /&gt;
** Player used to play the streaming (audio / video, etc.)&lt;br /&gt;
** Values being de-duped / aggregating for&lt;br /&gt;
&lt;br /&gt;
Nielsen collects only what it needs for audience measurement. Every view of creditable, watermarked content will be measured by Nielsen.&lt;br /&gt;
&lt;br /&gt;
=== Data Collected ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type of Information !! Parameter !! Transmitted to Nielsen? !! Sent to Provider?&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; | Nielsen ID3 Watermark&lt;br /&gt;
|-&lt;br /&gt;
| FinalDistributor Timestamp || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Program Content Timestamp || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Mobile Breakout Code || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Commercial Credit Code – Linear or Dynamic || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Time ShiftedViewing Code || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Segment Number || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Segment View Pattern || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;7&amp;quot; | Device/App Info&lt;br /&gt;
|-&lt;br /&gt;
| Device OSVersion || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| Device Model || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Cache Buster || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| SDKDisabled Flag || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| ServerCode || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Channel or URL || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; | Nielsen Identifiers&lt;br /&gt;
|-&lt;br /&gt;
| Client ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Campaign ID || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| Nielsen Unique Device ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Application ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| DeviceGroup (ex. Tablet, Smartphone, Desktop) || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| OS Group (ex. Android, iOS, Windows) || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| SDKVersion || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| IP Address for DMA, Country Code || Yes || Yes &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': Data is hashed, and encrypted using AES 128 before transmission to data provider.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Viewability_Data_Collected}}&lt;br /&gt;
&lt;br /&gt;
==== Example ping sent to provider ====&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://provider.com/cgi-bin/brandlift.php&amp;lt;/nowiki&amp;gt;?campaign_id=ff12725d724fac7934cf6003f096b4cd&amp;lt;wbr /&amp;gt;&amp;amp;placement_id=a4164b8fba9ee7c873a9c72c7091bb58&amp;lt;wbr /&amp;gt;&amp;amp;creative_id=25280139b61a947e127a52f56c8a2fdd&amp;lt;wbr /&amp;gt;&amp;amp;segment1=9000&amp;lt;wbr /&amp;gt;&amp;amp;segment2=41&amp;lt;wbr /&amp;gt;&amp;amp;segment3=iOS&amp;lt;wbr /&amp;gt;&amp;amp;OSVer=iOS6.1&amp;lt;wbr /&amp;gt;&amp;amp;c9=&amp;lt;wbr /&amp;gt;&amp;amp;devgrp=tablet&amp;lt;wbr /&amp;gt;&amp;amp;h=f5f243fe6d&amp;lt;wbr /&amp;gt;&amp;amp;rnd=1376971827360&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This ping passes the following parameters to the provider:&lt;br /&gt;
* Campaign ID – (campaign, placement, creative)&lt;br /&gt;
* Country Code&lt;br /&gt;
* DMA&lt;br /&gt;
* OS Group (ex. iOS, Android)&lt;br /&gt;
* DeviceOS Version&lt;br /&gt;
* Device Advertiser ID&lt;br /&gt;
* DeviceGroup (ex. Tablet, Smartphone, Desktop)&lt;br /&gt;
* Cache Buster&lt;br /&gt;
&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
=== Opt-Out Implementation ===&lt;br /&gt;
The site must provide the means for the user to opt-out of, or opt back into Nielsen Measurement.&lt;br /&gt;
&lt;br /&gt;
'''Sample Opt Out Template'''&lt;br /&gt;
&lt;br /&gt;
Our properties may feature Nielsen’s proprietary measurement software which will allow to contribute to market research, like Nielsen’s TV Ratings. To learn more about this information, please [http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html| click here]. Nielsen’s software may collect your choices with regards to it.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
See [[Digital Measurement Testing#Testing Browser Implementation|Digital Measurement Testing - Testing Browser Implementation]].&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_API_Reference&amp;diff=6794</id>
		<title>Browser SDK API Reference</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_API_Reference&amp;diff=6794"/>
		<updated>2024-12-11T20:15:57Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: Add Anchor name for SDK Initiailization Global Parameters&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Setting up Development Environment ==&lt;br /&gt;
=== Step 1: Configure Content Management System (CMS) ===&lt;br /&gt;
Configure CMS to send the required values (see table below). Any internal CMS_variable names can be used for passing the data.&lt;br /&gt;
&lt;br /&gt;
Ensure to capture these CMS_variable names in the SDK Configuration Form.&lt;br /&gt;
&lt;br /&gt;
For more information on setting variable names, see the SDK Configuration Form included within the SDK package.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Required Data !! Description !! Value&lt;br /&gt;
|-&lt;br /&gt;
| dataSrc || Used when both CMS metadata and ID3 data are present in the player. Setting this field tells the SDK whether to use the CMS metadata or the ID3 payload to derive the pings || cms&lt;br /&gt;
|-&lt;br /&gt;
| type || Type of asset: ad or content || preroll, midroll, postroll, or content&lt;br /&gt;
|-&lt;br /&gt;
| assetid || unique ID assigned to asset || custom &amp;lt;br&amp;gt;(no [[Special Characters]])&lt;br /&gt;
|-&lt;br /&gt;
| OCR Tag || OCR tag provided by Nielsen for implementation on the ad unit || Complete OCR URL&lt;br /&gt;
|-&lt;br /&gt;
| program || Name of program (25 character limit) || custom&lt;br /&gt;
|-&lt;br /&gt;
| title || Episode title (40 character limit) || custom&lt;br /&gt;
|-&lt;br /&gt;
| length || Length of content in seconds || Length in seconds, 0 for live stream&lt;br /&gt;
|-&lt;br /&gt;
| adloadtype || Type of ad load || &amp;quot;1&amp;quot; - Linear &amp;quot;2&amp;quot; - Dynamic(default)&lt;br /&gt;
|-&lt;br /&gt;
| hasAds || Identify if content includes Ads ||  &amp;quot;0&amp;quot; - no ads &amp;quot;1&amp;quot; - includes ads &amp;quot;2&amp;quot; - unknown(default)&lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode || Full episode flag	|| &amp;quot;y&amp;quot; - full episode &amp;quot;n&amp;quot; - non full episode&lt;br /&gt;
|-&lt;br /&gt;
| segA || Segment A (this is not available for video reporting as the episode title is reported) || custom value&lt;br /&gt;
|-&lt;br /&gt;
| segB || Custom segment B || custom value&lt;br /&gt;
|-&lt;br /&gt;
| segC || Custom segment C || custom value&lt;br /&gt;
|-&lt;br /&gt;
| crossId1 || Standard episode ID || custom value&lt;br /&gt;
|-&lt;br /&gt;
| crossId2 || Content originator (required only for distributors) || custom value&lt;br /&gt;
|-&lt;br /&gt;
| airdate || Original air date and time in Eastern Time. For non-US countries, it should be local time. || YYYYMMDD HH24:MI:SS&lt;br /&gt;
|-&lt;br /&gt;
| containerId || HTML DOM element of the Player container (for Viewability&amp;amp;Audibility feature only) || custom value &lt;br /&gt;
|-&lt;br /&gt;
|luid&lt;br /&gt;
|Living Unit ID - Experian Household ID&lt;br /&gt;
'''Note: This parameter is applicable only for CTV and First Party Livestream data'''&lt;br /&gt;
|&amp;quot;B0EOFEDgD&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Complete the Nielsen SDK Configuration Form ===&lt;br /&gt;
The SDK is designed to map the &amp;lt;code&amp;gt;CMS_variable names&amp;lt;/code&amp;gt;. To support the custom mapping, the developer is required to complete the SDK Configuration Form. The form will be provided during onboarding along with this guide.&lt;br /&gt;
&lt;br /&gt;
== Initialization ==&lt;br /&gt;
=== Obtain the Nielsen Application ID (apid) and Browser SDK URLs ===&lt;br /&gt;
The Nielsen &amp;lt;code&amp;gt;apid&amp;lt;/code&amp;gt; is required to enable SDK functionality. Technical Account Manager will provide an apid for each player configuration.  &lt;br /&gt;
Browser SDK can support URLs that use any of the protocols – HTTPS and HTTP.  &lt;br /&gt;
&lt;br /&gt;
=== Configure Browser SDK ===&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
&lt;br /&gt;
'''Add Static Queue Snippet'''&lt;br /&gt;
&lt;br /&gt;
*Add Static Queue Snippet&lt;br /&gt;
*Create SDK Instance&lt;br /&gt;
&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
'''Create SDK Instance'''&lt;br /&gt;
&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
'''Initialization API Call'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When creating an instance, pass the following three values:&lt;br /&gt;
&lt;br /&gt;
=== SDK Initialization – Global Parameters &amp;lt;span class=&amp;quot;anchor&amp;quot; id=&amp;quot;SDK Initialization Global Parameters&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameters !! Description !! Value&lt;br /&gt;
|-&lt;br /&gt;
| apid || UniqueID assigned to player/site. || 	'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
| instanceName || Name of SDK instance || &amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug || Enables Nielsen console logging. Only required for testing || &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| containerId || HTML DOM element id of the player container. Only for Viewability &amp;amp; Audibility feature. || {containerId: &amp;quot;playerId1&amp;quot;}&lt;br /&gt;
|-&lt;br /&gt;
| hem_sha256 || SHA256-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| hem_sha1 || SHA1-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;XvBniTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| hem_md5 || MD5-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;JnIbdTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| uid2 || An identifier based on a user’s verifiable PII (e.g. hashed email). UID2.0 was initially created by The Trade Desk (TTD) and is now managed by Prebid. || &amp;quot;MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| uid2_token || Encrypted Unified ID 2.0 || &amp;quot;AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8Ql&lt;br /&gt;
DSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeK&lt;br /&gt;
QI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhC&lt;br /&gt;
xG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{example_bsdk_init}}&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Configuration'''&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
  var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;,&amp;quot;nlsnInstance&amp;quot;, {nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multiple SDK Instances ===&lt;br /&gt;
The Browser SDK allows instantiating multiple instances of the object, which can be used simultaneously without any problems, however they must be instantiated with their own unique instance names. There is no maximum number of instances that is enforced in the browser.&lt;br /&gt;
&lt;br /&gt;
The below examples will make use of the same AppId, however using different AppIds will work as well. The principles below follow the same initialization rules stated above for a single instance and simply require a unique instance name and variable name with which the returned instance is assigned.&lt;br /&gt;
&lt;br /&gt;
For more information around the possible parameters that can be passed as well as deeper descriptions for the API calls, please refer to the section on  [[#SDK_Initialization|'''SDK Initialization - Global Parameters''']].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Example of 2 instances on the same page'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Add Static Queue Snippet&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    !function (e, n) {&lt;br /&gt;
      function t(e) {&lt;br /&gt;
        return &amp;quot;object&amp;quot; == typeof e ? JSON.parse(JSON.stringify(e)) : e&lt;br /&gt;
      }&lt;br /&gt;
      e[n] = e[n] ||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ: function (o, r, c) {&lt;br /&gt;
          var s = e.document,&lt;br /&gt;
            a = s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async = 1,&lt;br /&gt;
            a.src = (&amp;quot;http:&amp;quot; === e.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + o + &amp;quot;.js#name=&amp;quot; + r + &amp;quot;&amp;amp;ns=&amp;quot; + n;&lt;br /&gt;
          var i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a, i),&lt;br /&gt;
            e[n][r] = e[n][r] || {&lt;br /&gt;
              g: c || {},&lt;br /&gt;
              ggPM: function (o, c, s, a, i) { e[n][r].q = e[n][r].q || []; try { var l = t([o, c, s, a, i]); e[n][r].q.push(l) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } },&lt;br /&gt;
              trackEvent: function (o) { e[n][r].te = e[n][r].te || []; try { var c = t(o); e[n][r].te.push(c) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } }&lt;br /&gt;
            },&lt;br /&gt;
            e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    //Create SDK Instance(s)&lt;br /&gt;
    // Notice the unique instance name given to each instance below and the unique variable name for each instance&lt;br /&gt;
    var nSdkInstanceLive = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;instanceLive&amp;quot;, {&lt;br /&gt;
        nol_sdkDebug: 'debug',&lt;br /&gt;
        optout: 'false'&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    var nSdkInstanceVod = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;instanceVod&amp;quot;, {&lt;br /&gt;
        nol_sdkDebug: 'debug',&lt;br /&gt;
        optout: 'false'&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Example of 2 instances using a parent page and iFrame'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Parent Page (index.html)&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;ie=edge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;DCR Static/DCR Video&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    /* NLSQUEUE build v*/&lt;br /&gt;
    !function(e,n){&lt;br /&gt;
    function t(e){&lt;br /&gt;
      return&amp;quot;object&amp;quot;==typeof e?JSON.parse(JSON.stringify(e)):e&lt;br /&gt;
    }&lt;br /&gt;
    e[n]=e[n]||&lt;br /&gt;
    {&lt;br /&gt;
      nlsQ:function(o,r,c){&lt;br /&gt;
        var s=e.document,&lt;br /&gt;
        a=s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
        a.async=1,&lt;br /&gt;
        a.src=(&amp;quot;http:&amp;quot;===e.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+o+&amp;quot;.js#name=&amp;quot;+r+&amp;quot;&amp;amp;ns=&amp;quot;+n;&lt;br /&gt;
        var i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
        return i.parentNode.insertBefore(a,i),&lt;br /&gt;
        e[n][r]=e[n][r]||{g:c||{},&lt;br /&gt;
        ggPM:function(o,c,s,a,i){e[n][r].q=e[n][r].q||[];try{var l=t([o,c,s,a,i]);e[n][r].q.push(l)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}},&lt;br /&gt;
        trackEvent:function(o){e[n][r].te=e[n][r].te||[];try{var c=t(o);e[n][r].te.push(c)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}}},&lt;br /&gt;
        e[n][r]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // SDK Initialization&lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;staticPage&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: 'debug',&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Static Metadata &lt;br /&gt;
    var staticMetadata = {&lt;br /&gt;
      assetid: 'staticTestPage',&lt;br /&gt;
      type: 'static'&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    // Event 'staticstart' call&lt;br /&gt;
    nSdkInstance.ggPM(14, staticMetadata);&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;h1&amp;gt;DCR Static on Parent/DCR Video in iFrame&amp;lt;/h1&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Static measurement is current on parent page when window is in focus&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;iframe src=&amp;quot;./dcr-video.html&amp;quot; frameborder=&amp;quot;0&amp;quot; width=&amp;quot;650&amp;quot; height=&amp;quot;500&amp;quot; style=&amp;quot;background-color: rgb(42, 217, 248);&amp;quot; id=&amp;quot;video-iframe&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Nested iFrame Referenced on Parent Page (dcr-video.html)&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;ie=edge&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;iFrame Same Source&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
    /* NLSQUEUE build v*/&lt;br /&gt;
    !function(e,n){&lt;br /&gt;
      function t(e){&lt;br /&gt;
        return&amp;quot;object&amp;quot;==typeof e?JSON.parse(JSON.stringify(e)):e&lt;br /&gt;
      }&lt;br /&gt;
      e[n]=e[n]||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ:function(o,r,c){&lt;br /&gt;
          var s=e.document,&lt;br /&gt;
          a=s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async=1,&lt;br /&gt;
          a.src=(&amp;quot;http:&amp;quot;===e.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+o+&amp;quot;.js#name=&amp;quot;+r+&amp;quot;&amp;amp;ns=&amp;quot;+n;&lt;br /&gt;
          var i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a,i),&lt;br /&gt;
          e[n][r]=e[n][r]||{g:c||{},&lt;br /&gt;
          ggPM:function(o,c,s,a,i){e[n][r].q=e[n][r].q||[];try{var l=t([o,c,s,a,i]);e[n][r].q.push(l)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}},&lt;br /&gt;
          trackEvent:function(o){e[n][r].te=e[n][r].te||[];try{var c=t(o);e[n][r].te.push(c)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}}},&lt;br /&gt;
          e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // SDK Initialization&lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;videoPlayer&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: 'debug',&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    var contentMetadata = {&lt;br /&gt;
        type: &amp;quot;content&amp;quot;,&lt;br /&gt;
        length: &amp;quot;300&amp;quot;,&lt;br /&gt;
        title: &amp;quot;Skydiving Across Europe&amp;quot;,&lt;br /&gt;
        program: &amp;quot;latacg&amp;quot;,&lt;br /&gt;
        censuscategory: &amp;quot;Enlisted&amp;quot;,&lt;br /&gt;
        assetid: &amp;quot;204558915992&amp;quot;,&lt;br /&gt;
        section: &amp;quot;ProgramAsset8&amp;quot;,&lt;br /&gt;
        tv: &amp;quot;true&amp;quot;,&lt;br /&gt;
        adModel: &amp;quot;0&amp;quot;,&lt;br /&gt;
        dataSrc: &amp;quot;cms&amp;quot;,&lt;br /&gt;
        segA: &amp;quot;S07E04:NBC&amp;quot;,&lt;br /&gt;
        segB: &amp;quot;teams&amp;quot;,&lt;br /&gt;
        segC:&amp;quot;AtlanataFalcons&amp;quot;,&lt;br /&gt;
      }&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;I'm iframe SDK DCR Video measurement, DCR static measurement should continue when clicking &amp;quot;play&amp;quot; on video&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;main&amp;gt;&lt;br /&gt;
      &amp;lt;video&lt;br /&gt;
      controls&lt;br /&gt;
      src=&amp;quot;https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4&amp;quot;&lt;br /&gt;
      poster=&amp;quot;https://peach.blender.org/wp-content/uploads/title_anouncement.jpg?x11217&amp;quot;&lt;br /&gt;
      width=&amp;quot;620&amp;quot;&amp;gt;&lt;br /&gt;
      Sorry, your browser doesn't support embedded videos, but don't worry, you can&lt;br /&gt;
      &amp;lt;a href=&amp;quot;https://archive.org/details/BigBuckBunny_124&amp;quot;&amp;gt;download it&amp;lt;/a&amp;gt;&lt;br /&gt;
      and watch it with your favorite video player!&lt;br /&gt;
    &amp;lt;/video&amp;gt;&lt;br /&gt;
    &amp;lt;/main&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;../player.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SDK Initialization to measure the Viewability &amp;amp; Audibility ===&lt;br /&gt;
To support viewability metrics in the web page the integrator has to provide a tag value of the player view to let Nielsen SDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in the as string while initializing the Nielsen browser SDK.&lt;br /&gt;
&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{containerId: &amp;lt;playerElementID&amp;gt;, nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Initialization for Viewability'''&lt;br /&gt;
&lt;br /&gt;
Your configuration should include the Static Queue Snippet and an SDK Instance for your unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Add Static Queue Snippet&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    ! function(t, n) {&lt;br /&gt;
        t[n] = t[n] || {&lt;br /&gt;
            nlsQ: function(e, o, c, r, s, i) {&lt;br /&gt;
                return s = t.document,&lt;br /&gt;
                    r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
                    r.async = 1,&lt;br /&gt;
                    r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + o + &amp;quot;&amp;amp;ns=&amp;quot; + n,&lt;br /&gt;
                    i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
                    i.parentNode.insertBefore(r, i),&lt;br /&gt;
                    t[n][o] = t[n][o] || {&lt;br /&gt;
                        g: c || {},&lt;br /&gt;
                        ggPM: function(e, c, r, s, i) {&lt;br /&gt;
                            (t[n][o].q = t[n][o].q || []).push([e, c, r, s, i])&lt;br /&gt;
                        }&lt;br /&gt;
                    }, t[n][o]&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    (window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
//Create SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {containerId: “player1”, nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser SDK API Methods &amp;amp; Properties ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method / Property !! Event # !! DTVR !! DAR !! DCR !! Description&lt;br /&gt;
|-&lt;br /&gt;
| [[loadMetadata (Browser)|loadMetadata]] || 15 || ✔ || ✔ || ✔ || Used when there is a preroll ad that needs to be associated with content metadata. The loadMetadata will first be called to populate the content metadata values and then the loadMetadata for ad metadata will be called. This allows sending a content ping with the ad info, even if the user bails out during the preroll ad.&lt;br /&gt;
|-&lt;br /&gt;
| [[play (Browser)|play]] || 5 || ✔ || ✘ || ✔ || Used when there is an ID3 fed product such as DTVR and the client does not want to send in all the CMS metadata that is sent in loadMetadata. This allows the client to send in at least the required “channel name” value associated to the ID3 feed. When the client passes in the channelName, they can change the CMS data stored by passing new values. If this event is not called then the “channel name” value populated will be the default value of “defaultChannelName”.&lt;br /&gt;
|-&lt;br /&gt;
| [[sendID3 (Browser)|sendID3]] || 55 || ✔ || ✘ || ✘ || Used to send the ID3 metadata.&lt;br /&gt;
|-&lt;br /&gt;
| [[setPlayheadPosition (Browser)|setPlayheadPosition]] || 49 || ✘ || ✘ || ✔ || Used to send the playhead position.&lt;br /&gt;
|-&lt;br /&gt;
| [[stop (Browser)|stop]] || 7 || ✘ || ✘ || ✔ || Used when switching between ad and content or content and ad.&lt;br /&gt;
|-&lt;br /&gt;
| [[end (Browser)|end]] || 57 || ✔ || ✘ || ✔ || This is triggered 1) at the end of the content stream, 2) if the user switches to another piece of content 3) when the browser is refreshed or closed&lt;br /&gt;
|-&lt;br /&gt;
| [[staticstart (Browser)|staticstart]] || 14 || ✘ || ✘ || ✔ || Used to send the metadata for the static page.&lt;br /&gt;
|-&lt;br /&gt;
| [[StaticEnd (Browser)|staticend]] || 56 || ✘ || ✘ || ✔ || In Single Page Application (SPA) it is imperative that staticend is called prior to the loading of new metadata. This allows the Browser SDK to properly credit the previous section/content being viewed before measuring the new one.&lt;br /&gt;
|-&lt;br /&gt;
| [[updateOTT (Browser)|updateOTT]] || - || ✘ || ✘ || ✔ || Used to notify Browser SDK that the remote OTT device (like Google ChromeCast, Roku, Amazon FireTV, etc.) is connected / disconnected (change of OTT status).&lt;br /&gt;
|-&lt;br /&gt;
| [[ onPaginate (Browser)|onPaginate]] || 30 || ✘ || ✘ || ✔ || Used to create a new instance of the SDK object&lt;br /&gt;
|-&lt;br /&gt;
| [[updateMetadata (Browser)|updateMetadata]] || 35 || ✔ || ✔ || ✔ || This event is used for updating metadata parameters for the content or ad that is being played.&lt;br /&gt;
|-&lt;br /&gt;
| [[setVolume_(Browser)|setVolume]] || 61 || ✔ || ✘ || ✔ || Used to pass in the player volume levels in %. Default value is -1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Retrieving ID3 Tags ==&lt;br /&gt;
The video player must have the ability to extract ID3 tags and supply them to the Browser SDK, based on the HLS standard.&lt;br /&gt;
*An ID3 tag spans two PES packets.&lt;br /&gt;
**In the first PES packet, look for www.nielsen.com, this is the start of the ID3 tag. Continue to parse the first PES packet until the undefined char &amp;quot;\ufffd&amp;quot; is found. This forms the first half of the ID3 tag&lt;br /&gt;
**In the second PES packet, identify the end pattern – a regEx of /(\/\d+){3}/ and look to remove the lowest index of either &amp;quot;\x00&amp;quot; and/or &amp;quot;\ufffd&amp;quot;. Now the second packet has been appended and the demarcation of the Nielsen-specific data has been defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Follow the procedure below, to extract Nielsen ID3 tags from an MPEG-2 transport stream (including HLS streams).&lt;br /&gt;
#Parse the Program Map Table (PMT) to find the PID of the metadata stream. Confirm the presence of the metadata descriptor described in section 2.3.3 of Apple’s “HTTP Live Streaming Metadata Spec.pdf”. Only private streams with metadata descriptor present should be considered as ID3-tag metadata streams.&lt;br /&gt;
#Parse the HLS/Transport stream for any '''PES header''' with the PID found in step 1.&lt;br /&gt;
#Follow standard MPEG-2 parsing procedures to locate the start of the payload of the PES packet.&lt;br /&gt;
#Copy the PES payload into a buffer.&lt;br /&gt;
#The ID3 tag spans 2 PES packets. Parse the stream for the next packet whose PID is set to the PID found in step 1. Typically the ID3 Tag is of 249 bytes. The steps below guide towards extraction of the ID3 tag&lt;br /&gt;
##In the first PES packet, look for &amp;quot;www.nielsen.com&amp;quot; , this is the start of the ID3 tag. Keep on parsing the first PES packet until the undefined char &amp;quot;\ufffd&amp;quot; is found. This forms the first half of the ID3 tag&lt;br /&gt;
##In the second PES packet, identify the end pattern, a regEx of /(\/\d+){3}/ and look to remove the lowest index of either “\x00” and/or “\ufffd”. Now the second packet has been appended and the demarcation of the Nielsen specific data has been defined. This segment can be simply substringed.&lt;br /&gt;
##Concatenate this substringed segment with the payload derived from the first packet get the ID3 payload.&lt;br /&gt;
#Check the length of the contents in the buffer to make sure that it is equal to the size of a Nielsen ID3 tag.&lt;br /&gt;
#Ensure that the ID3 byte array is converted into the string and escape it, so that the SDK can consume it.&lt;br /&gt;
Repeat steps 2 through 7 for all ID3 tags in the stream.&lt;br /&gt;
&lt;br /&gt;
'''References'''&lt;br /&gt;
*[http://www.iso.org/iso/catalogue_detail?csnumber=44169. ISO/IEC 13818-1:2007] Information technology – Generic coding of moving pictures and associated audio information: Systems&lt;br /&gt;
*https://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/HTTP_Live_Streaming_Metadata_Spec/&lt;br /&gt;
&lt;br /&gt;
=== Sample ID3 tags ===&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/X100zdCIGeIlgZnkYj6UvQ==/AAAB2Jz2_k74GXSzx4npHuI_&amp;lt;wbr /&amp;gt;JwJd3QSUpW30rDkGTcbHEzIMWleCzM-uvNOP9fzJcQMWQLJqzXMCAxParOb5sGijSV9dNM3QiBniJYGZ5GI-lL1fXTTN0IgZ4iWBmeRiPpS9AAAAAAAAAAAAAAAAAAAAAFJWFM5SVhTONNU=/00000/00000/00&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/R8WHe7pEBeqBhu8jTeXydg==/AAICoyitYqlxT7n6aZ0oMCGhe&amp;lt;wbr /&amp;gt;Fi4CXFp46AMUPZz1lMr_M9tr3_cjee1SHqxrOiVerMDLeyn9xzocZSKwi746Re8vNOtpNCAZjYABs_J0R25IHpvOc1HS8&amp;lt;wbr /&amp;gt;QHGgD5TgOJeS6gX100zdCIGeIlgZnkYj6UvVJWFNhSVhTiPE0=/00000/46016/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': ID3 tags are not applicable for International (Germany)&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser Opt-Out Implementation ==&lt;br /&gt;
The site in which video content is being measure via Nielsen methodology must provide the means for the user to opt-out of, or opt back into Nielsen Measurement.&lt;br /&gt;
&lt;br /&gt;
For Browser-based applications, opt-out setting is stored via Nielsen cookie. Therefore, it is only necessary that users be made aware of measurement opt-out by incorporating the template below in the user interface.&lt;br /&gt;
&lt;br /&gt;
=== Sample Opt Out Template ===&lt;br /&gt;
Our properties may feature Nielsen’s proprietary measurement software which will allow to contribute to market research, like Nielsen’s TV Ratings. To learn more about this information, see https://www.nielsen.com/digitalprivacy. Nielsen’s software may collect your choices with regards to it.&lt;br /&gt;
&lt;br /&gt;
== Nielsen Privacy Requirements ==&lt;br /&gt;
Privacy protections that Nielsen ensures to have with each App SDK integration are as follows.&lt;br /&gt;
*Disclosure of viewership data collection in EULA / Privacy Policy&lt;br /&gt;
*A link in the EULA/Privacy policy, or in another conspicuous location within the App, to a Nielsen-hosted web page outlining what Nielsen is collecting and how it is being used&lt;br /&gt;
*Method for users to opt-out of Nielsen measurement, any time while using the application&lt;br /&gt;
&lt;br /&gt;
=== Ratings Data Flow ===&lt;br /&gt;
Every view of creditable and watermarked content is measured by Nielsen.&lt;br /&gt;
[[File:RatingsDataFlow.png]]&lt;br /&gt;
&lt;br /&gt;
'''Information NOT Shared'''&lt;br /&gt;
* '''With Nielsen'''&lt;br /&gt;
** User's Identity&lt;br /&gt;
* '''With Data Provider'''&lt;br /&gt;
** Content information&lt;br /&gt;
** Whether user is viewing an ad or video content&lt;br /&gt;
** Player used to play the streaming (audio / video, etc.)&lt;br /&gt;
** Values being de-duped / aggregating for&lt;br /&gt;
&lt;br /&gt;
Nielsen collects only what it needs for audience measurement. Every view of creditable, watermarked content will be measured by Nielsen.&lt;br /&gt;
&lt;br /&gt;
=== Data Collected ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type of Information !! Parameter !! Transmitted to Nielsen? !! Sent to Provider?&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; | Nielsen ID3 Watermark&lt;br /&gt;
|-&lt;br /&gt;
| FinalDistributor Timestamp || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Program Content Timestamp || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Mobile Breakout Code || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Commercial Credit Code – Linear or Dynamic || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Time ShiftedViewing Code || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Segment Number || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Segment View Pattern || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;7&amp;quot; | Device/App Info&lt;br /&gt;
|-&lt;br /&gt;
| Device OSVersion || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| Device Model || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Cache Buster || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| SDKDisabled Flag || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| ServerCode || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Channel or URL || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; | Nielsen Identifiers&lt;br /&gt;
|-&lt;br /&gt;
| Client ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Campaign ID || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| Nielsen Unique Device ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Application ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| DeviceGroup (ex. Tablet, Smartphone, Desktop) || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| OS Group (ex. Android, iOS, Windows) || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| SDKVersion || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| IP Address for DMA, Country Code || Yes || Yes &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': Data is hashed, and encrypted using AES 128 before transmission to data provider.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Viewability_Data_Collected}}&lt;br /&gt;
&lt;br /&gt;
==== Example ping sent to provider ====&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://provider.com/cgi-bin/brandlift.php&amp;lt;/nowiki&amp;gt;?campaign_id=ff12725d724fac7934cf6003f096b4cd&amp;lt;wbr /&amp;gt;&amp;amp;placement_id=a4164b8fba9ee7c873a9c72c7091bb58&amp;lt;wbr /&amp;gt;&amp;amp;creative_id=25280139b61a947e127a52f56c8a2fdd&amp;lt;wbr /&amp;gt;&amp;amp;segment1=9000&amp;lt;wbr /&amp;gt;&amp;amp;segment2=41&amp;lt;wbr /&amp;gt;&amp;amp;segment3=iOS&amp;lt;wbr /&amp;gt;&amp;amp;OSVer=iOS6.1&amp;lt;wbr /&amp;gt;&amp;amp;c9=&amp;lt;wbr /&amp;gt;&amp;amp;devgrp=tablet&amp;lt;wbr /&amp;gt;&amp;amp;h=f5f243fe6d&amp;lt;wbr /&amp;gt;&amp;amp;rnd=1376971827360&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This ping passes the following parameters to the provider:&lt;br /&gt;
* Campaign ID – (campaign, placement, creative)&lt;br /&gt;
* Country Code&lt;br /&gt;
* DMA&lt;br /&gt;
* OS Group (ex. iOS, Android)&lt;br /&gt;
* DeviceOS Version&lt;br /&gt;
* Device Advertiser ID&lt;br /&gt;
* DeviceGroup (ex. Tablet, Smartphone, Desktop)&lt;br /&gt;
* Cache Buster&lt;br /&gt;
&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
=== Opt-Out Implementation ===&lt;br /&gt;
The site must provide the means for the user to opt-out of, or opt back into Nielsen Measurement.&lt;br /&gt;
&lt;br /&gt;
'''Sample Opt Out Template'''&lt;br /&gt;
&lt;br /&gt;
Our properties may feature Nielsen’s proprietary measurement software which will allow to contribute to market research, like Nielsen’s TV Ratings. To learn more about this information, please [http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html| click here]. Nielsen’s software may collect your choices with regards to it.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
See [[Digital Measurement Testing#Testing Browser Implementation|Digital Measurement Testing - Testing Browser Implementation]].&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_API_Reference&amp;diff=6793</id>
		<title>Browser SDK API Reference</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_API_Reference&amp;diff=6793"/>
		<updated>2024-12-11T20:08:30Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: /* Multiple SDK Instances */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Setting up Development Environment ==&lt;br /&gt;
=== Step 1: Configure Content Management System (CMS) ===&lt;br /&gt;
Configure CMS to send the required values (see table below). Any internal CMS_variable names can be used for passing the data.&lt;br /&gt;
&lt;br /&gt;
Ensure to capture these CMS_variable names in the SDK Configuration Form.&lt;br /&gt;
&lt;br /&gt;
For more information on setting variable names, see the SDK Configuration Form included within the SDK package.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Required Data !! Description !! Value&lt;br /&gt;
|-&lt;br /&gt;
| dataSrc || Used when both CMS metadata and ID3 data are present in the player. Setting this field tells the SDK whether to use the CMS metadata or the ID3 payload to derive the pings || cms&lt;br /&gt;
|-&lt;br /&gt;
| type || Type of asset: ad or content || preroll, midroll, postroll, or content&lt;br /&gt;
|-&lt;br /&gt;
| assetid || unique ID assigned to asset || custom &amp;lt;br&amp;gt;(no [[Special Characters]])&lt;br /&gt;
|-&lt;br /&gt;
| OCR Tag || OCR tag provided by Nielsen for implementation on the ad unit || Complete OCR URL&lt;br /&gt;
|-&lt;br /&gt;
| program || Name of program (25 character limit) || custom&lt;br /&gt;
|-&lt;br /&gt;
| title || Episode title (40 character limit) || custom&lt;br /&gt;
|-&lt;br /&gt;
| length || Length of content in seconds || Length in seconds, 0 for live stream&lt;br /&gt;
|-&lt;br /&gt;
| adloadtype || Type of ad load || &amp;quot;1&amp;quot; - Linear &amp;quot;2&amp;quot; - Dynamic(default)&lt;br /&gt;
|-&lt;br /&gt;
| hasAds || Identify if content includes Ads ||  &amp;quot;0&amp;quot; - no ads &amp;quot;1&amp;quot; - includes ads &amp;quot;2&amp;quot; - unknown(default)&lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode || Full episode flag	|| &amp;quot;y&amp;quot; - full episode &amp;quot;n&amp;quot; - non full episode&lt;br /&gt;
|-&lt;br /&gt;
| segA || Segment A (this is not available for video reporting as the episode title is reported) || custom value&lt;br /&gt;
|-&lt;br /&gt;
| segB || Custom segment B || custom value&lt;br /&gt;
|-&lt;br /&gt;
| segC || Custom segment C || custom value&lt;br /&gt;
|-&lt;br /&gt;
| crossId1 || Standard episode ID || custom value&lt;br /&gt;
|-&lt;br /&gt;
| crossId2 || Content originator (required only for distributors) || custom value&lt;br /&gt;
|-&lt;br /&gt;
| airdate || Original air date and time in Eastern Time. For non-US countries, it should be local time. || YYYYMMDD HH24:MI:SS&lt;br /&gt;
|-&lt;br /&gt;
| containerId || HTML DOM element of the Player container (for Viewability&amp;amp;Audibility feature only) || custom value &lt;br /&gt;
|-&lt;br /&gt;
|luid&lt;br /&gt;
|Living Unit ID - Experian Household ID&lt;br /&gt;
'''Note: This parameter is applicable only for CTV and First Party Livestream data'''&lt;br /&gt;
|&amp;quot;B0EOFEDgD&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Complete the Nielsen SDK Configuration Form ===&lt;br /&gt;
The SDK is designed to map the &amp;lt;code&amp;gt;CMS_variable names&amp;lt;/code&amp;gt;. To support the custom mapping, the developer is required to complete the SDK Configuration Form. The form will be provided during onboarding along with this guide.&lt;br /&gt;
&lt;br /&gt;
== Initialization ==&lt;br /&gt;
=== Obtain the Nielsen Application ID (apid) and Browser SDK URLs ===&lt;br /&gt;
The Nielsen &amp;lt;code&amp;gt;apid&amp;lt;/code&amp;gt; is required to enable SDK functionality. Technical Account Manager will provide an apid for each player configuration.  &lt;br /&gt;
Browser SDK can support URLs that use any of the protocols – HTTPS and HTTP.  &lt;br /&gt;
&lt;br /&gt;
=== Configure Browser SDK ===&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
&lt;br /&gt;
'''Add Static Queue Snippet'''&lt;br /&gt;
&lt;br /&gt;
*Add Static Queue Snippet&lt;br /&gt;
*Create SDK Instance&lt;br /&gt;
&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
'''Create SDK Instance'''&lt;br /&gt;
&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
'''Initialization API Call'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When creating an instance, pass the following three values:&lt;br /&gt;
&lt;br /&gt;
=== SDK Initialization – Global Parameters ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameters !! Description !! Value&lt;br /&gt;
|-&lt;br /&gt;
| apid || UniqueID assigned to player/site. || 	'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
| instanceName || Name of SDK instance || &amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug || Enables Nielsen console logging. Only required for testing || &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| containerId || HTML DOM element id of the player container. Only for Viewability &amp;amp; Audibility feature. || {containerId: &amp;quot;playerId1&amp;quot;}&lt;br /&gt;
|-&lt;br /&gt;
| hem_sha256 || SHA256-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| hem_sha1 || SHA1-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;XvBniTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| hem_md5 || MD5-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;JnIbdTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| uid2 || An identifier based on a user’s verifiable PII (e.g. hashed email). UID2.0 was initially created by The Trade Desk (TTD) and is now managed by Prebid. || &amp;quot;MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| uid2_token || Encrypted Unified ID 2.0 || &amp;quot;AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8Ql&lt;br /&gt;
DSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeK&lt;br /&gt;
QI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhC&lt;br /&gt;
xG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{example_bsdk_init}}&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Configuration'''&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
  var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;,&amp;quot;nlsnInstance&amp;quot;, {nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multiple SDK Instances ===&lt;br /&gt;
The Browser SDK allows instantiating multiple instances of the object, which can be used simultaneously without any problems, however they must be instantiated with their own unique instance names. There is no maximum number of instances that is enforced in the browser.&lt;br /&gt;
&lt;br /&gt;
The below examples will make use of the same AppId, however using different AppIds will work as well. The principles below follow the same initialization rules stated above for a single instance and simply require a unique instance name and variable name with which the returned instance is assigned.&lt;br /&gt;
&lt;br /&gt;
For more information around the possible parameters that can be passed as well as deeper descriptions for the API calls, please refer to the section on  [[#SDK_Initialization|'''SDK Initialization - Global Parameters''']].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Example of 2 instances on the same page'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Add Static Queue Snippet&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    !function (e, n) {&lt;br /&gt;
      function t(e) {&lt;br /&gt;
        return &amp;quot;object&amp;quot; == typeof e ? JSON.parse(JSON.stringify(e)) : e&lt;br /&gt;
      }&lt;br /&gt;
      e[n] = e[n] ||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ: function (o, r, c) {&lt;br /&gt;
          var s = e.document,&lt;br /&gt;
            a = s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async = 1,&lt;br /&gt;
            a.src = (&amp;quot;http:&amp;quot; === e.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + o + &amp;quot;.js#name=&amp;quot; + r + &amp;quot;&amp;amp;ns=&amp;quot; + n;&lt;br /&gt;
          var i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a, i),&lt;br /&gt;
            e[n][r] = e[n][r] || {&lt;br /&gt;
              g: c || {},&lt;br /&gt;
              ggPM: function (o, c, s, a, i) { e[n][r].q = e[n][r].q || []; try { var l = t([o, c, s, a, i]); e[n][r].q.push(l) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } },&lt;br /&gt;
              trackEvent: function (o) { e[n][r].te = e[n][r].te || []; try { var c = t(o); e[n][r].te.push(c) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } }&lt;br /&gt;
            },&lt;br /&gt;
            e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    //Create SDK Instance(s)&lt;br /&gt;
    // Notice the unique instance name given to each instance below and the unique variable name for each instance&lt;br /&gt;
    var nSdkInstanceLive = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;instanceLive&amp;quot;, {&lt;br /&gt;
        nol_sdkDebug: 'debug',&lt;br /&gt;
        optout: 'false'&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    var nSdkInstanceVod = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;instanceVod&amp;quot;, {&lt;br /&gt;
        nol_sdkDebug: 'debug',&lt;br /&gt;
        optout: 'false'&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Example of 2 instances using a parent page and iFrame'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Parent Page (index.html)&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;ie=edge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;DCR Static/DCR Video&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    /* NLSQUEUE build v*/&lt;br /&gt;
    !function(e,n){&lt;br /&gt;
    function t(e){&lt;br /&gt;
      return&amp;quot;object&amp;quot;==typeof e?JSON.parse(JSON.stringify(e)):e&lt;br /&gt;
    }&lt;br /&gt;
    e[n]=e[n]||&lt;br /&gt;
    {&lt;br /&gt;
      nlsQ:function(o,r,c){&lt;br /&gt;
        var s=e.document,&lt;br /&gt;
        a=s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
        a.async=1,&lt;br /&gt;
        a.src=(&amp;quot;http:&amp;quot;===e.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+o+&amp;quot;.js#name=&amp;quot;+r+&amp;quot;&amp;amp;ns=&amp;quot;+n;&lt;br /&gt;
        var i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
        return i.parentNode.insertBefore(a,i),&lt;br /&gt;
        e[n][r]=e[n][r]||{g:c||{},&lt;br /&gt;
        ggPM:function(o,c,s,a,i){e[n][r].q=e[n][r].q||[];try{var l=t([o,c,s,a,i]);e[n][r].q.push(l)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}},&lt;br /&gt;
        trackEvent:function(o){e[n][r].te=e[n][r].te||[];try{var c=t(o);e[n][r].te.push(c)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}}},&lt;br /&gt;
        e[n][r]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // SDK Initialization&lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;staticPage&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: 'debug',&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Static Metadata &lt;br /&gt;
    var staticMetadata = {&lt;br /&gt;
      assetid: 'staticTestPage',&lt;br /&gt;
      type: 'static'&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    // Event 'staticstart' call&lt;br /&gt;
    nSdkInstance.ggPM(14, staticMetadata);&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;h1&amp;gt;DCR Static on Parent/DCR Video in iFrame&amp;lt;/h1&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Static measurement is current on parent page when window is in focus&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;iframe src=&amp;quot;./dcr-video.html&amp;quot; frameborder=&amp;quot;0&amp;quot; width=&amp;quot;650&amp;quot; height=&amp;quot;500&amp;quot; style=&amp;quot;background-color: rgb(42, 217, 248);&amp;quot; id=&amp;quot;video-iframe&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Nested iFrame Referenced on Parent Page (dcr-video.html)&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;ie=edge&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;iFrame Same Source&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
    /* NLSQUEUE build v*/&lt;br /&gt;
    !function(e,n){&lt;br /&gt;
      function t(e){&lt;br /&gt;
        return&amp;quot;object&amp;quot;==typeof e?JSON.parse(JSON.stringify(e)):e&lt;br /&gt;
      }&lt;br /&gt;
      e[n]=e[n]||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ:function(o,r,c){&lt;br /&gt;
          var s=e.document,&lt;br /&gt;
          a=s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async=1,&lt;br /&gt;
          a.src=(&amp;quot;http:&amp;quot;===e.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+o+&amp;quot;.js#name=&amp;quot;+r+&amp;quot;&amp;amp;ns=&amp;quot;+n;&lt;br /&gt;
          var i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a,i),&lt;br /&gt;
          e[n][r]=e[n][r]||{g:c||{},&lt;br /&gt;
          ggPM:function(o,c,s,a,i){e[n][r].q=e[n][r].q||[];try{var l=t([o,c,s,a,i]);e[n][r].q.push(l)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}},&lt;br /&gt;
          trackEvent:function(o){e[n][r].te=e[n][r].te||[];try{var c=t(o);e[n][r].te.push(c)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}}},&lt;br /&gt;
          e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // SDK Initialization&lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;videoPlayer&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: 'debug',&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    var contentMetadata = {&lt;br /&gt;
        type: &amp;quot;content&amp;quot;,&lt;br /&gt;
        length: &amp;quot;300&amp;quot;,&lt;br /&gt;
        title: &amp;quot;Skydiving Across Europe&amp;quot;,&lt;br /&gt;
        program: &amp;quot;latacg&amp;quot;,&lt;br /&gt;
        censuscategory: &amp;quot;Enlisted&amp;quot;,&lt;br /&gt;
        assetid: &amp;quot;204558915992&amp;quot;,&lt;br /&gt;
        section: &amp;quot;ProgramAsset8&amp;quot;,&lt;br /&gt;
        tv: &amp;quot;true&amp;quot;,&lt;br /&gt;
        adModel: &amp;quot;0&amp;quot;,&lt;br /&gt;
        dataSrc: &amp;quot;cms&amp;quot;,&lt;br /&gt;
        segA: &amp;quot;S07E04:NBC&amp;quot;,&lt;br /&gt;
        segB: &amp;quot;teams&amp;quot;,&lt;br /&gt;
        segC:&amp;quot;AtlanataFalcons&amp;quot;,&lt;br /&gt;
      }&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;I'm iframe SDK DCR Video measurement, DCR static measurement should continue when clicking &amp;quot;play&amp;quot; on video&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;main&amp;gt;&lt;br /&gt;
      &amp;lt;video&lt;br /&gt;
      controls&lt;br /&gt;
      src=&amp;quot;https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4&amp;quot;&lt;br /&gt;
      poster=&amp;quot;https://peach.blender.org/wp-content/uploads/title_anouncement.jpg?x11217&amp;quot;&lt;br /&gt;
      width=&amp;quot;620&amp;quot;&amp;gt;&lt;br /&gt;
      Sorry, your browser doesn't support embedded videos, but don't worry, you can&lt;br /&gt;
      &amp;lt;a href=&amp;quot;https://archive.org/details/BigBuckBunny_124&amp;quot;&amp;gt;download it&amp;lt;/a&amp;gt;&lt;br /&gt;
      and watch it with your favorite video player!&lt;br /&gt;
    &amp;lt;/video&amp;gt;&lt;br /&gt;
    &amp;lt;/main&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;../player.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SDK Initialization to measure the Viewability &amp;amp; Audibility ===&lt;br /&gt;
To support viewability metrics in the web page the integrator has to provide a tag value of the player view to let Nielsen SDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in the as string while initializing the Nielsen browser SDK.&lt;br /&gt;
&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{containerId: &amp;lt;playerElementID&amp;gt;, nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Initialization for Viewability'''&lt;br /&gt;
&lt;br /&gt;
Your configuration should include the Static Queue Snippet and an SDK Instance for your unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Add Static Queue Snippet&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    ! function(t, n) {&lt;br /&gt;
        t[n] = t[n] || {&lt;br /&gt;
            nlsQ: function(e, o, c, r, s, i) {&lt;br /&gt;
                return s = t.document,&lt;br /&gt;
                    r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
                    r.async = 1,&lt;br /&gt;
                    r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + o + &amp;quot;&amp;amp;ns=&amp;quot; + n,&lt;br /&gt;
                    i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
                    i.parentNode.insertBefore(r, i),&lt;br /&gt;
                    t[n][o] = t[n][o] || {&lt;br /&gt;
                        g: c || {},&lt;br /&gt;
                        ggPM: function(e, c, r, s, i) {&lt;br /&gt;
                            (t[n][o].q = t[n][o].q || []).push([e, c, r, s, i])&lt;br /&gt;
                        }&lt;br /&gt;
                    }, t[n][o]&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    (window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
//Create SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {containerId: “player1”, nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser SDK API Methods &amp;amp; Properties ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method / Property !! Event # !! DTVR !! DAR !! DCR !! Description&lt;br /&gt;
|-&lt;br /&gt;
| [[loadMetadata (Browser)|loadMetadata]] || 15 || ✔ || ✔ || ✔ || Used when there is a preroll ad that needs to be associated with content metadata. The loadMetadata will first be called to populate the content metadata values and then the loadMetadata for ad metadata will be called. This allows sending a content ping with the ad info, even if the user bails out during the preroll ad.&lt;br /&gt;
|-&lt;br /&gt;
| [[play (Browser)|play]] || 5 || ✔ || ✘ || ✔ || Used when there is an ID3 fed product such as DTVR and the client does not want to send in all the CMS metadata that is sent in loadMetadata. This allows the client to send in at least the required “channel name” value associated to the ID3 feed. When the client passes in the channelName, they can change the CMS data stored by passing new values. If this event is not called then the “channel name” value populated will be the default value of “defaultChannelName”.&lt;br /&gt;
|-&lt;br /&gt;
| [[sendID3 (Browser)|sendID3]] || 55 || ✔ || ✘ || ✘ || Used to send the ID3 metadata.&lt;br /&gt;
|-&lt;br /&gt;
| [[setPlayheadPosition (Browser)|setPlayheadPosition]] || 49 || ✘ || ✘ || ✔ || Used to send the playhead position.&lt;br /&gt;
|-&lt;br /&gt;
| [[stop (Browser)|stop]] || 7 || ✘ || ✘ || ✔ || Used when switching between ad and content or content and ad.&lt;br /&gt;
|-&lt;br /&gt;
| [[end (Browser)|end]] || 57 || ✔ || ✘ || ✔ || This is triggered 1) at the end of the content stream, 2) if the user switches to another piece of content 3) when the browser is refreshed or closed&lt;br /&gt;
|-&lt;br /&gt;
| [[staticstart (Browser)|staticstart]] || 14 || ✘ || ✘ || ✔ || Used to send the metadata for the static page.&lt;br /&gt;
|-&lt;br /&gt;
| [[StaticEnd (Browser)|staticend]] || 56 || ✘ || ✘ || ✔ || In Single Page Application (SPA) it is imperative that staticend is called prior to the loading of new metadata. This allows the Browser SDK to properly credit the previous section/content being viewed before measuring the new one.&lt;br /&gt;
|-&lt;br /&gt;
| [[updateOTT (Browser)|updateOTT]] || - || ✘ || ✘ || ✔ || Used to notify Browser SDK that the remote OTT device (like Google ChromeCast, Roku, Amazon FireTV, etc.) is connected / disconnected (change of OTT status).&lt;br /&gt;
|-&lt;br /&gt;
| [[ onPaginate (Browser)|onPaginate]] || 30 || ✘ || ✘ || ✔ || Used to create a new instance of the SDK object&lt;br /&gt;
|-&lt;br /&gt;
| [[updateMetadata (Browser)|updateMetadata]] || 35 || ✔ || ✔ || ✔ || This event is used for updating metadata parameters for the content or ad that is being played.&lt;br /&gt;
|-&lt;br /&gt;
| [[setVolume_(Browser)|setVolume]] || 61 || ✔ || ✘ || ✔ || Used to pass in the player volume levels in %. Default value is -1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Retrieving ID3 Tags ==&lt;br /&gt;
The video player must have the ability to extract ID3 tags and supply them to the Browser SDK, based on the HLS standard.&lt;br /&gt;
*An ID3 tag spans two PES packets.&lt;br /&gt;
**In the first PES packet, look for www.nielsen.com, this is the start of the ID3 tag. Continue to parse the first PES packet until the undefined char &amp;quot;\ufffd&amp;quot; is found. This forms the first half of the ID3 tag&lt;br /&gt;
**In the second PES packet, identify the end pattern – a regEx of /(\/\d+){3}/ and look to remove the lowest index of either &amp;quot;\x00&amp;quot; and/or &amp;quot;\ufffd&amp;quot;. Now the second packet has been appended and the demarcation of the Nielsen-specific data has been defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Follow the procedure below, to extract Nielsen ID3 tags from an MPEG-2 transport stream (including HLS streams).&lt;br /&gt;
#Parse the Program Map Table (PMT) to find the PID of the metadata stream. Confirm the presence of the metadata descriptor described in section 2.3.3 of Apple’s “HTTP Live Streaming Metadata Spec.pdf”. Only private streams with metadata descriptor present should be considered as ID3-tag metadata streams.&lt;br /&gt;
#Parse the HLS/Transport stream for any '''PES header''' with the PID found in step 1.&lt;br /&gt;
#Follow standard MPEG-2 parsing procedures to locate the start of the payload of the PES packet.&lt;br /&gt;
#Copy the PES payload into a buffer.&lt;br /&gt;
#The ID3 tag spans 2 PES packets. Parse the stream for the next packet whose PID is set to the PID found in step 1. Typically the ID3 Tag is of 249 bytes. The steps below guide towards extraction of the ID3 tag&lt;br /&gt;
##In the first PES packet, look for &amp;quot;www.nielsen.com&amp;quot; , this is the start of the ID3 tag. Keep on parsing the first PES packet until the undefined char &amp;quot;\ufffd&amp;quot; is found. This forms the first half of the ID3 tag&lt;br /&gt;
##In the second PES packet, identify the end pattern, a regEx of /(\/\d+){3}/ and look to remove the lowest index of either “\x00” and/or “\ufffd”. Now the second packet has been appended and the demarcation of the Nielsen specific data has been defined. This segment can be simply substringed.&lt;br /&gt;
##Concatenate this substringed segment with the payload derived from the first packet get the ID3 payload.&lt;br /&gt;
#Check the length of the contents in the buffer to make sure that it is equal to the size of a Nielsen ID3 tag.&lt;br /&gt;
#Ensure that the ID3 byte array is converted into the string and escape it, so that the SDK can consume it.&lt;br /&gt;
Repeat steps 2 through 7 for all ID3 tags in the stream.&lt;br /&gt;
&lt;br /&gt;
'''References'''&lt;br /&gt;
*[http://www.iso.org/iso/catalogue_detail?csnumber=44169. ISO/IEC 13818-1:2007] Information technology – Generic coding of moving pictures and associated audio information: Systems&lt;br /&gt;
*https://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/HTTP_Live_Streaming_Metadata_Spec/&lt;br /&gt;
&lt;br /&gt;
=== Sample ID3 tags ===&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/X100zdCIGeIlgZnkYj6UvQ==/AAAB2Jz2_k74GXSzx4npHuI_&amp;lt;wbr /&amp;gt;JwJd3QSUpW30rDkGTcbHEzIMWleCzM-uvNOP9fzJcQMWQLJqzXMCAxParOb5sGijSV9dNM3QiBniJYGZ5GI-lL1fXTTN0IgZ4iWBmeRiPpS9AAAAAAAAAAAAAAAAAAAAAFJWFM5SVhTONNU=/00000/00000/00&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/R8WHe7pEBeqBhu8jTeXydg==/AAICoyitYqlxT7n6aZ0oMCGhe&amp;lt;wbr /&amp;gt;Fi4CXFp46AMUPZz1lMr_M9tr3_cjee1SHqxrOiVerMDLeyn9xzocZSKwi746Re8vNOtpNCAZjYABs_J0R25IHpvOc1HS8&amp;lt;wbr /&amp;gt;QHGgD5TgOJeS6gX100zdCIGeIlgZnkYj6UvVJWFNhSVhTiPE0=/00000/46016/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': ID3 tags are not applicable for International (Germany)&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser Opt-Out Implementation ==&lt;br /&gt;
The site in which video content is being measure via Nielsen methodology must provide the means for the user to opt-out of, or opt back into Nielsen Measurement.&lt;br /&gt;
&lt;br /&gt;
For Browser-based applications, opt-out setting is stored via Nielsen cookie. Therefore, it is only necessary that users be made aware of measurement opt-out by incorporating the template below in the user interface.&lt;br /&gt;
&lt;br /&gt;
=== Sample Opt Out Template ===&lt;br /&gt;
Our properties may feature Nielsen’s proprietary measurement software which will allow to contribute to market research, like Nielsen’s TV Ratings. To learn more about this information, see https://www.nielsen.com/digitalprivacy. Nielsen’s software may collect your choices with regards to it.&lt;br /&gt;
&lt;br /&gt;
== Nielsen Privacy Requirements ==&lt;br /&gt;
Privacy protections that Nielsen ensures to have with each App SDK integration are as follows.&lt;br /&gt;
*Disclosure of viewership data collection in EULA / Privacy Policy&lt;br /&gt;
*A link in the EULA/Privacy policy, or in another conspicuous location within the App, to a Nielsen-hosted web page outlining what Nielsen is collecting and how it is being used&lt;br /&gt;
*Method for users to opt-out of Nielsen measurement, any time while using the application&lt;br /&gt;
&lt;br /&gt;
=== Ratings Data Flow ===&lt;br /&gt;
Every view of creditable and watermarked content is measured by Nielsen.&lt;br /&gt;
[[File:RatingsDataFlow.png]]&lt;br /&gt;
&lt;br /&gt;
'''Information NOT Shared'''&lt;br /&gt;
* '''With Nielsen'''&lt;br /&gt;
** User's Identity&lt;br /&gt;
* '''With Data Provider'''&lt;br /&gt;
** Content information&lt;br /&gt;
** Whether user is viewing an ad or video content&lt;br /&gt;
** Player used to play the streaming (audio / video, etc.)&lt;br /&gt;
** Values being de-duped / aggregating for&lt;br /&gt;
&lt;br /&gt;
Nielsen collects only what it needs for audience measurement. Every view of creditable, watermarked content will be measured by Nielsen.&lt;br /&gt;
&lt;br /&gt;
=== Data Collected ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type of Information !! Parameter !! Transmitted to Nielsen? !! Sent to Provider?&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; | Nielsen ID3 Watermark&lt;br /&gt;
|-&lt;br /&gt;
| FinalDistributor Timestamp || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Program Content Timestamp || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Mobile Breakout Code || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Commercial Credit Code – Linear or Dynamic || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Time ShiftedViewing Code || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Segment Number || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Segment View Pattern || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;7&amp;quot; | Device/App Info&lt;br /&gt;
|-&lt;br /&gt;
| Device OSVersion || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| Device Model || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Cache Buster || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| SDKDisabled Flag || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| ServerCode || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Channel or URL || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; | Nielsen Identifiers&lt;br /&gt;
|-&lt;br /&gt;
| Client ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Campaign ID || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| Nielsen Unique Device ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Application ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| DeviceGroup (ex. Tablet, Smartphone, Desktop) || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| OS Group (ex. Android, iOS, Windows) || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| SDKVersion || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| IP Address for DMA, Country Code || Yes || Yes &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': Data is hashed, and encrypted using AES 128 before transmission to data provider.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Viewability_Data_Collected}}&lt;br /&gt;
&lt;br /&gt;
==== Example ping sent to provider ====&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://provider.com/cgi-bin/brandlift.php&amp;lt;/nowiki&amp;gt;?campaign_id=ff12725d724fac7934cf6003f096b4cd&amp;lt;wbr /&amp;gt;&amp;amp;placement_id=a4164b8fba9ee7c873a9c72c7091bb58&amp;lt;wbr /&amp;gt;&amp;amp;creative_id=25280139b61a947e127a52f56c8a2fdd&amp;lt;wbr /&amp;gt;&amp;amp;segment1=9000&amp;lt;wbr /&amp;gt;&amp;amp;segment2=41&amp;lt;wbr /&amp;gt;&amp;amp;segment3=iOS&amp;lt;wbr /&amp;gt;&amp;amp;OSVer=iOS6.1&amp;lt;wbr /&amp;gt;&amp;amp;c9=&amp;lt;wbr /&amp;gt;&amp;amp;devgrp=tablet&amp;lt;wbr /&amp;gt;&amp;amp;h=f5f243fe6d&amp;lt;wbr /&amp;gt;&amp;amp;rnd=1376971827360&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This ping passes the following parameters to the provider:&lt;br /&gt;
* Campaign ID – (campaign, placement, creative)&lt;br /&gt;
* Country Code&lt;br /&gt;
* DMA&lt;br /&gt;
* OS Group (ex. iOS, Android)&lt;br /&gt;
* DeviceOS Version&lt;br /&gt;
* Device Advertiser ID&lt;br /&gt;
* DeviceGroup (ex. Tablet, Smartphone, Desktop)&lt;br /&gt;
* Cache Buster&lt;br /&gt;
&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
=== Opt-Out Implementation ===&lt;br /&gt;
The site must provide the means for the user to opt-out of, or opt back into Nielsen Measurement.&lt;br /&gt;
&lt;br /&gt;
'''Sample Opt Out Template'''&lt;br /&gt;
&lt;br /&gt;
Our properties may feature Nielsen’s proprietary measurement software which will allow to contribute to market research, like Nielsen’s TV Ratings. To learn more about this information, please [http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html| click here]. Nielsen’s software may collect your choices with regards to it.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
See [[Digital Measurement Testing#Testing Browser Implementation|Digital Measurement Testing - Testing Browser Implementation]].&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_API_Reference&amp;diff=6792</id>
		<title>Browser SDK API Reference</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_API_Reference&amp;diff=6792"/>
		<updated>2024-12-11T20:02:17Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Setting up Development Environment ==&lt;br /&gt;
=== Step 1: Configure Content Management System (CMS) ===&lt;br /&gt;
Configure CMS to send the required values (see table below). Any internal CMS_variable names can be used for passing the data.&lt;br /&gt;
&lt;br /&gt;
Ensure to capture these CMS_variable names in the SDK Configuration Form.&lt;br /&gt;
&lt;br /&gt;
For more information on setting variable names, see the SDK Configuration Form included within the SDK package.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Required Data !! Description !! Value&lt;br /&gt;
|-&lt;br /&gt;
| dataSrc || Used when both CMS metadata and ID3 data are present in the player. Setting this field tells the SDK whether to use the CMS metadata or the ID3 payload to derive the pings || cms&lt;br /&gt;
|-&lt;br /&gt;
| type || Type of asset: ad or content || preroll, midroll, postroll, or content&lt;br /&gt;
|-&lt;br /&gt;
| assetid || unique ID assigned to asset || custom &amp;lt;br&amp;gt;(no [[Special Characters]])&lt;br /&gt;
|-&lt;br /&gt;
| OCR Tag || OCR tag provided by Nielsen for implementation on the ad unit || Complete OCR URL&lt;br /&gt;
|-&lt;br /&gt;
| program || Name of program (25 character limit) || custom&lt;br /&gt;
|-&lt;br /&gt;
| title || Episode title (40 character limit) || custom&lt;br /&gt;
|-&lt;br /&gt;
| length || Length of content in seconds || Length in seconds, 0 for live stream&lt;br /&gt;
|-&lt;br /&gt;
| adloadtype || Type of ad load || &amp;quot;1&amp;quot; - Linear &amp;quot;2&amp;quot; - Dynamic(default)&lt;br /&gt;
|-&lt;br /&gt;
| hasAds || Identify if content includes Ads ||  &amp;quot;0&amp;quot; - no ads &amp;quot;1&amp;quot; - includes ads &amp;quot;2&amp;quot; - unknown(default)&lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode || Full episode flag	|| &amp;quot;y&amp;quot; - full episode &amp;quot;n&amp;quot; - non full episode&lt;br /&gt;
|-&lt;br /&gt;
| segA || Segment A (this is not available for video reporting as the episode title is reported) || custom value&lt;br /&gt;
|-&lt;br /&gt;
| segB || Custom segment B || custom value&lt;br /&gt;
|-&lt;br /&gt;
| segC || Custom segment C || custom value&lt;br /&gt;
|-&lt;br /&gt;
| crossId1 || Standard episode ID || custom value&lt;br /&gt;
|-&lt;br /&gt;
| crossId2 || Content originator (required only for distributors) || custom value&lt;br /&gt;
|-&lt;br /&gt;
| airdate || Original air date and time in Eastern Time. For non-US countries, it should be local time. || YYYYMMDD HH24:MI:SS&lt;br /&gt;
|-&lt;br /&gt;
| containerId || HTML DOM element of the Player container (for Viewability&amp;amp;Audibility feature only) || custom value &lt;br /&gt;
|-&lt;br /&gt;
|luid&lt;br /&gt;
|Living Unit ID - Experian Household ID&lt;br /&gt;
'''Note: This parameter is applicable only for CTV and First Party Livestream data'''&lt;br /&gt;
|&amp;quot;B0EOFEDgD&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Complete the Nielsen SDK Configuration Form ===&lt;br /&gt;
The SDK is designed to map the &amp;lt;code&amp;gt;CMS_variable names&amp;lt;/code&amp;gt;. To support the custom mapping, the developer is required to complete the SDK Configuration Form. The form will be provided during onboarding along with this guide.&lt;br /&gt;
&lt;br /&gt;
== Initialization ==&lt;br /&gt;
=== Obtain the Nielsen Application ID (apid) and Browser SDK URLs ===&lt;br /&gt;
The Nielsen &amp;lt;code&amp;gt;apid&amp;lt;/code&amp;gt; is required to enable SDK functionality. Technical Account Manager will provide an apid for each player configuration.  &lt;br /&gt;
Browser SDK can support URLs that use any of the protocols – HTTPS and HTTP.  &lt;br /&gt;
&lt;br /&gt;
=== Configure Browser SDK ===&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
&lt;br /&gt;
'''Add Static Queue Snippet'''&lt;br /&gt;
&lt;br /&gt;
*Add Static Queue Snippet&lt;br /&gt;
*Create SDK Instance&lt;br /&gt;
&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
'''Create SDK Instance'''&lt;br /&gt;
&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
'''Initialization API Call'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When creating an instance, pass the following three values:&lt;br /&gt;
&lt;br /&gt;
=== SDK Initialization – Global Parameters ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameters !! Description !! Value&lt;br /&gt;
|-&lt;br /&gt;
| apid || UniqueID assigned to player/site. || 	'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
| instanceName || Name of SDK instance || &amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug || Enables Nielsen console logging. Only required for testing || &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| containerId || HTML DOM element id of the player container. Only for Viewability &amp;amp; Audibility feature. || {containerId: &amp;quot;playerId1&amp;quot;}&lt;br /&gt;
|-&lt;br /&gt;
| hem_sha256 || SHA256-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| hem_sha1 || SHA1-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;XvBniTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| hem_md5 || MD5-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;JnIbdTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| uid2 || An identifier based on a user’s verifiable PII (e.g. hashed email). UID2.0 was initially created by The Trade Desk (TTD) and is now managed by Prebid. || &amp;quot;MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| uid2_token || Encrypted Unified ID 2.0 || &amp;quot;AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8Ql&lt;br /&gt;
DSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeK&lt;br /&gt;
QI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhC&lt;br /&gt;
xG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{example_bsdk_init}}&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Configuration'''&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
  var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;,&amp;quot;nlsnInstance&amp;quot;, {nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multiple SDK Instances ===&lt;br /&gt;
The Browser SDK allows instantiating multiple instances of the object, which can be used simultaneously without any problems, however they must be instantiated with their own unique instance names. There is no maximum number of instances that is enforced in the browser.&lt;br /&gt;
&lt;br /&gt;
The below examples will make use of the same AppId, however using different AppIds will work as well. The principles below follow the same initialization rules stated above for a single instance and simply require a unique instance name and variable name with which the returned instance is assigned.&lt;br /&gt;
&lt;br /&gt;
For more information around the possible parameters that can be passed as well as deeper descriptions for the API calls, please refer to the section on  [[#SDK_Initialization_-_Global Parameters|'''SDK Initialization - Global Parameters''']].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Example of 2 instances on the same page'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Add Static Queue Snippet&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    !function (e, n) {&lt;br /&gt;
      function t(e) {&lt;br /&gt;
        return &amp;quot;object&amp;quot; == typeof e ? JSON.parse(JSON.stringify(e)) : e&lt;br /&gt;
      }&lt;br /&gt;
      e[n] = e[n] ||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ: function (o, r, c) {&lt;br /&gt;
          var s = e.document,&lt;br /&gt;
            a = s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async = 1,&lt;br /&gt;
            a.src = (&amp;quot;http:&amp;quot; === e.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + o + &amp;quot;.js#name=&amp;quot; + r + &amp;quot;&amp;amp;ns=&amp;quot; + n;&lt;br /&gt;
          var i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a, i),&lt;br /&gt;
            e[n][r] = e[n][r] || {&lt;br /&gt;
              g: c || {},&lt;br /&gt;
              ggPM: function (o, c, s, a, i) { e[n][r].q = e[n][r].q || []; try { var l = t([o, c, s, a, i]); e[n][r].q.push(l) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } },&lt;br /&gt;
              trackEvent: function (o) { e[n][r].te = e[n][r].te || []; try { var c = t(o); e[n][r].te.push(c) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } }&lt;br /&gt;
            },&lt;br /&gt;
            e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    //Create SDK Instance(s)&lt;br /&gt;
    // Notice the unique instance name given to each instance below and the unique variable name for each instance&lt;br /&gt;
    var nSdkInstanceLive = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;instanceLive&amp;quot;, {&lt;br /&gt;
        nol_sdkDebug: 'debug',&lt;br /&gt;
        optout: 'false'&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    var nSdkInstanceVod = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;instanceVod&amp;quot;, {&lt;br /&gt;
        nol_sdkDebug: 'debug',&lt;br /&gt;
        optout: 'false'&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Example of 2 instances using a parent page and iFrame'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Parent Page (index.html)&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;ie=edge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;DCR Static/DCR Video&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    /* NLSQUEUE build v*/&lt;br /&gt;
    !function(e,n){&lt;br /&gt;
    function t(e){&lt;br /&gt;
      return&amp;quot;object&amp;quot;==typeof e?JSON.parse(JSON.stringify(e)):e&lt;br /&gt;
    }&lt;br /&gt;
    e[n]=e[n]||&lt;br /&gt;
    {&lt;br /&gt;
      nlsQ:function(o,r,c){&lt;br /&gt;
        var s=e.document,&lt;br /&gt;
        a=s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
        a.async=1,&lt;br /&gt;
        a.src=(&amp;quot;http:&amp;quot;===e.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+o+&amp;quot;.js#name=&amp;quot;+r+&amp;quot;&amp;amp;ns=&amp;quot;+n;&lt;br /&gt;
        var i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
        return i.parentNode.insertBefore(a,i),&lt;br /&gt;
        e[n][r]=e[n][r]||{g:c||{},&lt;br /&gt;
        ggPM:function(o,c,s,a,i){e[n][r].q=e[n][r].q||[];try{var l=t([o,c,s,a,i]);e[n][r].q.push(l)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}},&lt;br /&gt;
        trackEvent:function(o){e[n][r].te=e[n][r].te||[];try{var c=t(o);e[n][r].te.push(c)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}}},&lt;br /&gt;
        e[n][r]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // SDK Initialization&lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;staticPage&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: 'debug',&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Static Metadata &lt;br /&gt;
    var staticMetadata = {&lt;br /&gt;
      assetid: 'staticTestPage',&lt;br /&gt;
      type: 'static'&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    // Event 'staticstart' call&lt;br /&gt;
    nSdkInstance.ggPM(14, staticMetadata);&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;h1&amp;gt;DCR Static on Parent/DCR Video in iFrame&amp;lt;/h1&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Static measurement is current on parent page when window is in focus&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;iframe src=&amp;quot;./dcr-video.html&amp;quot; frameborder=&amp;quot;0&amp;quot; width=&amp;quot;650&amp;quot; height=&amp;quot;500&amp;quot; style=&amp;quot;background-color: rgb(42, 217, 248);&amp;quot; id=&amp;quot;video-iframe&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Nested iFrame Referenced on Parent Page (dcr-video.html)&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;ie=edge&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;iFrame Same Source&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
    /* NLSQUEUE build v*/&lt;br /&gt;
    !function(e,n){&lt;br /&gt;
      function t(e){&lt;br /&gt;
        return&amp;quot;object&amp;quot;==typeof e?JSON.parse(JSON.stringify(e)):e&lt;br /&gt;
      }&lt;br /&gt;
      e[n]=e[n]||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ:function(o,r,c){&lt;br /&gt;
          var s=e.document,&lt;br /&gt;
          a=s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async=1,&lt;br /&gt;
          a.src=(&amp;quot;http:&amp;quot;===e.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+o+&amp;quot;.js#name=&amp;quot;+r+&amp;quot;&amp;amp;ns=&amp;quot;+n;&lt;br /&gt;
          var i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a,i),&lt;br /&gt;
          e[n][r]=e[n][r]||{g:c||{},&lt;br /&gt;
          ggPM:function(o,c,s,a,i){e[n][r].q=e[n][r].q||[];try{var l=t([o,c,s,a,i]);e[n][r].q.push(l)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}},&lt;br /&gt;
          trackEvent:function(o){e[n][r].te=e[n][r].te||[];try{var c=t(o);e[n][r].te.push(c)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}}},&lt;br /&gt;
          e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // SDK Initialization&lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;videoPlayer&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: 'debug',&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    var contentMetadata = {&lt;br /&gt;
        type: &amp;quot;content&amp;quot;,&lt;br /&gt;
        length: &amp;quot;300&amp;quot;,&lt;br /&gt;
        title: &amp;quot;Skydiving Across Europe&amp;quot;,&lt;br /&gt;
        program: &amp;quot;latacg&amp;quot;,&lt;br /&gt;
        censuscategory: &amp;quot;Enlisted&amp;quot;,&lt;br /&gt;
        assetid: &amp;quot;204558915992&amp;quot;,&lt;br /&gt;
        section: &amp;quot;ProgramAsset8&amp;quot;,&lt;br /&gt;
        tv: &amp;quot;true&amp;quot;,&lt;br /&gt;
        adModel: &amp;quot;0&amp;quot;,&lt;br /&gt;
        dataSrc: &amp;quot;cms&amp;quot;,&lt;br /&gt;
        segA: &amp;quot;S07E04:NBC&amp;quot;,&lt;br /&gt;
        segB: &amp;quot;teams&amp;quot;,&lt;br /&gt;
        segC:&amp;quot;AtlanataFalcons&amp;quot;,&lt;br /&gt;
      }&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;I'm iframe SDK DCR Video measurement, DCR static measurement should continue when clicking &amp;quot;play&amp;quot; on video&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;main&amp;gt;&lt;br /&gt;
      &amp;lt;video&lt;br /&gt;
      controls&lt;br /&gt;
      src=&amp;quot;https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4&amp;quot;&lt;br /&gt;
      poster=&amp;quot;https://peach.blender.org/wp-content/uploads/title_anouncement.jpg?x11217&amp;quot;&lt;br /&gt;
      width=&amp;quot;620&amp;quot;&amp;gt;&lt;br /&gt;
      Sorry, your browser doesn't support embedded videos, but don't worry, you can&lt;br /&gt;
      &amp;lt;a href=&amp;quot;https://archive.org/details/BigBuckBunny_124&amp;quot;&amp;gt;download it&amp;lt;/a&amp;gt;&lt;br /&gt;
      and watch it with your favorite video player!&lt;br /&gt;
    &amp;lt;/video&amp;gt;&lt;br /&gt;
    &amp;lt;/main&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;../player.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SDK Initialization to measure the Viewability &amp;amp; Audibility ===&lt;br /&gt;
To support viewability metrics in the web page the integrator has to provide a tag value of the player view to let Nielsen SDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in the as string while initializing the Nielsen browser SDK.&lt;br /&gt;
&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{containerId: &amp;lt;playerElementID&amp;gt;, nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Initialization for Viewability'''&lt;br /&gt;
&lt;br /&gt;
Your configuration should include the Static Queue Snippet and an SDK Instance for your unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Add Static Queue Snippet&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    ! function(t, n) {&lt;br /&gt;
        t[n] = t[n] || {&lt;br /&gt;
            nlsQ: function(e, o, c, r, s, i) {&lt;br /&gt;
                return s = t.document,&lt;br /&gt;
                    r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
                    r.async = 1,&lt;br /&gt;
                    r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + o + &amp;quot;&amp;amp;ns=&amp;quot; + n,&lt;br /&gt;
                    i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
                    i.parentNode.insertBefore(r, i),&lt;br /&gt;
                    t[n][o] = t[n][o] || {&lt;br /&gt;
                        g: c || {},&lt;br /&gt;
                        ggPM: function(e, c, r, s, i) {&lt;br /&gt;
                            (t[n][o].q = t[n][o].q || []).push([e, c, r, s, i])&lt;br /&gt;
                        }&lt;br /&gt;
                    }, t[n][o]&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    (window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
//Create SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {containerId: “player1”, nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser SDK API Methods &amp;amp; Properties ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method / Property !! Event # !! DTVR !! DAR !! DCR !! Description&lt;br /&gt;
|-&lt;br /&gt;
| [[loadMetadata (Browser)|loadMetadata]] || 15 || ✔ || ✔ || ✔ || Used when there is a preroll ad that needs to be associated with content metadata. The loadMetadata will first be called to populate the content metadata values and then the loadMetadata for ad metadata will be called. This allows sending a content ping with the ad info, even if the user bails out during the preroll ad.&lt;br /&gt;
|-&lt;br /&gt;
| [[play (Browser)|play]] || 5 || ✔ || ✘ || ✔ || Used when there is an ID3 fed product such as DTVR and the client does not want to send in all the CMS metadata that is sent in loadMetadata. This allows the client to send in at least the required “channel name” value associated to the ID3 feed. When the client passes in the channelName, they can change the CMS data stored by passing new values. If this event is not called then the “channel name” value populated will be the default value of “defaultChannelName”.&lt;br /&gt;
|-&lt;br /&gt;
| [[sendID3 (Browser)|sendID3]] || 55 || ✔ || ✘ || ✘ || Used to send the ID3 metadata.&lt;br /&gt;
|-&lt;br /&gt;
| [[setPlayheadPosition (Browser)|setPlayheadPosition]] || 49 || ✘ || ✘ || ✔ || Used to send the playhead position.&lt;br /&gt;
|-&lt;br /&gt;
| [[stop (Browser)|stop]] || 7 || ✘ || ✘ || ✔ || Used when switching between ad and content or content and ad.&lt;br /&gt;
|-&lt;br /&gt;
| [[end (Browser)|end]] || 57 || ✔ || ✘ || ✔ || This is triggered 1) at the end of the content stream, 2) if the user switches to another piece of content 3) when the browser is refreshed or closed&lt;br /&gt;
|-&lt;br /&gt;
| [[staticstart (Browser)|staticstart]] || 14 || ✘ || ✘ || ✔ || Used to send the metadata for the static page.&lt;br /&gt;
|-&lt;br /&gt;
| [[StaticEnd (Browser)|staticend]] || 56 || ✘ || ✘ || ✔ || In Single Page Application (SPA) it is imperative that staticend is called prior to the loading of new metadata. This allows the Browser SDK to properly credit the previous section/content being viewed before measuring the new one.&lt;br /&gt;
|-&lt;br /&gt;
| [[updateOTT (Browser)|updateOTT]] || - || ✘ || ✘ || ✔ || Used to notify Browser SDK that the remote OTT device (like Google ChromeCast, Roku, Amazon FireTV, etc.) is connected / disconnected (change of OTT status).&lt;br /&gt;
|-&lt;br /&gt;
| [[ onPaginate (Browser)|onPaginate]] || 30 || ✘ || ✘ || ✔ || Used to create a new instance of the SDK object&lt;br /&gt;
|-&lt;br /&gt;
| [[updateMetadata (Browser)|updateMetadata]] || 35 || ✔ || ✔ || ✔ || This event is used for updating metadata parameters for the content or ad that is being played.&lt;br /&gt;
|-&lt;br /&gt;
| [[setVolume_(Browser)|setVolume]] || 61 || ✔ || ✘ || ✔ || Used to pass in the player volume levels in %. Default value is -1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Retrieving ID3 Tags ==&lt;br /&gt;
The video player must have the ability to extract ID3 tags and supply them to the Browser SDK, based on the HLS standard.&lt;br /&gt;
*An ID3 tag spans two PES packets.&lt;br /&gt;
**In the first PES packet, look for www.nielsen.com, this is the start of the ID3 tag. Continue to parse the first PES packet until the undefined char &amp;quot;\ufffd&amp;quot; is found. This forms the first half of the ID3 tag&lt;br /&gt;
**In the second PES packet, identify the end pattern – a regEx of /(\/\d+){3}/ and look to remove the lowest index of either &amp;quot;\x00&amp;quot; and/or &amp;quot;\ufffd&amp;quot;. Now the second packet has been appended and the demarcation of the Nielsen-specific data has been defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Follow the procedure below, to extract Nielsen ID3 tags from an MPEG-2 transport stream (including HLS streams).&lt;br /&gt;
#Parse the Program Map Table (PMT) to find the PID of the metadata stream. Confirm the presence of the metadata descriptor described in section 2.3.3 of Apple’s “HTTP Live Streaming Metadata Spec.pdf”. Only private streams with metadata descriptor present should be considered as ID3-tag metadata streams.&lt;br /&gt;
#Parse the HLS/Transport stream for any '''PES header''' with the PID found in step 1.&lt;br /&gt;
#Follow standard MPEG-2 parsing procedures to locate the start of the payload of the PES packet.&lt;br /&gt;
#Copy the PES payload into a buffer.&lt;br /&gt;
#The ID3 tag spans 2 PES packets. Parse the stream for the next packet whose PID is set to the PID found in step 1. Typically the ID3 Tag is of 249 bytes. The steps below guide towards extraction of the ID3 tag&lt;br /&gt;
##In the first PES packet, look for &amp;quot;www.nielsen.com&amp;quot; , this is the start of the ID3 tag. Keep on parsing the first PES packet until the undefined char &amp;quot;\ufffd&amp;quot; is found. This forms the first half of the ID3 tag&lt;br /&gt;
##In the second PES packet, identify the end pattern, a regEx of /(\/\d+){3}/ and look to remove the lowest index of either “\x00” and/or “\ufffd”. Now the second packet has been appended and the demarcation of the Nielsen specific data has been defined. This segment can be simply substringed.&lt;br /&gt;
##Concatenate this substringed segment with the payload derived from the first packet get the ID3 payload.&lt;br /&gt;
#Check the length of the contents in the buffer to make sure that it is equal to the size of a Nielsen ID3 tag.&lt;br /&gt;
#Ensure that the ID3 byte array is converted into the string and escape it, so that the SDK can consume it.&lt;br /&gt;
Repeat steps 2 through 7 for all ID3 tags in the stream.&lt;br /&gt;
&lt;br /&gt;
'''References'''&lt;br /&gt;
*[http://www.iso.org/iso/catalogue_detail?csnumber=44169. ISO/IEC 13818-1:2007] Information technology – Generic coding of moving pictures and associated audio information: Systems&lt;br /&gt;
*https://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/HTTP_Live_Streaming_Metadata_Spec/&lt;br /&gt;
&lt;br /&gt;
=== Sample ID3 tags ===&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/X100zdCIGeIlgZnkYj6UvQ==/AAAB2Jz2_k74GXSzx4npHuI_&amp;lt;wbr /&amp;gt;JwJd3QSUpW30rDkGTcbHEzIMWleCzM-uvNOP9fzJcQMWQLJqzXMCAxParOb5sGijSV9dNM3QiBniJYGZ5GI-lL1fXTTN0IgZ4iWBmeRiPpS9AAAAAAAAAAAAAAAAAAAAAFJWFM5SVhTONNU=/00000/00000/00&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/R8WHe7pEBeqBhu8jTeXydg==/AAICoyitYqlxT7n6aZ0oMCGhe&amp;lt;wbr /&amp;gt;Fi4CXFp46AMUPZz1lMr_M9tr3_cjee1SHqxrOiVerMDLeyn9xzocZSKwi746Re8vNOtpNCAZjYABs_J0R25IHpvOc1HS8&amp;lt;wbr /&amp;gt;QHGgD5TgOJeS6gX100zdCIGeIlgZnkYj6UvVJWFNhSVhTiPE0=/00000/46016/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': ID3 tags are not applicable for International (Germany)&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser Opt-Out Implementation ==&lt;br /&gt;
The site in which video content is being measure via Nielsen methodology must provide the means for the user to opt-out of, or opt back into Nielsen Measurement.&lt;br /&gt;
&lt;br /&gt;
For Browser-based applications, opt-out setting is stored via Nielsen cookie. Therefore, it is only necessary that users be made aware of measurement opt-out by incorporating the template below in the user interface.&lt;br /&gt;
&lt;br /&gt;
=== Sample Opt Out Template ===&lt;br /&gt;
Our properties may feature Nielsen’s proprietary measurement software which will allow to contribute to market research, like Nielsen’s TV Ratings. To learn more about this information, see https://www.nielsen.com/digitalprivacy. Nielsen’s software may collect your choices with regards to it.&lt;br /&gt;
&lt;br /&gt;
== Nielsen Privacy Requirements ==&lt;br /&gt;
Privacy protections that Nielsen ensures to have with each App SDK integration are as follows.&lt;br /&gt;
*Disclosure of viewership data collection in EULA / Privacy Policy&lt;br /&gt;
*A link in the EULA/Privacy policy, or in another conspicuous location within the App, to a Nielsen-hosted web page outlining what Nielsen is collecting and how it is being used&lt;br /&gt;
*Method for users to opt-out of Nielsen measurement, any time while using the application&lt;br /&gt;
&lt;br /&gt;
=== Ratings Data Flow ===&lt;br /&gt;
Every view of creditable and watermarked content is measured by Nielsen.&lt;br /&gt;
[[File:RatingsDataFlow.png]]&lt;br /&gt;
&lt;br /&gt;
'''Information NOT Shared'''&lt;br /&gt;
* '''With Nielsen'''&lt;br /&gt;
** User's Identity&lt;br /&gt;
* '''With Data Provider'''&lt;br /&gt;
** Content information&lt;br /&gt;
** Whether user is viewing an ad or video content&lt;br /&gt;
** Player used to play the streaming (audio / video, etc.)&lt;br /&gt;
** Values being de-duped / aggregating for&lt;br /&gt;
&lt;br /&gt;
Nielsen collects only what it needs for audience measurement. Every view of creditable, watermarked content will be measured by Nielsen.&lt;br /&gt;
&lt;br /&gt;
=== Data Collected ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type of Information !! Parameter !! Transmitted to Nielsen? !! Sent to Provider?&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; | Nielsen ID3 Watermark&lt;br /&gt;
|-&lt;br /&gt;
| FinalDistributor Timestamp || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Program Content Timestamp || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Mobile Breakout Code || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Commercial Credit Code – Linear or Dynamic || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Time ShiftedViewing Code || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Segment Number || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Segment View Pattern || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;7&amp;quot; | Device/App Info&lt;br /&gt;
|-&lt;br /&gt;
| Device OSVersion || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| Device Model || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Cache Buster || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| SDKDisabled Flag || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| ServerCode || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Channel or URL || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; | Nielsen Identifiers&lt;br /&gt;
|-&lt;br /&gt;
| Client ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Campaign ID || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| Nielsen Unique Device ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Application ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| DeviceGroup (ex. Tablet, Smartphone, Desktop) || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| OS Group (ex. Android, iOS, Windows) || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| SDKVersion || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| IP Address for DMA, Country Code || Yes || Yes &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': Data is hashed, and encrypted using AES 128 before transmission to data provider.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Viewability_Data_Collected}}&lt;br /&gt;
&lt;br /&gt;
==== Example ping sent to provider ====&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://provider.com/cgi-bin/brandlift.php&amp;lt;/nowiki&amp;gt;?campaign_id=ff12725d724fac7934cf6003f096b4cd&amp;lt;wbr /&amp;gt;&amp;amp;placement_id=a4164b8fba9ee7c873a9c72c7091bb58&amp;lt;wbr /&amp;gt;&amp;amp;creative_id=25280139b61a947e127a52f56c8a2fdd&amp;lt;wbr /&amp;gt;&amp;amp;segment1=9000&amp;lt;wbr /&amp;gt;&amp;amp;segment2=41&amp;lt;wbr /&amp;gt;&amp;amp;segment3=iOS&amp;lt;wbr /&amp;gt;&amp;amp;OSVer=iOS6.1&amp;lt;wbr /&amp;gt;&amp;amp;c9=&amp;lt;wbr /&amp;gt;&amp;amp;devgrp=tablet&amp;lt;wbr /&amp;gt;&amp;amp;h=f5f243fe6d&amp;lt;wbr /&amp;gt;&amp;amp;rnd=1376971827360&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This ping passes the following parameters to the provider:&lt;br /&gt;
* Campaign ID – (campaign, placement, creative)&lt;br /&gt;
* Country Code&lt;br /&gt;
* DMA&lt;br /&gt;
* OS Group (ex. iOS, Android)&lt;br /&gt;
* DeviceOS Version&lt;br /&gt;
* Device Advertiser ID&lt;br /&gt;
* DeviceGroup (ex. Tablet, Smartphone, Desktop)&lt;br /&gt;
* Cache Buster&lt;br /&gt;
&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
=== Opt-Out Implementation ===&lt;br /&gt;
The site must provide the means for the user to opt-out of, or opt back into Nielsen Measurement.&lt;br /&gt;
&lt;br /&gt;
'''Sample Opt Out Template'''&lt;br /&gt;
&lt;br /&gt;
Our properties may feature Nielsen’s proprietary measurement software which will allow to contribute to market research, like Nielsen’s TV Ratings. To learn more about this information, please [http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html| click here]. Nielsen’s software may collect your choices with regards to it.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
See [[Digital Measurement Testing#Testing Browser Implementation|Digital Measurement Testing - Testing Browser Implementation]].&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_API_Reference&amp;diff=6791</id>
		<title>Browser SDK API Reference</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_API_Reference&amp;diff=6791"/>
		<updated>2024-12-11T16:27:08Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: /* Multiple SDK Instances */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Setting up Development Environment ==&lt;br /&gt;
=== Step 1: Configure Content Management System (CMS) ===&lt;br /&gt;
Configure CMS to send the required values (see table below). Any internal CMS_variable names can be used for passing the data.&lt;br /&gt;
&lt;br /&gt;
Ensure to capture these CMS_variable names in the SDK Configuration Form.&lt;br /&gt;
&lt;br /&gt;
For more information on setting variable names, see the SDK Configuration Form included within the SDK package.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Required Data !! Description !! Value&lt;br /&gt;
|-&lt;br /&gt;
| dataSrc || Used when both CMS metadata and ID3 data are present in the player. Setting this field tells the SDK whether to use the CMS metadata or the ID3 payload to derive the pings || cms&lt;br /&gt;
|-&lt;br /&gt;
| type || Type of asset: ad or content || preroll, midroll, postroll, or content&lt;br /&gt;
|-&lt;br /&gt;
| assetid || unique ID assigned to asset || custom &amp;lt;br&amp;gt;(no [[Special Characters]])&lt;br /&gt;
|-&lt;br /&gt;
| OCR Tag || OCR tag provided by Nielsen for implementation on the ad unit || Complete OCR URL&lt;br /&gt;
|-&lt;br /&gt;
| program || Name of program (25 character limit) || custom&lt;br /&gt;
|-&lt;br /&gt;
| title || Episode title (40 character limit) || custom&lt;br /&gt;
|-&lt;br /&gt;
| length || Length of content in seconds || Length in seconds, 0 for live stream&lt;br /&gt;
|-&lt;br /&gt;
| adloadtype || Type of ad load || &amp;quot;1&amp;quot; - Linear &amp;quot;2&amp;quot; - Dynamic(default)&lt;br /&gt;
|-&lt;br /&gt;
| hasAds || Identify if content includes Ads ||  &amp;quot;0&amp;quot; - no ads &amp;quot;1&amp;quot; - includes ads &amp;quot;2&amp;quot; - unknown(default)&lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode || Full episode flag	|| &amp;quot;y&amp;quot; - full episode &amp;quot;n&amp;quot; - non full episode&lt;br /&gt;
|-&lt;br /&gt;
| segA || Segment A (this is not available for video reporting as the episode title is reported) || custom value&lt;br /&gt;
|-&lt;br /&gt;
| segB || Custom segment B || custom value&lt;br /&gt;
|-&lt;br /&gt;
| segC || Custom segment C || custom value&lt;br /&gt;
|-&lt;br /&gt;
| crossId1 || Standard episode ID || custom value&lt;br /&gt;
|-&lt;br /&gt;
| crossId2 || Content originator (required only for distributors) || custom value&lt;br /&gt;
|-&lt;br /&gt;
| airdate || Original air date and time in Eastern Time. For non-US countries, it should be local time. || YYYYMMDD HH24:MI:SS&lt;br /&gt;
|-&lt;br /&gt;
| containerId || HTML DOM element of the Player container (for Viewability&amp;amp;Audibility feature only) || custom value &lt;br /&gt;
|-&lt;br /&gt;
|luid&lt;br /&gt;
|Living Unit ID - Experian Household ID&lt;br /&gt;
'''Note: This parameter is applicable only for CTV and First Party Livestream data'''&lt;br /&gt;
|&amp;quot;B0EOFEDgD&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Complete the Nielsen SDK Configuration Form ===&lt;br /&gt;
The SDK is designed to map the &amp;lt;code&amp;gt;CMS_variable names&amp;lt;/code&amp;gt;. To support the custom mapping, the developer is required to complete the SDK Configuration Form. The form will be provided during onboarding along with this guide.&lt;br /&gt;
&lt;br /&gt;
== Initialization ==&lt;br /&gt;
=== Obtain the Nielsen Application ID (apid) and Browser SDK URLs ===&lt;br /&gt;
The Nielsen &amp;lt;code&amp;gt;apid&amp;lt;/code&amp;gt; is required to enable SDK functionality. Technical Account Manager will provide an apid for each player configuration.  &lt;br /&gt;
Browser SDK can support URLs that use any of the protocols – HTTPS and HTTP.  &lt;br /&gt;
&lt;br /&gt;
=== Configure Browser SDK ===&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
&lt;br /&gt;
'''Add Static Queue Snippet'''&lt;br /&gt;
&lt;br /&gt;
*Add Static Queue Snippet&lt;br /&gt;
*Create SDK Instance&lt;br /&gt;
&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
'''Create SDK Instance'''&lt;br /&gt;
&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
'''Initialization API Call'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When creating an instance, pass the following three values:&lt;br /&gt;
&lt;br /&gt;
=== SDK Initialization – Global Parameters ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameters !! Description !! Value&lt;br /&gt;
|-&lt;br /&gt;
| apid || UniqueID assigned to player/site. || 	'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
| instanceName || Name of SDK instance || &amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug || Enables Nielsen console logging. Only required for testing || &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| containerId || HTML DOM element id of the player container. Only for Viewability &amp;amp; Audibility feature. || {containerId: &amp;quot;playerId1&amp;quot;}&lt;br /&gt;
|-&lt;br /&gt;
| hem_sha256 || SHA256-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| hem_sha1 || SHA1-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;XvBniTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| hem_md5 || MD5-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;JnIbdTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| uid2 || An identifier based on a user’s verifiable PII (e.g. hashed email). UID2.0 was initially created by The Trade Desk (TTD) and is now managed by Prebid. || &amp;quot;MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| uid2_token || Encrypted Unified ID 2.0 || &amp;quot;AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8Ql&lt;br /&gt;
DSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeK&lt;br /&gt;
QI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhC&lt;br /&gt;
xG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{example_bsdk_init}}&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Configuration'''&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
  var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;,&amp;quot;nlsnInstance&amp;quot;, {nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multiple SDK Instances ===&lt;br /&gt;
The Browser SDK allows instantiating multiple instances of the object, which can be used simultaneously without any problems, however they must be instantiated with their own unique instance names. There is no maximum number of instances that is enforced in the browser.&lt;br /&gt;
&lt;br /&gt;
The below examples will make use of the same AppId, however using different AppIds will work as well. The principles below follow the same initialization rules stated above for a single instance and simply require a unique instance name and variable name with which the returned instance is assigned.&lt;br /&gt;
&lt;br /&gt;
For more information around the possible parameters that can be passed as well as deeper descriptions for the API calls, please refer to the section on  [[#SDK Initialization - Global Parameters|'''SDK Initialization - Global Parameters''']].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Example of 2 instances on the same page'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Add Static Queue Snippet&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    !function (e, n) {&lt;br /&gt;
      function t(e) {&lt;br /&gt;
        return &amp;quot;object&amp;quot; == typeof e ? JSON.parse(JSON.stringify(e)) : e&lt;br /&gt;
      }&lt;br /&gt;
      e[n] = e[n] ||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ: function (o, r, c) {&lt;br /&gt;
          var s = e.document,&lt;br /&gt;
            a = s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async = 1,&lt;br /&gt;
            a.src = (&amp;quot;http:&amp;quot; === e.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + o + &amp;quot;.js#name=&amp;quot; + r + &amp;quot;&amp;amp;ns=&amp;quot; + n;&lt;br /&gt;
          var i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a, i),&lt;br /&gt;
            e[n][r] = e[n][r] || {&lt;br /&gt;
              g: c || {},&lt;br /&gt;
              ggPM: function (o, c, s, a, i) { e[n][r].q = e[n][r].q || []; try { var l = t([o, c, s, a, i]); e[n][r].q.push(l) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } },&lt;br /&gt;
              trackEvent: function (o) { e[n][r].te = e[n][r].te || []; try { var c = t(o); e[n][r].te.push(c) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } }&lt;br /&gt;
            },&lt;br /&gt;
            e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    //Create SDK Instance(s)&lt;br /&gt;
    // Notice the unique instance name given to each instance below and the unique variable name for each instance&lt;br /&gt;
    var nSdkInstanceLive = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;instanceLive&amp;quot;, {&lt;br /&gt;
        nol_sdkDebug: 'debug',&lt;br /&gt;
        optout: 'false'&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    var nSdkInstanceVod = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;instanceVod&amp;quot;, {&lt;br /&gt;
        nol_sdkDebug: 'debug',&lt;br /&gt;
        optout: 'false'&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Example of 2 instances using a parent page and iFrame'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Parent Page (index.html)&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;ie=edge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;DCR Static/DCR Video&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    /* NLSQUEUE build v*/&lt;br /&gt;
    !function(e,n){&lt;br /&gt;
    function t(e){&lt;br /&gt;
      return&amp;quot;object&amp;quot;==typeof e?JSON.parse(JSON.stringify(e)):e&lt;br /&gt;
    }&lt;br /&gt;
    e[n]=e[n]||&lt;br /&gt;
    {&lt;br /&gt;
      nlsQ:function(o,r,c){&lt;br /&gt;
        var s=e.document,&lt;br /&gt;
        a=s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
        a.async=1,&lt;br /&gt;
        a.src=(&amp;quot;http:&amp;quot;===e.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+o+&amp;quot;.js#name=&amp;quot;+r+&amp;quot;&amp;amp;ns=&amp;quot;+n;&lt;br /&gt;
        var i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
        return i.parentNode.insertBefore(a,i),&lt;br /&gt;
        e[n][r]=e[n][r]||{g:c||{},&lt;br /&gt;
        ggPM:function(o,c,s,a,i){e[n][r].q=e[n][r].q||[];try{var l=t([o,c,s,a,i]);e[n][r].q.push(l)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}},&lt;br /&gt;
        trackEvent:function(o){e[n][r].te=e[n][r].te||[];try{var c=t(o);e[n][r].te.push(c)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}}},&lt;br /&gt;
        e[n][r]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // SDK Initialization&lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;staticPage&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: 'debug',&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Static Metadata &lt;br /&gt;
    var staticMetadata = {&lt;br /&gt;
      assetid: 'staticTestPage',&lt;br /&gt;
      type: 'static'&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    // Event 'staticstart' call&lt;br /&gt;
    nSdkInstance.ggPM(14, staticMetadata);&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;h1&amp;gt;DCR Static on Parent/DCR Video in iFrame&amp;lt;/h1&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Static measurement is current on parent page when window is in focus&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;iframe src=&amp;quot;./dcr-video.html&amp;quot; frameborder=&amp;quot;0&amp;quot; width=&amp;quot;650&amp;quot; height=&amp;quot;500&amp;quot; style=&amp;quot;background-color: rgb(42, 217, 248);&amp;quot; id=&amp;quot;video-iframe&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Nested iFrame Referenced on Parent Page (dcr-video.html)&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;ie=edge&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;iFrame Same Source&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
    /* NLSQUEUE build v*/&lt;br /&gt;
    !function(e,n){&lt;br /&gt;
      function t(e){&lt;br /&gt;
        return&amp;quot;object&amp;quot;==typeof e?JSON.parse(JSON.stringify(e)):e&lt;br /&gt;
      }&lt;br /&gt;
      e[n]=e[n]||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ:function(o,r,c){&lt;br /&gt;
          var s=e.document,&lt;br /&gt;
          a=s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async=1,&lt;br /&gt;
          a.src=(&amp;quot;http:&amp;quot;===e.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+o+&amp;quot;.js#name=&amp;quot;+r+&amp;quot;&amp;amp;ns=&amp;quot;+n;&lt;br /&gt;
          var i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a,i),&lt;br /&gt;
          e[n][r]=e[n][r]||{g:c||{},&lt;br /&gt;
          ggPM:function(o,c,s,a,i){e[n][r].q=e[n][r].q||[];try{var l=t([o,c,s,a,i]);e[n][r].q.push(l)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}},&lt;br /&gt;
          trackEvent:function(o){e[n][r].te=e[n][r].te||[];try{var c=t(o);e[n][r].te.push(c)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}}},&lt;br /&gt;
          e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // SDK Initialization&lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;videoPlayer&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: 'debug',&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    var contentMetadata = {&lt;br /&gt;
        type: &amp;quot;content&amp;quot;,&lt;br /&gt;
        length: &amp;quot;300&amp;quot;,&lt;br /&gt;
        title: &amp;quot;Skydiving Across Europe&amp;quot;,&lt;br /&gt;
        program: &amp;quot;latacg&amp;quot;,&lt;br /&gt;
        censuscategory: &amp;quot;Enlisted&amp;quot;,&lt;br /&gt;
        assetid: &amp;quot;204558915992&amp;quot;,&lt;br /&gt;
        section: &amp;quot;ProgramAsset8&amp;quot;,&lt;br /&gt;
        tv: &amp;quot;true&amp;quot;,&lt;br /&gt;
        adModel: &amp;quot;0&amp;quot;,&lt;br /&gt;
        dataSrc: &amp;quot;cms&amp;quot;,&lt;br /&gt;
        segA: &amp;quot;S07E04:NBC&amp;quot;,&lt;br /&gt;
        segB: &amp;quot;teams&amp;quot;,&lt;br /&gt;
        segC:&amp;quot;AtlanataFalcons&amp;quot;,&lt;br /&gt;
      }&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;I'm iframe SDK DCR Video measurement, DCR static measurement should continue when clicking &amp;quot;play&amp;quot; on video&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;main&amp;gt;&lt;br /&gt;
      &amp;lt;video&lt;br /&gt;
      controls&lt;br /&gt;
      src=&amp;quot;https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4&amp;quot;&lt;br /&gt;
      poster=&amp;quot;https://peach.blender.org/wp-content/uploads/title_anouncement.jpg?x11217&amp;quot;&lt;br /&gt;
      width=&amp;quot;620&amp;quot;&amp;gt;&lt;br /&gt;
      Sorry, your browser doesn't support embedded videos, but don't worry, you can&lt;br /&gt;
      &amp;lt;a href=&amp;quot;https://archive.org/details/BigBuckBunny_124&amp;quot;&amp;gt;download it&amp;lt;/a&amp;gt;&lt;br /&gt;
      and watch it with your favorite video player!&lt;br /&gt;
    &amp;lt;/video&amp;gt;&lt;br /&gt;
    &amp;lt;/main&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;../player.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SDK Initialization to measure the Viewability &amp;amp; Audibility ===&lt;br /&gt;
To support viewability metrics in the web page the integrator has to provide a tag value of the player view to let Nielsen SDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in the as string while initializing the Nielsen browser SDK.&lt;br /&gt;
&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{containerId: &amp;lt;playerElementID&amp;gt;, nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Initialization for Viewability'''&lt;br /&gt;
&lt;br /&gt;
Your configuration should include the Static Queue Snippet and an SDK Instance for your unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Add Static Queue Snippet&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    ! function(t, n) {&lt;br /&gt;
        t[n] = t[n] || {&lt;br /&gt;
            nlsQ: function(e, o, c, r, s, i) {&lt;br /&gt;
                return s = t.document,&lt;br /&gt;
                    r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
                    r.async = 1,&lt;br /&gt;
                    r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + o + &amp;quot;&amp;amp;ns=&amp;quot; + n,&lt;br /&gt;
                    i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
                    i.parentNode.insertBefore(r, i),&lt;br /&gt;
                    t[n][o] = t[n][o] || {&lt;br /&gt;
                        g: c || {},&lt;br /&gt;
                        ggPM: function(e, c, r, s, i) {&lt;br /&gt;
                            (t[n][o].q = t[n][o].q || []).push([e, c, r, s, i])&lt;br /&gt;
                        }&lt;br /&gt;
                    }, t[n][o]&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    (window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
//Create SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {containerId: “player1”, nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser SDK API Methods &amp;amp; Properties ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method / Property !! Event # !! DTVR !! DAR !! DCR !! Description&lt;br /&gt;
|-&lt;br /&gt;
| [[loadMetadata (Browser)|loadMetadata]] || 15 || ✔ || ✔ || ✔ || Used when there is a preroll ad that needs to be associated with content metadata. The loadMetadata will first be called to populate the content metadata values and then the loadMetadata for ad metadata will be called. This allows sending a content ping with the ad info, even if the user bails out during the preroll ad.&lt;br /&gt;
|-&lt;br /&gt;
| [[play (Browser)|play]] || 5 || ✔ || ✘ || ✔ || Used when there is an ID3 fed product such as DTVR and the client does not want to send in all the CMS metadata that is sent in loadMetadata. This allows the client to send in at least the required “channel name” value associated to the ID3 feed. When the client passes in the channelName, they can change the CMS data stored by passing new values. If this event is not called then the “channel name” value populated will be the default value of “defaultChannelName”.&lt;br /&gt;
|-&lt;br /&gt;
| [[sendID3 (Browser)|sendID3]] || 55 || ✔ || ✘ || ✘ || Used to send the ID3 metadata.&lt;br /&gt;
|-&lt;br /&gt;
| [[setPlayheadPosition (Browser)|setPlayheadPosition]] || 49 || ✘ || ✘ || ✔ || Used to send the playhead position.&lt;br /&gt;
|-&lt;br /&gt;
| [[stop (Browser)|stop]] || 7 || ✘ || ✘ || ✔ || Used when switching between ad and content or content and ad.&lt;br /&gt;
|-&lt;br /&gt;
| [[end (Browser)|end]] || 57 || ✔ || ✘ || ✔ || This is triggered 1) at the end of the content stream, 2) if the user switches to another piece of content 3) when the browser is refreshed or closed&lt;br /&gt;
|-&lt;br /&gt;
| [[staticstart (Browser)|staticstart]] || 14 || ✘ || ✘ || ✔ || Used to send the metadata for the static page.&lt;br /&gt;
|-&lt;br /&gt;
| [[StaticEnd (Browser)|staticend]] || 56 || ✘ || ✘ || ✔ || In Single Page Application (SPA) it is imperative that staticend is called prior to the loading of new metadata. This allows the Browser SDK to properly credit the previous section/content being viewed before measuring the new one.&lt;br /&gt;
|-&lt;br /&gt;
| [[updateOTT (Browser)|updateOTT]] || - || ✘ || ✘ || ✔ || Used to notify Browser SDK that the remote OTT device (like Google ChromeCast, Roku, Amazon FireTV, etc.) is connected / disconnected (change of OTT status).&lt;br /&gt;
|-&lt;br /&gt;
| [[ onPaginate (Browser)|onPaginate]] || 30 || ✘ || ✘ || ✔ || Used to create a new instance of the SDK object&lt;br /&gt;
|-&lt;br /&gt;
| [[updateMetadata (Browser)|updateMetadata]] || 35 || ✔ || ✔ || ✔ || This event is used for updating metadata parameters for the content or ad that is being played.&lt;br /&gt;
|-&lt;br /&gt;
| [[setVolume_(Browser)|setVolume]] || 61 || ✔ || ✘ || ✔ || Used to pass in the player volume levels in %. Default value is -1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Retrieving ID3 Tags ==&lt;br /&gt;
The video player must have the ability to extract ID3 tags and supply them to the Browser SDK, based on the HLS standard.&lt;br /&gt;
*An ID3 tag spans two PES packets.&lt;br /&gt;
**In the first PES packet, look for www.nielsen.com, this is the start of the ID3 tag. Continue to parse the first PES packet until the undefined char &amp;quot;\ufffd&amp;quot; is found. This forms the first half of the ID3 tag&lt;br /&gt;
**In the second PES packet, identify the end pattern – a regEx of /(\/\d+){3}/ and look to remove the lowest index of either &amp;quot;\x00&amp;quot; and/or &amp;quot;\ufffd&amp;quot;. Now the second packet has been appended and the demarcation of the Nielsen-specific data has been defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Follow the procedure below, to extract Nielsen ID3 tags from an MPEG-2 transport stream (including HLS streams).&lt;br /&gt;
#Parse the Program Map Table (PMT) to find the PID of the metadata stream. Confirm the presence of the metadata descriptor described in section 2.3.3 of Apple’s “HTTP Live Streaming Metadata Spec.pdf”. Only private streams with metadata descriptor present should be considered as ID3-tag metadata streams.&lt;br /&gt;
#Parse the HLS/Transport stream for any '''PES header''' with the PID found in step 1.&lt;br /&gt;
#Follow standard MPEG-2 parsing procedures to locate the start of the payload of the PES packet.&lt;br /&gt;
#Copy the PES payload into a buffer.&lt;br /&gt;
#The ID3 tag spans 2 PES packets. Parse the stream for the next packet whose PID is set to the PID found in step 1. Typically the ID3 Tag is of 249 bytes. The steps below guide towards extraction of the ID3 tag&lt;br /&gt;
##In the first PES packet, look for &amp;quot;www.nielsen.com&amp;quot; , this is the start of the ID3 tag. Keep on parsing the first PES packet until the undefined char &amp;quot;\ufffd&amp;quot; is found. This forms the first half of the ID3 tag&lt;br /&gt;
##In the second PES packet, identify the end pattern, a regEx of /(\/\d+){3}/ and look to remove the lowest index of either “\x00” and/or “\ufffd”. Now the second packet has been appended and the demarcation of the Nielsen specific data has been defined. This segment can be simply substringed.&lt;br /&gt;
##Concatenate this substringed segment with the payload derived from the first packet get the ID3 payload.&lt;br /&gt;
#Check the length of the contents in the buffer to make sure that it is equal to the size of a Nielsen ID3 tag.&lt;br /&gt;
#Ensure that the ID3 byte array is converted into the string and escape it, so that the SDK can consume it.&lt;br /&gt;
Repeat steps 2 through 7 for all ID3 tags in the stream.&lt;br /&gt;
&lt;br /&gt;
'''References'''&lt;br /&gt;
*[http://www.iso.org/iso/catalogue_detail?csnumber=44169. ISO/IEC 13818-1:2007] Information technology – Generic coding of moving pictures and associated audio information: Systems&lt;br /&gt;
*https://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/HTTP_Live_Streaming_Metadata_Spec/&lt;br /&gt;
&lt;br /&gt;
=== Sample ID3 tags ===&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/X100zdCIGeIlgZnkYj6UvQ==/AAAB2Jz2_k74GXSzx4npHuI_&amp;lt;wbr /&amp;gt;JwJd3QSUpW30rDkGTcbHEzIMWleCzM-uvNOP9fzJcQMWQLJqzXMCAxParOb5sGijSV9dNM3QiBniJYGZ5GI-lL1fXTTN0IgZ4iWBmeRiPpS9AAAAAAAAAAAAAAAAAAAAAFJWFM5SVhTONNU=/00000/00000/00&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/R8WHe7pEBeqBhu8jTeXydg==/AAICoyitYqlxT7n6aZ0oMCGhe&amp;lt;wbr /&amp;gt;Fi4CXFp46AMUPZz1lMr_M9tr3_cjee1SHqxrOiVerMDLeyn9xzocZSKwi746Re8vNOtpNCAZjYABs_J0R25IHpvOc1HS8&amp;lt;wbr /&amp;gt;QHGgD5TgOJeS6gX100zdCIGeIlgZnkYj6UvVJWFNhSVhTiPE0=/00000/46016/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': ID3 tags are not applicable for International (Germany)&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser Opt-Out Implementation ==&lt;br /&gt;
The site in which video content is being measure via Nielsen methodology must provide the means for the user to opt-out of, or opt back into Nielsen Measurement.&lt;br /&gt;
&lt;br /&gt;
For Browser-based applications, opt-out setting is stored via Nielsen cookie. Therefore, it is only necessary that users be made aware of measurement opt-out by incorporating the template below in the user interface.&lt;br /&gt;
&lt;br /&gt;
=== Sample Opt Out Template ===&lt;br /&gt;
Our properties may feature Nielsen’s proprietary measurement software which will allow to contribute to market research, like Nielsen’s TV Ratings. To learn more about this information, see https://www.nielsen.com/digitalprivacy. Nielsen’s software may collect your choices with regards to it.&lt;br /&gt;
&lt;br /&gt;
== Nielsen Privacy Requirements ==&lt;br /&gt;
Privacy protections that Nielsen ensures to have with each App SDK integration are as follows.&lt;br /&gt;
*Disclosure of viewership data collection in EULA / Privacy Policy&lt;br /&gt;
*A link in the EULA/Privacy policy, or in another conspicuous location within the App, to a Nielsen-hosted web page outlining what Nielsen is collecting and how it is being used&lt;br /&gt;
*Method for users to opt-out of Nielsen measurement, any time while using the application&lt;br /&gt;
&lt;br /&gt;
=== Ratings Data Flow ===&lt;br /&gt;
Every view of creditable and watermarked content is measured by Nielsen.&lt;br /&gt;
[[File:RatingsDataFlow.png]]&lt;br /&gt;
&lt;br /&gt;
'''Information NOT Shared'''&lt;br /&gt;
* '''With Nielsen'''&lt;br /&gt;
** User's Identity&lt;br /&gt;
* '''With Data Provider'''&lt;br /&gt;
** Content information&lt;br /&gt;
** Whether user is viewing an ad or video content&lt;br /&gt;
** Player used to play the streaming (audio / video, etc.)&lt;br /&gt;
** Values being de-duped / aggregating for&lt;br /&gt;
&lt;br /&gt;
Nielsen collects only what it needs for audience measurement. Every view of creditable, watermarked content will be measured by Nielsen.&lt;br /&gt;
&lt;br /&gt;
=== Data Collected ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type of Information !! Parameter !! Transmitted to Nielsen? !! Sent to Provider?&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; | Nielsen ID3 Watermark&lt;br /&gt;
|-&lt;br /&gt;
| FinalDistributor Timestamp || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Program Content Timestamp || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Mobile Breakout Code || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Commercial Credit Code – Linear or Dynamic || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Time ShiftedViewing Code || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Segment Number || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Segment View Pattern || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;7&amp;quot; | Device/App Info&lt;br /&gt;
|-&lt;br /&gt;
| Device OSVersion || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| Device Model || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Cache Buster || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| SDKDisabled Flag || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| ServerCode || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Channel or URL || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; | Nielsen Identifiers&lt;br /&gt;
|-&lt;br /&gt;
| Client ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Campaign ID || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| Nielsen Unique Device ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Application ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| DeviceGroup (ex. Tablet, Smartphone, Desktop) || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| OS Group (ex. Android, iOS, Windows) || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| SDKVersion || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| IP Address for DMA, Country Code || Yes || Yes &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': Data is hashed, and encrypted using AES 128 before transmission to data provider.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Viewability_Data_Collected}}&lt;br /&gt;
&lt;br /&gt;
==== Example ping sent to provider ====&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://provider.com/cgi-bin/brandlift.php&amp;lt;/nowiki&amp;gt;?campaign_id=ff12725d724fac7934cf6003f096b4cd&amp;lt;wbr /&amp;gt;&amp;amp;placement_id=a4164b8fba9ee7c873a9c72c7091bb58&amp;lt;wbr /&amp;gt;&amp;amp;creative_id=25280139b61a947e127a52f56c8a2fdd&amp;lt;wbr /&amp;gt;&amp;amp;segment1=9000&amp;lt;wbr /&amp;gt;&amp;amp;segment2=41&amp;lt;wbr /&amp;gt;&amp;amp;segment3=iOS&amp;lt;wbr /&amp;gt;&amp;amp;OSVer=iOS6.1&amp;lt;wbr /&amp;gt;&amp;amp;c9=&amp;lt;wbr /&amp;gt;&amp;amp;devgrp=tablet&amp;lt;wbr /&amp;gt;&amp;amp;h=f5f243fe6d&amp;lt;wbr /&amp;gt;&amp;amp;rnd=1376971827360&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This ping passes the following parameters to the provider:&lt;br /&gt;
* Campaign ID – (campaign, placement, creative)&lt;br /&gt;
* Country Code&lt;br /&gt;
* DMA&lt;br /&gt;
* OS Group (ex. iOS, Android)&lt;br /&gt;
* DeviceOS Version&lt;br /&gt;
* Device Advertiser ID&lt;br /&gt;
* DeviceGroup (ex. Tablet, Smartphone, Desktop)&lt;br /&gt;
* Cache Buster&lt;br /&gt;
&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
=== Opt-Out Implementation ===&lt;br /&gt;
The site must provide the means for the user to opt-out of, or opt back into Nielsen Measurement.&lt;br /&gt;
&lt;br /&gt;
'''Sample Opt Out Template'''&lt;br /&gt;
&lt;br /&gt;
Our properties may feature Nielsen’s proprietary measurement software which will allow to contribute to market research, like Nielsen’s TV Ratings. To learn more about this information, please [http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html| click here]. Nielsen’s software may collect your choices with regards to it.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
See [[Digital Measurement Testing#Testing Browser Implementation|Digital Measurement Testing - Testing Browser Implementation]].&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_API_Reference&amp;diff=6790</id>
		<title>Browser SDK API Reference</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_API_Reference&amp;diff=6790"/>
		<updated>2024-12-10T18:04:18Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: /* Multiple SDK Instances */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Setting up Development Environment ==&lt;br /&gt;
=== Step 1: Configure Content Management System (CMS) ===&lt;br /&gt;
Configure CMS to send the required values (see table below). Any internal CMS_variable names can be used for passing the data.&lt;br /&gt;
&lt;br /&gt;
Ensure to capture these CMS_variable names in the SDK Configuration Form.&lt;br /&gt;
&lt;br /&gt;
For more information on setting variable names, see the SDK Configuration Form included within the SDK package.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Required Data !! Description !! Value&lt;br /&gt;
|-&lt;br /&gt;
| dataSrc || Used when both CMS metadata and ID3 data are present in the player. Setting this field tells the SDK whether to use the CMS metadata or the ID3 payload to derive the pings || cms&lt;br /&gt;
|-&lt;br /&gt;
| type || Type of asset: ad or content || preroll, midroll, postroll, or content&lt;br /&gt;
|-&lt;br /&gt;
| assetid || unique ID assigned to asset || custom &amp;lt;br&amp;gt;(no [[Special Characters]])&lt;br /&gt;
|-&lt;br /&gt;
| OCR Tag || OCR tag provided by Nielsen for implementation on the ad unit || Complete OCR URL&lt;br /&gt;
|-&lt;br /&gt;
| program || Name of program (25 character limit) || custom&lt;br /&gt;
|-&lt;br /&gt;
| title || Episode title (40 character limit) || custom&lt;br /&gt;
|-&lt;br /&gt;
| length || Length of content in seconds || Length in seconds, 0 for live stream&lt;br /&gt;
|-&lt;br /&gt;
| adloadtype || Type of ad load || &amp;quot;1&amp;quot; - Linear &amp;quot;2&amp;quot; - Dynamic(default)&lt;br /&gt;
|-&lt;br /&gt;
| hasAds || Identify if content includes Ads ||  &amp;quot;0&amp;quot; - no ads &amp;quot;1&amp;quot; - includes ads &amp;quot;2&amp;quot; - unknown(default)&lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode || Full episode flag	|| &amp;quot;y&amp;quot; - full episode &amp;quot;n&amp;quot; - non full episode&lt;br /&gt;
|-&lt;br /&gt;
| segA || Segment A (this is not available for video reporting as the episode title is reported) || custom value&lt;br /&gt;
|-&lt;br /&gt;
| segB || Custom segment B || custom value&lt;br /&gt;
|-&lt;br /&gt;
| segC || Custom segment C || custom value&lt;br /&gt;
|-&lt;br /&gt;
| crossId1 || Standard episode ID || custom value&lt;br /&gt;
|-&lt;br /&gt;
| crossId2 || Content originator (required only for distributors) || custom value&lt;br /&gt;
|-&lt;br /&gt;
| airdate || Original air date and time in Eastern Time. For non-US countries, it should be local time. || YYYYMMDD HH24:MI:SS&lt;br /&gt;
|-&lt;br /&gt;
| containerId || HTML DOM element of the Player container (for Viewability&amp;amp;Audibility feature only) || custom value &lt;br /&gt;
|-&lt;br /&gt;
|luid&lt;br /&gt;
|Living Unit ID - Experian Household ID&lt;br /&gt;
'''Note: This parameter is applicable only for CTV and First Party Livestream data'''&lt;br /&gt;
|&amp;quot;B0EOFEDgD&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Complete the Nielsen SDK Configuration Form ===&lt;br /&gt;
The SDK is designed to map the &amp;lt;code&amp;gt;CMS_variable names&amp;lt;/code&amp;gt;. To support the custom mapping, the developer is required to complete the SDK Configuration Form. The form will be provided during onboarding along with this guide.&lt;br /&gt;
&lt;br /&gt;
== Initialization ==&lt;br /&gt;
=== Obtain the Nielsen Application ID (apid) and Browser SDK URLs ===&lt;br /&gt;
The Nielsen &amp;lt;code&amp;gt;apid&amp;lt;/code&amp;gt; is required to enable SDK functionality. Technical Account Manager will provide an apid for each player configuration.  &lt;br /&gt;
Browser SDK can support URLs that use any of the protocols – HTTPS and HTTP.  &lt;br /&gt;
&lt;br /&gt;
=== Configure Browser SDK ===&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
&lt;br /&gt;
'''Add Static Queue Snippet'''&lt;br /&gt;
&lt;br /&gt;
*Add Static Queue Snippet&lt;br /&gt;
*Create SDK Instance&lt;br /&gt;
&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
'''Create SDK Instance'''&lt;br /&gt;
&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
'''Initialization API Call'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When creating an instance, pass the following three values:&lt;br /&gt;
&lt;br /&gt;
=== SDK Initialization – Global Parameters ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameters !! Description !! Value&lt;br /&gt;
|-&lt;br /&gt;
| apid || UniqueID assigned to player/site. || 	'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
| instanceName || Name of SDK instance || &amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug || Enables Nielsen console logging. Only required for testing || &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| containerId || HTML DOM element id of the player container. Only for Viewability &amp;amp; Audibility feature. || {containerId: &amp;quot;playerId1&amp;quot;}&lt;br /&gt;
|-&lt;br /&gt;
| hem_sha256 || SHA256-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| hem_sha1 || SHA1-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;XvBniTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| hem_md5 || MD5-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;JnIbdTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| uid2 || An identifier based on a user’s verifiable PII (e.g. hashed email). UID2.0 was initially created by The Trade Desk (TTD) and is now managed by Prebid. || &amp;quot;MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| uid2_token || Encrypted Unified ID 2.0 || &amp;quot;AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8Ql&lt;br /&gt;
DSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeK&lt;br /&gt;
QI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhC&lt;br /&gt;
xG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{example_bsdk_init}}&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Configuration'''&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
  var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;,&amp;quot;nlsnInstance&amp;quot;, {nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multiple SDK Instances ===&lt;br /&gt;
The Browser SDK allows instantiating multiple instances of the object, which can be used simultaneously without any problems, however they must be instantiated with their own unique instance names. There is no maximum number of instances that is enforced in the browser.&lt;br /&gt;
&lt;br /&gt;
The below examples will make use of the same AppId, however using different AppIds will work as well. The principles below follow the same initialization rules stated above for a single instance and simply require a unique instance name and variable name with which the returned instance is assigned.&lt;br /&gt;
&lt;br /&gt;
For more information around the possible parameters that can be passed as well as deeper descriptions for the API calls, please refer to the section on  [[Browser SDK API Reference#SDK Initialization - Global Parameters|SDK Initialization - Global Parameters]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Example of 2 instances on the same page'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Add Static Queue Snippet&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    !function (e, n) {&lt;br /&gt;
      function t(e) {&lt;br /&gt;
        return &amp;quot;object&amp;quot; == typeof e ? JSON.parse(JSON.stringify(e)) : e&lt;br /&gt;
      }&lt;br /&gt;
      e[n] = e[n] ||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ: function (o, r, c) {&lt;br /&gt;
          var s = e.document,&lt;br /&gt;
            a = s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async = 1,&lt;br /&gt;
            a.src = (&amp;quot;http:&amp;quot; === e.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + o + &amp;quot;.js#name=&amp;quot; + r + &amp;quot;&amp;amp;ns=&amp;quot; + n;&lt;br /&gt;
          var i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a, i),&lt;br /&gt;
            e[n][r] = e[n][r] || {&lt;br /&gt;
              g: c || {},&lt;br /&gt;
              ggPM: function (o, c, s, a, i) { e[n][r].q = e[n][r].q || []; try { var l = t([o, c, s, a, i]); e[n][r].q.push(l) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } },&lt;br /&gt;
              trackEvent: function (o) { e[n][r].te = e[n][r].te || []; try { var c = t(o); e[n][r].te.push(c) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } }&lt;br /&gt;
            },&lt;br /&gt;
            e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    //Create SDK Instance(s)&lt;br /&gt;
    // Notice the unique instance name given to each instance below and the unique variable name for each instance&lt;br /&gt;
    var nSdkInstanceLive = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;instanceLive&amp;quot;, {&lt;br /&gt;
        nol_sdkDebug: 'debug',&lt;br /&gt;
        optout: 'false'&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    var nSdkInstanceVod = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;instanceVod&amp;quot;, {&lt;br /&gt;
        nol_sdkDebug: 'debug',&lt;br /&gt;
        optout: 'false'&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Example of 2 instances using a parent page and iFrame'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Parent Page (index.html)&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;ie=edge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;DCR Static/DCR Video&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    /* NLSQUEUE build v*/&lt;br /&gt;
    !function(e,n){&lt;br /&gt;
    function t(e){&lt;br /&gt;
      return&amp;quot;object&amp;quot;==typeof e?JSON.parse(JSON.stringify(e)):e&lt;br /&gt;
    }&lt;br /&gt;
    e[n]=e[n]||&lt;br /&gt;
    {&lt;br /&gt;
      nlsQ:function(o,r,c){&lt;br /&gt;
        var s=e.document,&lt;br /&gt;
        a=s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
        a.async=1,&lt;br /&gt;
        a.src=(&amp;quot;http:&amp;quot;===e.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+o+&amp;quot;.js#name=&amp;quot;+r+&amp;quot;&amp;amp;ns=&amp;quot;+n;&lt;br /&gt;
        var i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
        return i.parentNode.insertBefore(a,i),&lt;br /&gt;
        e[n][r]=e[n][r]||{g:c||{},&lt;br /&gt;
        ggPM:function(o,c,s,a,i){e[n][r].q=e[n][r].q||[];try{var l=t([o,c,s,a,i]);e[n][r].q.push(l)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}},&lt;br /&gt;
        trackEvent:function(o){e[n][r].te=e[n][r].te||[];try{var c=t(o);e[n][r].te.push(c)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}}},&lt;br /&gt;
        e[n][r]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // SDK Initialization&lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;staticPage&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: 'debug',&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Static Metadata &lt;br /&gt;
    var staticMetadata = {&lt;br /&gt;
      assetid: 'staticTestPage',&lt;br /&gt;
      type: 'static'&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    // Event 'staticstart' call&lt;br /&gt;
    nSdkInstance.ggPM(14, staticMetadata);&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;h1&amp;gt;DCR Static on Parent/DCR Video in iFrame&amp;lt;/h1&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Static measurement is current on parent page when window is in focus&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;iframe src=&amp;quot;./dcr-video.html&amp;quot; frameborder=&amp;quot;0&amp;quot; width=&amp;quot;650&amp;quot; height=&amp;quot;500&amp;quot; style=&amp;quot;background-color: rgb(42, 217, 248);&amp;quot; id=&amp;quot;video-iframe&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Nested iFrame Referenced on Parent Page (dcr-video.html)&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;ie=edge&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;iFrame Same Source&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
    /* NLSQUEUE build v*/&lt;br /&gt;
    !function(e,n){&lt;br /&gt;
      function t(e){&lt;br /&gt;
        return&amp;quot;object&amp;quot;==typeof e?JSON.parse(JSON.stringify(e)):e&lt;br /&gt;
      }&lt;br /&gt;
      e[n]=e[n]||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ:function(o,r,c){&lt;br /&gt;
          var s=e.document,&lt;br /&gt;
          a=s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async=1,&lt;br /&gt;
          a.src=(&amp;quot;http:&amp;quot;===e.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+o+&amp;quot;.js#name=&amp;quot;+r+&amp;quot;&amp;amp;ns=&amp;quot;+n;&lt;br /&gt;
          var i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a,i),&lt;br /&gt;
          e[n][r]=e[n][r]||{g:c||{},&lt;br /&gt;
          ggPM:function(o,c,s,a,i){e[n][r].q=e[n][r].q||[];try{var l=t([o,c,s,a,i]);e[n][r].q.push(l)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}},&lt;br /&gt;
          trackEvent:function(o){e[n][r].te=e[n][r].te||[];try{var c=t(o);e[n][r].te.push(c)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}}},&lt;br /&gt;
          e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // SDK Initialization&lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;videoPlayer&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: 'debug',&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    var contentMetadata = {&lt;br /&gt;
        type: &amp;quot;content&amp;quot;,&lt;br /&gt;
        length: &amp;quot;300&amp;quot;,&lt;br /&gt;
        title: &amp;quot;Skydiving Across Europe&amp;quot;,&lt;br /&gt;
        program: &amp;quot;latacg&amp;quot;,&lt;br /&gt;
        censuscategory: &amp;quot;Enlisted&amp;quot;,&lt;br /&gt;
        assetid: &amp;quot;204558915992&amp;quot;,&lt;br /&gt;
        section: &amp;quot;ProgramAsset8&amp;quot;,&lt;br /&gt;
        tv: &amp;quot;true&amp;quot;,&lt;br /&gt;
        adModel: &amp;quot;0&amp;quot;,&lt;br /&gt;
        dataSrc: &amp;quot;cms&amp;quot;,&lt;br /&gt;
        segA: &amp;quot;S07E04:NBC&amp;quot;,&lt;br /&gt;
        segB: &amp;quot;teams&amp;quot;,&lt;br /&gt;
        segC:&amp;quot;AtlanataFalcons&amp;quot;,&lt;br /&gt;
      }&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;I'm iframe SDK DCR Video measurement, DCR static measurement should continue when clicking &amp;quot;play&amp;quot; on video&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;main&amp;gt;&lt;br /&gt;
      &amp;lt;video&lt;br /&gt;
      controls&lt;br /&gt;
      src=&amp;quot;https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4&amp;quot;&lt;br /&gt;
      poster=&amp;quot;https://peach.blender.org/wp-content/uploads/title_anouncement.jpg?x11217&amp;quot;&lt;br /&gt;
      width=&amp;quot;620&amp;quot;&amp;gt;&lt;br /&gt;
      Sorry, your browser doesn't support embedded videos, but don't worry, you can&lt;br /&gt;
      &amp;lt;a href=&amp;quot;https://archive.org/details/BigBuckBunny_124&amp;quot;&amp;gt;download it&amp;lt;/a&amp;gt;&lt;br /&gt;
      and watch it with your favorite video player!&lt;br /&gt;
    &amp;lt;/video&amp;gt;&lt;br /&gt;
    &amp;lt;/main&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;../player.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SDK Initialization to measure the Viewability &amp;amp; Audibility ===&lt;br /&gt;
To support viewability metrics in the web page the integrator has to provide a tag value of the player view to let Nielsen SDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in the as string while initializing the Nielsen browser SDK.&lt;br /&gt;
&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{containerId: &amp;lt;playerElementID&amp;gt;, nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Initialization for Viewability'''&lt;br /&gt;
&lt;br /&gt;
Your configuration should include the Static Queue Snippet and an SDK Instance for your unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Add Static Queue Snippet&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    ! function(t, n) {&lt;br /&gt;
        t[n] = t[n] || {&lt;br /&gt;
            nlsQ: function(e, o, c, r, s, i) {&lt;br /&gt;
                return s = t.document,&lt;br /&gt;
                    r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
                    r.async = 1,&lt;br /&gt;
                    r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + o + &amp;quot;&amp;amp;ns=&amp;quot; + n,&lt;br /&gt;
                    i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
                    i.parentNode.insertBefore(r, i),&lt;br /&gt;
                    t[n][o] = t[n][o] || {&lt;br /&gt;
                        g: c || {},&lt;br /&gt;
                        ggPM: function(e, c, r, s, i) {&lt;br /&gt;
                            (t[n][o].q = t[n][o].q || []).push([e, c, r, s, i])&lt;br /&gt;
                        }&lt;br /&gt;
                    }, t[n][o]&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    (window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
//Create SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {containerId: “player1”, nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser SDK API Methods &amp;amp; Properties ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method / Property !! Event # !! DTVR !! DAR !! DCR !! Description&lt;br /&gt;
|-&lt;br /&gt;
| [[loadMetadata (Browser)|loadMetadata]] || 15 || ✔ || ✔ || ✔ || Used when there is a preroll ad that needs to be associated with content metadata. The loadMetadata will first be called to populate the content metadata values and then the loadMetadata for ad metadata will be called. This allows sending a content ping with the ad info, even if the user bails out during the preroll ad.&lt;br /&gt;
|-&lt;br /&gt;
| [[play (Browser)|play]] || 5 || ✔ || ✘ || ✔ || Used when there is an ID3 fed product such as DTVR and the client does not want to send in all the CMS metadata that is sent in loadMetadata. This allows the client to send in at least the required “channel name” value associated to the ID3 feed. When the client passes in the channelName, they can change the CMS data stored by passing new values. If this event is not called then the “channel name” value populated will be the default value of “defaultChannelName”.&lt;br /&gt;
|-&lt;br /&gt;
| [[sendID3 (Browser)|sendID3]] || 55 || ✔ || ✘ || ✘ || Used to send the ID3 metadata.&lt;br /&gt;
|-&lt;br /&gt;
| [[setPlayheadPosition (Browser)|setPlayheadPosition]] || 49 || ✘ || ✘ || ✔ || Used to send the playhead position.&lt;br /&gt;
|-&lt;br /&gt;
| [[stop (Browser)|stop]] || 7 || ✘ || ✘ || ✔ || Used when switching between ad and content or content and ad.&lt;br /&gt;
|-&lt;br /&gt;
| [[end (Browser)|end]] || 57 || ✔ || ✘ || ✔ || This is triggered 1) at the end of the content stream, 2) if the user switches to another piece of content 3) when the browser is refreshed or closed&lt;br /&gt;
|-&lt;br /&gt;
| [[staticstart (Browser)|staticstart]] || 14 || ✘ || ✘ || ✔ || Used to send the metadata for the static page.&lt;br /&gt;
|-&lt;br /&gt;
| [[StaticEnd (Browser)|staticend]] || 56 || ✘ || ✘ || ✔ || In Single Page Application (SPA) it is imperative that staticend is called prior to the loading of new metadata. This allows the Browser SDK to properly credit the previous section/content being viewed before measuring the new one.&lt;br /&gt;
|-&lt;br /&gt;
| [[updateOTT (Browser)|updateOTT]] || - || ✘ || ✘ || ✔ || Used to notify Browser SDK that the remote OTT device (like Google ChromeCast, Roku, Amazon FireTV, etc.) is connected / disconnected (change of OTT status).&lt;br /&gt;
|-&lt;br /&gt;
| [[ onPaginate (Browser)|onPaginate]] || 30 || ✘ || ✘ || ✔ || Used to create a new instance of the SDK object&lt;br /&gt;
|-&lt;br /&gt;
| [[updateMetadata (Browser)|updateMetadata]] || 35 || ✔ || ✔ || ✔ || This event is used for updating metadata parameters for the content or ad that is being played.&lt;br /&gt;
|-&lt;br /&gt;
| [[setVolume_(Browser)|setVolume]] || 61 || ✔ || ✘ || ✔ || Used to pass in the player volume levels in %. Default value is -1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Retrieving ID3 Tags ==&lt;br /&gt;
The video player must have the ability to extract ID3 tags and supply them to the Browser SDK, based on the HLS standard.&lt;br /&gt;
*An ID3 tag spans two PES packets.&lt;br /&gt;
**In the first PES packet, look for www.nielsen.com, this is the start of the ID3 tag. Continue to parse the first PES packet until the undefined char &amp;quot;\ufffd&amp;quot; is found. This forms the first half of the ID3 tag&lt;br /&gt;
**In the second PES packet, identify the end pattern – a regEx of /(\/\d+){3}/ and look to remove the lowest index of either &amp;quot;\x00&amp;quot; and/or &amp;quot;\ufffd&amp;quot;. Now the second packet has been appended and the demarcation of the Nielsen-specific data has been defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Follow the procedure below, to extract Nielsen ID3 tags from an MPEG-2 transport stream (including HLS streams).&lt;br /&gt;
#Parse the Program Map Table (PMT) to find the PID of the metadata stream. Confirm the presence of the metadata descriptor described in section 2.3.3 of Apple’s “HTTP Live Streaming Metadata Spec.pdf”. Only private streams with metadata descriptor present should be considered as ID3-tag metadata streams.&lt;br /&gt;
#Parse the HLS/Transport stream for any '''PES header''' with the PID found in step 1.&lt;br /&gt;
#Follow standard MPEG-2 parsing procedures to locate the start of the payload of the PES packet.&lt;br /&gt;
#Copy the PES payload into a buffer.&lt;br /&gt;
#The ID3 tag spans 2 PES packets. Parse the stream for the next packet whose PID is set to the PID found in step 1. Typically the ID3 Tag is of 249 bytes. The steps below guide towards extraction of the ID3 tag&lt;br /&gt;
##In the first PES packet, look for &amp;quot;www.nielsen.com&amp;quot; , this is the start of the ID3 tag. Keep on parsing the first PES packet until the undefined char &amp;quot;\ufffd&amp;quot; is found. This forms the first half of the ID3 tag&lt;br /&gt;
##In the second PES packet, identify the end pattern, a regEx of /(\/\d+){3}/ and look to remove the lowest index of either “\x00” and/or “\ufffd”. Now the second packet has been appended and the demarcation of the Nielsen specific data has been defined. This segment can be simply substringed.&lt;br /&gt;
##Concatenate this substringed segment with the payload derived from the first packet get the ID3 payload.&lt;br /&gt;
#Check the length of the contents in the buffer to make sure that it is equal to the size of a Nielsen ID3 tag.&lt;br /&gt;
#Ensure that the ID3 byte array is converted into the string and escape it, so that the SDK can consume it.&lt;br /&gt;
Repeat steps 2 through 7 for all ID3 tags in the stream.&lt;br /&gt;
&lt;br /&gt;
'''References'''&lt;br /&gt;
*[http://www.iso.org/iso/catalogue_detail?csnumber=44169. ISO/IEC 13818-1:2007] Information technology – Generic coding of moving pictures and associated audio information: Systems&lt;br /&gt;
*https://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/HTTP_Live_Streaming_Metadata_Spec/&lt;br /&gt;
&lt;br /&gt;
=== Sample ID3 tags ===&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/X100zdCIGeIlgZnkYj6UvQ==/AAAB2Jz2_k74GXSzx4npHuI_&amp;lt;wbr /&amp;gt;JwJd3QSUpW30rDkGTcbHEzIMWleCzM-uvNOP9fzJcQMWQLJqzXMCAxParOb5sGijSV9dNM3QiBniJYGZ5GI-lL1fXTTN0IgZ4iWBmeRiPpS9AAAAAAAAAAAAAAAAAAAAAFJWFM5SVhTONNU=/00000/00000/00&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/R8WHe7pEBeqBhu8jTeXydg==/AAICoyitYqlxT7n6aZ0oMCGhe&amp;lt;wbr /&amp;gt;Fi4CXFp46AMUPZz1lMr_M9tr3_cjee1SHqxrOiVerMDLeyn9xzocZSKwi746Re8vNOtpNCAZjYABs_J0R25IHpvOc1HS8&amp;lt;wbr /&amp;gt;QHGgD5TgOJeS6gX100zdCIGeIlgZnkYj6UvVJWFNhSVhTiPE0=/00000/46016/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': ID3 tags are not applicable for International (Germany)&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser Opt-Out Implementation ==&lt;br /&gt;
The site in which video content is being measure via Nielsen methodology must provide the means for the user to opt-out of, or opt back into Nielsen Measurement.&lt;br /&gt;
&lt;br /&gt;
For Browser-based applications, opt-out setting is stored via Nielsen cookie. Therefore, it is only necessary that users be made aware of measurement opt-out by incorporating the template below in the user interface.&lt;br /&gt;
&lt;br /&gt;
=== Sample Opt Out Template ===&lt;br /&gt;
Our properties may feature Nielsen’s proprietary measurement software which will allow to contribute to market research, like Nielsen’s TV Ratings. To learn more about this information, see https://www.nielsen.com/digitalprivacy. Nielsen’s software may collect your choices with regards to it.&lt;br /&gt;
&lt;br /&gt;
== Nielsen Privacy Requirements ==&lt;br /&gt;
Privacy protections that Nielsen ensures to have with each App SDK integration are as follows.&lt;br /&gt;
*Disclosure of viewership data collection in EULA / Privacy Policy&lt;br /&gt;
*A link in the EULA/Privacy policy, or in another conspicuous location within the App, to a Nielsen-hosted web page outlining what Nielsen is collecting and how it is being used&lt;br /&gt;
*Method for users to opt-out of Nielsen measurement, any time while using the application&lt;br /&gt;
&lt;br /&gt;
=== Ratings Data Flow ===&lt;br /&gt;
Every view of creditable and watermarked content is measured by Nielsen.&lt;br /&gt;
[[File:RatingsDataFlow.png]]&lt;br /&gt;
&lt;br /&gt;
'''Information NOT Shared'''&lt;br /&gt;
* '''With Nielsen'''&lt;br /&gt;
** User's Identity&lt;br /&gt;
* '''With Data Provider'''&lt;br /&gt;
** Content information&lt;br /&gt;
** Whether user is viewing an ad or video content&lt;br /&gt;
** Player used to play the streaming (audio / video, etc.)&lt;br /&gt;
** Values being de-duped / aggregating for&lt;br /&gt;
&lt;br /&gt;
Nielsen collects only what it needs for audience measurement. Every view of creditable, watermarked content will be measured by Nielsen.&lt;br /&gt;
&lt;br /&gt;
=== Data Collected ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type of Information !! Parameter !! Transmitted to Nielsen? !! Sent to Provider?&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; | Nielsen ID3 Watermark&lt;br /&gt;
|-&lt;br /&gt;
| FinalDistributor Timestamp || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Program Content Timestamp || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Mobile Breakout Code || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Commercial Credit Code – Linear or Dynamic || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Time ShiftedViewing Code || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Segment Number || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Segment View Pattern || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;7&amp;quot; | Device/App Info&lt;br /&gt;
|-&lt;br /&gt;
| Device OSVersion || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| Device Model || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Cache Buster || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| SDKDisabled Flag || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| ServerCode || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Channel or URL || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; | Nielsen Identifiers&lt;br /&gt;
|-&lt;br /&gt;
| Client ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Campaign ID || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| Nielsen Unique Device ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Application ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| DeviceGroup (ex. Tablet, Smartphone, Desktop) || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| OS Group (ex. Android, iOS, Windows) || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| SDKVersion || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| IP Address for DMA, Country Code || Yes || Yes &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': Data is hashed, and encrypted using AES 128 before transmission to data provider.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Viewability_Data_Collected}}&lt;br /&gt;
&lt;br /&gt;
==== Example ping sent to provider ====&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://provider.com/cgi-bin/brandlift.php&amp;lt;/nowiki&amp;gt;?campaign_id=ff12725d724fac7934cf6003f096b4cd&amp;lt;wbr /&amp;gt;&amp;amp;placement_id=a4164b8fba9ee7c873a9c72c7091bb58&amp;lt;wbr /&amp;gt;&amp;amp;creative_id=25280139b61a947e127a52f56c8a2fdd&amp;lt;wbr /&amp;gt;&amp;amp;segment1=9000&amp;lt;wbr /&amp;gt;&amp;amp;segment2=41&amp;lt;wbr /&amp;gt;&amp;amp;segment3=iOS&amp;lt;wbr /&amp;gt;&amp;amp;OSVer=iOS6.1&amp;lt;wbr /&amp;gt;&amp;amp;c9=&amp;lt;wbr /&amp;gt;&amp;amp;devgrp=tablet&amp;lt;wbr /&amp;gt;&amp;amp;h=f5f243fe6d&amp;lt;wbr /&amp;gt;&amp;amp;rnd=1376971827360&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This ping passes the following parameters to the provider:&lt;br /&gt;
* Campaign ID – (campaign, placement, creative)&lt;br /&gt;
* Country Code&lt;br /&gt;
* DMA&lt;br /&gt;
* OS Group (ex. iOS, Android)&lt;br /&gt;
* DeviceOS Version&lt;br /&gt;
* Device Advertiser ID&lt;br /&gt;
* DeviceGroup (ex. Tablet, Smartphone, Desktop)&lt;br /&gt;
* Cache Buster&lt;br /&gt;
&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
=== Opt-Out Implementation ===&lt;br /&gt;
The site must provide the means for the user to opt-out of, or opt back into Nielsen Measurement.&lt;br /&gt;
&lt;br /&gt;
'''Sample Opt Out Template'''&lt;br /&gt;
&lt;br /&gt;
Our properties may feature Nielsen’s proprietary measurement software which will allow to contribute to market research, like Nielsen’s TV Ratings. To learn more about this information, please [http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html| click here]. Nielsen’s software may collect your choices with regards to it.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
See [[Digital Measurement Testing#Testing Browser Implementation|Digital Measurement Testing - Testing Browser Implementation]].&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_API_Reference&amp;diff=6789</id>
		<title>Browser SDK API Reference</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_API_Reference&amp;diff=6789"/>
		<updated>2024-12-10T18:01:28Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: Multiple SDK instances&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Setting up Development Environment ==&lt;br /&gt;
=== Step 1: Configure Content Management System (CMS) ===&lt;br /&gt;
Configure CMS to send the required values (see table below). Any internal CMS_variable names can be used for passing the data.&lt;br /&gt;
&lt;br /&gt;
Ensure to capture these CMS_variable names in the SDK Configuration Form.&lt;br /&gt;
&lt;br /&gt;
For more information on setting variable names, see the SDK Configuration Form included within the SDK package.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Required Data !! Description !! Value&lt;br /&gt;
|-&lt;br /&gt;
| dataSrc || Used when both CMS metadata and ID3 data are present in the player. Setting this field tells the SDK whether to use the CMS metadata or the ID3 payload to derive the pings || cms&lt;br /&gt;
|-&lt;br /&gt;
| type || Type of asset: ad or content || preroll, midroll, postroll, or content&lt;br /&gt;
|-&lt;br /&gt;
| assetid || unique ID assigned to asset || custom &amp;lt;br&amp;gt;(no [[Special Characters]])&lt;br /&gt;
|-&lt;br /&gt;
| OCR Tag || OCR tag provided by Nielsen for implementation on the ad unit || Complete OCR URL&lt;br /&gt;
|-&lt;br /&gt;
| program || Name of program (25 character limit) || custom&lt;br /&gt;
|-&lt;br /&gt;
| title || Episode title (40 character limit) || custom&lt;br /&gt;
|-&lt;br /&gt;
| length || Length of content in seconds || Length in seconds, 0 for live stream&lt;br /&gt;
|-&lt;br /&gt;
| adloadtype || Type of ad load || &amp;quot;1&amp;quot; - Linear &amp;quot;2&amp;quot; - Dynamic(default)&lt;br /&gt;
|-&lt;br /&gt;
| hasAds || Identify if content includes Ads ||  &amp;quot;0&amp;quot; - no ads &amp;quot;1&amp;quot; - includes ads &amp;quot;2&amp;quot; - unknown(default)&lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode || Full episode flag	|| &amp;quot;y&amp;quot; - full episode &amp;quot;n&amp;quot; - non full episode&lt;br /&gt;
|-&lt;br /&gt;
| segA || Segment A (this is not available for video reporting as the episode title is reported) || custom value&lt;br /&gt;
|-&lt;br /&gt;
| segB || Custom segment B || custom value&lt;br /&gt;
|-&lt;br /&gt;
| segC || Custom segment C || custom value&lt;br /&gt;
|-&lt;br /&gt;
| crossId1 || Standard episode ID || custom value&lt;br /&gt;
|-&lt;br /&gt;
| crossId2 || Content originator (required only for distributors) || custom value&lt;br /&gt;
|-&lt;br /&gt;
| airdate || Original air date and time in Eastern Time. For non-US countries, it should be local time. || YYYYMMDD HH24:MI:SS&lt;br /&gt;
|-&lt;br /&gt;
| containerId || HTML DOM element of the Player container (for Viewability&amp;amp;Audibility feature only) || custom value &lt;br /&gt;
|-&lt;br /&gt;
|luid&lt;br /&gt;
|Living Unit ID - Experian Household ID&lt;br /&gt;
'''Note: This parameter is applicable only for CTV and First Party Livestream data'''&lt;br /&gt;
|&amp;quot;B0EOFEDgD&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Complete the Nielsen SDK Configuration Form ===&lt;br /&gt;
The SDK is designed to map the &amp;lt;code&amp;gt;CMS_variable names&amp;lt;/code&amp;gt;. To support the custom mapping, the developer is required to complete the SDK Configuration Form. The form will be provided during onboarding along with this guide.&lt;br /&gt;
&lt;br /&gt;
== Initialization ==&lt;br /&gt;
=== Obtain the Nielsen Application ID (apid) and Browser SDK URLs ===&lt;br /&gt;
The Nielsen &amp;lt;code&amp;gt;apid&amp;lt;/code&amp;gt; is required to enable SDK functionality. Technical Account Manager will provide an apid for each player configuration.  &lt;br /&gt;
Browser SDK can support URLs that use any of the protocols – HTTPS and HTTP.  &lt;br /&gt;
&lt;br /&gt;
=== Configure Browser SDK ===&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
&lt;br /&gt;
'''Add Static Queue Snippet'''&lt;br /&gt;
&lt;br /&gt;
*Add Static Queue Snippet&lt;br /&gt;
*Create SDK Instance&lt;br /&gt;
&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
'''Create SDK Instance'''&lt;br /&gt;
&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
'''Initialization API Call'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When creating an instance, pass the following three values:&lt;br /&gt;
&lt;br /&gt;
=== SDK Initialization – Global Parameters ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameters !! Description !! Value&lt;br /&gt;
|-&lt;br /&gt;
| apid || UniqueID assigned to player/site. || 	'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
| instanceName || Name of SDK instance || &amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug || Enables Nielsen console logging. Only required for testing || &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| containerId || HTML DOM element id of the player container. Only for Viewability &amp;amp; Audibility feature. || {containerId: &amp;quot;playerId1&amp;quot;}&lt;br /&gt;
|-&lt;br /&gt;
| hem_sha256 || SHA256-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| hem_sha1 || SHA1-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;XvBniTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| hem_md5 || MD5-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;JnIbdTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| uid2 || An identifier based on a user’s verifiable PII (e.g. hashed email). UID2.0 was initially created by The Trade Desk (TTD) and is now managed by Prebid. || &amp;quot;MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| uid2_token || Encrypted Unified ID 2.0 || &amp;quot;AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8Ql&lt;br /&gt;
DSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeK&lt;br /&gt;
QI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhC&lt;br /&gt;
xG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{example_bsdk_init}}&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Configuration'''&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
  var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;,&amp;quot;nlsnInstance&amp;quot;, {nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multiple SDK Instances ===&lt;br /&gt;
The Browser SDK allows instantiating multiple instances of the object, which can be used simultaneously without any problems, however they must be instantiated with their own unique instance names. There is no maximum number of instances that is enforced in the browser.&lt;br /&gt;
&lt;br /&gt;
The below examples will make use of the same AppId, however using different AppIds will work as well. The principles below follow the same initialization rules stated above for a single instance and simply require a unique instance name and variable name with which the returned instance is assigned.&lt;br /&gt;
&lt;br /&gt;
For more information around the possible parameters that can be passed as well as deeper descriptions for the API calls, please refer to the section on &amp;quot; [[Browser SDK API Reference#SDK Initialization - Global Parameters|SDK Initialization - Global Parameters]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Example of 2 instances on the same page'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Add Static Queue Snippet&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    !function (e, n) {&lt;br /&gt;
      function t(e) {&lt;br /&gt;
        return &amp;quot;object&amp;quot; == typeof e ? JSON.parse(JSON.stringify(e)) : e&lt;br /&gt;
      }&lt;br /&gt;
      e[n] = e[n] ||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ: function (o, r, c) {&lt;br /&gt;
          var s = e.document,&lt;br /&gt;
            a = s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async = 1,&lt;br /&gt;
            a.src = (&amp;quot;http:&amp;quot; === e.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + o + &amp;quot;.js#name=&amp;quot; + r + &amp;quot;&amp;amp;ns=&amp;quot; + n;&lt;br /&gt;
          var i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a, i),&lt;br /&gt;
            e[n][r] = e[n][r] || {&lt;br /&gt;
              g: c || {},&lt;br /&gt;
              ggPM: function (o, c, s, a, i) { e[n][r].q = e[n][r].q || []; try { var l = t([o, c, s, a, i]); e[n][r].q.push(l) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } },&lt;br /&gt;
              trackEvent: function (o) { e[n][r].te = e[n][r].te || []; try { var c = t(o); e[n][r].te.push(c) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } }&lt;br /&gt;
            },&lt;br /&gt;
            e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    //Create SDK Instance(s)&lt;br /&gt;
    // Notice the unique instance name given to each instance below and the unique variable name for each instance&lt;br /&gt;
    var nSdkInstanceLive = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;instanceLive&amp;quot;, {&lt;br /&gt;
        nol_sdkDebug: 'debug',&lt;br /&gt;
        optout: 'false'&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    var nSdkInstanceVod = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;instanceVod&amp;quot;, {&lt;br /&gt;
        nol_sdkDebug: 'debug',&lt;br /&gt;
        optout: 'false'&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Example of 2 instances using a parent page and iFrame'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Parent Page (index.html)&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;ie=edge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;DCR Static/DCR Video&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    /* NLSQUEUE build v*/&lt;br /&gt;
    !function(e,n){&lt;br /&gt;
    function t(e){&lt;br /&gt;
      return&amp;quot;object&amp;quot;==typeof e?JSON.parse(JSON.stringify(e)):e&lt;br /&gt;
    }&lt;br /&gt;
    e[n]=e[n]||&lt;br /&gt;
    {&lt;br /&gt;
      nlsQ:function(o,r,c){&lt;br /&gt;
        var s=e.document,&lt;br /&gt;
        a=s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
        a.async=1,&lt;br /&gt;
        a.src=(&amp;quot;http:&amp;quot;===e.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+o+&amp;quot;.js#name=&amp;quot;+r+&amp;quot;&amp;amp;ns=&amp;quot;+n;&lt;br /&gt;
        var i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
        return i.parentNode.insertBefore(a,i),&lt;br /&gt;
        e[n][r]=e[n][r]||{g:c||{},&lt;br /&gt;
        ggPM:function(o,c,s,a,i){e[n][r].q=e[n][r].q||[];try{var l=t([o,c,s,a,i]);e[n][r].q.push(l)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}},&lt;br /&gt;
        trackEvent:function(o){e[n][r].te=e[n][r].te||[];try{var c=t(o);e[n][r].te.push(c)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}}},&lt;br /&gt;
        e[n][r]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // SDK Initialization&lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;staticPage&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: 'debug',&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Static Metadata &lt;br /&gt;
    var staticMetadata = {&lt;br /&gt;
      assetid: 'staticTestPage',&lt;br /&gt;
      type: 'static'&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    // Event 'staticstart' call&lt;br /&gt;
    nSdkInstance.ggPM(14, staticMetadata);&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;h1&amp;gt;DCR Static on Parent/DCR Video in iFrame&amp;lt;/h1&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Static measurement is current on parent page when window is in focus&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;iframe src=&amp;quot;./dcr-video.html&amp;quot; frameborder=&amp;quot;0&amp;quot; width=&amp;quot;650&amp;quot; height=&amp;quot;500&amp;quot; style=&amp;quot;background-color: rgb(42, 217, 248);&amp;quot; id=&amp;quot;video-iframe&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Nested iFrame Referenced on Parent Page (dcr-video.html)&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;ie=edge&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;iFrame Same Source&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
    /* NLSQUEUE build v*/&lt;br /&gt;
    !function(e,n){&lt;br /&gt;
      function t(e){&lt;br /&gt;
        return&amp;quot;object&amp;quot;==typeof e?JSON.parse(JSON.stringify(e)):e&lt;br /&gt;
      }&lt;br /&gt;
      e[n]=e[n]||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ:function(o,r,c){&lt;br /&gt;
          var s=e.document,&lt;br /&gt;
          a=s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async=1,&lt;br /&gt;
          a.src=(&amp;quot;http:&amp;quot;===e.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+o+&amp;quot;.js#name=&amp;quot;+r+&amp;quot;&amp;amp;ns=&amp;quot;+n;&lt;br /&gt;
          var i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a,i),&lt;br /&gt;
          e[n][r]=e[n][r]||{g:c||{},&lt;br /&gt;
          ggPM:function(o,c,s,a,i){e[n][r].q=e[n][r].q||[];try{var l=t([o,c,s,a,i]);e[n][r].q.push(l)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}},&lt;br /&gt;
          trackEvent:function(o){e[n][r].te=e[n][r].te||[];try{var c=t(o);e[n][r].te.push(c)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}}},&lt;br /&gt;
          e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // SDK Initialization&lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;videoPlayer&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: 'debug',&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    var contentMetadata = {&lt;br /&gt;
        type: &amp;quot;content&amp;quot;,&lt;br /&gt;
        length: &amp;quot;300&amp;quot;,&lt;br /&gt;
        title: &amp;quot;Skydiving Across Europe&amp;quot;,&lt;br /&gt;
        program: &amp;quot;latacg&amp;quot;,&lt;br /&gt;
        censuscategory: &amp;quot;Enlisted&amp;quot;,&lt;br /&gt;
        assetid: &amp;quot;204558915992&amp;quot;,&lt;br /&gt;
        section: &amp;quot;ProgramAsset8&amp;quot;,&lt;br /&gt;
        tv: &amp;quot;true&amp;quot;,&lt;br /&gt;
        adModel: &amp;quot;0&amp;quot;,&lt;br /&gt;
        dataSrc: &amp;quot;cms&amp;quot;,&lt;br /&gt;
        segA: &amp;quot;S07E04:NBC&amp;quot;,&lt;br /&gt;
        segB: &amp;quot;teams&amp;quot;,&lt;br /&gt;
        segC:&amp;quot;AtlanataFalcons&amp;quot;,&lt;br /&gt;
      }&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;I'm iframe SDK DCR Video measurement, DCR static measurement should continue when clicking &amp;quot;play&amp;quot; on video&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;main&amp;gt;&lt;br /&gt;
      &amp;lt;video&lt;br /&gt;
      controls&lt;br /&gt;
      src=&amp;quot;https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4&amp;quot;&lt;br /&gt;
      poster=&amp;quot;https://peach.blender.org/wp-content/uploads/title_anouncement.jpg?x11217&amp;quot;&lt;br /&gt;
      width=&amp;quot;620&amp;quot;&amp;gt;&lt;br /&gt;
      Sorry, your browser doesn't support embedded videos, but don't worry, you can&lt;br /&gt;
      &amp;lt;a href=&amp;quot;https://archive.org/details/BigBuckBunny_124&amp;quot;&amp;gt;download it&amp;lt;/a&amp;gt;&lt;br /&gt;
      and watch it with your favorite video player!&lt;br /&gt;
    &amp;lt;/video&amp;gt;&lt;br /&gt;
    &amp;lt;/main&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;../player.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SDK Initialization to measure the Viewability &amp;amp; Audibility ===&lt;br /&gt;
To support viewability metrics in the web page the integrator has to provide a tag value of the player view to let Nielsen SDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in the as string while initializing the Nielsen browser SDK.&lt;br /&gt;
&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{containerId: &amp;lt;playerElementID&amp;gt;, nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Initialization for Viewability'''&lt;br /&gt;
&lt;br /&gt;
Your configuration should include the Static Queue Snippet and an SDK Instance for your unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Add Static Queue Snippet&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    ! function(t, n) {&lt;br /&gt;
        t[n] = t[n] || {&lt;br /&gt;
            nlsQ: function(e, o, c, r, s, i) {&lt;br /&gt;
                return s = t.document,&lt;br /&gt;
                    r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
                    r.async = 1,&lt;br /&gt;
                    r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + o + &amp;quot;&amp;amp;ns=&amp;quot; + n,&lt;br /&gt;
                    i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
                    i.parentNode.insertBefore(r, i),&lt;br /&gt;
                    t[n][o] = t[n][o] || {&lt;br /&gt;
                        g: c || {},&lt;br /&gt;
                        ggPM: function(e, c, r, s, i) {&lt;br /&gt;
                            (t[n][o].q = t[n][o].q || []).push([e, c, r, s, i])&lt;br /&gt;
                        }&lt;br /&gt;
                    }, t[n][o]&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    (window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
//Create SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {containerId: “player1”, nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser SDK API Methods &amp;amp; Properties ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method / Property !! Event # !! DTVR !! DAR !! DCR !! Description&lt;br /&gt;
|-&lt;br /&gt;
| [[loadMetadata (Browser)|loadMetadata]] || 15 || ✔ || ✔ || ✔ || Used when there is a preroll ad that needs to be associated with content metadata. The loadMetadata will first be called to populate the content metadata values and then the loadMetadata for ad metadata will be called. This allows sending a content ping with the ad info, even if the user bails out during the preroll ad.&lt;br /&gt;
|-&lt;br /&gt;
| [[play (Browser)|play]] || 5 || ✔ || ✘ || ✔ || Used when there is an ID3 fed product such as DTVR and the client does not want to send in all the CMS metadata that is sent in loadMetadata. This allows the client to send in at least the required “channel name” value associated to the ID3 feed. When the client passes in the channelName, they can change the CMS data stored by passing new values. If this event is not called then the “channel name” value populated will be the default value of “defaultChannelName”.&lt;br /&gt;
|-&lt;br /&gt;
| [[sendID3 (Browser)|sendID3]] || 55 || ✔ || ✘ || ✘ || Used to send the ID3 metadata.&lt;br /&gt;
|-&lt;br /&gt;
| [[setPlayheadPosition (Browser)|setPlayheadPosition]] || 49 || ✘ || ✘ || ✔ || Used to send the playhead position.&lt;br /&gt;
|-&lt;br /&gt;
| [[stop (Browser)|stop]] || 7 || ✘ || ✘ || ✔ || Used when switching between ad and content or content and ad.&lt;br /&gt;
|-&lt;br /&gt;
| [[end (Browser)|end]] || 57 || ✔ || ✘ || ✔ || This is triggered 1) at the end of the content stream, 2) if the user switches to another piece of content 3) when the browser is refreshed or closed&lt;br /&gt;
|-&lt;br /&gt;
| [[staticstart (Browser)|staticstart]] || 14 || ✘ || ✘ || ✔ || Used to send the metadata for the static page.&lt;br /&gt;
|-&lt;br /&gt;
| [[StaticEnd (Browser)|staticend]] || 56 || ✘ || ✘ || ✔ || In Single Page Application (SPA) it is imperative that staticend is called prior to the loading of new metadata. This allows the Browser SDK to properly credit the previous section/content being viewed before measuring the new one.&lt;br /&gt;
|-&lt;br /&gt;
| [[updateOTT (Browser)|updateOTT]] || - || ✘ || ✘ || ✔ || Used to notify Browser SDK that the remote OTT device (like Google ChromeCast, Roku, Amazon FireTV, etc.) is connected / disconnected (change of OTT status).&lt;br /&gt;
|-&lt;br /&gt;
| [[ onPaginate (Browser)|onPaginate]] || 30 || ✘ || ✘ || ✔ || Used to create a new instance of the SDK object&lt;br /&gt;
|-&lt;br /&gt;
| [[updateMetadata (Browser)|updateMetadata]] || 35 || ✔ || ✔ || ✔ || This event is used for updating metadata parameters for the content or ad that is being played.&lt;br /&gt;
|-&lt;br /&gt;
| [[setVolume_(Browser)|setVolume]] || 61 || ✔ || ✘ || ✔ || Used to pass in the player volume levels in %. Default value is -1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Retrieving ID3 Tags ==&lt;br /&gt;
The video player must have the ability to extract ID3 tags and supply them to the Browser SDK, based on the HLS standard.&lt;br /&gt;
*An ID3 tag spans two PES packets.&lt;br /&gt;
**In the first PES packet, look for www.nielsen.com, this is the start of the ID3 tag. Continue to parse the first PES packet until the undefined char &amp;quot;\ufffd&amp;quot; is found. This forms the first half of the ID3 tag&lt;br /&gt;
**In the second PES packet, identify the end pattern – a regEx of /(\/\d+){3}/ and look to remove the lowest index of either &amp;quot;\x00&amp;quot; and/or &amp;quot;\ufffd&amp;quot;. Now the second packet has been appended and the demarcation of the Nielsen-specific data has been defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Follow the procedure below, to extract Nielsen ID3 tags from an MPEG-2 transport stream (including HLS streams).&lt;br /&gt;
#Parse the Program Map Table (PMT) to find the PID of the metadata stream. Confirm the presence of the metadata descriptor described in section 2.3.3 of Apple’s “HTTP Live Streaming Metadata Spec.pdf”. Only private streams with metadata descriptor present should be considered as ID3-tag metadata streams.&lt;br /&gt;
#Parse the HLS/Transport stream for any '''PES header''' with the PID found in step 1.&lt;br /&gt;
#Follow standard MPEG-2 parsing procedures to locate the start of the payload of the PES packet.&lt;br /&gt;
#Copy the PES payload into a buffer.&lt;br /&gt;
#The ID3 tag spans 2 PES packets. Parse the stream for the next packet whose PID is set to the PID found in step 1. Typically the ID3 Tag is of 249 bytes. The steps below guide towards extraction of the ID3 tag&lt;br /&gt;
##In the first PES packet, look for &amp;quot;www.nielsen.com&amp;quot; , this is the start of the ID3 tag. Keep on parsing the first PES packet until the undefined char &amp;quot;\ufffd&amp;quot; is found. This forms the first half of the ID3 tag&lt;br /&gt;
##In the second PES packet, identify the end pattern, a regEx of /(\/\d+){3}/ and look to remove the lowest index of either “\x00” and/or “\ufffd”. Now the second packet has been appended and the demarcation of the Nielsen specific data has been defined. This segment can be simply substringed.&lt;br /&gt;
##Concatenate this substringed segment with the payload derived from the first packet get the ID3 payload.&lt;br /&gt;
#Check the length of the contents in the buffer to make sure that it is equal to the size of a Nielsen ID3 tag.&lt;br /&gt;
#Ensure that the ID3 byte array is converted into the string and escape it, so that the SDK can consume it.&lt;br /&gt;
Repeat steps 2 through 7 for all ID3 tags in the stream.&lt;br /&gt;
&lt;br /&gt;
'''References'''&lt;br /&gt;
*[http://www.iso.org/iso/catalogue_detail?csnumber=44169. ISO/IEC 13818-1:2007] Information technology – Generic coding of moving pictures and associated audio information: Systems&lt;br /&gt;
*https://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/HTTP_Live_Streaming_Metadata_Spec/&lt;br /&gt;
&lt;br /&gt;
=== Sample ID3 tags ===&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/X100zdCIGeIlgZnkYj6UvQ==/AAAB2Jz2_k74GXSzx4npHuI_&amp;lt;wbr /&amp;gt;JwJd3QSUpW30rDkGTcbHEzIMWleCzM-uvNOP9fzJcQMWQLJqzXMCAxParOb5sGijSV9dNM3QiBniJYGZ5GI-lL1fXTTN0IgZ4iWBmeRiPpS9AAAAAAAAAAAAAAAAAAAAAFJWFM5SVhTONNU=/00000/00000/00&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/R8WHe7pEBeqBhu8jTeXydg==/AAICoyitYqlxT7n6aZ0oMCGhe&amp;lt;wbr /&amp;gt;Fi4CXFp46AMUPZz1lMr_M9tr3_cjee1SHqxrOiVerMDLeyn9xzocZSKwi746Re8vNOtpNCAZjYABs_J0R25IHpvOc1HS8&amp;lt;wbr /&amp;gt;QHGgD5TgOJeS6gX100zdCIGeIlgZnkYj6UvVJWFNhSVhTiPE0=/00000/46016/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': ID3 tags are not applicable for International (Germany)&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser Opt-Out Implementation ==&lt;br /&gt;
The site in which video content is being measure via Nielsen methodology must provide the means for the user to opt-out of, or opt back into Nielsen Measurement.&lt;br /&gt;
&lt;br /&gt;
For Browser-based applications, opt-out setting is stored via Nielsen cookie. Therefore, it is only necessary that users be made aware of measurement opt-out by incorporating the template below in the user interface.&lt;br /&gt;
&lt;br /&gt;
=== Sample Opt Out Template ===&lt;br /&gt;
Our properties may feature Nielsen’s proprietary measurement software which will allow to contribute to market research, like Nielsen’s TV Ratings. To learn more about this information, see https://www.nielsen.com/digitalprivacy. Nielsen’s software may collect your choices with regards to it.&lt;br /&gt;
&lt;br /&gt;
== Nielsen Privacy Requirements ==&lt;br /&gt;
Privacy protections that Nielsen ensures to have with each App SDK integration are as follows.&lt;br /&gt;
*Disclosure of viewership data collection in EULA / Privacy Policy&lt;br /&gt;
*A link in the EULA/Privacy policy, or in another conspicuous location within the App, to a Nielsen-hosted web page outlining what Nielsen is collecting and how it is being used&lt;br /&gt;
*Method for users to opt-out of Nielsen measurement, any time while using the application&lt;br /&gt;
&lt;br /&gt;
=== Ratings Data Flow ===&lt;br /&gt;
Every view of creditable and watermarked content is measured by Nielsen.&lt;br /&gt;
[[File:RatingsDataFlow.png]]&lt;br /&gt;
&lt;br /&gt;
'''Information NOT Shared'''&lt;br /&gt;
* '''With Nielsen'''&lt;br /&gt;
** User's Identity&lt;br /&gt;
* '''With Data Provider'''&lt;br /&gt;
** Content information&lt;br /&gt;
** Whether user is viewing an ad or video content&lt;br /&gt;
** Player used to play the streaming (audio / video, etc.)&lt;br /&gt;
** Values being de-duped / aggregating for&lt;br /&gt;
&lt;br /&gt;
Nielsen collects only what it needs for audience measurement. Every view of creditable, watermarked content will be measured by Nielsen.&lt;br /&gt;
&lt;br /&gt;
=== Data Collected ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type of Information !! Parameter !! Transmitted to Nielsen? !! Sent to Provider?&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; | Nielsen ID3 Watermark&lt;br /&gt;
|-&lt;br /&gt;
| FinalDistributor Timestamp || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Program Content Timestamp || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Mobile Breakout Code || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Commercial Credit Code – Linear or Dynamic || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Time ShiftedViewing Code || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Segment Number || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Segment View Pattern || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;7&amp;quot; | Device/App Info&lt;br /&gt;
|-&lt;br /&gt;
| Device OSVersion || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| Device Model || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Cache Buster || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| SDKDisabled Flag || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| ServerCode || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Channel or URL || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; | Nielsen Identifiers&lt;br /&gt;
|-&lt;br /&gt;
| Client ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Campaign ID || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| Nielsen Unique Device ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Application ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| DeviceGroup (ex. Tablet, Smartphone, Desktop) || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| OS Group (ex. Android, iOS, Windows) || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| SDKVersion || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| IP Address for DMA, Country Code || Yes || Yes &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': Data is hashed, and encrypted using AES 128 before transmission to data provider.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Viewability_Data_Collected}}&lt;br /&gt;
&lt;br /&gt;
==== Example ping sent to provider ====&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://provider.com/cgi-bin/brandlift.php&amp;lt;/nowiki&amp;gt;?campaign_id=ff12725d724fac7934cf6003f096b4cd&amp;lt;wbr /&amp;gt;&amp;amp;placement_id=a4164b8fba9ee7c873a9c72c7091bb58&amp;lt;wbr /&amp;gt;&amp;amp;creative_id=25280139b61a947e127a52f56c8a2fdd&amp;lt;wbr /&amp;gt;&amp;amp;segment1=9000&amp;lt;wbr /&amp;gt;&amp;amp;segment2=41&amp;lt;wbr /&amp;gt;&amp;amp;segment3=iOS&amp;lt;wbr /&amp;gt;&amp;amp;OSVer=iOS6.1&amp;lt;wbr /&amp;gt;&amp;amp;c9=&amp;lt;wbr /&amp;gt;&amp;amp;devgrp=tablet&amp;lt;wbr /&amp;gt;&amp;amp;h=f5f243fe6d&amp;lt;wbr /&amp;gt;&amp;amp;rnd=1376971827360&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This ping passes the following parameters to the provider:&lt;br /&gt;
* Campaign ID – (campaign, placement, creative)&lt;br /&gt;
* Country Code&lt;br /&gt;
* DMA&lt;br /&gt;
* OS Group (ex. iOS, Android)&lt;br /&gt;
* DeviceOS Version&lt;br /&gt;
* Device Advertiser ID&lt;br /&gt;
* DeviceGroup (ex. Tablet, Smartphone, Desktop)&lt;br /&gt;
* Cache Buster&lt;br /&gt;
&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
=== Opt-Out Implementation ===&lt;br /&gt;
The site must provide the means for the user to opt-out of, or opt back into Nielsen Measurement.&lt;br /&gt;
&lt;br /&gt;
'''Sample Opt Out Template'''&lt;br /&gt;
&lt;br /&gt;
Our properties may feature Nielsen’s proprietary measurement software which will allow to contribute to market research, like Nielsen’s TV Ratings. To learn more about this information, please [http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html| click here]. Nielsen’s software may collect your choices with regards to it.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
See [[Digital Measurement Testing#Testing Browser Implementation|Digital Measurement Testing - Testing Browser Implementation]].&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_API_Reference&amp;diff=6788</id>
		<title>Browser SDK API Reference</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_API_Reference&amp;diff=6788"/>
		<updated>2024-12-09T20:00:10Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: /* Multiple SDK Instances */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Setting up Development Environment ==&lt;br /&gt;
=== Step 1: Configure Content Management System (CMS) ===&lt;br /&gt;
Configure CMS to send the required values (see table below). Any internal CMS_variable names can be used for passing the data.&lt;br /&gt;
&lt;br /&gt;
Ensure to capture these CMS_variable names in the SDK Configuration Form.&lt;br /&gt;
&lt;br /&gt;
For more information on setting variable names, see the SDK Configuration Form included within the SDK package.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Required Data !! Description !! Value&lt;br /&gt;
|-&lt;br /&gt;
| dataSrc || Used when both CMS metadata and ID3 data are present in the player. Setting this field tells the SDK whether to use the CMS metadata or the ID3 payload to derive the pings || cms&lt;br /&gt;
|-&lt;br /&gt;
| type || Type of asset: ad or content || preroll, midroll, postroll, or content&lt;br /&gt;
|-&lt;br /&gt;
| assetid || unique ID assigned to asset || custom &amp;lt;br&amp;gt;(no [[Special Characters]])&lt;br /&gt;
|-&lt;br /&gt;
| OCR Tag || OCR tag provided by Nielsen for implementation on the ad unit || Complete OCR URL&lt;br /&gt;
|-&lt;br /&gt;
| program || Name of program (25 character limit) || custom&lt;br /&gt;
|-&lt;br /&gt;
| title || Episode title (40 character limit) || custom&lt;br /&gt;
|-&lt;br /&gt;
| length || Length of content in seconds || Length in seconds, 0 for live stream&lt;br /&gt;
|-&lt;br /&gt;
| adloadtype || Type of ad load || &amp;quot;1&amp;quot; - Linear &amp;quot;2&amp;quot; - Dynamic(default)&lt;br /&gt;
|-&lt;br /&gt;
| hasAds || Identify if content includes Ads ||  &amp;quot;0&amp;quot; - no ads &amp;quot;1&amp;quot; - includes ads &amp;quot;2&amp;quot; - unknown(default)&lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode || Full episode flag	|| &amp;quot;y&amp;quot; - full episode &amp;quot;n&amp;quot; - non full episode&lt;br /&gt;
|-&lt;br /&gt;
| segA || Segment A (this is not available for video reporting as the episode title is reported) || custom value&lt;br /&gt;
|-&lt;br /&gt;
| segB || Custom segment B || custom value&lt;br /&gt;
|-&lt;br /&gt;
| segC || Custom segment C || custom value&lt;br /&gt;
|-&lt;br /&gt;
| crossId1 || Standard episode ID || custom value&lt;br /&gt;
|-&lt;br /&gt;
| crossId2 || Content originator (required only for distributors) || custom value&lt;br /&gt;
|-&lt;br /&gt;
| airdate || Original air date and time in Eastern Time. For non-US countries, it should be local time. || YYYYMMDD HH24:MI:SS&lt;br /&gt;
|-&lt;br /&gt;
| containerId || HTML DOM element of the Player container (for Viewability&amp;amp;Audibility feature only) || custom value &lt;br /&gt;
|-&lt;br /&gt;
|luid&lt;br /&gt;
|Living Unit ID - Experian Household ID&lt;br /&gt;
'''Note: This parameter is applicable only for CTV and First Party Livestream data'''&lt;br /&gt;
|&amp;quot;B0EOFEDgD&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Complete the Nielsen SDK Configuration Form ===&lt;br /&gt;
The SDK is designed to map the &amp;lt;code&amp;gt;CMS_variable names&amp;lt;/code&amp;gt;. To support the custom mapping, the developer is required to complete the SDK Configuration Form. The form will be provided during onboarding along with this guide.&lt;br /&gt;
&lt;br /&gt;
== Initialization ==&lt;br /&gt;
=== Obtain the Nielsen Application ID (apid) and Browser SDK URLs ===&lt;br /&gt;
The Nielsen &amp;lt;code&amp;gt;apid&amp;lt;/code&amp;gt; is required to enable SDK functionality. Technical Account Manager will provide an apid for each player configuration.  &lt;br /&gt;
Browser SDK can support URLs that use any of the protocols – HTTPS and HTTP.  &lt;br /&gt;
&lt;br /&gt;
=== Configure Browser SDK ===&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
&lt;br /&gt;
'''Add Static Queue Snippet'''&lt;br /&gt;
&lt;br /&gt;
*Add Static Queue Snippet&lt;br /&gt;
*Create SDK Instance&lt;br /&gt;
&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
'''Create SDK Instance'''&lt;br /&gt;
&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
'''Initialization API Call'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When creating an instance, pass the following three values:&lt;br /&gt;
&lt;br /&gt;
=== SDK Initialization – Global Parameters ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameters !! Description !! Value&lt;br /&gt;
|-&lt;br /&gt;
| apid || UniqueID assigned to player/site. || 	'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
| instanceName || Name of SDK instance || &amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug || Enables Nielsen console logging. Only required for testing || &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| containerId || HTML DOM element id of the player container. Only for Viewability &amp;amp; Audibility feature. || {containerId: &amp;quot;playerId1&amp;quot;}&lt;br /&gt;
|-&lt;br /&gt;
| hem_sha256 || SHA256-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| hem_sha1 || SHA1-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;XvBniTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| hem_md5 || MD5-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;JnIbdTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| uid2 || An identifier based on a user’s verifiable PII (e.g. hashed email). UID2.0 was initially created by The Trade Desk (TTD) and is now managed by Prebid. || &amp;quot;MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| uid2_token || Encrypted Unified ID 2.0 || &amp;quot;AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8Ql&lt;br /&gt;
DSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeK&lt;br /&gt;
QI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhC&lt;br /&gt;
xG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{example_bsdk_init}}&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Configuration'''&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
  var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;,&amp;quot;nlsnInstance&amp;quot;, {nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multiple SDK Instances ===&lt;br /&gt;
The Browser SDK allows instantiating multiple instances of the object, which can be used simultaneously without any problems, however they must be instantiated with their own unique instance names. There is no maximum number of instances that is enforced in the browser.&lt;br /&gt;
&lt;br /&gt;
The below examples will make use of the same AppId, however using different AppIds will work as well. The principles below follow the same initialization rules stated above for a single instance and simply require a unique instance name and variable name with which the returned instance is assigned.&lt;br /&gt;
&lt;br /&gt;
For more information around the possible parameters that can be passed as well as deeper descriptions for the API calls, please refer to the section on &amp;quot;[[#SDK_Initialization_-_Global_Parameters | SDK Initialization - Global Parameters]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Example of 2 instances on the same page'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Add Static Queue Snippet&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    !function (e, n) {&lt;br /&gt;
      function t(e) {&lt;br /&gt;
        return &amp;quot;object&amp;quot; == typeof e ? JSON.parse(JSON.stringify(e)) : e&lt;br /&gt;
      }&lt;br /&gt;
      e[n] = e[n] ||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ: function (o, r, c) {&lt;br /&gt;
          var s = e.document,&lt;br /&gt;
            a = s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async = 1,&lt;br /&gt;
            a.src = (&amp;quot;http:&amp;quot; === e.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + o + &amp;quot;.js#name=&amp;quot; + r + &amp;quot;&amp;amp;ns=&amp;quot; + n;&lt;br /&gt;
          var i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a, i),&lt;br /&gt;
            e[n][r] = e[n][r] || {&lt;br /&gt;
              g: c || {},&lt;br /&gt;
              ggPM: function (o, c, s, a, i) { e[n][r].q = e[n][r].q || []; try { var l = t([o, c, s, a, i]); e[n][r].q.push(l) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } },&lt;br /&gt;
              trackEvent: function (o) { e[n][r].te = e[n][r].te || []; try { var c = t(o); e[n][r].te.push(c) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } }&lt;br /&gt;
            },&lt;br /&gt;
            e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    //Create SDK Instance(s)&lt;br /&gt;
    // Notice the unique instance name given to each instance below and the unique variable name for each instance&lt;br /&gt;
    var nSdkInstanceLive = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;instanceLive&amp;quot;, {&lt;br /&gt;
        nol_sdkDebug: 'debug',&lt;br /&gt;
        optout: 'false'&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    var nSdkInstanceVod = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;instanceVod&amp;quot;, {&lt;br /&gt;
        nol_sdkDebug: 'debug',&lt;br /&gt;
        optout: 'false'&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Example of 2 instances using a parent page and iFrame'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Parent Page (index.html)&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;ie=edge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;DCR Static/DCR Video&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    /* NLSQUEUE build v*/&lt;br /&gt;
    !function(e,n){&lt;br /&gt;
    function t(e){&lt;br /&gt;
      return&amp;quot;object&amp;quot;==typeof e?JSON.parse(JSON.stringify(e)):e&lt;br /&gt;
    }&lt;br /&gt;
    e[n]=e[n]||&lt;br /&gt;
    {&lt;br /&gt;
      nlsQ:function(o,r,c){&lt;br /&gt;
        var s=e.document,&lt;br /&gt;
        a=s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
        a.async=1,&lt;br /&gt;
        a.src=(&amp;quot;http:&amp;quot;===e.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+o+&amp;quot;.js#name=&amp;quot;+r+&amp;quot;&amp;amp;ns=&amp;quot;+n;&lt;br /&gt;
        var i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
        return i.parentNode.insertBefore(a,i),&lt;br /&gt;
        e[n][r]=e[n][r]||{g:c||{},&lt;br /&gt;
        ggPM:function(o,c,s,a,i){e[n][r].q=e[n][r].q||[];try{var l=t([o,c,s,a,i]);e[n][r].q.push(l)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}},&lt;br /&gt;
        trackEvent:function(o){e[n][r].te=e[n][r].te||[];try{var c=t(o);e[n][r].te.push(c)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}}},&lt;br /&gt;
        e[n][r]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // SDK Initialization&lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;staticPage&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: 'debug',&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Static Metadata &lt;br /&gt;
    var staticMetadata = {&lt;br /&gt;
      assetid: 'staticTestPage',&lt;br /&gt;
      type: 'static'&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    // Event 'staticstart' call&lt;br /&gt;
    nSdkInstance.ggPM(14, staticMetadata);&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;h1&amp;gt;DCR Static on Parent/DCR Video in iFrame&amp;lt;/h1&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Static measurement is current on parent page when window is in focus&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;iframe src=&amp;quot;./dcr-video.html&amp;quot; frameborder=&amp;quot;0&amp;quot; width=&amp;quot;650&amp;quot; height=&amp;quot;500&amp;quot; style=&amp;quot;background-color: rgb(42, 217, 248);&amp;quot; id=&amp;quot;video-iframe&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Nested iFrame Referenced on Parent Page (dcr-video.html)&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;ie=edge&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;iFrame Same Source&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
    /* NLSQUEUE build v*/&lt;br /&gt;
    !function(e,n){&lt;br /&gt;
      function t(e){&lt;br /&gt;
        return&amp;quot;object&amp;quot;==typeof e?JSON.parse(JSON.stringify(e)):e&lt;br /&gt;
      }&lt;br /&gt;
      e[n]=e[n]||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ:function(o,r,c){&lt;br /&gt;
          var s=e.document,&lt;br /&gt;
          a=s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async=1,&lt;br /&gt;
          a.src=(&amp;quot;http:&amp;quot;===e.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+o+&amp;quot;.js#name=&amp;quot;+r+&amp;quot;&amp;amp;ns=&amp;quot;+n;&lt;br /&gt;
          var i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a,i),&lt;br /&gt;
          e[n][r]=e[n][r]||{g:c||{},&lt;br /&gt;
          ggPM:function(o,c,s,a,i){e[n][r].q=e[n][r].q||[];try{var l=t([o,c,s,a,i]);e[n][r].q.push(l)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}},&lt;br /&gt;
          trackEvent:function(o){e[n][r].te=e[n][r].te||[];try{var c=t(o);e[n][r].te.push(c)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}}},&lt;br /&gt;
          e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // SDK Initialization&lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;videoPlayer&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: 'debug',&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    var contentMetadata = {&lt;br /&gt;
        type: &amp;quot;content&amp;quot;,&lt;br /&gt;
        length: &amp;quot;300&amp;quot;,&lt;br /&gt;
        title: &amp;quot;Skydiving Across Europe&amp;quot;,&lt;br /&gt;
        program: &amp;quot;latacg&amp;quot;,&lt;br /&gt;
        censuscategory: &amp;quot;Enlisted&amp;quot;,&lt;br /&gt;
        assetid: &amp;quot;204558915992&amp;quot;,&lt;br /&gt;
        section: &amp;quot;ProgramAsset8&amp;quot;,&lt;br /&gt;
        tv: &amp;quot;true&amp;quot;,&lt;br /&gt;
        adModel: &amp;quot;0&amp;quot;,&lt;br /&gt;
        dataSrc: &amp;quot;cms&amp;quot;,&lt;br /&gt;
        segA: &amp;quot;S07E04:NBC&amp;quot;,&lt;br /&gt;
        segB: &amp;quot;teams&amp;quot;,&lt;br /&gt;
        segC:&amp;quot;AtlanataFalcons&amp;quot;,&lt;br /&gt;
      }&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;I'm iframe SDK DCR Video measurement, DCR static measurement should continue when clicking &amp;quot;play&amp;quot; on video&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;main&amp;gt;&lt;br /&gt;
      &amp;lt;video&lt;br /&gt;
      controls&lt;br /&gt;
      src=&amp;quot;https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4&amp;quot;&lt;br /&gt;
      poster=&amp;quot;https://peach.blender.org/wp-content/uploads/title_anouncement.jpg?x11217&amp;quot;&lt;br /&gt;
      width=&amp;quot;620&amp;quot;&amp;gt;&lt;br /&gt;
      Sorry, your browser doesn't support embedded videos, but don't worry, you can&lt;br /&gt;
      &amp;lt;a href=&amp;quot;https://archive.org/details/BigBuckBunny_124&amp;quot;&amp;gt;download it&amp;lt;/a&amp;gt;&lt;br /&gt;
      and watch it with your favorite video player!&lt;br /&gt;
    &amp;lt;/video&amp;gt;&lt;br /&gt;
    &amp;lt;/main&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;../player.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SDK Initialization to measure the Viewability &amp;amp; Audibility ===&lt;br /&gt;
To support viewability metrics in the web page the integrator has to provide a tag value of the player view to let Nielsen SDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in the as string while initializing the Nielsen browser SDK.&lt;br /&gt;
&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{containerId: &amp;lt;playerElementID&amp;gt;, nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Initialization for Viewability'''&lt;br /&gt;
&lt;br /&gt;
Your configuration should include the Static Queue Snippet and an SDK Instance for your unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Add Static Queue Snippet&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    ! function(t, n) {&lt;br /&gt;
        t[n] = t[n] || {&lt;br /&gt;
            nlsQ: function(e, o, c, r, s, i) {&lt;br /&gt;
                return s = t.document,&lt;br /&gt;
                    r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
                    r.async = 1,&lt;br /&gt;
                    r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + o + &amp;quot;&amp;amp;ns=&amp;quot; + n,&lt;br /&gt;
                    i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
                    i.parentNode.insertBefore(r, i),&lt;br /&gt;
                    t[n][o] = t[n][o] || {&lt;br /&gt;
                        g: c || {},&lt;br /&gt;
                        ggPM: function(e, c, r, s, i) {&lt;br /&gt;
                            (t[n][o].q = t[n][o].q || []).push([e, c, r, s, i])&lt;br /&gt;
                        }&lt;br /&gt;
                    }, t[n][o]&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    (window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
//Create SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {containerId: “player1”, nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser SDK API Methods &amp;amp; Properties ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method / Property !! Event # !! DTVR !! DAR !! DCR !! Description&lt;br /&gt;
|-&lt;br /&gt;
| [[loadMetadata (Browser)|loadMetadata]] || 15 || ✔ || ✔ || ✔ || Used when there is a preroll ad that needs to be associated with content metadata. The loadMetadata will first be called to populate the content metadata values and then the loadMetadata for ad metadata will be called. This allows sending a content ping with the ad info, even if the user bails out during the preroll ad.&lt;br /&gt;
|-&lt;br /&gt;
| [[play (Browser)|play]] || 5 || ✔ || ✘ || ✔ || Used when there is an ID3 fed product such as DTVR and the client does not want to send in all the CMS metadata that is sent in loadMetadata. This allows the client to send in at least the required “channel name” value associated to the ID3 feed. When the client passes in the channelName, they can change the CMS data stored by passing new values. If this event is not called then the “channel name” value populated will be the default value of “defaultChannelName”.&lt;br /&gt;
|-&lt;br /&gt;
| [[sendID3 (Browser)|sendID3]] || 55 || ✔ || ✘ || ✘ || Used to send the ID3 metadata.&lt;br /&gt;
|-&lt;br /&gt;
| [[setPlayheadPosition (Browser)|setPlayheadPosition]] || 49 || ✘ || ✘ || ✔ || Used to send the playhead position.&lt;br /&gt;
|-&lt;br /&gt;
| [[stop (Browser)|stop]] || 7 || ✘ || ✘ || ✔ || Used when switching between ad and content or content and ad.&lt;br /&gt;
|-&lt;br /&gt;
| [[end (Browser)|end]] || 57 || ✔ || ✘ || ✔ || This is triggered 1) at the end of the content stream, 2) if the user switches to another piece of content 3) when the browser is refreshed or closed&lt;br /&gt;
|-&lt;br /&gt;
| [[staticstart (Browser)|staticstart]] || 14 || ✘ || ✘ || ✔ || Used to send the metadata for the static page.&lt;br /&gt;
|-&lt;br /&gt;
| [[StaticEnd (Browser)|staticend]] || 56 || ✘ || ✘ || ✔ || In Single Page Application (SPA) it is imperative that staticend is called prior to the loading of new metadata. This allows the Browser SDK to properly credit the previous section/content being viewed before measuring the new one.&lt;br /&gt;
|-&lt;br /&gt;
| [[updateOTT (Browser)|updateOTT]] || - || ✘ || ✘ || ✔ || Used to notify Browser SDK that the remote OTT device (like Google ChromeCast, Roku, Amazon FireTV, etc.) is connected / disconnected (change of OTT status).&lt;br /&gt;
|-&lt;br /&gt;
| [[ onPaginate (Browser)|onPaginate]] || 30 || ✘ || ✘ || ✔ || Used to create a new instance of the SDK object&lt;br /&gt;
|-&lt;br /&gt;
| [[updateMetadata (Browser)|updateMetadata]] || 35 || ✔ || ✔ || ✔ || This event is used for updating metadata parameters for the content or ad that is being played.&lt;br /&gt;
|-&lt;br /&gt;
| [[setVolume_(Browser)|setVolume]] || 61 || ✔ || ✘ || ✔ || Used to pass in the player volume levels in %. Default value is -1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Retrieving ID3 Tags ==&lt;br /&gt;
The video player must have the ability to extract ID3 tags and supply them to the Browser SDK, based on the HLS standard.&lt;br /&gt;
*An ID3 tag spans two PES packets.&lt;br /&gt;
**In the first PES packet, look for www.nielsen.com, this is the start of the ID3 tag. Continue to parse the first PES packet until the undefined char &amp;quot;\ufffd&amp;quot; is found. This forms the first half of the ID3 tag&lt;br /&gt;
**In the second PES packet, identify the end pattern – a regEx of /(\/\d+){3}/ and look to remove the lowest index of either &amp;quot;\x00&amp;quot; and/or &amp;quot;\ufffd&amp;quot;. Now the second packet has been appended and the demarcation of the Nielsen-specific data has been defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Follow the procedure below, to extract Nielsen ID3 tags from an MPEG-2 transport stream (including HLS streams).&lt;br /&gt;
#Parse the Program Map Table (PMT) to find the PID of the metadata stream. Confirm the presence of the metadata descriptor described in section 2.3.3 of Apple’s “HTTP Live Streaming Metadata Spec.pdf”. Only private streams with metadata descriptor present should be considered as ID3-tag metadata streams.&lt;br /&gt;
#Parse the HLS/Transport stream for any '''PES header''' with the PID found in step 1.&lt;br /&gt;
#Follow standard MPEG-2 parsing procedures to locate the start of the payload of the PES packet.&lt;br /&gt;
#Copy the PES payload into a buffer.&lt;br /&gt;
#The ID3 tag spans 2 PES packets. Parse the stream for the next packet whose PID is set to the PID found in step 1. Typically the ID3 Tag is of 249 bytes. The steps below guide towards extraction of the ID3 tag&lt;br /&gt;
##In the first PES packet, look for &amp;quot;www.nielsen.com&amp;quot; , this is the start of the ID3 tag. Keep on parsing the first PES packet until the undefined char &amp;quot;\ufffd&amp;quot; is found. This forms the first half of the ID3 tag&lt;br /&gt;
##In the second PES packet, identify the end pattern, a regEx of /(\/\d+){3}/ and look to remove the lowest index of either “\x00” and/or “\ufffd”. Now the second packet has been appended and the demarcation of the Nielsen specific data has been defined. This segment can be simply substringed.&lt;br /&gt;
##Concatenate this substringed segment with the payload derived from the first packet get the ID3 payload.&lt;br /&gt;
#Check the length of the contents in the buffer to make sure that it is equal to the size of a Nielsen ID3 tag.&lt;br /&gt;
#Ensure that the ID3 byte array is converted into the string and escape it, so that the SDK can consume it.&lt;br /&gt;
Repeat steps 2 through 7 for all ID3 tags in the stream.&lt;br /&gt;
&lt;br /&gt;
'''References'''&lt;br /&gt;
*[http://www.iso.org/iso/catalogue_detail?csnumber=44169. ISO/IEC 13818-1:2007] Information technology – Generic coding of moving pictures and associated audio information: Systems&lt;br /&gt;
*https://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/HTTP_Live_Streaming_Metadata_Spec/&lt;br /&gt;
&lt;br /&gt;
=== Sample ID3 tags ===&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/X100zdCIGeIlgZnkYj6UvQ==/AAAB2Jz2_k74GXSzx4npHuI_&amp;lt;wbr /&amp;gt;JwJd3QSUpW30rDkGTcbHEzIMWleCzM-uvNOP9fzJcQMWQLJqzXMCAxParOb5sGijSV9dNM3QiBniJYGZ5GI-lL1fXTTN0IgZ4iWBmeRiPpS9AAAAAAAAAAAAAAAAAAAAAFJWFM5SVhTONNU=/00000/00000/00&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/R8WHe7pEBeqBhu8jTeXydg==/AAICoyitYqlxT7n6aZ0oMCGhe&amp;lt;wbr /&amp;gt;Fi4CXFp46AMUPZz1lMr_M9tr3_cjee1SHqxrOiVerMDLeyn9xzocZSKwi746Re8vNOtpNCAZjYABs_J0R25IHpvOc1HS8&amp;lt;wbr /&amp;gt;QHGgD5TgOJeS6gX100zdCIGeIlgZnkYj6UvVJWFNhSVhTiPE0=/00000/46016/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': ID3 tags are not applicable for International (Germany)&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser Opt-Out Implementation ==&lt;br /&gt;
The site in which video content is being measure via Nielsen methodology must provide the means for the user to opt-out of, or opt back into Nielsen Measurement.&lt;br /&gt;
&lt;br /&gt;
For Browser-based applications, opt-out setting is stored via Nielsen cookie. Therefore, it is only necessary that users be made aware of measurement opt-out by incorporating the template below in the user interface.&lt;br /&gt;
&lt;br /&gt;
=== Sample Opt Out Template ===&lt;br /&gt;
Our properties may feature Nielsen’s proprietary measurement software which will allow to contribute to market research, like Nielsen’s TV Ratings. To learn more about this information, see https://www.nielsen.com/digitalprivacy. Nielsen’s software may collect your choices with regards to it.&lt;br /&gt;
&lt;br /&gt;
== Nielsen Privacy Requirements ==&lt;br /&gt;
Privacy protections that Nielsen ensures to have with each App SDK integration are as follows.&lt;br /&gt;
*Disclosure of viewership data collection in EULA / Privacy Policy&lt;br /&gt;
*A link in the EULA/Privacy policy, or in another conspicuous location within the App, to a Nielsen-hosted web page outlining what Nielsen is collecting and how it is being used&lt;br /&gt;
*Method for users to opt-out of Nielsen measurement, any time while using the application&lt;br /&gt;
&lt;br /&gt;
=== Ratings Data Flow ===&lt;br /&gt;
Every view of creditable and watermarked content is measured by Nielsen.&lt;br /&gt;
[[File:RatingsDataFlow.png]]&lt;br /&gt;
&lt;br /&gt;
'''Information NOT Shared'''&lt;br /&gt;
* '''With Nielsen'''&lt;br /&gt;
** User's Identity&lt;br /&gt;
* '''With Data Provider'''&lt;br /&gt;
** Content information&lt;br /&gt;
** Whether user is viewing an ad or video content&lt;br /&gt;
** Player used to play the streaming (audio / video, etc.)&lt;br /&gt;
** Values being de-duped / aggregating for&lt;br /&gt;
&lt;br /&gt;
Nielsen collects only what it needs for audience measurement. Every view of creditable, watermarked content will be measured by Nielsen.&lt;br /&gt;
&lt;br /&gt;
=== Data Collected ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type of Information !! Parameter !! Transmitted to Nielsen? !! Sent to Provider?&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; | Nielsen ID3 Watermark&lt;br /&gt;
|-&lt;br /&gt;
| FinalDistributor Timestamp || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Program Content Timestamp || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Mobile Breakout Code || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Commercial Credit Code – Linear or Dynamic || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Time ShiftedViewing Code || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Segment Number || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Segment View Pattern || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;7&amp;quot; | Device/App Info&lt;br /&gt;
|-&lt;br /&gt;
| Device OSVersion || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| Device Model || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Cache Buster || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| SDKDisabled Flag || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| ServerCode || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Channel or URL || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; | Nielsen Identifiers&lt;br /&gt;
|-&lt;br /&gt;
| Client ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Campaign ID || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| Nielsen Unique Device ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Application ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| DeviceGroup (ex. Tablet, Smartphone, Desktop) || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| OS Group (ex. Android, iOS, Windows) || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| SDKVersion || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| IP Address for DMA, Country Code || Yes || Yes &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': Data is hashed, and encrypted using AES 128 before transmission to data provider.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Viewability_Data_Collected}}&lt;br /&gt;
&lt;br /&gt;
==== Example ping sent to provider ====&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://provider.com/cgi-bin/brandlift.php&amp;lt;/nowiki&amp;gt;?campaign_id=ff12725d724fac7934cf6003f096b4cd&amp;lt;wbr /&amp;gt;&amp;amp;placement_id=a4164b8fba9ee7c873a9c72c7091bb58&amp;lt;wbr /&amp;gt;&amp;amp;creative_id=25280139b61a947e127a52f56c8a2fdd&amp;lt;wbr /&amp;gt;&amp;amp;segment1=9000&amp;lt;wbr /&amp;gt;&amp;amp;segment2=41&amp;lt;wbr /&amp;gt;&amp;amp;segment3=iOS&amp;lt;wbr /&amp;gt;&amp;amp;OSVer=iOS6.1&amp;lt;wbr /&amp;gt;&amp;amp;c9=&amp;lt;wbr /&amp;gt;&amp;amp;devgrp=tablet&amp;lt;wbr /&amp;gt;&amp;amp;h=f5f243fe6d&amp;lt;wbr /&amp;gt;&amp;amp;rnd=1376971827360&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This ping passes the following parameters to the provider:&lt;br /&gt;
* Campaign ID – (campaign, placement, creative)&lt;br /&gt;
* Country Code&lt;br /&gt;
* DMA&lt;br /&gt;
* OS Group (ex. iOS, Android)&lt;br /&gt;
* DeviceOS Version&lt;br /&gt;
* Device Advertiser ID&lt;br /&gt;
* DeviceGroup (ex. Tablet, Smartphone, Desktop)&lt;br /&gt;
* Cache Buster&lt;br /&gt;
&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
=== Opt-Out Implementation ===&lt;br /&gt;
The site must provide the means for the user to opt-out of, or opt back into Nielsen Measurement.&lt;br /&gt;
&lt;br /&gt;
'''Sample Opt Out Template'''&lt;br /&gt;
&lt;br /&gt;
Our properties may feature Nielsen’s proprietary measurement software which will allow to contribute to market research, like Nielsen’s TV Ratings. To learn more about this information, please [http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html| click here]. Nielsen’s software may collect your choices with regards to it.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
See [[Digital Measurement Testing#Testing Browser Implementation|Digital Measurement Testing - Testing Browser Implementation]].&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_API_Reference&amp;diff=6787</id>
		<title>Browser SDK API Reference</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_API_Reference&amp;diff=6787"/>
		<updated>2024-12-09T19:52:05Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: /* Multiple SDK Instances */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Setting up Development Environment ==&lt;br /&gt;
=== Step 1: Configure Content Management System (CMS) ===&lt;br /&gt;
Configure CMS to send the required values (see table below). Any internal CMS_variable names can be used for passing the data.&lt;br /&gt;
&lt;br /&gt;
Ensure to capture these CMS_variable names in the SDK Configuration Form.&lt;br /&gt;
&lt;br /&gt;
For more information on setting variable names, see the SDK Configuration Form included within the SDK package.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Required Data !! Description !! Value&lt;br /&gt;
|-&lt;br /&gt;
| dataSrc || Used when both CMS metadata and ID3 data are present in the player. Setting this field tells the SDK whether to use the CMS metadata or the ID3 payload to derive the pings || cms&lt;br /&gt;
|-&lt;br /&gt;
| type || Type of asset: ad or content || preroll, midroll, postroll, or content&lt;br /&gt;
|-&lt;br /&gt;
| assetid || unique ID assigned to asset || custom &amp;lt;br&amp;gt;(no [[Special Characters]])&lt;br /&gt;
|-&lt;br /&gt;
| OCR Tag || OCR tag provided by Nielsen for implementation on the ad unit || Complete OCR URL&lt;br /&gt;
|-&lt;br /&gt;
| program || Name of program (25 character limit) || custom&lt;br /&gt;
|-&lt;br /&gt;
| title || Episode title (40 character limit) || custom&lt;br /&gt;
|-&lt;br /&gt;
| length || Length of content in seconds || Length in seconds, 0 for live stream&lt;br /&gt;
|-&lt;br /&gt;
| adloadtype || Type of ad load || &amp;quot;1&amp;quot; - Linear &amp;quot;2&amp;quot; - Dynamic(default)&lt;br /&gt;
|-&lt;br /&gt;
| hasAds || Identify if content includes Ads ||  &amp;quot;0&amp;quot; - no ads &amp;quot;1&amp;quot; - includes ads &amp;quot;2&amp;quot; - unknown(default)&lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode || Full episode flag	|| &amp;quot;y&amp;quot; - full episode &amp;quot;n&amp;quot; - non full episode&lt;br /&gt;
|-&lt;br /&gt;
| segA || Segment A (this is not available for video reporting as the episode title is reported) || custom value&lt;br /&gt;
|-&lt;br /&gt;
| segB || Custom segment B || custom value&lt;br /&gt;
|-&lt;br /&gt;
| segC || Custom segment C || custom value&lt;br /&gt;
|-&lt;br /&gt;
| crossId1 || Standard episode ID || custom value&lt;br /&gt;
|-&lt;br /&gt;
| crossId2 || Content originator (required only for distributors) || custom value&lt;br /&gt;
|-&lt;br /&gt;
| airdate || Original air date and time in Eastern Time. For non-US countries, it should be local time. || YYYYMMDD HH24:MI:SS&lt;br /&gt;
|-&lt;br /&gt;
| containerId || HTML DOM element of the Player container (for Viewability&amp;amp;Audibility feature only) || custom value &lt;br /&gt;
|-&lt;br /&gt;
|luid&lt;br /&gt;
|Living Unit ID - Experian Household ID&lt;br /&gt;
'''Note: This parameter is applicable only for CTV and First Party Livestream data'''&lt;br /&gt;
|&amp;quot;B0EOFEDgD&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Complete the Nielsen SDK Configuration Form ===&lt;br /&gt;
The SDK is designed to map the &amp;lt;code&amp;gt;CMS_variable names&amp;lt;/code&amp;gt;. To support the custom mapping, the developer is required to complete the SDK Configuration Form. The form will be provided during onboarding along with this guide.&lt;br /&gt;
&lt;br /&gt;
== Initialization ==&lt;br /&gt;
=== Obtain the Nielsen Application ID (apid) and Browser SDK URLs ===&lt;br /&gt;
The Nielsen &amp;lt;code&amp;gt;apid&amp;lt;/code&amp;gt; is required to enable SDK functionality. Technical Account Manager will provide an apid for each player configuration.  &lt;br /&gt;
Browser SDK can support URLs that use any of the protocols – HTTPS and HTTP.  &lt;br /&gt;
&lt;br /&gt;
=== Configure Browser SDK ===&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
&lt;br /&gt;
'''Add Static Queue Snippet'''&lt;br /&gt;
&lt;br /&gt;
*Add Static Queue Snippet&lt;br /&gt;
*Create SDK Instance&lt;br /&gt;
&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
'''Create SDK Instance'''&lt;br /&gt;
&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
'''Initialization API Call'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When creating an instance, pass the following three values:&lt;br /&gt;
&lt;br /&gt;
=== SDK Initialization – Global Parameters ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameters !! Description !! Value&lt;br /&gt;
|-&lt;br /&gt;
| apid || UniqueID assigned to player/site. || 	'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
| instanceName || Name of SDK instance || &amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug || Enables Nielsen console logging. Only required for testing || &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| containerId || HTML DOM element id of the player container. Only for Viewability &amp;amp; Audibility feature. || {containerId: &amp;quot;playerId1&amp;quot;}&lt;br /&gt;
|-&lt;br /&gt;
| hem_sha256 || SHA256-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| hem_sha1 || SHA1-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;XvBniTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| hem_md5 || MD5-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;JnIbdTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| uid2 || An identifier based on a user’s verifiable PII (e.g. hashed email). UID2.0 was initially created by The Trade Desk (TTD) and is now managed by Prebid. || &amp;quot;MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| uid2_token || Encrypted Unified ID 2.0 || &amp;quot;AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8Ql&lt;br /&gt;
DSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeK&lt;br /&gt;
QI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhC&lt;br /&gt;
xG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{example_bsdk_init}}&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Configuration'''&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
  var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;,&amp;quot;nlsnInstance&amp;quot;, {nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multiple SDK Instances ===&lt;br /&gt;
The Browser SDK allows instantiating multiple instances of the object, which can be used simultaneously without any problems, however they must be instantiated with their own unique instance names. There is no maximum number of instances that is enforced in the browser.&lt;br /&gt;
&lt;br /&gt;
The below examples will make use of the same AppId, however using different AppIds will work as well. The principles below follow the same initialization rules stated above for a single instance and simply require a unique instance name and variable name with which the returned instance is assigned.&lt;br /&gt;
&lt;br /&gt;
For more information around the possible parameters that can be passed as well as deeper descriptions for the API calls, please refer to the section on &amp;quot;[[SDK_Initialization_-_Global_Parameters | SDK Initialization - Global Parameters]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Example of 2 instances on the same page'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Add Static Queue Snippet&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    !function (e, n) {&lt;br /&gt;
      function t(e) {&lt;br /&gt;
        return &amp;quot;object&amp;quot; == typeof e ? JSON.parse(JSON.stringify(e)) : e&lt;br /&gt;
      }&lt;br /&gt;
      e[n] = e[n] ||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ: function (o, r, c) {&lt;br /&gt;
          var s = e.document,&lt;br /&gt;
            a = s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async = 1,&lt;br /&gt;
            a.src = (&amp;quot;http:&amp;quot; === e.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + o + &amp;quot;.js#name=&amp;quot; + r + &amp;quot;&amp;amp;ns=&amp;quot; + n;&lt;br /&gt;
          var i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a, i),&lt;br /&gt;
            e[n][r] = e[n][r] || {&lt;br /&gt;
              g: c || {},&lt;br /&gt;
              ggPM: function (o, c, s, a, i) { e[n][r].q = e[n][r].q || []; try { var l = t([o, c, s, a, i]); e[n][r].q.push(l) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } },&lt;br /&gt;
              trackEvent: function (o) { e[n][r].te = e[n][r].te || []; try { var c = t(o); e[n][r].te.push(c) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } }&lt;br /&gt;
            },&lt;br /&gt;
            e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    //Create SDK Instance(s)&lt;br /&gt;
    // Notice the unique instance name given to each instance below and the unique variable name for each instance&lt;br /&gt;
    var nSdkInstanceLive = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;instanceLive&amp;quot;, {&lt;br /&gt;
        nol_sdkDebug: 'debug',&lt;br /&gt;
        optout: 'false'&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    var nSdkInstanceVod = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;instanceVod&amp;quot;, {&lt;br /&gt;
        nol_sdkDebug: 'debug',&lt;br /&gt;
        optout: 'false'&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Example of 2 instances using a parent page and iFrame'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Parent Page (index.html)&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;ie=edge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;DCR Static/DCR Video&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    /* NLSQUEUE build v*/&lt;br /&gt;
    !function(e,n){&lt;br /&gt;
    function t(e){&lt;br /&gt;
      return&amp;quot;object&amp;quot;==typeof e?JSON.parse(JSON.stringify(e)):e&lt;br /&gt;
    }&lt;br /&gt;
    e[n]=e[n]||&lt;br /&gt;
    {&lt;br /&gt;
      nlsQ:function(o,r,c){&lt;br /&gt;
        var s=e.document,&lt;br /&gt;
        a=s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
        a.async=1,&lt;br /&gt;
        a.src=(&amp;quot;http:&amp;quot;===e.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+o+&amp;quot;.js#name=&amp;quot;+r+&amp;quot;&amp;amp;ns=&amp;quot;+n;&lt;br /&gt;
        var i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
        return i.parentNode.insertBefore(a,i),&lt;br /&gt;
        e[n][r]=e[n][r]||{g:c||{},&lt;br /&gt;
        ggPM:function(o,c,s,a,i){e[n][r].q=e[n][r].q||[];try{var l=t([o,c,s,a,i]);e[n][r].q.push(l)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}},&lt;br /&gt;
        trackEvent:function(o){e[n][r].te=e[n][r].te||[];try{var c=t(o);e[n][r].te.push(c)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}}},&lt;br /&gt;
        e[n][r]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // SDK Initialization&lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;staticPage&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: 'debug',&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Static Metadata &lt;br /&gt;
    var staticMetadata = {&lt;br /&gt;
      assetid: 'staticTestPage',&lt;br /&gt;
      type: 'static'&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    // Event 'staticstart' call&lt;br /&gt;
    nSdkInstance.ggPM(14, staticMetadata);&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;h1&amp;gt;DCR Static on Parent/DCR Video in iFrame&amp;lt;/h1&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Static measurement is current on parent page when window is in focus&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;iframe src=&amp;quot;./dcr-video.html&amp;quot; frameborder=&amp;quot;0&amp;quot; width=&amp;quot;650&amp;quot; height=&amp;quot;500&amp;quot; style=&amp;quot;background-color: rgb(42, 217, 248);&amp;quot; id=&amp;quot;video-iframe&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Nested iFrame Referenced on Parent Page (dcr-video.html)&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;ie=edge&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;iFrame Same Source&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
    /* NLSQUEUE build v*/&lt;br /&gt;
    !function(e,n){&lt;br /&gt;
      function t(e){&lt;br /&gt;
        return&amp;quot;object&amp;quot;==typeof e?JSON.parse(JSON.stringify(e)):e&lt;br /&gt;
      }&lt;br /&gt;
      e[n]=e[n]||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ:function(o,r,c){&lt;br /&gt;
          var s=e.document,&lt;br /&gt;
          a=s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async=1,&lt;br /&gt;
          a.src=(&amp;quot;http:&amp;quot;===e.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+o+&amp;quot;.js#name=&amp;quot;+r+&amp;quot;&amp;amp;ns=&amp;quot;+n;&lt;br /&gt;
          var i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a,i),&lt;br /&gt;
          e[n][r]=e[n][r]||{g:c||{},&lt;br /&gt;
          ggPM:function(o,c,s,a,i){e[n][r].q=e[n][r].q||[];try{var l=t([o,c,s,a,i]);e[n][r].q.push(l)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}},&lt;br /&gt;
          trackEvent:function(o){e[n][r].te=e[n][r].te||[];try{var c=t(o);e[n][r].te.push(c)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}}},&lt;br /&gt;
          e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // SDK Initialization&lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;videoPlayer&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: 'debug',&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    var contentMetadata = {&lt;br /&gt;
        type: &amp;quot;content&amp;quot;,&lt;br /&gt;
        length: &amp;quot;300&amp;quot;,&lt;br /&gt;
        title: &amp;quot;Skydiving Across Europe&amp;quot;,&lt;br /&gt;
        program: &amp;quot;latacg&amp;quot;,&lt;br /&gt;
        censuscategory: &amp;quot;Enlisted&amp;quot;,&lt;br /&gt;
        assetid: &amp;quot;204558915992&amp;quot;,&lt;br /&gt;
        section: &amp;quot;ProgramAsset8&amp;quot;,&lt;br /&gt;
        tv: &amp;quot;true&amp;quot;,&lt;br /&gt;
        adModel: &amp;quot;0&amp;quot;,&lt;br /&gt;
        dataSrc: &amp;quot;cms&amp;quot;,&lt;br /&gt;
        segA: &amp;quot;S07E04:NBC&amp;quot;,&lt;br /&gt;
        segB: &amp;quot;teams&amp;quot;,&lt;br /&gt;
        segC:&amp;quot;AtlanataFalcons&amp;quot;,&lt;br /&gt;
      }&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;I'm iframe SDK DCR Video measurement, DCR static measurement should continue when clicking &amp;quot;play&amp;quot; on video&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;main&amp;gt;&lt;br /&gt;
      &amp;lt;video&lt;br /&gt;
      controls&lt;br /&gt;
      src=&amp;quot;https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4&amp;quot;&lt;br /&gt;
      poster=&amp;quot;https://peach.blender.org/wp-content/uploads/title_anouncement.jpg?x11217&amp;quot;&lt;br /&gt;
      width=&amp;quot;620&amp;quot;&amp;gt;&lt;br /&gt;
      Sorry, your browser doesn't support embedded videos, but don't worry, you can&lt;br /&gt;
      &amp;lt;a href=&amp;quot;https://archive.org/details/BigBuckBunny_124&amp;quot;&amp;gt;download it&amp;lt;/a&amp;gt;&lt;br /&gt;
      and watch it with your favorite video player!&lt;br /&gt;
    &amp;lt;/video&amp;gt;&lt;br /&gt;
    &amp;lt;/main&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;../player.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SDK Initialization to measure the Viewability &amp;amp; Audibility ===&lt;br /&gt;
To support viewability metrics in the web page the integrator has to provide a tag value of the player view to let Nielsen SDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in the as string while initializing the Nielsen browser SDK.&lt;br /&gt;
&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{containerId: &amp;lt;playerElementID&amp;gt;, nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Initialization for Viewability'''&lt;br /&gt;
&lt;br /&gt;
Your configuration should include the Static Queue Snippet and an SDK Instance for your unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Add Static Queue Snippet&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    ! function(t, n) {&lt;br /&gt;
        t[n] = t[n] || {&lt;br /&gt;
            nlsQ: function(e, o, c, r, s, i) {&lt;br /&gt;
                return s = t.document,&lt;br /&gt;
                    r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
                    r.async = 1,&lt;br /&gt;
                    r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + o + &amp;quot;&amp;amp;ns=&amp;quot; + n,&lt;br /&gt;
                    i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
                    i.parentNode.insertBefore(r, i),&lt;br /&gt;
                    t[n][o] = t[n][o] || {&lt;br /&gt;
                        g: c || {},&lt;br /&gt;
                        ggPM: function(e, c, r, s, i) {&lt;br /&gt;
                            (t[n][o].q = t[n][o].q || []).push([e, c, r, s, i])&lt;br /&gt;
                        }&lt;br /&gt;
                    }, t[n][o]&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    (window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
//Create SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {containerId: “player1”, nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser SDK API Methods &amp;amp; Properties ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method / Property !! Event # !! DTVR !! DAR !! DCR !! Description&lt;br /&gt;
|-&lt;br /&gt;
| [[loadMetadata (Browser)|loadMetadata]] || 15 || ✔ || ✔ || ✔ || Used when there is a preroll ad that needs to be associated with content metadata. The loadMetadata will first be called to populate the content metadata values and then the loadMetadata for ad metadata will be called. This allows sending a content ping with the ad info, even if the user bails out during the preroll ad.&lt;br /&gt;
|-&lt;br /&gt;
| [[play (Browser)|play]] || 5 || ✔ || ✘ || ✔ || Used when there is an ID3 fed product such as DTVR and the client does not want to send in all the CMS metadata that is sent in loadMetadata. This allows the client to send in at least the required “channel name” value associated to the ID3 feed. When the client passes in the channelName, they can change the CMS data stored by passing new values. If this event is not called then the “channel name” value populated will be the default value of “defaultChannelName”.&lt;br /&gt;
|-&lt;br /&gt;
| [[sendID3 (Browser)|sendID3]] || 55 || ✔ || ✘ || ✘ || Used to send the ID3 metadata.&lt;br /&gt;
|-&lt;br /&gt;
| [[setPlayheadPosition (Browser)|setPlayheadPosition]] || 49 || ✘ || ✘ || ✔ || Used to send the playhead position.&lt;br /&gt;
|-&lt;br /&gt;
| [[stop (Browser)|stop]] || 7 || ✘ || ✘ || ✔ || Used when switching between ad and content or content and ad.&lt;br /&gt;
|-&lt;br /&gt;
| [[end (Browser)|end]] || 57 || ✔ || ✘ || ✔ || This is triggered 1) at the end of the content stream, 2) if the user switches to another piece of content 3) when the browser is refreshed or closed&lt;br /&gt;
|-&lt;br /&gt;
| [[staticstart (Browser)|staticstart]] || 14 || ✘ || ✘ || ✔ || Used to send the metadata for the static page.&lt;br /&gt;
|-&lt;br /&gt;
| [[StaticEnd (Browser)|staticend]] || 56 || ✘ || ✘ || ✔ || In Single Page Application (SPA) it is imperative that staticend is called prior to the loading of new metadata. This allows the Browser SDK to properly credit the previous section/content being viewed before measuring the new one.&lt;br /&gt;
|-&lt;br /&gt;
| [[updateOTT (Browser)|updateOTT]] || - || ✘ || ✘ || ✔ || Used to notify Browser SDK that the remote OTT device (like Google ChromeCast, Roku, Amazon FireTV, etc.) is connected / disconnected (change of OTT status).&lt;br /&gt;
|-&lt;br /&gt;
| [[ onPaginate (Browser)|onPaginate]] || 30 || ✘ || ✘ || ✔ || Used to create a new instance of the SDK object&lt;br /&gt;
|-&lt;br /&gt;
| [[updateMetadata (Browser)|updateMetadata]] || 35 || ✔ || ✔ || ✔ || This event is used for updating metadata parameters for the content or ad that is being played.&lt;br /&gt;
|-&lt;br /&gt;
| [[setVolume_(Browser)|setVolume]] || 61 || ✔ || ✘ || ✔ || Used to pass in the player volume levels in %. Default value is -1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Retrieving ID3 Tags ==&lt;br /&gt;
The video player must have the ability to extract ID3 tags and supply them to the Browser SDK, based on the HLS standard.&lt;br /&gt;
*An ID3 tag spans two PES packets.&lt;br /&gt;
**In the first PES packet, look for www.nielsen.com, this is the start of the ID3 tag. Continue to parse the first PES packet until the undefined char &amp;quot;\ufffd&amp;quot; is found. This forms the first half of the ID3 tag&lt;br /&gt;
**In the second PES packet, identify the end pattern – a regEx of /(\/\d+){3}/ and look to remove the lowest index of either &amp;quot;\x00&amp;quot; and/or &amp;quot;\ufffd&amp;quot;. Now the second packet has been appended and the demarcation of the Nielsen-specific data has been defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Follow the procedure below, to extract Nielsen ID3 tags from an MPEG-2 transport stream (including HLS streams).&lt;br /&gt;
#Parse the Program Map Table (PMT) to find the PID of the metadata stream. Confirm the presence of the metadata descriptor described in section 2.3.3 of Apple’s “HTTP Live Streaming Metadata Spec.pdf”. Only private streams with metadata descriptor present should be considered as ID3-tag metadata streams.&lt;br /&gt;
#Parse the HLS/Transport stream for any '''PES header''' with the PID found in step 1.&lt;br /&gt;
#Follow standard MPEG-2 parsing procedures to locate the start of the payload of the PES packet.&lt;br /&gt;
#Copy the PES payload into a buffer.&lt;br /&gt;
#The ID3 tag spans 2 PES packets. Parse the stream for the next packet whose PID is set to the PID found in step 1. Typically the ID3 Tag is of 249 bytes. The steps below guide towards extraction of the ID3 tag&lt;br /&gt;
##In the first PES packet, look for &amp;quot;www.nielsen.com&amp;quot; , this is the start of the ID3 tag. Keep on parsing the first PES packet until the undefined char &amp;quot;\ufffd&amp;quot; is found. This forms the first half of the ID3 tag&lt;br /&gt;
##In the second PES packet, identify the end pattern, a regEx of /(\/\d+){3}/ and look to remove the lowest index of either “\x00” and/or “\ufffd”. Now the second packet has been appended and the demarcation of the Nielsen specific data has been defined. This segment can be simply substringed.&lt;br /&gt;
##Concatenate this substringed segment with the payload derived from the first packet get the ID3 payload.&lt;br /&gt;
#Check the length of the contents in the buffer to make sure that it is equal to the size of a Nielsen ID3 tag.&lt;br /&gt;
#Ensure that the ID3 byte array is converted into the string and escape it, so that the SDK can consume it.&lt;br /&gt;
Repeat steps 2 through 7 for all ID3 tags in the stream.&lt;br /&gt;
&lt;br /&gt;
'''References'''&lt;br /&gt;
*[http://www.iso.org/iso/catalogue_detail?csnumber=44169. ISO/IEC 13818-1:2007] Information technology – Generic coding of moving pictures and associated audio information: Systems&lt;br /&gt;
*https://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/HTTP_Live_Streaming_Metadata_Spec/&lt;br /&gt;
&lt;br /&gt;
=== Sample ID3 tags ===&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/X100zdCIGeIlgZnkYj6UvQ==/AAAB2Jz2_k74GXSzx4npHuI_&amp;lt;wbr /&amp;gt;JwJd3QSUpW30rDkGTcbHEzIMWleCzM-uvNOP9fzJcQMWQLJqzXMCAxParOb5sGijSV9dNM3QiBniJYGZ5GI-lL1fXTTN0IgZ4iWBmeRiPpS9AAAAAAAAAAAAAAAAAAAAAFJWFM5SVhTONNU=/00000/00000/00&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/R8WHe7pEBeqBhu8jTeXydg==/AAICoyitYqlxT7n6aZ0oMCGhe&amp;lt;wbr /&amp;gt;Fi4CXFp46AMUPZz1lMr_M9tr3_cjee1SHqxrOiVerMDLeyn9xzocZSKwi746Re8vNOtpNCAZjYABs_J0R25IHpvOc1HS8&amp;lt;wbr /&amp;gt;QHGgD5TgOJeS6gX100zdCIGeIlgZnkYj6UvVJWFNhSVhTiPE0=/00000/46016/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': ID3 tags are not applicable for International (Germany)&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser Opt-Out Implementation ==&lt;br /&gt;
The site in which video content is being measure via Nielsen methodology must provide the means for the user to opt-out of, or opt back into Nielsen Measurement.&lt;br /&gt;
&lt;br /&gt;
For Browser-based applications, opt-out setting is stored via Nielsen cookie. Therefore, it is only necessary that users be made aware of measurement opt-out by incorporating the template below in the user interface.&lt;br /&gt;
&lt;br /&gt;
=== Sample Opt Out Template ===&lt;br /&gt;
Our properties may feature Nielsen’s proprietary measurement software which will allow to contribute to market research, like Nielsen’s TV Ratings. To learn more about this information, see https://www.nielsen.com/digitalprivacy. Nielsen’s software may collect your choices with regards to it.&lt;br /&gt;
&lt;br /&gt;
== Nielsen Privacy Requirements ==&lt;br /&gt;
Privacy protections that Nielsen ensures to have with each App SDK integration are as follows.&lt;br /&gt;
*Disclosure of viewership data collection in EULA / Privacy Policy&lt;br /&gt;
*A link in the EULA/Privacy policy, or in another conspicuous location within the App, to a Nielsen-hosted web page outlining what Nielsen is collecting and how it is being used&lt;br /&gt;
*Method for users to opt-out of Nielsen measurement, any time while using the application&lt;br /&gt;
&lt;br /&gt;
=== Ratings Data Flow ===&lt;br /&gt;
Every view of creditable and watermarked content is measured by Nielsen.&lt;br /&gt;
[[File:RatingsDataFlow.png]]&lt;br /&gt;
&lt;br /&gt;
'''Information NOT Shared'''&lt;br /&gt;
* '''With Nielsen'''&lt;br /&gt;
** User's Identity&lt;br /&gt;
* '''With Data Provider'''&lt;br /&gt;
** Content information&lt;br /&gt;
** Whether user is viewing an ad or video content&lt;br /&gt;
** Player used to play the streaming (audio / video, etc.)&lt;br /&gt;
** Values being de-duped / aggregating for&lt;br /&gt;
&lt;br /&gt;
Nielsen collects only what it needs for audience measurement. Every view of creditable, watermarked content will be measured by Nielsen.&lt;br /&gt;
&lt;br /&gt;
=== Data Collected ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type of Information !! Parameter !! Transmitted to Nielsen? !! Sent to Provider?&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; | Nielsen ID3 Watermark&lt;br /&gt;
|-&lt;br /&gt;
| FinalDistributor Timestamp || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Program Content Timestamp || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Mobile Breakout Code || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Commercial Credit Code – Linear or Dynamic || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Time ShiftedViewing Code || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Segment Number || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Segment View Pattern || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;7&amp;quot; | Device/App Info&lt;br /&gt;
|-&lt;br /&gt;
| Device OSVersion || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| Device Model || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Cache Buster || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| SDKDisabled Flag || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| ServerCode || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Channel or URL || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; | Nielsen Identifiers&lt;br /&gt;
|-&lt;br /&gt;
| Client ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Campaign ID || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| Nielsen Unique Device ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Application ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| DeviceGroup (ex. Tablet, Smartphone, Desktop) || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| OS Group (ex. Android, iOS, Windows) || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| SDKVersion || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| IP Address for DMA, Country Code || Yes || Yes &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': Data is hashed, and encrypted using AES 128 before transmission to data provider.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Viewability_Data_Collected}}&lt;br /&gt;
&lt;br /&gt;
==== Example ping sent to provider ====&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://provider.com/cgi-bin/brandlift.php&amp;lt;/nowiki&amp;gt;?campaign_id=ff12725d724fac7934cf6003f096b4cd&amp;lt;wbr /&amp;gt;&amp;amp;placement_id=a4164b8fba9ee7c873a9c72c7091bb58&amp;lt;wbr /&amp;gt;&amp;amp;creative_id=25280139b61a947e127a52f56c8a2fdd&amp;lt;wbr /&amp;gt;&amp;amp;segment1=9000&amp;lt;wbr /&amp;gt;&amp;amp;segment2=41&amp;lt;wbr /&amp;gt;&amp;amp;segment3=iOS&amp;lt;wbr /&amp;gt;&amp;amp;OSVer=iOS6.1&amp;lt;wbr /&amp;gt;&amp;amp;c9=&amp;lt;wbr /&amp;gt;&amp;amp;devgrp=tablet&amp;lt;wbr /&amp;gt;&amp;amp;h=f5f243fe6d&amp;lt;wbr /&amp;gt;&amp;amp;rnd=1376971827360&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This ping passes the following parameters to the provider:&lt;br /&gt;
* Campaign ID – (campaign, placement, creative)&lt;br /&gt;
* Country Code&lt;br /&gt;
* DMA&lt;br /&gt;
* OS Group (ex. iOS, Android)&lt;br /&gt;
* DeviceOS Version&lt;br /&gt;
* Device Advertiser ID&lt;br /&gt;
* DeviceGroup (ex. Tablet, Smartphone, Desktop)&lt;br /&gt;
* Cache Buster&lt;br /&gt;
&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
=== Opt-Out Implementation ===&lt;br /&gt;
The site must provide the means for the user to opt-out of, or opt back into Nielsen Measurement.&lt;br /&gt;
&lt;br /&gt;
'''Sample Opt Out Template'''&lt;br /&gt;
&lt;br /&gt;
Our properties may feature Nielsen’s proprietary measurement software which will allow to contribute to market research, like Nielsen’s TV Ratings. To learn more about this information, please [http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html| click here]. Nielsen’s software may collect your choices with regards to it.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
See [[Digital Measurement Testing#Testing Browser Implementation|Digital Measurement Testing - Testing Browser Implementation]].&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_API_Reference&amp;diff=6786</id>
		<title>Browser SDK API Reference</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_API_Reference&amp;diff=6786"/>
		<updated>2024-12-09T19:41:19Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: /* Multiple SDK Instances */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Setting up Development Environment ==&lt;br /&gt;
=== Step 1: Configure Content Management System (CMS) ===&lt;br /&gt;
Configure CMS to send the required values (see table below). Any internal CMS_variable names can be used for passing the data.&lt;br /&gt;
&lt;br /&gt;
Ensure to capture these CMS_variable names in the SDK Configuration Form.&lt;br /&gt;
&lt;br /&gt;
For more information on setting variable names, see the SDK Configuration Form included within the SDK package.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Required Data !! Description !! Value&lt;br /&gt;
|-&lt;br /&gt;
| dataSrc || Used when both CMS metadata and ID3 data are present in the player. Setting this field tells the SDK whether to use the CMS metadata or the ID3 payload to derive the pings || cms&lt;br /&gt;
|-&lt;br /&gt;
| type || Type of asset: ad or content || preroll, midroll, postroll, or content&lt;br /&gt;
|-&lt;br /&gt;
| assetid || unique ID assigned to asset || custom &amp;lt;br&amp;gt;(no [[Special Characters]])&lt;br /&gt;
|-&lt;br /&gt;
| OCR Tag || OCR tag provided by Nielsen for implementation on the ad unit || Complete OCR URL&lt;br /&gt;
|-&lt;br /&gt;
| program || Name of program (25 character limit) || custom&lt;br /&gt;
|-&lt;br /&gt;
| title || Episode title (40 character limit) || custom&lt;br /&gt;
|-&lt;br /&gt;
| length || Length of content in seconds || Length in seconds, 0 for live stream&lt;br /&gt;
|-&lt;br /&gt;
| adloadtype || Type of ad load || &amp;quot;1&amp;quot; - Linear &amp;quot;2&amp;quot; - Dynamic(default)&lt;br /&gt;
|-&lt;br /&gt;
| hasAds || Identify if content includes Ads ||  &amp;quot;0&amp;quot; - no ads &amp;quot;1&amp;quot; - includes ads &amp;quot;2&amp;quot; - unknown(default)&lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode || Full episode flag	|| &amp;quot;y&amp;quot; - full episode &amp;quot;n&amp;quot; - non full episode&lt;br /&gt;
|-&lt;br /&gt;
| segA || Segment A (this is not available for video reporting as the episode title is reported) || custom value&lt;br /&gt;
|-&lt;br /&gt;
| segB || Custom segment B || custom value&lt;br /&gt;
|-&lt;br /&gt;
| segC || Custom segment C || custom value&lt;br /&gt;
|-&lt;br /&gt;
| crossId1 || Standard episode ID || custom value&lt;br /&gt;
|-&lt;br /&gt;
| crossId2 || Content originator (required only for distributors) || custom value&lt;br /&gt;
|-&lt;br /&gt;
| airdate || Original air date and time in Eastern Time. For non-US countries, it should be local time. || YYYYMMDD HH24:MI:SS&lt;br /&gt;
|-&lt;br /&gt;
| containerId || HTML DOM element of the Player container (for Viewability&amp;amp;Audibility feature only) || custom value &lt;br /&gt;
|-&lt;br /&gt;
|luid&lt;br /&gt;
|Living Unit ID - Experian Household ID&lt;br /&gt;
'''Note: This parameter is applicable only for CTV and First Party Livestream data'''&lt;br /&gt;
|&amp;quot;B0EOFEDgD&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Complete the Nielsen SDK Configuration Form ===&lt;br /&gt;
The SDK is designed to map the &amp;lt;code&amp;gt;CMS_variable names&amp;lt;/code&amp;gt;. To support the custom mapping, the developer is required to complete the SDK Configuration Form. The form will be provided during onboarding along with this guide.&lt;br /&gt;
&lt;br /&gt;
== Initialization ==&lt;br /&gt;
=== Obtain the Nielsen Application ID (apid) and Browser SDK URLs ===&lt;br /&gt;
The Nielsen &amp;lt;code&amp;gt;apid&amp;lt;/code&amp;gt; is required to enable SDK functionality. Technical Account Manager will provide an apid for each player configuration.  &lt;br /&gt;
Browser SDK can support URLs that use any of the protocols – HTTPS and HTTP.  &lt;br /&gt;
&lt;br /&gt;
=== Configure Browser SDK ===&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
&lt;br /&gt;
'''Add Static Queue Snippet'''&lt;br /&gt;
&lt;br /&gt;
*Add Static Queue Snippet&lt;br /&gt;
*Create SDK Instance&lt;br /&gt;
&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
'''Create SDK Instance'''&lt;br /&gt;
&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
'''Initialization API Call'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When creating an instance, pass the following three values:&lt;br /&gt;
&lt;br /&gt;
=== SDK Initialization – Global Parameters ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameters !! Description !! Value&lt;br /&gt;
|-&lt;br /&gt;
| apid || UniqueID assigned to player/site. || 	'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
| instanceName || Name of SDK instance || &amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug || Enables Nielsen console logging. Only required for testing || &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| containerId || HTML DOM element id of the player container. Only for Viewability &amp;amp; Audibility feature. || {containerId: &amp;quot;playerId1&amp;quot;}&lt;br /&gt;
|-&lt;br /&gt;
| hem_sha256 || SHA256-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| hem_sha1 || SHA1-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;XvBniTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| hem_md5 || MD5-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;JnIbdTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| uid2 || An identifier based on a user’s verifiable PII (e.g. hashed email). UID2.0 was initially created by The Trade Desk (TTD) and is now managed by Prebid. || &amp;quot;MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| uid2_token || Encrypted Unified ID 2.0 || &amp;quot;AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8Ql&lt;br /&gt;
DSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeK&lt;br /&gt;
QI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhC&lt;br /&gt;
xG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{example_bsdk_init}}&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Configuration'''&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
  var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;,&amp;quot;nlsnInstance&amp;quot;, {nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multiple SDK Instances ===&lt;br /&gt;
The Browser SDK allows instantiating multiple instances of the object, which can be used simultaneously without any problems, however they must be instantiated with their own unique instance names. There is no maximum number of instances that is enforced in the browser.&lt;br /&gt;
&lt;br /&gt;
The below examples will make use of the same AppId, however using different AppIds will work as well. The principles below follow the same initialization rules stated above for a single instance and simply require a unique instance name and variable name with which the returned instance is assigned.&lt;br /&gt;
&lt;br /&gt;
For more information around the possible parameters that can be passed as well as deeper descriptions for the API calls, please refer to the section on &amp;quot;[[Browser_SDK_API_Reference#SDK_Initialization_-_Global_Parameters | SDK Initialization - Global Parameters]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Example of 2 instances on the same page'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Add Static Queue Snippet&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    !function (e, n) {&lt;br /&gt;
      function t(e) {&lt;br /&gt;
        return &amp;quot;object&amp;quot; == typeof e ? JSON.parse(JSON.stringify(e)) : e&lt;br /&gt;
      }&lt;br /&gt;
      e[n] = e[n] ||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ: function (o, r, c) {&lt;br /&gt;
          var s = e.document,&lt;br /&gt;
            a = s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async = 1,&lt;br /&gt;
            a.src = (&amp;quot;http:&amp;quot; === e.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + o + &amp;quot;.js#name=&amp;quot; + r + &amp;quot;&amp;amp;ns=&amp;quot; + n;&lt;br /&gt;
          var i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a, i),&lt;br /&gt;
            e[n][r] = e[n][r] || {&lt;br /&gt;
              g: c || {},&lt;br /&gt;
              ggPM: function (o, c, s, a, i) { e[n][r].q = e[n][r].q || []; try { var l = t([o, c, s, a, i]); e[n][r].q.push(l) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } },&lt;br /&gt;
              trackEvent: function (o) { e[n][r].te = e[n][r].te || []; try { var c = t(o); e[n][r].te.push(c) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } }&lt;br /&gt;
            },&lt;br /&gt;
            e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    //Create SDK Instance(s)&lt;br /&gt;
    // Notice the unique instance name given to each instance below and the unique variable name for each instance&lt;br /&gt;
    var nSdkInstanceLive = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;instanceLive&amp;quot;, {&lt;br /&gt;
        nol_sdkDebug: 'debug',&lt;br /&gt;
        optout: 'false'&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    var nSdkInstanceVod = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;instanceVod&amp;quot;, {&lt;br /&gt;
        nol_sdkDebug: 'debug',&lt;br /&gt;
        optout: 'false'&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Example of 2 instances using a parent page and iFrame'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Parent Page (index.html)&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;ie=edge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;DCR Static/DCR Video&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    /* NLSQUEUE build v*/&lt;br /&gt;
    !function(e,n){&lt;br /&gt;
    function t(e){&lt;br /&gt;
      return&amp;quot;object&amp;quot;==typeof e?JSON.parse(JSON.stringify(e)):e&lt;br /&gt;
    }&lt;br /&gt;
    e[n]=e[n]||&lt;br /&gt;
    {&lt;br /&gt;
      nlsQ:function(o,r,c){&lt;br /&gt;
        var s=e.document,&lt;br /&gt;
        a=s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
        a.async=1,&lt;br /&gt;
        a.src=(&amp;quot;http:&amp;quot;===e.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+o+&amp;quot;.js#name=&amp;quot;+r+&amp;quot;&amp;amp;ns=&amp;quot;+n;&lt;br /&gt;
        var i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
        return i.parentNode.insertBefore(a,i),&lt;br /&gt;
        e[n][r]=e[n][r]||{g:c||{},&lt;br /&gt;
        ggPM:function(o,c,s,a,i){e[n][r].q=e[n][r].q||[];try{var l=t([o,c,s,a,i]);e[n][r].q.push(l)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}},&lt;br /&gt;
        trackEvent:function(o){e[n][r].te=e[n][r].te||[];try{var c=t(o);e[n][r].te.push(c)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}}},&lt;br /&gt;
        e[n][r]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // SDK Initialization&lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;staticPage&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: 'debug',&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Static Metadata &lt;br /&gt;
    var staticMetadata = {&lt;br /&gt;
      assetid: 'staticTestPage',&lt;br /&gt;
      type: 'static'&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    // Event 'staticstart' call&lt;br /&gt;
    nSdkInstance.ggPM(14, staticMetadata);&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;h1&amp;gt;DCR Static on Parent/DCR Video in iFrame&amp;lt;/h1&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Static measurement is current on parent page when window is in focus&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;iframe src=&amp;quot;./dcr-video.html&amp;quot; frameborder=&amp;quot;0&amp;quot; width=&amp;quot;650&amp;quot; height=&amp;quot;500&amp;quot; style=&amp;quot;background-color: rgb(42, 217, 248);&amp;quot; id=&amp;quot;video-iframe&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Nested iFrame Referenced on Parent Page (dcr-video.html)&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;ie=edge&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;iFrame Same Source&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
    /* NLSQUEUE build v*/&lt;br /&gt;
    !function(e,n){&lt;br /&gt;
      function t(e){&lt;br /&gt;
        return&amp;quot;object&amp;quot;==typeof e?JSON.parse(JSON.stringify(e)):e&lt;br /&gt;
      }&lt;br /&gt;
      e[n]=e[n]||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ:function(o,r,c){&lt;br /&gt;
          var s=e.document,&lt;br /&gt;
          a=s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async=1,&lt;br /&gt;
          a.src=(&amp;quot;http:&amp;quot;===e.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+o+&amp;quot;.js#name=&amp;quot;+r+&amp;quot;&amp;amp;ns=&amp;quot;+n;&lt;br /&gt;
          var i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a,i),&lt;br /&gt;
          e[n][r]=e[n][r]||{g:c||{},&lt;br /&gt;
          ggPM:function(o,c,s,a,i){e[n][r].q=e[n][r].q||[];try{var l=t([o,c,s,a,i]);e[n][r].q.push(l)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}},&lt;br /&gt;
          trackEvent:function(o){e[n][r].te=e[n][r].te||[];try{var c=t(o);e[n][r].te.push(c)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}}},&lt;br /&gt;
          e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // SDK Initialization&lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;videoPlayer&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: 'debug',&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    var contentMetadata = {&lt;br /&gt;
        type: &amp;quot;content&amp;quot;,&lt;br /&gt;
        length: &amp;quot;300&amp;quot;,&lt;br /&gt;
        title: &amp;quot;Skydiving Across Europe&amp;quot;,&lt;br /&gt;
        program: &amp;quot;latacg&amp;quot;,&lt;br /&gt;
        censuscategory: &amp;quot;Enlisted&amp;quot;,&lt;br /&gt;
        assetid: &amp;quot;204558915992&amp;quot;,&lt;br /&gt;
        section: &amp;quot;ProgramAsset8&amp;quot;,&lt;br /&gt;
        tv: &amp;quot;true&amp;quot;,&lt;br /&gt;
        adModel: &amp;quot;0&amp;quot;,&lt;br /&gt;
        dataSrc: &amp;quot;cms&amp;quot;,&lt;br /&gt;
        segA: &amp;quot;S07E04:NBC&amp;quot;,&lt;br /&gt;
        segB: &amp;quot;teams&amp;quot;,&lt;br /&gt;
        segC:&amp;quot;AtlanataFalcons&amp;quot;,&lt;br /&gt;
      }&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;I'm iframe SDK DCR Video measurement, DCR static measurement should continue when clicking &amp;quot;play&amp;quot; on video&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;main&amp;gt;&lt;br /&gt;
      &amp;lt;video&lt;br /&gt;
      controls&lt;br /&gt;
      src=&amp;quot;https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4&amp;quot;&lt;br /&gt;
      poster=&amp;quot;https://peach.blender.org/wp-content/uploads/title_anouncement.jpg?x11217&amp;quot;&lt;br /&gt;
      width=&amp;quot;620&amp;quot;&amp;gt;&lt;br /&gt;
      Sorry, your browser doesn't support embedded videos, but don't worry, you can&lt;br /&gt;
      &amp;lt;a href=&amp;quot;https://archive.org/details/BigBuckBunny_124&amp;quot;&amp;gt;download it&amp;lt;/a&amp;gt;&lt;br /&gt;
      and watch it with your favorite video player!&lt;br /&gt;
    &amp;lt;/video&amp;gt;&lt;br /&gt;
    &amp;lt;/main&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;../player.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SDK Initialization to measure the Viewability &amp;amp; Audibility ===&lt;br /&gt;
To support viewability metrics in the web page the integrator has to provide a tag value of the player view to let Nielsen SDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in the as string while initializing the Nielsen browser SDK.&lt;br /&gt;
&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{containerId: &amp;lt;playerElementID&amp;gt;, nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Initialization for Viewability'''&lt;br /&gt;
&lt;br /&gt;
Your configuration should include the Static Queue Snippet and an SDK Instance for your unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Add Static Queue Snippet&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    ! function(t, n) {&lt;br /&gt;
        t[n] = t[n] || {&lt;br /&gt;
            nlsQ: function(e, o, c, r, s, i) {&lt;br /&gt;
                return s = t.document,&lt;br /&gt;
                    r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
                    r.async = 1,&lt;br /&gt;
                    r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + o + &amp;quot;&amp;amp;ns=&amp;quot; + n,&lt;br /&gt;
                    i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
                    i.parentNode.insertBefore(r, i),&lt;br /&gt;
                    t[n][o] = t[n][o] || {&lt;br /&gt;
                        g: c || {},&lt;br /&gt;
                        ggPM: function(e, c, r, s, i) {&lt;br /&gt;
                            (t[n][o].q = t[n][o].q || []).push([e, c, r, s, i])&lt;br /&gt;
                        }&lt;br /&gt;
                    }, t[n][o]&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    (window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
//Create SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {containerId: “player1”, nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser SDK API Methods &amp;amp; Properties ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method / Property !! Event # !! DTVR !! DAR !! DCR !! Description&lt;br /&gt;
|-&lt;br /&gt;
| [[loadMetadata (Browser)|loadMetadata]] || 15 || ✔ || ✔ || ✔ || Used when there is a preroll ad that needs to be associated with content metadata. The loadMetadata will first be called to populate the content metadata values and then the loadMetadata for ad metadata will be called. This allows sending a content ping with the ad info, even if the user bails out during the preroll ad.&lt;br /&gt;
|-&lt;br /&gt;
| [[play (Browser)|play]] || 5 || ✔ || ✘ || ✔ || Used when there is an ID3 fed product such as DTVR and the client does not want to send in all the CMS metadata that is sent in loadMetadata. This allows the client to send in at least the required “channel name” value associated to the ID3 feed. When the client passes in the channelName, they can change the CMS data stored by passing new values. If this event is not called then the “channel name” value populated will be the default value of “defaultChannelName”.&lt;br /&gt;
|-&lt;br /&gt;
| [[sendID3 (Browser)|sendID3]] || 55 || ✔ || ✘ || ✘ || Used to send the ID3 metadata.&lt;br /&gt;
|-&lt;br /&gt;
| [[setPlayheadPosition (Browser)|setPlayheadPosition]] || 49 || ✘ || ✘ || ✔ || Used to send the playhead position.&lt;br /&gt;
|-&lt;br /&gt;
| [[stop (Browser)|stop]] || 7 || ✘ || ✘ || ✔ || Used when switching between ad and content or content and ad.&lt;br /&gt;
|-&lt;br /&gt;
| [[end (Browser)|end]] || 57 || ✔ || ✘ || ✔ || This is triggered 1) at the end of the content stream, 2) if the user switches to another piece of content 3) when the browser is refreshed or closed&lt;br /&gt;
|-&lt;br /&gt;
| [[staticstart (Browser)|staticstart]] || 14 || ✘ || ✘ || ✔ || Used to send the metadata for the static page.&lt;br /&gt;
|-&lt;br /&gt;
| [[StaticEnd (Browser)|staticend]] || 56 || ✘ || ✘ || ✔ || In Single Page Application (SPA) it is imperative that staticend is called prior to the loading of new metadata. This allows the Browser SDK to properly credit the previous section/content being viewed before measuring the new one.&lt;br /&gt;
|-&lt;br /&gt;
| [[updateOTT (Browser)|updateOTT]] || - || ✘ || ✘ || ✔ || Used to notify Browser SDK that the remote OTT device (like Google ChromeCast, Roku, Amazon FireTV, etc.) is connected / disconnected (change of OTT status).&lt;br /&gt;
|-&lt;br /&gt;
| [[ onPaginate (Browser)|onPaginate]] || 30 || ✘ || ✘ || ✔ || Used to create a new instance of the SDK object&lt;br /&gt;
|-&lt;br /&gt;
| [[updateMetadata (Browser)|updateMetadata]] || 35 || ✔ || ✔ || ✔ || This event is used for updating metadata parameters for the content or ad that is being played.&lt;br /&gt;
|-&lt;br /&gt;
| [[setVolume_(Browser)|setVolume]] || 61 || ✔ || ✘ || ✔ || Used to pass in the player volume levels in %. Default value is -1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Retrieving ID3 Tags ==&lt;br /&gt;
The video player must have the ability to extract ID3 tags and supply them to the Browser SDK, based on the HLS standard.&lt;br /&gt;
*An ID3 tag spans two PES packets.&lt;br /&gt;
**In the first PES packet, look for www.nielsen.com, this is the start of the ID3 tag. Continue to parse the first PES packet until the undefined char &amp;quot;\ufffd&amp;quot; is found. This forms the first half of the ID3 tag&lt;br /&gt;
**In the second PES packet, identify the end pattern – a regEx of /(\/\d+){3}/ and look to remove the lowest index of either &amp;quot;\x00&amp;quot; and/or &amp;quot;\ufffd&amp;quot;. Now the second packet has been appended and the demarcation of the Nielsen-specific data has been defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Follow the procedure below, to extract Nielsen ID3 tags from an MPEG-2 transport stream (including HLS streams).&lt;br /&gt;
#Parse the Program Map Table (PMT) to find the PID of the metadata stream. Confirm the presence of the metadata descriptor described in section 2.3.3 of Apple’s “HTTP Live Streaming Metadata Spec.pdf”. Only private streams with metadata descriptor present should be considered as ID3-tag metadata streams.&lt;br /&gt;
#Parse the HLS/Transport stream for any '''PES header''' with the PID found in step 1.&lt;br /&gt;
#Follow standard MPEG-2 parsing procedures to locate the start of the payload of the PES packet.&lt;br /&gt;
#Copy the PES payload into a buffer.&lt;br /&gt;
#The ID3 tag spans 2 PES packets. Parse the stream for the next packet whose PID is set to the PID found in step 1. Typically the ID3 Tag is of 249 bytes. The steps below guide towards extraction of the ID3 tag&lt;br /&gt;
##In the first PES packet, look for &amp;quot;www.nielsen.com&amp;quot; , this is the start of the ID3 tag. Keep on parsing the first PES packet until the undefined char &amp;quot;\ufffd&amp;quot; is found. This forms the first half of the ID3 tag&lt;br /&gt;
##In the second PES packet, identify the end pattern, a regEx of /(\/\d+){3}/ and look to remove the lowest index of either “\x00” and/or “\ufffd”. Now the second packet has been appended and the demarcation of the Nielsen specific data has been defined. This segment can be simply substringed.&lt;br /&gt;
##Concatenate this substringed segment with the payload derived from the first packet get the ID3 payload.&lt;br /&gt;
#Check the length of the contents in the buffer to make sure that it is equal to the size of a Nielsen ID3 tag.&lt;br /&gt;
#Ensure that the ID3 byte array is converted into the string and escape it, so that the SDK can consume it.&lt;br /&gt;
Repeat steps 2 through 7 for all ID3 tags in the stream.&lt;br /&gt;
&lt;br /&gt;
'''References'''&lt;br /&gt;
*[http://www.iso.org/iso/catalogue_detail?csnumber=44169. ISO/IEC 13818-1:2007] Information technology – Generic coding of moving pictures and associated audio information: Systems&lt;br /&gt;
*https://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/HTTP_Live_Streaming_Metadata_Spec/&lt;br /&gt;
&lt;br /&gt;
=== Sample ID3 tags ===&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/X100zdCIGeIlgZnkYj6UvQ==/AAAB2Jz2_k74GXSzx4npHuI_&amp;lt;wbr /&amp;gt;JwJd3QSUpW30rDkGTcbHEzIMWleCzM-uvNOP9fzJcQMWQLJqzXMCAxParOb5sGijSV9dNM3QiBniJYGZ5GI-lL1fXTTN0IgZ4iWBmeRiPpS9AAAAAAAAAAAAAAAAAAAAAFJWFM5SVhTONNU=/00000/00000/00&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/R8WHe7pEBeqBhu8jTeXydg==/AAICoyitYqlxT7n6aZ0oMCGhe&amp;lt;wbr /&amp;gt;Fi4CXFp46AMUPZz1lMr_M9tr3_cjee1SHqxrOiVerMDLeyn9xzocZSKwi746Re8vNOtpNCAZjYABs_J0R25IHpvOc1HS8&amp;lt;wbr /&amp;gt;QHGgD5TgOJeS6gX100zdCIGeIlgZnkYj6UvVJWFNhSVhTiPE0=/00000/46016/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': ID3 tags are not applicable for International (Germany)&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser Opt-Out Implementation ==&lt;br /&gt;
The site in which video content is being measure via Nielsen methodology must provide the means for the user to opt-out of, or opt back into Nielsen Measurement.&lt;br /&gt;
&lt;br /&gt;
For Browser-based applications, opt-out setting is stored via Nielsen cookie. Therefore, it is only necessary that users be made aware of measurement opt-out by incorporating the template below in the user interface.&lt;br /&gt;
&lt;br /&gt;
=== Sample Opt Out Template ===&lt;br /&gt;
Our properties may feature Nielsen’s proprietary measurement software which will allow to contribute to market research, like Nielsen’s TV Ratings. To learn more about this information, see https://www.nielsen.com/digitalprivacy. Nielsen’s software may collect your choices with regards to it.&lt;br /&gt;
&lt;br /&gt;
== Nielsen Privacy Requirements ==&lt;br /&gt;
Privacy protections that Nielsen ensures to have with each App SDK integration are as follows.&lt;br /&gt;
*Disclosure of viewership data collection in EULA / Privacy Policy&lt;br /&gt;
*A link in the EULA/Privacy policy, or in another conspicuous location within the App, to a Nielsen-hosted web page outlining what Nielsen is collecting and how it is being used&lt;br /&gt;
*Method for users to opt-out of Nielsen measurement, any time while using the application&lt;br /&gt;
&lt;br /&gt;
=== Ratings Data Flow ===&lt;br /&gt;
Every view of creditable and watermarked content is measured by Nielsen.&lt;br /&gt;
[[File:RatingsDataFlow.png]]&lt;br /&gt;
&lt;br /&gt;
'''Information NOT Shared'''&lt;br /&gt;
* '''With Nielsen'''&lt;br /&gt;
** User's Identity&lt;br /&gt;
* '''With Data Provider'''&lt;br /&gt;
** Content information&lt;br /&gt;
** Whether user is viewing an ad or video content&lt;br /&gt;
** Player used to play the streaming (audio / video, etc.)&lt;br /&gt;
** Values being de-duped / aggregating for&lt;br /&gt;
&lt;br /&gt;
Nielsen collects only what it needs for audience measurement. Every view of creditable, watermarked content will be measured by Nielsen.&lt;br /&gt;
&lt;br /&gt;
=== Data Collected ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type of Information !! Parameter !! Transmitted to Nielsen? !! Sent to Provider?&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; | Nielsen ID3 Watermark&lt;br /&gt;
|-&lt;br /&gt;
| FinalDistributor Timestamp || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Program Content Timestamp || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Mobile Breakout Code || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Commercial Credit Code – Linear or Dynamic || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Time ShiftedViewing Code || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Segment Number || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Segment View Pattern || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;7&amp;quot; | Device/App Info&lt;br /&gt;
|-&lt;br /&gt;
| Device OSVersion || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| Device Model || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Cache Buster || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| SDKDisabled Flag || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| ServerCode || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Channel or URL || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; | Nielsen Identifiers&lt;br /&gt;
|-&lt;br /&gt;
| Client ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Campaign ID || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| Nielsen Unique Device ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Application ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| DeviceGroup (ex. Tablet, Smartphone, Desktop) || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| OS Group (ex. Android, iOS, Windows) || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| SDKVersion || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| IP Address for DMA, Country Code || Yes || Yes &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': Data is hashed, and encrypted using AES 128 before transmission to data provider.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Viewability_Data_Collected}}&lt;br /&gt;
&lt;br /&gt;
==== Example ping sent to provider ====&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://provider.com/cgi-bin/brandlift.php&amp;lt;/nowiki&amp;gt;?campaign_id=ff12725d724fac7934cf6003f096b4cd&amp;lt;wbr /&amp;gt;&amp;amp;placement_id=a4164b8fba9ee7c873a9c72c7091bb58&amp;lt;wbr /&amp;gt;&amp;amp;creative_id=25280139b61a947e127a52f56c8a2fdd&amp;lt;wbr /&amp;gt;&amp;amp;segment1=9000&amp;lt;wbr /&amp;gt;&amp;amp;segment2=41&amp;lt;wbr /&amp;gt;&amp;amp;segment3=iOS&amp;lt;wbr /&amp;gt;&amp;amp;OSVer=iOS6.1&amp;lt;wbr /&amp;gt;&amp;amp;c9=&amp;lt;wbr /&amp;gt;&amp;amp;devgrp=tablet&amp;lt;wbr /&amp;gt;&amp;amp;h=f5f243fe6d&amp;lt;wbr /&amp;gt;&amp;amp;rnd=1376971827360&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This ping passes the following parameters to the provider:&lt;br /&gt;
* Campaign ID – (campaign, placement, creative)&lt;br /&gt;
* Country Code&lt;br /&gt;
* DMA&lt;br /&gt;
* OS Group (ex. iOS, Android)&lt;br /&gt;
* DeviceOS Version&lt;br /&gt;
* Device Advertiser ID&lt;br /&gt;
* DeviceGroup (ex. Tablet, Smartphone, Desktop)&lt;br /&gt;
* Cache Buster&lt;br /&gt;
&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
=== Opt-Out Implementation ===&lt;br /&gt;
The site must provide the means for the user to opt-out of, or opt back into Nielsen Measurement.&lt;br /&gt;
&lt;br /&gt;
'''Sample Opt Out Template'''&lt;br /&gt;
&lt;br /&gt;
Our properties may feature Nielsen’s proprietary measurement software which will allow to contribute to market research, like Nielsen’s TV Ratings. To learn more about this information, please [http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html| click here]. Nielsen’s software may collect your choices with regards to it.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
See [[Digital Measurement Testing#Testing Browser Implementation|Digital Measurement Testing - Testing Browser Implementation]].&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_API_Reference&amp;diff=6785</id>
		<title>Browser SDK API Reference</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_API_Reference&amp;diff=6785"/>
		<updated>2024-12-09T19:40:20Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: /* Multiple SDK Instances */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Setting up Development Environment ==&lt;br /&gt;
=== Step 1: Configure Content Management System (CMS) ===&lt;br /&gt;
Configure CMS to send the required values (see table below). Any internal CMS_variable names can be used for passing the data.&lt;br /&gt;
&lt;br /&gt;
Ensure to capture these CMS_variable names in the SDK Configuration Form.&lt;br /&gt;
&lt;br /&gt;
For more information on setting variable names, see the SDK Configuration Form included within the SDK package.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Required Data !! Description !! Value&lt;br /&gt;
|-&lt;br /&gt;
| dataSrc || Used when both CMS metadata and ID3 data are present in the player. Setting this field tells the SDK whether to use the CMS metadata or the ID3 payload to derive the pings || cms&lt;br /&gt;
|-&lt;br /&gt;
| type || Type of asset: ad or content || preroll, midroll, postroll, or content&lt;br /&gt;
|-&lt;br /&gt;
| assetid || unique ID assigned to asset || custom &amp;lt;br&amp;gt;(no [[Special Characters]])&lt;br /&gt;
|-&lt;br /&gt;
| OCR Tag || OCR tag provided by Nielsen for implementation on the ad unit || Complete OCR URL&lt;br /&gt;
|-&lt;br /&gt;
| program || Name of program (25 character limit) || custom&lt;br /&gt;
|-&lt;br /&gt;
| title || Episode title (40 character limit) || custom&lt;br /&gt;
|-&lt;br /&gt;
| length || Length of content in seconds || Length in seconds, 0 for live stream&lt;br /&gt;
|-&lt;br /&gt;
| adloadtype || Type of ad load || &amp;quot;1&amp;quot; - Linear &amp;quot;2&amp;quot; - Dynamic(default)&lt;br /&gt;
|-&lt;br /&gt;
| hasAds || Identify if content includes Ads ||  &amp;quot;0&amp;quot; - no ads &amp;quot;1&amp;quot; - includes ads &amp;quot;2&amp;quot; - unknown(default)&lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode || Full episode flag	|| &amp;quot;y&amp;quot; - full episode &amp;quot;n&amp;quot; - non full episode&lt;br /&gt;
|-&lt;br /&gt;
| segA || Segment A (this is not available for video reporting as the episode title is reported) || custom value&lt;br /&gt;
|-&lt;br /&gt;
| segB || Custom segment B || custom value&lt;br /&gt;
|-&lt;br /&gt;
| segC || Custom segment C || custom value&lt;br /&gt;
|-&lt;br /&gt;
| crossId1 || Standard episode ID || custom value&lt;br /&gt;
|-&lt;br /&gt;
| crossId2 || Content originator (required only for distributors) || custom value&lt;br /&gt;
|-&lt;br /&gt;
| airdate || Original air date and time in Eastern Time. For non-US countries, it should be local time. || YYYYMMDD HH24:MI:SS&lt;br /&gt;
|-&lt;br /&gt;
| containerId || HTML DOM element of the Player container (for Viewability&amp;amp;Audibility feature only) || custom value &lt;br /&gt;
|-&lt;br /&gt;
|luid&lt;br /&gt;
|Living Unit ID - Experian Household ID&lt;br /&gt;
'''Note: This parameter is applicable only for CTV and First Party Livestream data'''&lt;br /&gt;
|&amp;quot;B0EOFEDgD&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Complete the Nielsen SDK Configuration Form ===&lt;br /&gt;
The SDK is designed to map the &amp;lt;code&amp;gt;CMS_variable names&amp;lt;/code&amp;gt;. To support the custom mapping, the developer is required to complete the SDK Configuration Form. The form will be provided during onboarding along with this guide.&lt;br /&gt;
&lt;br /&gt;
== Initialization ==&lt;br /&gt;
=== Obtain the Nielsen Application ID (apid) and Browser SDK URLs ===&lt;br /&gt;
The Nielsen &amp;lt;code&amp;gt;apid&amp;lt;/code&amp;gt; is required to enable SDK functionality. Technical Account Manager will provide an apid for each player configuration.  &lt;br /&gt;
Browser SDK can support URLs that use any of the protocols – HTTPS and HTTP.  &lt;br /&gt;
&lt;br /&gt;
=== Configure Browser SDK ===&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
&lt;br /&gt;
'''Add Static Queue Snippet'''&lt;br /&gt;
&lt;br /&gt;
*Add Static Queue Snippet&lt;br /&gt;
*Create SDK Instance&lt;br /&gt;
&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
'''Create SDK Instance'''&lt;br /&gt;
&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
'''Initialization API Call'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When creating an instance, pass the following three values:&lt;br /&gt;
&lt;br /&gt;
=== SDK Initialization – Global Parameters ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameters !! Description !! Value&lt;br /&gt;
|-&lt;br /&gt;
| apid || UniqueID assigned to player/site. || 	'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
| instanceName || Name of SDK instance || &amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug || Enables Nielsen console logging. Only required for testing || &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| containerId || HTML DOM element id of the player container. Only for Viewability &amp;amp; Audibility feature. || {containerId: &amp;quot;playerId1&amp;quot;}&lt;br /&gt;
|-&lt;br /&gt;
| hem_sha256 || SHA256-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| hem_sha1 || SHA1-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;XvBniTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| hem_md5 || MD5-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;JnIbdTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| uid2 || An identifier based on a user’s verifiable PII (e.g. hashed email). UID2.0 was initially created by The Trade Desk (TTD) and is now managed by Prebid. || &amp;quot;MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| uid2_token || Encrypted Unified ID 2.0 || &amp;quot;AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8Ql&lt;br /&gt;
DSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeK&lt;br /&gt;
QI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhC&lt;br /&gt;
xG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{example_bsdk_init}}&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Configuration'''&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
  var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;,&amp;quot;nlsnInstance&amp;quot;, {nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multiple SDK Instances ===&lt;br /&gt;
The Browser SDK allows instantiating multiple instances of the object, which can be used simultaneously without any problems, however they must be instantiated with their own unique instance names. There is no maximum number of instances that is enforced in the browser.&lt;br /&gt;
&lt;br /&gt;
The below examples will make use of the same AppId, however using different AppIds will work as well. The principles below follow the same initialization rules stated above for a single instance and simply require a unique instance name and variable name with which the returned instance is assigned.&lt;br /&gt;
&lt;br /&gt;
For more information around the possible parameters that can be passed as well as deeper descriptions for the API calls, please refer to the section on &amp;quot;[[Browser_SDK_API_Reference#SDK Initialization - Global Parameters | SDK Initialization - Global Parameters]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Example of 2 instances on the same page'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Add Static Queue Snippet&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    !function (e, n) {&lt;br /&gt;
      function t(e) {&lt;br /&gt;
        return &amp;quot;object&amp;quot; == typeof e ? JSON.parse(JSON.stringify(e)) : e&lt;br /&gt;
      }&lt;br /&gt;
      e[n] = e[n] ||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ: function (o, r, c) {&lt;br /&gt;
          var s = e.document,&lt;br /&gt;
            a = s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async = 1,&lt;br /&gt;
            a.src = (&amp;quot;http:&amp;quot; === e.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + o + &amp;quot;.js#name=&amp;quot; + r + &amp;quot;&amp;amp;ns=&amp;quot; + n;&lt;br /&gt;
          var i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a, i),&lt;br /&gt;
            e[n][r] = e[n][r] || {&lt;br /&gt;
              g: c || {},&lt;br /&gt;
              ggPM: function (o, c, s, a, i) { e[n][r].q = e[n][r].q || []; try { var l = t([o, c, s, a, i]); e[n][r].q.push(l) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } },&lt;br /&gt;
              trackEvent: function (o) { e[n][r].te = e[n][r].te || []; try { var c = t(o); e[n][r].te.push(c) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } }&lt;br /&gt;
            },&lt;br /&gt;
            e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    //Create SDK Instance(s)&lt;br /&gt;
    // Notice the unique instance name given to each instance below and the unique variable name for each instance&lt;br /&gt;
    var nSdkInstanceLive = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;instanceLive&amp;quot;, {&lt;br /&gt;
        nol_sdkDebug: 'debug',&lt;br /&gt;
        optout: 'false'&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    var nSdkInstanceVod = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;instanceVod&amp;quot;, {&lt;br /&gt;
        nol_sdkDebug: 'debug',&lt;br /&gt;
        optout: 'false'&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Example of 2 instances using a parent page and iFrame'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Parent Page (index.html)&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;ie=edge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;DCR Static/DCR Video&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    /* NLSQUEUE build v*/&lt;br /&gt;
    !function(e,n){&lt;br /&gt;
    function t(e){&lt;br /&gt;
      return&amp;quot;object&amp;quot;==typeof e?JSON.parse(JSON.stringify(e)):e&lt;br /&gt;
    }&lt;br /&gt;
    e[n]=e[n]||&lt;br /&gt;
    {&lt;br /&gt;
      nlsQ:function(o,r,c){&lt;br /&gt;
        var s=e.document,&lt;br /&gt;
        a=s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
        a.async=1,&lt;br /&gt;
        a.src=(&amp;quot;http:&amp;quot;===e.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+o+&amp;quot;.js#name=&amp;quot;+r+&amp;quot;&amp;amp;ns=&amp;quot;+n;&lt;br /&gt;
        var i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
        return i.parentNode.insertBefore(a,i),&lt;br /&gt;
        e[n][r]=e[n][r]||{g:c||{},&lt;br /&gt;
        ggPM:function(o,c,s,a,i){e[n][r].q=e[n][r].q||[];try{var l=t([o,c,s,a,i]);e[n][r].q.push(l)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}},&lt;br /&gt;
        trackEvent:function(o){e[n][r].te=e[n][r].te||[];try{var c=t(o);e[n][r].te.push(c)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}}},&lt;br /&gt;
        e[n][r]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // SDK Initialization&lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;staticPage&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: 'debug',&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Static Metadata &lt;br /&gt;
    var staticMetadata = {&lt;br /&gt;
      assetid: 'staticTestPage',&lt;br /&gt;
      type: 'static'&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    // Event 'staticstart' call&lt;br /&gt;
    nSdkInstance.ggPM(14, staticMetadata);&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;h1&amp;gt;DCR Static on Parent/DCR Video in iFrame&amp;lt;/h1&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Static measurement is current on parent page when window is in focus&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;iframe src=&amp;quot;./dcr-video.html&amp;quot; frameborder=&amp;quot;0&amp;quot; width=&amp;quot;650&amp;quot; height=&amp;quot;500&amp;quot; style=&amp;quot;background-color: rgb(42, 217, 248);&amp;quot; id=&amp;quot;video-iframe&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Nested iFrame Referenced on Parent Page (dcr-video.html)&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;ie=edge&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;iFrame Same Source&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
    /* NLSQUEUE build v*/&lt;br /&gt;
    !function(e,n){&lt;br /&gt;
      function t(e){&lt;br /&gt;
        return&amp;quot;object&amp;quot;==typeof e?JSON.parse(JSON.stringify(e)):e&lt;br /&gt;
      }&lt;br /&gt;
      e[n]=e[n]||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ:function(o,r,c){&lt;br /&gt;
          var s=e.document,&lt;br /&gt;
          a=s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async=1,&lt;br /&gt;
          a.src=(&amp;quot;http:&amp;quot;===e.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+o+&amp;quot;.js#name=&amp;quot;+r+&amp;quot;&amp;amp;ns=&amp;quot;+n;&lt;br /&gt;
          var i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a,i),&lt;br /&gt;
          e[n][r]=e[n][r]||{g:c||{},&lt;br /&gt;
          ggPM:function(o,c,s,a,i){e[n][r].q=e[n][r].q||[];try{var l=t([o,c,s,a,i]);e[n][r].q.push(l)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}},&lt;br /&gt;
          trackEvent:function(o){e[n][r].te=e[n][r].te||[];try{var c=t(o);e[n][r].te.push(c)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}}},&lt;br /&gt;
          e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // SDK Initialization&lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;videoPlayer&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: 'debug',&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    var contentMetadata = {&lt;br /&gt;
        type: &amp;quot;content&amp;quot;,&lt;br /&gt;
        length: &amp;quot;300&amp;quot;,&lt;br /&gt;
        title: &amp;quot;Skydiving Across Europe&amp;quot;,&lt;br /&gt;
        program: &amp;quot;latacg&amp;quot;,&lt;br /&gt;
        censuscategory: &amp;quot;Enlisted&amp;quot;,&lt;br /&gt;
        assetid: &amp;quot;204558915992&amp;quot;,&lt;br /&gt;
        section: &amp;quot;ProgramAsset8&amp;quot;,&lt;br /&gt;
        tv: &amp;quot;true&amp;quot;,&lt;br /&gt;
        adModel: &amp;quot;0&amp;quot;,&lt;br /&gt;
        dataSrc: &amp;quot;cms&amp;quot;,&lt;br /&gt;
        segA: &amp;quot;S07E04:NBC&amp;quot;,&lt;br /&gt;
        segB: &amp;quot;teams&amp;quot;,&lt;br /&gt;
        segC:&amp;quot;AtlanataFalcons&amp;quot;,&lt;br /&gt;
      }&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;I'm iframe SDK DCR Video measurement, DCR static measurement should continue when clicking &amp;quot;play&amp;quot; on video&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;main&amp;gt;&lt;br /&gt;
      &amp;lt;video&lt;br /&gt;
      controls&lt;br /&gt;
      src=&amp;quot;https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4&amp;quot;&lt;br /&gt;
      poster=&amp;quot;https://peach.blender.org/wp-content/uploads/title_anouncement.jpg?x11217&amp;quot;&lt;br /&gt;
      width=&amp;quot;620&amp;quot;&amp;gt;&lt;br /&gt;
      Sorry, your browser doesn't support embedded videos, but don't worry, you can&lt;br /&gt;
      &amp;lt;a href=&amp;quot;https://archive.org/details/BigBuckBunny_124&amp;quot;&amp;gt;download it&amp;lt;/a&amp;gt;&lt;br /&gt;
      and watch it with your favorite video player!&lt;br /&gt;
    &amp;lt;/video&amp;gt;&lt;br /&gt;
    &amp;lt;/main&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;../player.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SDK Initialization to measure the Viewability &amp;amp; Audibility ===&lt;br /&gt;
To support viewability metrics in the web page the integrator has to provide a tag value of the player view to let Nielsen SDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in the as string while initializing the Nielsen browser SDK.&lt;br /&gt;
&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{containerId: &amp;lt;playerElementID&amp;gt;, nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Initialization for Viewability'''&lt;br /&gt;
&lt;br /&gt;
Your configuration should include the Static Queue Snippet and an SDK Instance for your unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Add Static Queue Snippet&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    ! function(t, n) {&lt;br /&gt;
        t[n] = t[n] || {&lt;br /&gt;
            nlsQ: function(e, o, c, r, s, i) {&lt;br /&gt;
                return s = t.document,&lt;br /&gt;
                    r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
                    r.async = 1,&lt;br /&gt;
                    r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + o + &amp;quot;&amp;amp;ns=&amp;quot; + n,&lt;br /&gt;
                    i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
                    i.parentNode.insertBefore(r, i),&lt;br /&gt;
                    t[n][o] = t[n][o] || {&lt;br /&gt;
                        g: c || {},&lt;br /&gt;
                        ggPM: function(e, c, r, s, i) {&lt;br /&gt;
                            (t[n][o].q = t[n][o].q || []).push([e, c, r, s, i])&lt;br /&gt;
                        }&lt;br /&gt;
                    }, t[n][o]&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    (window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
//Create SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {containerId: “player1”, nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser SDK API Methods &amp;amp; Properties ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method / Property !! Event # !! DTVR !! DAR !! DCR !! Description&lt;br /&gt;
|-&lt;br /&gt;
| [[loadMetadata (Browser)|loadMetadata]] || 15 || ✔ || ✔ || ✔ || Used when there is a preroll ad that needs to be associated with content metadata. The loadMetadata will first be called to populate the content metadata values and then the loadMetadata for ad metadata will be called. This allows sending a content ping with the ad info, even if the user bails out during the preroll ad.&lt;br /&gt;
|-&lt;br /&gt;
| [[play (Browser)|play]] || 5 || ✔ || ✘ || ✔ || Used when there is an ID3 fed product such as DTVR and the client does not want to send in all the CMS metadata that is sent in loadMetadata. This allows the client to send in at least the required “channel name” value associated to the ID3 feed. When the client passes in the channelName, they can change the CMS data stored by passing new values. If this event is not called then the “channel name” value populated will be the default value of “defaultChannelName”.&lt;br /&gt;
|-&lt;br /&gt;
| [[sendID3 (Browser)|sendID3]] || 55 || ✔ || ✘ || ✘ || Used to send the ID3 metadata.&lt;br /&gt;
|-&lt;br /&gt;
| [[setPlayheadPosition (Browser)|setPlayheadPosition]] || 49 || ✘ || ✘ || ✔ || Used to send the playhead position.&lt;br /&gt;
|-&lt;br /&gt;
| [[stop (Browser)|stop]] || 7 || ✘ || ✘ || ✔ || Used when switching between ad and content or content and ad.&lt;br /&gt;
|-&lt;br /&gt;
| [[end (Browser)|end]] || 57 || ✔ || ✘ || ✔ || This is triggered 1) at the end of the content stream, 2) if the user switches to another piece of content 3) when the browser is refreshed or closed&lt;br /&gt;
|-&lt;br /&gt;
| [[staticstart (Browser)|staticstart]] || 14 || ✘ || ✘ || ✔ || Used to send the metadata for the static page.&lt;br /&gt;
|-&lt;br /&gt;
| [[StaticEnd (Browser)|staticend]] || 56 || ✘ || ✘ || ✔ || In Single Page Application (SPA) it is imperative that staticend is called prior to the loading of new metadata. This allows the Browser SDK to properly credit the previous section/content being viewed before measuring the new one.&lt;br /&gt;
|-&lt;br /&gt;
| [[updateOTT (Browser)|updateOTT]] || - || ✘ || ✘ || ✔ || Used to notify Browser SDK that the remote OTT device (like Google ChromeCast, Roku, Amazon FireTV, etc.) is connected / disconnected (change of OTT status).&lt;br /&gt;
|-&lt;br /&gt;
| [[ onPaginate (Browser)|onPaginate]] || 30 || ✘ || ✘ || ✔ || Used to create a new instance of the SDK object&lt;br /&gt;
|-&lt;br /&gt;
| [[updateMetadata (Browser)|updateMetadata]] || 35 || ✔ || ✔ || ✔ || This event is used for updating metadata parameters for the content or ad that is being played.&lt;br /&gt;
|-&lt;br /&gt;
| [[setVolume_(Browser)|setVolume]] || 61 || ✔ || ✘ || ✔ || Used to pass in the player volume levels in %. Default value is -1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Retrieving ID3 Tags ==&lt;br /&gt;
The video player must have the ability to extract ID3 tags and supply them to the Browser SDK, based on the HLS standard.&lt;br /&gt;
*An ID3 tag spans two PES packets.&lt;br /&gt;
**In the first PES packet, look for www.nielsen.com, this is the start of the ID3 tag. Continue to parse the first PES packet until the undefined char &amp;quot;\ufffd&amp;quot; is found. This forms the first half of the ID3 tag&lt;br /&gt;
**In the second PES packet, identify the end pattern – a regEx of /(\/\d+){3}/ and look to remove the lowest index of either &amp;quot;\x00&amp;quot; and/or &amp;quot;\ufffd&amp;quot;. Now the second packet has been appended and the demarcation of the Nielsen-specific data has been defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Follow the procedure below, to extract Nielsen ID3 tags from an MPEG-2 transport stream (including HLS streams).&lt;br /&gt;
#Parse the Program Map Table (PMT) to find the PID of the metadata stream. Confirm the presence of the metadata descriptor described in section 2.3.3 of Apple’s “HTTP Live Streaming Metadata Spec.pdf”. Only private streams with metadata descriptor present should be considered as ID3-tag metadata streams.&lt;br /&gt;
#Parse the HLS/Transport stream for any '''PES header''' with the PID found in step 1.&lt;br /&gt;
#Follow standard MPEG-2 parsing procedures to locate the start of the payload of the PES packet.&lt;br /&gt;
#Copy the PES payload into a buffer.&lt;br /&gt;
#The ID3 tag spans 2 PES packets. Parse the stream for the next packet whose PID is set to the PID found in step 1. Typically the ID3 Tag is of 249 bytes. The steps below guide towards extraction of the ID3 tag&lt;br /&gt;
##In the first PES packet, look for &amp;quot;www.nielsen.com&amp;quot; , this is the start of the ID3 tag. Keep on parsing the first PES packet until the undefined char &amp;quot;\ufffd&amp;quot; is found. This forms the first half of the ID3 tag&lt;br /&gt;
##In the second PES packet, identify the end pattern, a regEx of /(\/\d+){3}/ and look to remove the lowest index of either “\x00” and/or “\ufffd”. Now the second packet has been appended and the demarcation of the Nielsen specific data has been defined. This segment can be simply substringed.&lt;br /&gt;
##Concatenate this substringed segment with the payload derived from the first packet get the ID3 payload.&lt;br /&gt;
#Check the length of the contents in the buffer to make sure that it is equal to the size of a Nielsen ID3 tag.&lt;br /&gt;
#Ensure that the ID3 byte array is converted into the string and escape it, so that the SDK can consume it.&lt;br /&gt;
Repeat steps 2 through 7 for all ID3 tags in the stream.&lt;br /&gt;
&lt;br /&gt;
'''References'''&lt;br /&gt;
*[http://www.iso.org/iso/catalogue_detail?csnumber=44169. ISO/IEC 13818-1:2007] Information technology – Generic coding of moving pictures and associated audio information: Systems&lt;br /&gt;
*https://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/HTTP_Live_Streaming_Metadata_Spec/&lt;br /&gt;
&lt;br /&gt;
=== Sample ID3 tags ===&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/X100zdCIGeIlgZnkYj6UvQ==/AAAB2Jz2_k74GXSzx4npHuI_&amp;lt;wbr /&amp;gt;JwJd3QSUpW30rDkGTcbHEzIMWleCzM-uvNOP9fzJcQMWQLJqzXMCAxParOb5sGijSV9dNM3QiBniJYGZ5GI-lL1fXTTN0IgZ4iWBmeRiPpS9AAAAAAAAAAAAAAAAAAAAAFJWFM5SVhTONNU=/00000/00000/00&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/R8WHe7pEBeqBhu8jTeXydg==/AAICoyitYqlxT7n6aZ0oMCGhe&amp;lt;wbr /&amp;gt;Fi4CXFp46AMUPZz1lMr_M9tr3_cjee1SHqxrOiVerMDLeyn9xzocZSKwi746Re8vNOtpNCAZjYABs_J0R25IHpvOc1HS8&amp;lt;wbr /&amp;gt;QHGgD5TgOJeS6gX100zdCIGeIlgZnkYj6UvVJWFNhSVhTiPE0=/00000/46016/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': ID3 tags are not applicable for International (Germany)&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser Opt-Out Implementation ==&lt;br /&gt;
The site in which video content is being measure via Nielsen methodology must provide the means for the user to opt-out of, or opt back into Nielsen Measurement.&lt;br /&gt;
&lt;br /&gt;
For Browser-based applications, opt-out setting is stored via Nielsen cookie. Therefore, it is only necessary that users be made aware of measurement opt-out by incorporating the template below in the user interface.&lt;br /&gt;
&lt;br /&gt;
=== Sample Opt Out Template ===&lt;br /&gt;
Our properties may feature Nielsen’s proprietary measurement software which will allow to contribute to market research, like Nielsen’s TV Ratings. To learn more about this information, see https://www.nielsen.com/digitalprivacy. Nielsen’s software may collect your choices with regards to it.&lt;br /&gt;
&lt;br /&gt;
== Nielsen Privacy Requirements ==&lt;br /&gt;
Privacy protections that Nielsen ensures to have with each App SDK integration are as follows.&lt;br /&gt;
*Disclosure of viewership data collection in EULA / Privacy Policy&lt;br /&gt;
*A link in the EULA/Privacy policy, or in another conspicuous location within the App, to a Nielsen-hosted web page outlining what Nielsen is collecting and how it is being used&lt;br /&gt;
*Method for users to opt-out of Nielsen measurement, any time while using the application&lt;br /&gt;
&lt;br /&gt;
=== Ratings Data Flow ===&lt;br /&gt;
Every view of creditable and watermarked content is measured by Nielsen.&lt;br /&gt;
[[File:RatingsDataFlow.png]]&lt;br /&gt;
&lt;br /&gt;
'''Information NOT Shared'''&lt;br /&gt;
* '''With Nielsen'''&lt;br /&gt;
** User's Identity&lt;br /&gt;
* '''With Data Provider'''&lt;br /&gt;
** Content information&lt;br /&gt;
** Whether user is viewing an ad or video content&lt;br /&gt;
** Player used to play the streaming (audio / video, etc.)&lt;br /&gt;
** Values being de-duped / aggregating for&lt;br /&gt;
&lt;br /&gt;
Nielsen collects only what it needs for audience measurement. Every view of creditable, watermarked content will be measured by Nielsen.&lt;br /&gt;
&lt;br /&gt;
=== Data Collected ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type of Information !! Parameter !! Transmitted to Nielsen? !! Sent to Provider?&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; | Nielsen ID3 Watermark&lt;br /&gt;
|-&lt;br /&gt;
| FinalDistributor Timestamp || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Program Content Timestamp || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Mobile Breakout Code || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Commercial Credit Code – Linear or Dynamic || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Time ShiftedViewing Code || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Segment Number || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Segment View Pattern || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;7&amp;quot; | Device/App Info&lt;br /&gt;
|-&lt;br /&gt;
| Device OSVersion || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| Device Model || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Cache Buster || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| SDKDisabled Flag || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| ServerCode || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Channel or URL || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; | Nielsen Identifiers&lt;br /&gt;
|-&lt;br /&gt;
| Client ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Campaign ID || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| Nielsen Unique Device ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Application ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| DeviceGroup (ex. Tablet, Smartphone, Desktop) || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| OS Group (ex. Android, iOS, Windows) || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| SDKVersion || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| IP Address for DMA, Country Code || Yes || Yes &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': Data is hashed, and encrypted using AES 128 before transmission to data provider.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Viewability_Data_Collected}}&lt;br /&gt;
&lt;br /&gt;
==== Example ping sent to provider ====&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://provider.com/cgi-bin/brandlift.php&amp;lt;/nowiki&amp;gt;?campaign_id=ff12725d724fac7934cf6003f096b4cd&amp;lt;wbr /&amp;gt;&amp;amp;placement_id=a4164b8fba9ee7c873a9c72c7091bb58&amp;lt;wbr /&amp;gt;&amp;amp;creative_id=25280139b61a947e127a52f56c8a2fdd&amp;lt;wbr /&amp;gt;&amp;amp;segment1=9000&amp;lt;wbr /&amp;gt;&amp;amp;segment2=41&amp;lt;wbr /&amp;gt;&amp;amp;segment3=iOS&amp;lt;wbr /&amp;gt;&amp;amp;OSVer=iOS6.1&amp;lt;wbr /&amp;gt;&amp;amp;c9=&amp;lt;wbr /&amp;gt;&amp;amp;devgrp=tablet&amp;lt;wbr /&amp;gt;&amp;amp;h=f5f243fe6d&amp;lt;wbr /&amp;gt;&amp;amp;rnd=1376971827360&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This ping passes the following parameters to the provider:&lt;br /&gt;
* Campaign ID – (campaign, placement, creative)&lt;br /&gt;
* Country Code&lt;br /&gt;
* DMA&lt;br /&gt;
* OS Group (ex. iOS, Android)&lt;br /&gt;
* DeviceOS Version&lt;br /&gt;
* Device Advertiser ID&lt;br /&gt;
* DeviceGroup (ex. Tablet, Smartphone, Desktop)&lt;br /&gt;
* Cache Buster&lt;br /&gt;
&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
=== Opt-Out Implementation ===&lt;br /&gt;
The site must provide the means for the user to opt-out of, or opt back into Nielsen Measurement.&lt;br /&gt;
&lt;br /&gt;
'''Sample Opt Out Template'''&lt;br /&gt;
&lt;br /&gt;
Our properties may feature Nielsen’s proprietary measurement software which will allow to contribute to market research, like Nielsen’s TV Ratings. To learn more about this information, please [http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html| click here]. Nielsen’s software may collect your choices with regards to it.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
See [[Digital Measurement Testing#Testing Browser Implementation|Digital Measurement Testing - Testing Browser Implementation]].&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
	<entry>
		<id>https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_API_Reference&amp;diff=6784</id>
		<title>Browser SDK API Reference</title>
		<link rel="alternate" type="text/html" href="https://nielsentest.mywikis.net/w/index.php?title=Browser_SDK_API_Reference&amp;diff=6784"/>
		<updated>2024-12-09T19:36:21Z</updated>

		<summary type="html">&lt;p&gt;AmySockanathan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Breadcrumb|}} {{Breadcrumb|Digital}} {{CurrentBreadcrumb}}&lt;br /&gt;
[[Category:Digital]]&lt;br /&gt;
&lt;br /&gt;
== Setting up Development Environment ==&lt;br /&gt;
=== Step 1: Configure Content Management System (CMS) ===&lt;br /&gt;
Configure CMS to send the required values (see table below). Any internal CMS_variable names can be used for passing the data.&lt;br /&gt;
&lt;br /&gt;
Ensure to capture these CMS_variable names in the SDK Configuration Form.&lt;br /&gt;
&lt;br /&gt;
For more information on setting variable names, see the SDK Configuration Form included within the SDK package.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Required Data !! Description !! Value&lt;br /&gt;
|-&lt;br /&gt;
| dataSrc || Used when both CMS metadata and ID3 data are present in the player. Setting this field tells the SDK whether to use the CMS metadata or the ID3 payload to derive the pings || cms&lt;br /&gt;
|-&lt;br /&gt;
| type || Type of asset: ad or content || preroll, midroll, postroll, or content&lt;br /&gt;
|-&lt;br /&gt;
| assetid || unique ID assigned to asset || custom &amp;lt;br&amp;gt;(no [[Special Characters]])&lt;br /&gt;
|-&lt;br /&gt;
| OCR Tag || OCR tag provided by Nielsen for implementation on the ad unit || Complete OCR URL&lt;br /&gt;
|-&lt;br /&gt;
| program || Name of program (25 character limit) || custom&lt;br /&gt;
|-&lt;br /&gt;
| title || Episode title (40 character limit) || custom&lt;br /&gt;
|-&lt;br /&gt;
| length || Length of content in seconds || Length in seconds, 0 for live stream&lt;br /&gt;
|-&lt;br /&gt;
| adloadtype || Type of ad load || &amp;quot;1&amp;quot; - Linear &amp;quot;2&amp;quot; - Dynamic(default)&lt;br /&gt;
|-&lt;br /&gt;
| hasAds || Identify if content includes Ads ||  &amp;quot;0&amp;quot; - no ads &amp;quot;1&amp;quot; - includes ads &amp;quot;2&amp;quot; - unknown(default)&lt;br /&gt;
|-&lt;br /&gt;
| isfullepisode || Full episode flag	|| &amp;quot;y&amp;quot; - full episode &amp;quot;n&amp;quot; - non full episode&lt;br /&gt;
|-&lt;br /&gt;
| segA || Segment A (this is not available for video reporting as the episode title is reported) || custom value&lt;br /&gt;
|-&lt;br /&gt;
| segB || Custom segment B || custom value&lt;br /&gt;
|-&lt;br /&gt;
| segC || Custom segment C || custom value&lt;br /&gt;
|-&lt;br /&gt;
| crossId1 || Standard episode ID || custom value&lt;br /&gt;
|-&lt;br /&gt;
| crossId2 || Content originator (required only for distributors) || custom value&lt;br /&gt;
|-&lt;br /&gt;
| airdate || Original air date and time in Eastern Time. For non-US countries, it should be local time. || YYYYMMDD HH24:MI:SS&lt;br /&gt;
|-&lt;br /&gt;
| containerId || HTML DOM element of the Player container (for Viewability&amp;amp;Audibility feature only) || custom value &lt;br /&gt;
|-&lt;br /&gt;
|luid&lt;br /&gt;
|Living Unit ID - Experian Household ID&lt;br /&gt;
'''Note: This parameter is applicable only for CTV and First Party Livestream data'''&lt;br /&gt;
|&amp;quot;B0EOFEDgD&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Complete the Nielsen SDK Configuration Form ===&lt;br /&gt;
The SDK is designed to map the &amp;lt;code&amp;gt;CMS_variable names&amp;lt;/code&amp;gt;. To support the custom mapping, the developer is required to complete the SDK Configuration Form. The form will be provided during onboarding along with this guide.&lt;br /&gt;
&lt;br /&gt;
== Initialization ==&lt;br /&gt;
=== Obtain the Nielsen Application ID (apid) and Browser SDK URLs ===&lt;br /&gt;
The Nielsen &amp;lt;code&amp;gt;apid&amp;lt;/code&amp;gt; is required to enable SDK functionality. Technical Account Manager will provide an apid for each player configuration.  &lt;br /&gt;
Browser SDK can support URLs that use any of the protocols – HTTPS and HTTP.  &lt;br /&gt;
&lt;br /&gt;
=== Configure Browser SDK ===&lt;br /&gt;
There are two steps required for configuring the SDK:&lt;br /&gt;
&lt;br /&gt;
'''Add Static Queue Snippet'''&lt;br /&gt;
&lt;br /&gt;
*Add Static Queue Snippet&lt;br /&gt;
*Create SDK Instance&lt;br /&gt;
&lt;br /&gt;
Add the following script tag to the website:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The static queue snippet allows the SDK APIs to be called while the actual SDK and configuration file are still being downloaded. As the queue can capture all API calls before the download completes, there is no wait time. Once the SDK is available, the API calls will transition from directing to the queue to the SDK seamlessly.&lt;br /&gt;
&lt;br /&gt;
'''Create SDK Instance'''&lt;br /&gt;
&lt;br /&gt;
To initialize the SDK, create an SDK instance by making the initialization call:&lt;br /&gt;
&lt;br /&gt;
'''Initialization API Call'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When creating an instance, pass the following three values:&lt;br /&gt;
&lt;br /&gt;
=== SDK Initialization – Global Parameters ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameters !! Description !! Value&lt;br /&gt;
|-&lt;br /&gt;
| apid || UniqueID assigned to player/site. || 	'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'&lt;br /&gt;
|-&lt;br /&gt;
| instanceName || Name of SDK instance || &amp;quot;any string value&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| nol_sdkDebug || Enables Nielsen console logging. Only required for testing || &amp;quot;{nol_sdkDebug: &amp;quot;debug&amp;quot;})&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| containerId || HTML DOM element id of the player container. Only for Viewability &amp;amp; Audibility feature. || {containerId: &amp;quot;playerId1&amp;quot;}&lt;br /&gt;
|-&lt;br /&gt;
| hem_sha256 || SHA256-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;tMmiiTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| hem_sha1 || SHA1-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;XvBniTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| hem_md5 || MD5-hashed email address (client-supplied unique 32-character hexadecimal string) || &amp;quot;JnIbdTI7IaAcPpQPFQ65uMVCWH8av9jw4cwf/F5HVRQ=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| uid2 || An identifier based on a user’s verifiable PII (e.g. hashed email). UID2.0 was initially created by The Trade Desk (TTD) and is now managed by Prebid. || &amp;quot;MTKVpUAzwYAPnHrtfE0wlINOMzhU7UUEjjVdCdRu63k=&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| uid2_token || Encrypted Unified ID 2.0 || &amp;quot;AgAAAAPFR0zA5ogv/yaAPiUsAdZPsfqS8Ql&lt;br /&gt;
DSGxAB+rr8yekFs3AjLYVk5qqqiyV2XHbSuwzHmxSlLeQeK&lt;br /&gt;
QI1mp015jsNnpX5/xGgXldcgVz+gFnyh3T8/3agMwRmyrhC&lt;br /&gt;
xG4oH2C7fc48AQk2eotE7FW0ZDEYM8fD9ZxDaxFUC/OV3OuZA&amp;amp;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{example_bsdk_init}}&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Configuration'''&lt;br /&gt;
&lt;br /&gt;
The configuration should include the Static Queue Snippet and an SDK Instance for an unique App ID as shown in the example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
!function(t,n)&lt;br /&gt;
{&lt;br /&gt;
  t[n]=t[n]||&lt;br /&gt;
  {&lt;br /&gt;
    nlsQ:function(e,o,c,r,s,i)&lt;br /&gt;
    {&lt;br /&gt;
     return s=t.document,&lt;br /&gt;
     r=s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
     r.async=1,&lt;br /&gt;
     r.src=(&amp;quot;http:&amp;quot;===t.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+e+&amp;quot;.js#name=&amp;quot;+o+&amp;quot;&amp;amp;ns=&amp;quot;+n,&lt;br /&gt;
     i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
     i.parentNode.insertBefore(r,i),&lt;br /&gt;
     t[n][o]=t[n][o]||{g:c||{},&lt;br /&gt;
     ggPM:function(e,c,r,s,i){(t[n][o].q=t[n][o].q||[]).push([e,c,r,s,i])}},t[n][o]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
  // Created SDK Instance&lt;br /&gt;
  var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;,&amp;quot;nlsnInstance&amp;quot;, {nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multiple SDK Instances ===&lt;br /&gt;
The Browser SDK allows instantiating multiple instances of the object, which can be used simultaneously without any problems, however they must be instantiated with their own unique instance names. There is no maximum number of instances that is enforced in the browser.&lt;br /&gt;
&lt;br /&gt;
The below examples will make use of the same AppId, however using different AppIds will work as well. The principles below follow the same initialization rules stated above for a single instance and simply require a unique instance name and variable name with which the returned instance is assigned.&lt;br /&gt;
&lt;br /&gt;
For more information around the possible parameters that can be passed as well as deeper descriptions for the API calls, please refer to the section on &amp;quot;[[SDK Initialization - Global Parameters#Browser_SDK_API_Reference | SDK Initialization - Global Parameters]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Example of 2 instances on the same page'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Add Static Queue Snippet&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    !function (e, n) {&lt;br /&gt;
      function t(e) {&lt;br /&gt;
        return &amp;quot;object&amp;quot; == typeof e ? JSON.parse(JSON.stringify(e)) : e&lt;br /&gt;
      }&lt;br /&gt;
      e[n] = e[n] ||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ: function (o, r, c) {&lt;br /&gt;
          var s = e.document,&lt;br /&gt;
            a = s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async = 1,&lt;br /&gt;
            a.src = (&amp;quot;http:&amp;quot; === e.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + o + &amp;quot;.js#name=&amp;quot; + r + &amp;quot;&amp;amp;ns=&amp;quot; + n;&lt;br /&gt;
          var i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a, i),&lt;br /&gt;
            e[n][r] = e[n][r] || {&lt;br /&gt;
              g: c || {},&lt;br /&gt;
              ggPM: function (o, c, s, a, i) { e[n][r].q = e[n][r].q || []; try { var l = t([o, c, s, a, i]); e[n][r].q.push(l) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } },&lt;br /&gt;
              trackEvent: function (o) { e[n][r].te = e[n][r].te || []; try { var c = t(o); e[n][r].te.push(c) } catch (e) { console &amp;amp;&amp;amp; console.log &amp;amp;&amp;amp; console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;) } }&lt;br /&gt;
            },&lt;br /&gt;
            e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    //Create SDK Instance(s)&lt;br /&gt;
    // Notice the unique instance name given to each instance below and the unique variable name for each instance&lt;br /&gt;
    var nSdkInstanceLive = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;instanceLive&amp;quot;, {&lt;br /&gt;
        nol_sdkDebug: 'debug',&lt;br /&gt;
        optout: 'false'&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    var nSdkInstanceVod = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;instanceVod&amp;quot;, {&lt;br /&gt;
        nol_sdkDebug: 'debug',&lt;br /&gt;
        optout: 'false'&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Example of 2 instances using a parent page and iFrame'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Parent Page (index.html)&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;ie=edge&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;DCR Static/DCR Video&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    /* NLSQUEUE build v*/&lt;br /&gt;
    !function(e,n){&lt;br /&gt;
    function t(e){&lt;br /&gt;
      return&amp;quot;object&amp;quot;==typeof e?JSON.parse(JSON.stringify(e)):e&lt;br /&gt;
    }&lt;br /&gt;
    e[n]=e[n]||&lt;br /&gt;
    {&lt;br /&gt;
      nlsQ:function(o,r,c){&lt;br /&gt;
        var s=e.document,&lt;br /&gt;
        a=s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
        a.async=1,&lt;br /&gt;
        a.src=(&amp;quot;http:&amp;quot;===e.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+o+&amp;quot;.js#name=&amp;quot;+r+&amp;quot;&amp;amp;ns=&amp;quot;+n;&lt;br /&gt;
        var i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
        return i.parentNode.insertBefore(a,i),&lt;br /&gt;
        e[n][r]=e[n][r]||{g:c||{},&lt;br /&gt;
        ggPM:function(o,c,s,a,i){e[n][r].q=e[n][r].q||[];try{var l=t([o,c,s,a,i]);e[n][r].q.push(l)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}},&lt;br /&gt;
        trackEvent:function(o){e[n][r].te=e[n][r].te||[];try{var c=t(o);e[n][r].te.push(c)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}}},&lt;br /&gt;
        e[n][r]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // SDK Initialization&lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;staticPage&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: 'debug',&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Static Metadata &lt;br /&gt;
    var staticMetadata = {&lt;br /&gt;
      assetid: 'staticTestPage',&lt;br /&gt;
      type: 'static'&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    // Event 'staticstart' call&lt;br /&gt;
    nSdkInstance.ggPM(14, staticMetadata);&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;h1&amp;gt;DCR Static on Parent/DCR Video in iFrame&amp;lt;/h1&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Static measurement is current on parent page when window is in focus&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;iframe src=&amp;quot;./dcr-video.html&amp;quot; frameborder=&amp;quot;0&amp;quot; width=&amp;quot;650&amp;quot; height=&amp;quot;500&amp;quot; style=&amp;quot;background-color: rgb(42, 217, 248);&amp;quot; id=&amp;quot;video-iframe&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Nested iFrame Referenced on Parent Page (dcr-video.html)&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;ie=edge&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;iFrame Same Source&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
    /* NLSQUEUE build v*/&lt;br /&gt;
    !function(e,n){&lt;br /&gt;
      function t(e){&lt;br /&gt;
        return&amp;quot;object&amp;quot;==typeof e?JSON.parse(JSON.stringify(e)):e&lt;br /&gt;
      }&lt;br /&gt;
      e[n]=e[n]||&lt;br /&gt;
      {&lt;br /&gt;
        nlsQ:function(o,r,c){&lt;br /&gt;
          var s=e.document,&lt;br /&gt;
          a=s.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
          a.async=1,&lt;br /&gt;
          a.src=(&amp;quot;http:&amp;quot;===e.location.protocol?&amp;quot;http:&amp;quot;:&amp;quot;https:&amp;quot;)+&amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot;+o+&amp;quot;.js#name=&amp;quot;+r+&amp;quot;&amp;amp;ns=&amp;quot;+n;&lt;br /&gt;
          var i=s.getElementsByTagName(&amp;quot;script&amp;quot;)[0];&lt;br /&gt;
          return i.parentNode.insertBefore(a,i),&lt;br /&gt;
          e[n][r]=e[n][r]||{g:c||{},&lt;br /&gt;
          ggPM:function(o,c,s,a,i){e[n][r].q=e[n][r].q||[];try{var l=t([o,c,s,a,i]);e[n][r].q.push(l)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}},&lt;br /&gt;
          trackEvent:function(o){e[n][r].te=e[n][r].te||[];try{var c=t(o);e[n][r].te.push(c)}catch(e){console&amp;amp;&amp;amp;console.log&amp;amp;&amp;amp;console.log(&amp;quot;Error: Cannot register event in Nielsen SDK queue.&amp;quot;)}}},&lt;br /&gt;
          e[n][r]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }(window,&amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // SDK Initialization&lt;br /&gt;
    var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;videoPlayer&amp;quot;, {&lt;br /&gt;
      nol_sdkDebug: 'debug',&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    var contentMetadata = {&lt;br /&gt;
        type: &amp;quot;content&amp;quot;,&lt;br /&gt;
        length: &amp;quot;300&amp;quot;,&lt;br /&gt;
        title: &amp;quot;Skydiving Across Europe&amp;quot;,&lt;br /&gt;
        program: &amp;quot;latacg&amp;quot;,&lt;br /&gt;
        censuscategory: &amp;quot;Enlisted&amp;quot;,&lt;br /&gt;
        assetid: &amp;quot;204558915992&amp;quot;,&lt;br /&gt;
        section: &amp;quot;ProgramAsset8&amp;quot;,&lt;br /&gt;
        tv: &amp;quot;true&amp;quot;,&lt;br /&gt;
        adModel: &amp;quot;0&amp;quot;,&lt;br /&gt;
        dataSrc: &amp;quot;cms&amp;quot;,&lt;br /&gt;
        segA: &amp;quot;S07E04:NBC&amp;quot;,&lt;br /&gt;
        segB: &amp;quot;teams&amp;quot;,&lt;br /&gt;
        segC:&amp;quot;AtlanataFalcons&amp;quot;,&lt;br /&gt;
      }&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;I'm iframe SDK DCR Video measurement, DCR static measurement should continue when clicking &amp;quot;play&amp;quot; on video&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;main&amp;gt;&lt;br /&gt;
      &amp;lt;video&lt;br /&gt;
      controls&lt;br /&gt;
      src=&amp;quot;https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4&amp;quot;&lt;br /&gt;
      poster=&amp;quot;https://peach.blender.org/wp-content/uploads/title_anouncement.jpg?x11217&amp;quot;&lt;br /&gt;
      width=&amp;quot;620&amp;quot;&amp;gt;&lt;br /&gt;
      Sorry, your browser doesn't support embedded videos, but don't worry, you can&lt;br /&gt;
      &amp;lt;a href=&amp;quot;https://archive.org/details/BigBuckBunny_124&amp;quot;&amp;gt;download it&amp;lt;/a&amp;gt;&lt;br /&gt;
      and watch it with your favorite video player!&lt;br /&gt;
    &amp;lt;/video&amp;gt;&lt;br /&gt;
    &amp;lt;/main&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;../player.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SDK Initialization to measure the Viewability &amp;amp; Audibility ===&lt;br /&gt;
To support viewability metrics in the web page the integrator has to provide a tag value of the player view to let Nielsen SDK know that there is a player that needs to be tracked. It’s called the ‘containerId’ and it should be passed in the as string while initializing the Nielsen browser SDK.&lt;br /&gt;
&lt;br /&gt;
NOLBUNDLE.nlsQ(&amp;quot;&amp;lt;apid&amp;gt;&amp;quot;, &amp;quot;&amp;lt;instanceName&amp;gt;&amp;quot;,{containerId: &amp;lt;playerElementID&amp;gt;, nol_sdkDebug: &amp;quot;debug&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
'''Example SDK Initialization for Viewability'''&lt;br /&gt;
&lt;br /&gt;
Your configuration should include the Static Queue Snippet and an SDK Instance for your unique App ID as shown in the example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Add Static Queue Snippet&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    ! function(t, n) {&lt;br /&gt;
        t[n] = t[n] || {&lt;br /&gt;
            nlsQ: function(e, o, c, r, s, i) {&lt;br /&gt;
                return s = t.document,&lt;br /&gt;
                    r = s.createElement(&amp;quot;script&amp;quot;),&lt;br /&gt;
                    r.async = 1,&lt;br /&gt;
                    r.src = (&amp;quot;http:&amp;quot; === t.location.protocol ? &amp;quot;http:&amp;quot; : &amp;quot;https:&amp;quot;) + &amp;quot;//cdn-gl.imrworldwide.com/conf/&amp;quot; + e + &amp;quot;.js#name=&amp;quot; + o + &amp;quot;&amp;amp;ns=&amp;quot; + n,&lt;br /&gt;
                    i = s.getElementsByTagName(&amp;quot;script&amp;quot;)[0],&lt;br /&gt;
                    i.parentNode.insertBefore(r, i),&lt;br /&gt;
                    t[n][o] = t[n][o] || {&lt;br /&gt;
                        g: c || {},&lt;br /&gt;
                        ggPM: function(e, c, r, s, i) {&lt;br /&gt;
                            (t[n][o].q = t[n][o].q || []).push([e, c, r, s, i])&lt;br /&gt;
                        }&lt;br /&gt;
                    }, t[n][o]&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    (window, &amp;quot;NOLBUNDLE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
//Create SDK Instance&lt;br /&gt;
var nSdkInstance = NOLBUNDLE.nlsQ(&amp;quot;XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX&amp;quot;, &amp;quot;nlsnInstance&amp;quot;, {containerId: “player1”, nol_sdkDebug: &amp;quot;debug&amp;quot;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser SDK API Methods &amp;amp; Properties ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method / Property !! Event # !! DTVR !! DAR !! DCR !! Description&lt;br /&gt;
|-&lt;br /&gt;
| [[loadMetadata (Browser)|loadMetadata]] || 15 || ✔ || ✔ || ✔ || Used when there is a preroll ad that needs to be associated with content metadata. The loadMetadata will first be called to populate the content metadata values and then the loadMetadata for ad metadata will be called. This allows sending a content ping with the ad info, even if the user bails out during the preroll ad.&lt;br /&gt;
|-&lt;br /&gt;
| [[play (Browser)|play]] || 5 || ✔ || ✘ || ✔ || Used when there is an ID3 fed product such as DTVR and the client does not want to send in all the CMS metadata that is sent in loadMetadata. This allows the client to send in at least the required “channel name” value associated to the ID3 feed. When the client passes in the channelName, they can change the CMS data stored by passing new values. If this event is not called then the “channel name” value populated will be the default value of “defaultChannelName”.&lt;br /&gt;
|-&lt;br /&gt;
| [[sendID3 (Browser)|sendID3]] || 55 || ✔ || ✘ || ✘ || Used to send the ID3 metadata.&lt;br /&gt;
|-&lt;br /&gt;
| [[setPlayheadPosition (Browser)|setPlayheadPosition]] || 49 || ✘ || ✘ || ✔ || Used to send the playhead position.&lt;br /&gt;
|-&lt;br /&gt;
| [[stop (Browser)|stop]] || 7 || ✘ || ✘ || ✔ || Used when switching between ad and content or content and ad.&lt;br /&gt;
|-&lt;br /&gt;
| [[end (Browser)|end]] || 57 || ✔ || ✘ || ✔ || This is triggered 1) at the end of the content stream, 2) if the user switches to another piece of content 3) when the browser is refreshed or closed&lt;br /&gt;
|-&lt;br /&gt;
| [[staticstart (Browser)|staticstart]] || 14 || ✘ || ✘ || ✔ || Used to send the metadata for the static page.&lt;br /&gt;
|-&lt;br /&gt;
| [[StaticEnd (Browser)|staticend]] || 56 || ✘ || ✘ || ✔ || In Single Page Application (SPA) it is imperative that staticend is called prior to the loading of new metadata. This allows the Browser SDK to properly credit the previous section/content being viewed before measuring the new one.&lt;br /&gt;
|-&lt;br /&gt;
| [[updateOTT (Browser)|updateOTT]] || - || ✘ || ✘ || ✔ || Used to notify Browser SDK that the remote OTT device (like Google ChromeCast, Roku, Amazon FireTV, etc.) is connected / disconnected (change of OTT status).&lt;br /&gt;
|-&lt;br /&gt;
| [[ onPaginate (Browser)|onPaginate]] || 30 || ✘ || ✘ || ✔ || Used to create a new instance of the SDK object&lt;br /&gt;
|-&lt;br /&gt;
| [[updateMetadata (Browser)|updateMetadata]] || 35 || ✔ || ✔ || ✔ || This event is used for updating metadata parameters for the content or ad that is being played.&lt;br /&gt;
|-&lt;br /&gt;
| [[setVolume_(Browser)|setVolume]] || 61 || ✔ || ✘ || ✔ || Used to pass in the player volume levels in %. Default value is -1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Retrieving ID3 Tags ==&lt;br /&gt;
The video player must have the ability to extract ID3 tags and supply them to the Browser SDK, based on the HLS standard.&lt;br /&gt;
*An ID3 tag spans two PES packets.&lt;br /&gt;
**In the first PES packet, look for www.nielsen.com, this is the start of the ID3 tag. Continue to parse the first PES packet until the undefined char &amp;quot;\ufffd&amp;quot; is found. This forms the first half of the ID3 tag&lt;br /&gt;
**In the second PES packet, identify the end pattern – a regEx of /(\/\d+){3}/ and look to remove the lowest index of either &amp;quot;\x00&amp;quot; and/or &amp;quot;\ufffd&amp;quot;. Now the second packet has been appended and the demarcation of the Nielsen-specific data has been defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Follow the procedure below, to extract Nielsen ID3 tags from an MPEG-2 transport stream (including HLS streams).&lt;br /&gt;
#Parse the Program Map Table (PMT) to find the PID of the metadata stream. Confirm the presence of the metadata descriptor described in section 2.3.3 of Apple’s “HTTP Live Streaming Metadata Spec.pdf”. Only private streams with metadata descriptor present should be considered as ID3-tag metadata streams.&lt;br /&gt;
#Parse the HLS/Transport stream for any '''PES header''' with the PID found in step 1.&lt;br /&gt;
#Follow standard MPEG-2 parsing procedures to locate the start of the payload of the PES packet.&lt;br /&gt;
#Copy the PES payload into a buffer.&lt;br /&gt;
#The ID3 tag spans 2 PES packets. Parse the stream for the next packet whose PID is set to the PID found in step 1. Typically the ID3 Tag is of 249 bytes. The steps below guide towards extraction of the ID3 tag&lt;br /&gt;
##In the first PES packet, look for &amp;quot;www.nielsen.com&amp;quot; , this is the start of the ID3 tag. Keep on parsing the first PES packet until the undefined char &amp;quot;\ufffd&amp;quot; is found. This forms the first half of the ID3 tag&lt;br /&gt;
##In the second PES packet, identify the end pattern, a regEx of /(\/\d+){3}/ and look to remove the lowest index of either “\x00” and/or “\ufffd”. Now the second packet has been appended and the demarcation of the Nielsen specific data has been defined. This segment can be simply substringed.&lt;br /&gt;
##Concatenate this substringed segment with the payload derived from the first packet get the ID3 payload.&lt;br /&gt;
#Check the length of the contents in the buffer to make sure that it is equal to the size of a Nielsen ID3 tag.&lt;br /&gt;
#Ensure that the ID3 byte array is converted into the string and escape it, so that the SDK can consume it.&lt;br /&gt;
Repeat steps 2 through 7 for all ID3 tags in the stream.&lt;br /&gt;
&lt;br /&gt;
'''References'''&lt;br /&gt;
*[http://www.iso.org/iso/catalogue_detail?csnumber=44169. ISO/IEC 13818-1:2007] Information technology – Generic coding of moving pictures and associated audio information: Systems&lt;br /&gt;
*https://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/HTTP_Live_Streaming_Metadata_Spec/&lt;br /&gt;
&lt;br /&gt;
=== Sample ID3 tags ===&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/X100zdCIGeIlgZnkYj6UvQ==/AAAB2Jz2_k74GXSzx4npHuI_&amp;lt;wbr /&amp;gt;JwJd3QSUpW30rDkGTcbHEzIMWleCzM-uvNOP9fzJcQMWQLJqzXMCAxParOb5sGijSV9dNM3QiBniJYGZ5GI-lL1fXTTN0IgZ4iWBmeRiPpS9AAAAAAAAAAAAAAAAAAAAAFJWFM5SVhTONNU=/00000/00000/00&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;www.nielsen.com/X100zdCIGeIlgZnkYj6UvQ==/R8WHe7pEBeqBhu8jTeXydg==/AAICoyitYqlxT7n6aZ0oMCGhe&amp;lt;wbr /&amp;gt;Fi4CXFp46AMUPZz1lMr_M9tr3_cjee1SHqxrOiVerMDLeyn9xzocZSKwi746Re8vNOtpNCAZjYABs_J0R25IHpvOc1HS8&amp;lt;wbr /&amp;gt;QHGgD5TgOJeS6gX100zdCIGeIlgZnkYj6UvVJWFNhSVhTiPE0=/00000/46016/00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': ID3 tags are not applicable for International (Germany)&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser Opt-Out Implementation ==&lt;br /&gt;
The site in which video content is being measure via Nielsen methodology must provide the means for the user to opt-out of, or opt back into Nielsen Measurement.&lt;br /&gt;
&lt;br /&gt;
For Browser-based applications, opt-out setting is stored via Nielsen cookie. Therefore, it is only necessary that users be made aware of measurement opt-out by incorporating the template below in the user interface.&lt;br /&gt;
&lt;br /&gt;
=== Sample Opt Out Template ===&lt;br /&gt;
Our properties may feature Nielsen’s proprietary measurement software which will allow to contribute to market research, like Nielsen’s TV Ratings. To learn more about this information, see https://www.nielsen.com/digitalprivacy. Nielsen’s software may collect your choices with regards to it.&lt;br /&gt;
&lt;br /&gt;
== Nielsen Privacy Requirements ==&lt;br /&gt;
Privacy protections that Nielsen ensures to have with each App SDK integration are as follows.&lt;br /&gt;
*Disclosure of viewership data collection in EULA / Privacy Policy&lt;br /&gt;
*A link in the EULA/Privacy policy, or in another conspicuous location within the App, to a Nielsen-hosted web page outlining what Nielsen is collecting and how it is being used&lt;br /&gt;
*Method for users to opt-out of Nielsen measurement, any time while using the application&lt;br /&gt;
&lt;br /&gt;
=== Ratings Data Flow ===&lt;br /&gt;
Every view of creditable and watermarked content is measured by Nielsen.&lt;br /&gt;
[[File:RatingsDataFlow.png]]&lt;br /&gt;
&lt;br /&gt;
'''Information NOT Shared'''&lt;br /&gt;
* '''With Nielsen'''&lt;br /&gt;
** User's Identity&lt;br /&gt;
* '''With Data Provider'''&lt;br /&gt;
** Content information&lt;br /&gt;
** Whether user is viewing an ad or video content&lt;br /&gt;
** Player used to play the streaming (audio / video, etc.)&lt;br /&gt;
** Values being de-duped / aggregating for&lt;br /&gt;
&lt;br /&gt;
Nielsen collects only what it needs for audience measurement. Every view of creditable, watermarked content will be measured by Nielsen.&lt;br /&gt;
&lt;br /&gt;
=== Data Collected ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type of Information !! Parameter !! Transmitted to Nielsen? !! Sent to Provider?&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; | Nielsen ID3 Watermark&lt;br /&gt;
|-&lt;br /&gt;
| FinalDistributor Timestamp || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Program Content Timestamp || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Mobile Breakout Code || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Commercial Credit Code – Linear or Dynamic || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Time ShiftedViewing Code || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Segment Number || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Segment View Pattern || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;7&amp;quot; | Device/App Info&lt;br /&gt;
|-&lt;br /&gt;
| Device OSVersion || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| Device Model || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Cache Buster || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| SDKDisabled Flag || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| ServerCode || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Channel or URL || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; | Nielsen Identifiers&lt;br /&gt;
|-&lt;br /&gt;
| Client ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Campaign ID || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| Nielsen Unique Device ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Application ID || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| DeviceGroup (ex. Tablet, Smartphone, Desktop) || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| OS Group (ex. Android, iOS, Windows) || Yes || Yes &lt;br /&gt;
|-&lt;br /&gt;
| SDKVersion || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| IP Address for DMA, Country Code || Yes || Yes &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Note''': Data is hashed, and encrypted using AES 128 before transmission to data provider.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Viewability_Data_Collected}}&lt;br /&gt;
&lt;br /&gt;
==== Example ping sent to provider ====&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://provider.com/cgi-bin/brandlift.php&amp;lt;/nowiki&amp;gt;?campaign_id=ff12725d724fac7934cf6003f096b4cd&amp;lt;wbr /&amp;gt;&amp;amp;placement_id=a4164b8fba9ee7c873a9c72c7091bb58&amp;lt;wbr /&amp;gt;&amp;amp;creative_id=25280139b61a947e127a52f56c8a2fdd&amp;lt;wbr /&amp;gt;&amp;amp;segment1=9000&amp;lt;wbr /&amp;gt;&amp;amp;segment2=41&amp;lt;wbr /&amp;gt;&amp;amp;segment3=iOS&amp;lt;wbr /&amp;gt;&amp;amp;OSVer=iOS6.1&amp;lt;wbr /&amp;gt;&amp;amp;c9=&amp;lt;wbr /&amp;gt;&amp;amp;devgrp=tablet&amp;lt;wbr /&amp;gt;&amp;amp;h=f5f243fe6d&amp;lt;wbr /&amp;gt;&amp;amp;rnd=1376971827360&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This ping passes the following parameters to the provider:&lt;br /&gt;
* Campaign ID – (campaign, placement, creative)&lt;br /&gt;
* Country Code&lt;br /&gt;
* DMA&lt;br /&gt;
* OS Group (ex. iOS, Android)&lt;br /&gt;
* DeviceOS Version&lt;br /&gt;
* Device Advertiser ID&lt;br /&gt;
* DeviceGroup (ex. Tablet, Smartphone, Desktop)&lt;br /&gt;
* Cache Buster&lt;br /&gt;
&lt;br /&gt;
{{Template:Browser_Privacy_and_Opt-Out}}&lt;br /&gt;
&lt;br /&gt;
=== Opt-Out Implementation ===&lt;br /&gt;
The site must provide the means for the user to opt-out of, or opt back into Nielsen Measurement.&lt;br /&gt;
&lt;br /&gt;
'''Sample Opt Out Template'''&lt;br /&gt;
&lt;br /&gt;
Our properties may feature Nielsen’s proprietary measurement software which will allow to contribute to market research, like Nielsen’s TV Ratings. To learn more about this information, please [http://priv-policy.imrworldwide.com/priv/mobile/us/en/optout.html| click here]. Nielsen’s software may collect your choices with regards to it.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
See [[Digital Measurement Testing#Testing Browser Implementation|Digital Measurement Testing - Testing Browser Implementation]].&lt;/div&gt;</summary>
		<author><name>AmySockanathan</name></author>
	</entry>
</feed>