DCR Sweden Video Cloud API: Difference between revisions
From Engineering Client Portal
MichelFodjo (talk | contribs) (→Configure Payload: isthirdpartyad is removed per MM request on Google chat 27-06-2024) |
|||
(15 intermediate revisions by 3 users not shown) | |||
Line 29: | Line 29: | ||
*<code>[endpoint]</code>: location of data collection environment | *<code>[endpoint]</code>: location of data collection environment | ||
*<code>[appid]</code>: provided App ID | *<code>[appid]</code>: provided App ID. | ||
** '''Note: P prefix must be removed before adding it to the URL''' | |||
** Example App ID with P prefix: "PDF20695-XXXX-XXXX-XXXX-3E334133D917" | |||
** <code>https://sc-eucert.imrworldwide.com/nmapi/v2/DF20695-XXXX-XXXX-XXXX-3E334133D917/[sessionID]/a?b=[payload]</code> | |||
*<code>[sessionID]</code>: unique value for each user session | *<code>[sessionID]</code>: unique value for each user session | ||
*<code>[payload]</code>: metadata and events | *<code>[payload]</code>: metadata and events | ||
Line 70: | Line 73: | ||
A Session ID needs to be completely unique so it is recommended to use our generation method example provided below to create unique alpha-numerical 29 characters + 10 characters UTC timestamp, to guarantee there are no repeats, also see [[#Review the Reference Implementation for VoD and Live Streams|Reference Implementation for VoD and Live Streams]] for your reference and use. | A Session ID needs to be completely unique so it is recommended to use our generation method example provided below to create unique alpha-numerical 29 characters + 10 characters UTC timestamp, to guarantee there are no repeats, also see [[#Review the Reference Implementation for VoD and Live Streams|Reference Implementation for VoD and Live Streams]] for your reference and use. | ||
Session ID example: '''LsTYTmZQPwdchsNZkdtJp9lErjgAp1632729088''' | |||
<br> | |||
<syntaxhighlight lang="javascript"> | <syntaxhighlight lang="javascript"> | ||
Line 108: | Line 114: | ||
* An First Party ID <code>[fpid]</code> must be created and stored on the device. It is re-used until the expiration date or if the user has deleted it from the device storage. | * An First Party ID <code>[fpid]</code> must be created and stored on the device. It is re-used until the expiration date or if the user has deleted it from the device storage. | ||
The default expiration date should be set to the equivalent of 180 days. | The default expiration date should be set to the equivalent of 180 days. | ||
* Additionally the Creation Time <code>[fpcrtm]</code> of the First Party ID should be stored as well. The same value should be used as long as the First Party ID is available on the device. | * Additionally the Creation Time <code>[fpcrtm]</code> of the First Party ID should be stored as well. The same value should be used as long as the First Party ID is available on the device. This Unix timestamp is in milliseconds. | ||
===Create View Session ID for each Video Start=== | ===Create View Session ID for each Video Start=== | ||
Line 165: | Line 171: | ||
"type": "preroll", // type of ad | "type": "preroll", // type of ad | ||
"assetid": "E1UMBR1001", // unique ID for ad | "assetid": "E1UMBR1001", // unique ID for ad | ||
"length": " | "length": "30", // ad duration in seconds | ||
"isprogrammatic": "yes",//identify if the ad is bought prommatic | "isprogrammatic": "yes",//identify if the ad is bought prommatic | ||
"adplatformorigin": "YuMe",//identity of ad origin | "adplatformorigin": "YuMe",//identity of ad origin | ||
"adidx": "1/5" //placement in ad break | "adidx": "1/5" //placement in ad break | ||
Line 187: | Line 192: | ||
|- | |- | ||
! Keys !! Description !! Values !! Required | ! Keys !! Description !! Values !! Required | ||
|- | |-style="background-color:#d0f6f8;" | ||
| devId || unique ID | | devId || unique Device ID of a user device (e.g. SHA-256 hashed value of i.e. Advertising ID, Roku Device ID). Please verify your implemented SHA-256 by passing "00000000-0000-0000-0000-000000000000" which should return "12b9377cbe7e5c94e8a70d9d23929523d14afa954793130f8a3959c7b849aca8" || custom || ✓ | ||
|- | |- | ||
| apn || app name || custom || ✓ | | apn || app name || custom || ✓ | ||
Line 198: | Line 203: | ||
|- | |- | ||
|- | |- | ||
| hem_unknown || Hashed email using SHA512. | | hem_unknown || Hashed email using SHA512. This email is used by MMS reach model. (required if login feature) || custom || ✓ | ||
|- | |- | ||
|-style="background-color:#d0f6f8;" | |-style="background-color:#d0f6f8;" | ||
Line 303: | Line 308: | ||
|- | |- | ||
| <code>"complete"</code> || The complete event must be sent when the content has completed | | <code>"complete"</code> || The complete event must be sent when full playback of the content has completed . 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. | ||
|- | |- | ||
| <code>"delete"</code> || The delete event is | | <code>"delete"</code> || The delete event is 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). | ||
|} | |} | ||
Line 432: | Line 437: | ||
*App Crash or Exit | *App Crash or Exit | ||
'''Note:''' A session will automatically timeout after 30 minutes of inactivity. | |||
'''Note:''' | |||
=== Example Request === | === Example Request === | ||
Line 482: | Line 484: | ||
"length": "3359", // ad duration in seconds | "length": "3359", // ad duration in seconds | ||
"isprogrammatic": "yes",//identify if the ad is bought prommatic | "isprogrammatic": "yes",//identify if the ad is bought prommatic | ||
"adplatformorigin": "YuMe",//identity of ad origin | "adplatformorigin": "YuMe",//identity of ad origin | ||
"adidx": "1/5" //placement in ad break | "adidx": "1/5" //placement in ad break | ||
Line 595: | Line 596: | ||
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. | 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 in English and Swedish. | ||
<br><b>ENGLISH</b><br> | |||
<blockquote> | <blockquote> | ||
'''''ABOUT NIELSEN MEASUREMENT''''' | '''''ABOUT NIELSEN MEASUREMENT''''' | ||
Line 606: | Line 607: | ||
'''''YOUR CHOICES''''' | '''''YOUR CHOICES''''' | ||
Nielsen believes that you should have a choice about whether to contribute to our research and insights. To opt-out or opt into Nielsen measurement, please toggle your "Limit Ad Tracking" (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:// | Nielsen believes that you should have a choice about whether to contribute to our research and insights. To opt-out or opt into Nielsen measurement, please toggle your "Limit Ad Tracking" (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://nielsen.com/legal/privacy-principles/digital-measurement-privacy-statement/?lang=en-se | ||
</blockquote> | </blockquote> | ||
<br><b>SWEDISH</b><br> | |||
<blockquote> | |||
'''''OM NIELSEN-MÄTNINGEN''''' | |||
Television och våra tittarvanor har utvecklats mycket sedan Nielsen började mäta tv-publiken på 1950-talet. Dagens möjlighet att titta på program när som helst och på flera olika enheter ökar behovet av exceptionellt kompetenta och flexibla produkter för publikmätning. | |||
Konsumenterna ändras med tiden och likaså Nielsen. I takt med att tekniken fortsätter att utvecklas och medieföretagen försöker hitta nya sätt att tilltala tittare, är det viktigare än någonsin att förstå vad konsumenterna tittar på och med vilken typ av enhet. I dag är det en personlig och obunden upplevelse att se på en video – du kan se när som helst och var som helst. Våra produkter ger relevanta mätvärden som är nödvändiga för att informera om framgångsrik marknadsföring och programmering samt för att gynna en fortsatt tillväxt. | |||
Som global ledare inom information och mätning strävar vi efter att skydda integriteten och säkerheten för de personuppgifter som vi samlar in, behandlar och använder..Även om våra digitala mätningsprodukter inte används för att identifiera dig på något sätt, hjälper de oss och våra klienter att mäta och analysera konsumenters medievanor online, på mobila enheter och via annan ny teknik som kan komma att utvecklas. | |||
'''''DINA VAL''''' | |||
Nielsen anser att du alltid ska ha ett val kring huruvida du vill bidra till vår forskning och insikter. För att avböja till Nielsens mätningar på en specifik enhet behöver du därför endast avaktivera/aktivera mätningen genom ”App Tracking/Limit Ad Tracking” (för iOS-enheter) eller ”Opt out of Ads Personalization” (för Android-enheter) som finns i din enhets inställningar. Om du har applikationer på flera mobila enheter måste du ändra inställningarna på varje enhet. | |||
Om du ändrar dig efter att du har avböjt och vill medverka på nytt, kan du aktivera/avaktivera mätningen genom "App Tracking/ Limit Ad Tracking” (för iOS-enheter) eller "Opt out of Ads Personalization” (för Android-enheter) i enhetens inställningar. | |||
Mer information om våra digitala mätprodukter och programvara samt om dina val när det gäller dessa finns på vår sida https://nielsen.com/legal/privacy-principles/digital-measurement-privacy-statement/?lang=sv | |||
</blockquote> | |||
'''''Disclosure Template''''' | '''''Disclosure Template''''' | ||
Additionally, you must update the App description information from the App Distribution Store with the Nielsen Measurement disclosure below: | Additionally, you must update the App description information from the App Distribution Store with the Nielsen Measurement disclosure below: | ||
This app features Nielsen's proprietary measurement software which will allow you to contribute to market research, like Nielsen's TV Ratings. Please see https:// | This app features Nielsen's proprietary measurement software which will allow you to contribute to market research, like Nielsen's TV Ratings. Please see https://nielsen.com/legal/privacy-principles/digital-measurement-privacy-statement/?lang=sv for more information. | ||
== Review the Reference Implementation for VoD and Live Streams == | == Review the Reference Implementation for VoD and Live Streams == | ||
Line 631: | Line 652: | ||
In order to disclose the Nielsen measurement privacy statement, please include the following items in your privacy policy: | In order to disclose the Nielsen measurement privacy statement, please include the following items in your privacy policy: | ||
* A notice that the player includes third-party measurement software that allows users to contribute to market research with anonymous data. | * A notice that the player includes third-party measurement software that allows users to contribute to market research with anonymous data. | ||
* A link to the Nielsen Digital Measurement Privacy Policy located at https:// | * A link to the Nielsen Digital Measurement Privacy Policy located at https://nielsen.com/legal/privacy-principles/digital-measurement-privacy-statement/?lang=en-se | ||
== Testing == | == Testing == |
Latest revision as of 09:05, 27 June 2024
DCR Integration Utilizing Cloud API
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.
Prerequisites
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 by your assigned Technical Account Manager upon starting the integration.
Item | Description | Source |
---|---|---|
App ID (appid) | Unique ID assigned to the player/site and configured by product. | Provided by Nielsen |
Integration
We will cover the steps for constructing the Cloud API Calls.
URL Structure
The Cloud API Calls are HTTP GET Requests with the URL structure:
[endpoint]/[appid]/[sessionID]/a?b=[payload]
The URL includes the following components:
[endpoint]
: location of data collection environment[appid]
: provided App ID.- Note: P prefix must be removed before adding it to the URL
- Example App ID with P prefix: "PDF20695-XXXX-XXXX-XXXX-3E334133D917"
https://sc-eucert.imrworldwide.com/nmapi/v2/DF20695-XXXX-XXXX-XXXX-3E334133D917/[sessionID]/a?b=[payload]
[sessionID]
: unique value for each user session[payload]
: metadata and events
Endpoint
There are endpoints for testing and production:
- Testing:
https://sc-eucert.imrworldwide.com/nmapi/v2/
- Production:
https://capi-sw.imrworldwide.com/nmapi/v2/
Please note that our Endpoints use TLS 1.2 and above, older devices using TLS 1.0 OR 1.1 is not compatible with the endpoints above.
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.
URL Example
As you move through the integration steps, you can reference the below URL structure with the expanded payload:
https://sc-eucert.imrworldwide.com/nmapi/v2/[appid]/[sessionID]/a?b=
{
"devInfo": [deviceInfo],
"metadata": {
"content": [content_metadata],
"ad": [ad metadata]
},
"event": [event],
"position": [playhead_position],
"type": [asset type],
"utc": [Unix time in ms]
}
Create Session ID and send EMM Ping
Create Session ID
A unique Session ID [sessionID]
must be created upon app launch and provided in the URL. This will allow the measurement to occur for the entire duration that a user is within the app.
A Session ID needs to be completely unique so it is recommended to use our generation method example provided below to create unique alpha-numerical 29 characters + 10 characters UTC timestamp, to guarantee there are no repeats, also see Reference Implementation for VoD and Live Streams for your reference and use.
Session ID example: LsTYTmZQPwdchsNZkdtJp9lErjgAp1632729088
'''// Create random GUID'''
function buildGUID() {
var UAIDbase62Characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
var UAIDpayloadLength = 29;
function UAIDgetRandom62() {
var r1;
do {
r1 = Math.floor(Math.random() * (16 * 62));
} while (r1 > 61);
return r1;
}
var uid = '';
for (var a = 0; a < UAIDpayloadLength; a++) {
uid += UAIDbase62Characters.charAt(UAIDgetRandom62());
}
uid += Math.floor(new Date().getTime() / 1000);
return uid;
}
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.
Send EMM Ping
An EMM Ping must be sent using the created unique Session ID [sessionID]
upon start of the first stream playback.
https://[sessionID].uaid.imrworldwide.com/
Also see Reference Implementation for VoD and Live Streams for your reference.
Create First Party ID
- An First Party ID
[fpid]
must be created and stored on the device. It is re-used until the expiration date or if the user has deleted it from the device storage.
The default expiration date should be set to the equivalent of 180 days.
- Additionally the Creation Time
[fpcrtm]
of the First Party ID should be stored as well. The same value should be used as long as the First Party ID is available on the device. This Unix timestamp is in milliseconds.
Create View Session ID for each Video Start
An View Session ID [sessid]
must be created upon start of each stream playback, sessid is unique per video play.
Define URL Structure
Define the URL structure using your provided [appid]
and a unique [sessionID]
.
https://sc-eucert.imrworldwide.com/nmapi/v2/[appid]/[sessionID]/a?b=[payload]
Configure Payload
All Cloud API requests must contain the following payload data:
- devInfo: device and app info
- metadata: asset metadata
- event metadata: type of event
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.
Payload Example
The example below should be referenced when following the steps for configuring the request payload.
// 3.1 Configure Payload: devInfo
payload = {
"devInfo": {
"devId": "AD-ID",
"apn": "AppName",
"apv": "1.0",
"uoo": "false",
"fpid": "First Party ID",
"fpcrtm": "Creation Time (UTC) of the First Party ID (Unix Timestamp in milliseconds)"
"hem_unknown" : "924899b875ea6767ab790bd2f4852345fcfec5d203c49be8e8..."
},
// 3.2 Configure Payload: metadata
"metadata": {
"content": { // object for measuring video content
"type": "content", // "content" for video
"assetid": "uniqueassetid_simulcast", // unique ID for video
"userid": "fbd1a7a7d672a5fcf5cf5c55d8d9d0abbe3a4e0fa…", // SHA512 hashed userid
"clientpassparam": "origcode=29", // Custom parameters passed
"program": "Program Name leif-och-billy", // program name
"title": "Episode Title S3 - EP1 en-ny-tjej-i-byn", // episode name
"length": "3359", // content duration in seconds
"playlisttitle": "barn", //playlist title
"ispremiumcontent": "yes", //identify premium level content
"isautoplay": "yes", //identify if autoplay is enabled
"plugv": "1.0.1", //player version
"playerv": "Sonic" // player identifier
},
"ad": {
"type": "preroll", // type of ad
"assetid": "E1UMBR1001", // unique ID for ad
"length": "30", // ad duration in seconds
"isprogrammatic": "yes",//identify if the ad is bought prommatic
"adplatformorigin": "YuMe",//identity of ad origin
"adidx": "1/5" //placement in ad break
}
},
// 3.3 Configure Payload: events
"event": "playhead", //event name
"position": "300", // position in seconds
"type": "content", //"content" or "ad"
"utc": "1456448742000" //unix timestamp in milliseconds
}
Configure Payload: devInfo
An object "devInfo"
will need to be created to capture App and Device information.
Keys | Description | Values | Required |
---|---|---|---|
devId | unique Device ID of a user device (e.g. SHA-256 hashed value of i.e. Advertising ID, Roku Device ID). Please verify your implemented SHA-256 by passing "00000000-0000-0000-0000-000000000000" which should return "12b9377cbe7e5c94e8a70d9d23929523d14afa954793130f8a3959c7b849aca8" | custom | ✓ |
apn | app name | custom | ✓ |
apv | app build version | custom | ✓ |
uoo | device opt-out status | "true" or "false" |
✓ |
hem_unknown | Hashed email using SHA512. This email is used by MMS reach model. (required if login feature) | custom | ✓ |
fpid | First Party ID | custom | ✓ |
fpcrtm | Creation Time (UTC) of the First Party ID (Unix Timestamp in milliseconds) | custom | ✓ |
Example devInfo Object
// create devInfo object
"devInfo": {
"devId": "AD-ID",
"apn": "AppName",
"apv": "1.0",
"uoo": "false",
"fpid": "First Party ID",
"fpcrtm": "Creation Time (UTC) of the First Party ID (Unix Timestamp in milliseconds)"
"hem_unknown" : "924899b875ea6767ab790bd2f4852345fcfec5d203c49be8e8..." //SHA512 hashed value
},
3.2 Configure Payload: metadata
Asset metadata can be passed through "metadata"
. There are two asset types: "content"
for video and "ad"
for ads. The metadata received for each asset is used for classification and reporting.
You will need to set up "metadata"
objects for "content"
and "ad"
with the required Nielsen keys as shown in the sample code below.
Create Content Metadata
Content metadata should remain constant throughout the entirety of an episode/clip including when ads play.
Please see the Metadata link for the full list of content and ad metadata.
Note: program and title metadata values should be passed as UTF-8 strings.
Example Content Object
// create content object
"content": {
"type": "content",
"assetid": "uniqueassetid",
"length": "2600",
"program": "program name",
"title": "episode title"
}
Create Ad Metadata
The Ad Metadata (if applicable) should be passed for each individual ad.
Please see the Metadata link for the full list of content and ad metadata.
Note: All metadata values should be passed as UTF-8 strings.
Example Ad Object
// create ad object
"ad": {
"type": "preroll",
"assetid": "unique_preroll_ad_id"
}
URL Character Limit: There is a URL character limit of 2K characters due to browser limitations. Exceeding this value could impair data delivery on particular browsers.
Configure Payload: Events
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.
Event Types
The available events are:
Event | Description |
---|---|
"playhead" |
Handling PlayheadCalling General
Live Stream
VoD Stream
End of an Asset
Ads
User Actions
|
"complete" |
The complete event must be sent when full playback of the content has completed . 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. |
"delete" |
The delete event is 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). |
Event Parameters
The following parameters need to be passed when calling events:
Parameter | Description | Value | Required |
---|---|---|---|
"event" |
event type | "playhead" , "complete" , or "delete" |
✓ |
"position" |
playhead position in seconds or Unix time in seconds | "300" |
✓ |
"type" |
asset type | "content" , "ad" |
✓ |
"utc" |
Unix timestamp in milliseconds. Must be passed every 10 seconds. | "1472760000000" |
✓ |
"sessid" |
Unique View Session ID must be created upon start of each stream playback, sessid is unique per video play. | "xxxjavd6wzirm93xb95uxjy1ac5wu1627638609" |
✓ |
Example Event
You can call events by passing values in the required parameters:
"devInfo": [deviceInfo],
"metadata": {
"content": [content metadata],
"ad": [ad metadata]
},
// Event Parameters
"event": [event], // event name
"position": [playheadPosition], //position in seconds
"type": [asset type], // values are "content" or "ad"
"utc": "1472760000000" //unix timestamp in milliseconds
"sessid": "xxxjavd6wzirm93xb95uxjy1ac5wu1627638609", // unique for each video play
}
Note: The full payload including "devInfo" and "metadata" must be populated in each event request.
Sample Event Lifecycle for VoD Stream
The sample event lifecycle can be used as a reference for identifying the order for calling events and values to pass.
// Start of Session: session ID created when App is opened
// Preroll
Ad Playhead {"event": "playhead", "position": "0", "type": "ad", "utc": "1472760000000"}
// Content
Content Playhead {"event": "playhead", "position": "0", "type": "content", "utc": "1472760000000"}
// Midroll
Midroll Playhead {"event": "playhead", "position": "0", "type": "ad", "utc": "1472760000000"}
// Content resumes at 15 minutes
Content Playhead {"event": "playhead", "position": "900", "type": "content", "utc": "1472760000000"}
// Content completes at 30 minutes
Complete {"event": "complete", "position": "1800", "type": "content", "utc": "1472760000000"}
// Postroll
Ad Playhead {"event": "playhead", "position": "0", "type": "ad", "utc": "1472760000000"}
//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.
Delete { "event": "delete", "position": "", "type": "", "utc": "1472760000000"}
Sample Event Lifecycle for VoD Stream - Detailed Storyline
This detailed event sequence provides additional insight for the correct events to call when handling certain playback scenarios.
// SESSION STARTS
// Start of Session: session ID created when App is opened
// PREROLL
// Preroll Start - Start each Ad with a position of "0", resetting to '0' for each Ad, and Ad break.
Ad Playhead {"event": "playhead", "position": "0", "type": "ad", "utc": "1472760000000"}
// Preroll Stop - End each Ad with the final position of the Ad.
Ad Playhead {"event": "playhead", "position": "15", "type": "ad", "utc": "1472761500000"}
// CONTENT
// Content Start - Start new content streams with a position of "0" incrementing the position every 10 seconds.
Content Playhead {"event": "playhead", "position": "0", "type": "content", "utc": "1472761500000"}
// Content Stop Before Ad Break - Send a playhead update including the current content positon before an Ad break.
Content Playhead {"event": "playhead", "position": "299", "type": "content", "utc": "1472787400000"}
// MIDROLL
// Midroll Start - Start each Ad with a position of "0", resetting to '0' for each Ad, and Ad break.
Midroll Playhead {"event": "playhead", "position": "0", "type": "ad", "utc": "1472787500000"}
// Midroll Stop - End each Ad with the final position of the Ad.
Ad Playhead {"event": "playhead", "position": "60", "type": "ad", "utc": "1472793500000"}
// CONTENT
// Content resumes at 5 minutes - Send playhead update with the current resumed position, and begin incrimenting the positon every 10 seconds.
Content Playhead {"event": "playhead", "position": "300", "type": "content", "utc": "1472799500000"}
// Content completes at 10:12 - Make sure to send in the playhead event with the final content position before sending the complete event.
Final Content Playhead {"event": "playhead", "position": "612", "type": "content", "utc": "1472830700000"}
Complete {"event": "complete", "position": "612", "type": "content", "utc": "1472830800000"}
// POSTROLL
// Postroll Start - Start each Ad with a position of "0", resetting to '0' for each Ad, and Ad break.
Ad Playhead {"event": "playhead", "position": "0", "type": "ad", "utc": "1472830900000"}
// Postroll Stop - End each Ad with the final position of the Ad.
Ad Playhead {"event": "playhead", "position": "45", "type": "ad", "utc": "1472835300000"}
// SESSION ENDS
//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.
Delete { "event": "delete", "position": "", "type": "", "utc": "1472835400000"}
Interruption Scenarios
As part of configuring events, you will need to handle all possible interruption scenarios such as:
- Wi-Fi OFF / ON
- App going Background / Foreground (Video players only, not for Audio players)
- App Crash or Exit
Note: A session will automatically timeout after 30 minutes of inactivity.
Example Request
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.
// 1. Create Session ID
sessionID = LsTYTmZQPwdchsNZkdtJp9lErjgAp1632729088 // Example sessionID created using a UUID Generator
// 2. Define URL Structure with App ID and Session ID
sessionURL = https://sc-eucert.imrworldwide.com/nmapi/v2/[appid]/[sessionID]/a?b=
// 3. Configure Payload
// 3.1 Configure Payload: devInfo
payload = {
"devInfo": {
"devId": "AD-ID",
"apn": "AppName",
"apv": "1.0",
"uoo": "false",
"fpid": "U4EDwDcpvWIbguYVyjlhzS1v0eaov1631180980",
"fpcrtm": "1631098029000"
"hem_unknown" : "924899b875ea6767ab790bd2f4852345fcfec5d203c49be8e8..." //SHA512 hashed value
},
// 3.2 Configure Payload: metadata
"metadata": {
"type": "content", // "content" for video
"assetid": "uniqueassetid_simulcast", // unique ID for video
"userid": "fbd1a7a7d672a5fcf5cf5c55d8d9d0abbe3a4e0fa…", // SHA512 hashed userid
"clientpassparam": "origcode=29", // Custom parameters passed
"program": "Program Name leif-och-billy", // program name
"title": "Episode Title S3 - EP1 en-ny-tjej-i-byn", // episode name
"length": "3359", // content duration in seconds
"playlisttitle": "barn", //playlist title
"ispremiumcontent": "yes", //identify premium level content
"isautoplay": "yes", //identify if autoplay is enabled
"plugv": "1.0.1", //player version
"playerv": "Sonic" // player identifier
},
"ad": {
"type": "preroll", // type of ad
"assetid": "AD-ID123", // unique ID for ad
"length": "3359", // ad duration in seconds
"isprogrammatic": "yes",//identify if the ad is bought prommatic
"adplatformorigin": "YuMe",//identity of ad origin
"adidx": "1/5" //placement in ad break
}
},
// 3.3 Configure Payload: events
"event": "playhead", //event name
"position": "300", // position in seconds
"type": "content", //"content" or "ad"
"utc": "1456448742000" //unix timestamp in milliseconds
"sessid": "xxxjavd6wzirm93xb95uxjy1ac5wu1627638609", // unique for each video play
}
// Append payload to URL
function sendPayloadToNielsen() {
var payloadStr = JSON.stringify(payload); // payload as string
var imgPing = new Image();
imgPing.onload = function() {
// onload event, payload succesfull sent
};
imgPing.onerror = function() {
// handle error i.e. wait and send again
};
imgPing.src = sessionURL+encodeURIComponent(payloadStr);
}
Enable Debug Logging
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.
GET Request
Display GET Request to console using a name to identify each event (e.g. playhead).
console.log("Event", image);
Payload
Output payload to identify required metadata and events.
console.log("Event Payload", payload);
HTTP Response Code
Confirm request was completed by viewing HTTP response code.
code = msg.GetResponseCode();
console.log("Response Code", code);
You can reference the HTTP Response Code table when reviewing your requests:
Status Code | Status Text | Description |
---|---|---|
200 |
OK | request received |
403 |
Forbidden | invalid App ID |
404 |
Not Found | JSON issue |
Opt-Out
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 "Limit Ad Tracking" or similar option. If the device offers "Limit Ad Tracking" settings, you should set uoo=true
or uoo=false
depending on the user's privacy setting. Also, ensure that the devId
is set to a blank value if the user elects to opt-out.
If the device does not have OS-level "Do Not Track" settings, you can implement opt-out by creating an Opt-Out/Opt-In button, toggle switch, or slider within the app "Settings", or "About" section to allow the user selection.
You will need to store the User Opt-Out (uoo) status, so that it can be retrieved and populated in the "devInfo"
metadata which will be sent in every Cloud API event (playhead, complete, & delete).
uoo Key | Description | Values |
---|---|---|
uoo | Device is Opted-In to Nielsen Measurement (Recommended Default Setting) | "false"
|
uoo | Device is Opted-Out of Nielsen Measurement | "true"
|
devInfo Opt-In JSON Payload Example
"devInfo": {
"apn": "Cloud API Sample App",
"apv": "1",
"devId": "7be25cf9-8c40-5cc2-871e-19bf41940288",
"uoo": "false"
},
devInfo Opt-Out JSON Payload Example
"devInfo": {
"apn": "Cloud API Sample App",
"apv": "1",
"devId": "", //devId must be blank when a user elects to Opt-Out.
"uoo": "true"
},
Privacy Information Template To Include In Opt-Out Screen
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 in English and Swedish.
ENGLISH
ABOUT NIELSEN MEASUREMENT
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.
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 client's measure and analyze how consumers engage with media across online, mobile, and emerging technologies, and offer insights into consumer behavior.
YOUR CHOICES
Nielsen believes that you should have a choice about whether to contribute to our research and insights. To opt-out or opt into Nielsen measurement, please toggle your "Limit Ad Tracking" (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://nielsen.com/legal/privacy-principles/digital-measurement-privacy-statement/?lang=en-se
SWEDISH
OM NIELSEN-MÄTNINGEN
Television och våra tittarvanor har utvecklats mycket sedan Nielsen började mäta tv-publiken på 1950-talet. Dagens möjlighet att titta på program när som helst och på flera olika enheter ökar behovet av exceptionellt kompetenta och flexibla produkter för publikmätning.
Konsumenterna ändras med tiden och likaså Nielsen. I takt med att tekniken fortsätter att utvecklas och medieföretagen försöker hitta nya sätt att tilltala tittare, är det viktigare än någonsin att förstå vad konsumenterna tittar på och med vilken typ av enhet. I dag är det en personlig och obunden upplevelse att se på en video – du kan se när som helst och var som helst. Våra produkter ger relevanta mätvärden som är nödvändiga för att informera om framgångsrik marknadsföring och programmering samt för att gynna en fortsatt tillväxt.
Som global ledare inom information och mätning strävar vi efter att skydda integriteten och säkerheten för de personuppgifter som vi samlar in, behandlar och använder..Även om våra digitala mätningsprodukter inte används för att identifiera dig på något sätt, hjälper de oss och våra klienter att mäta och analysera konsumenters medievanor online, på mobila enheter och via annan ny teknik som kan komma att utvecklas.
DINA VAL
Nielsen anser att du alltid ska ha ett val kring huruvida du vill bidra till vår forskning och insikter. För att avböja till Nielsens mätningar på en specifik enhet behöver du därför endast avaktivera/aktivera mätningen genom ”App Tracking/Limit Ad Tracking” (för iOS-enheter) eller ”Opt out of Ads Personalization” (för Android-enheter) som finns i din enhets inställningar. Om du har applikationer på flera mobila enheter måste du ändra inställningarna på varje enhet.
Om du ändrar dig efter att du har avböjt och vill medverka på nytt, kan du aktivera/avaktivera mätningen genom "App Tracking/ Limit Ad Tracking” (för iOS-enheter) eller "Opt out of Ads Personalization” (för Android-enheter) i enhetens inställningar.
Mer information om våra digitala mätprodukter och programvara samt om dina val när det gäller dessa finns på vår sida https://nielsen.com/legal/privacy-principles/digital-measurement-privacy-statement/?lang=sv
Disclosure Template
Additionally, you must update the App description information from the App Distribution Store with the Nielsen Measurement disclosure below:
This app features Nielsen's proprietary measurement software which will allow you to contribute to market research, like Nielsen's TV Ratings. Please see https://nielsen.com/legal/privacy-principles/digital-measurement-privacy-statement/?lang=sv for more information.
Review the Reference Implementation for VoD and Live Streams
The Reference Implementation covers vod and Live use cases. It also covers DAI (Dynamic Ad Insertion) with preroll and post-roll Ads.
In order to start live stream select the checkbox "isLive" in the Playback Settings
below the video player.
Start the Reference Implementation for Sweden RefImplCloudAPISE.
Review the Nielsen CloudAPI Call Sequence below the Video Player.
Disclose Nielsen Privacy Statement
In order to disclose the Nielsen measurement privacy statement, please include the following items in your privacy policy:
- A notice that the player includes third-party measurement software that allows users to contribute to market research with anonymous data.
- A link to the Nielsen Digital Measurement Privacy Policy located at https://nielsen.com/legal/privacy-principles/digital-measurement-privacy-statement/?lang=en-se
Testing
Before providing an app build to Nielsen for testing, it is important to run validation checks once you have enabled debug logging.
Payload Validation
Ensure that all of the required payload data is populating while testing several videos. The following areas are critical to measurement:
- devInfo
- Asset metadata for both content, and ads
- Events
Player Events
Review event calls:
playhead
- Playhead position updates every 10 seconds starting at position '0' for each new asset for VoD stream and UTC Unix Time in seconds for Live stream.
- Final playhead position is sent on content, or ad before switching between assets.
- Content metadata remains constant throughout an episode or clip play.
- Ad metadata is populated appropriately for each individual ad.
- Playhead position update resumes for content after an ad break and resets to 0 for each individual ad.
- For scrubbing, last current position should be sent while scrubbing occurs, and the new position should also be sent where the user scrubs to.
- Exiting a stream early should execute the last current position in a playhead update to receive accurate duration.
- Upon pause, the current position should be sent, and playhead updates should stop incrementing until resume play occurs.
complete
- Check that the complete event executes upon content complete after the final playhead update is sent
- Do not execute the complete event for ads
delete
- Check to see that the delete event occurs upon app exit, if the platform has the necessary exit callback events.
GET Request Format
- Ensure that the event payloads are formatted in JSON
- Check to see that each of the Cloud API GET requests are properly encoded
HTTP Response
- Make sure that each of the Cloud API Get requests are received by the Nielsen Cloud API properly through use of the HTTP Response Code outputs enabled in console.
Opt-Out
- Test the "uoo" 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.
- Test that the devId field is populated with a blank value if a user has elected to Opt-Out. For example: "devId": "",
- If the device supports "Limit Ad Tracking" or has device "Opt-Out" settings, test that uoo=true, and that devId is set to a blank value if enabled in the device settings.
Go Live
After your integration has been certified, you will need to: Change the Endpoint and Disable Logging.
Change Endpoint: You will need to update to the production endpoint:
- Testing:
https://sc-eucert.imrworldwide.com/nmapi/v2/
- Production:
https://capi-sw.imrworldwide.com/nmapi/v2/
Your production URL structure should now be:
https://capi-sw.imrworldwide.com/nmapi/v2/[appid]/[sessionID]/a?b=[payload]
Disable Logging: You can now disable debug logging