Table of content

Overview

The Dailymotion reporting API provides the ability to build custom reports based on aggregated performance measurements across a set of dimensions and filters. The flexible interface allows you to ingest data at your convenience and in the format you need. The reporting API is only available to our verified partners.

Reporting parameters

The Dailymotion reporting API accepts dimensions, filters, metrics and product as parameters:

  • Dimensions are used to organize metrics across common criteria. For example: visitor country and visitor device type.
  • Filters are used to scope down the result set. For example, media type and visitor domain group.
  • Metrics are measurements related to activity. For example: number of views and time watched.

Refer to these tables for detailed information: Dimensions, filters, and metrics and Compatibility matrix.

  • Product is used to target a specific product usage. On Dailymotion, data is collected and attributed against three different kinds of product usage
    • data generated on your content
    • data generated on your embeds
    • data generated on your claims

Using Reporting API, the following product values can be used

ProductDescription
CONTENTThis is the Default value if product is not specified.
Get data only for content that belongs to this partner account
EMBEDGet data only for embeds that belong to this partner account
CLAIMGet data only for claims that belong to this partner account
ALLGet data only for content, embeds and claims that belong to this partner account

Reporting constraints

Key points to note before you begin:

  • Reports are generated asynchronously; data is pulled and collected in a CSV
  • You can generate a maximum of two reports concurrently
  • A report can take up to two hours to generate
  • The API supports granularity no smaller than one day
  • A date range is required for every request
  • The date range filter cannot exceed a period of 180 days
  • A maximum of eight dimensions can be passed in a single report
  • Reports are deleted after 48 hours

How to generate a report

You can follow these steps to generate a report. We’ve included code samples in each step for reference, but you’ll find complete code samples (in BASH (with cURL), PHP, and Python) at the end of this section.

Step 1: Generate an API key and secret.

  1. Go to the Partner HQ.
  2. Scroll down to Manage your API keys. Click Create a new key and fill out the form. Use http://localhost.com in the Website and Callback URL fields if you don’t have a specific website to use.
  3. Click Create. Your API key and secret will be displayed and stored here for future reference.
  4. Contact your Dailymotion content manager with the API key (but not the secret) and request reporting API access be enabled. Move to step 2 once this is done.

Step 2: Perform authentication.

Pass in the Dailymotion login credentials along with the API key and secret generated in step 1.

Use this endpoint to request the access token:

POST https://graphql.api.dailymotion.com/oauth/token

Example of request (using cURL):

curl -s -X POST https://graphql.api.dailymotion.com/oauth/token \
        -H "Content-Type: application/x-www-form-urlencoded" \
        -d "client_id=<YOUR_API_KEY>&client_secret=<YOUR_API_SECRET>&username=<YOUR_USERNAME>&password=<YOUR_PASSWORD>&grant_type=password&version=2"

Example of response body:

{
  "access_token": "eyJ0eXAiOiJK...jO67fL658U",
  "expires_in": 36000,
  "refresh_token": "eyJ0eXAiOiJK...LFPA1uDBD0",
  "scope": "",
  "token_type": "Bearer"
}

Step 3: Request the report.

Use this endpoint for all subsequent API calls:

POST https://graphql.api.dailymotion.com

Example of request header:

Content-Type: application/json
Authorization: Bearer <ACCESS_TOKEN>

Example of request body:

{
    "query": "mutation ($input: AskPartnerReportFileInput!) {
        askPartnerReportFile(input: $input) {
            reportFile {
                reportToken
            }
        }
    }",
    "variables": {
        "input": {
            "metrics": ["VIEWS"],
            "dimensions": ["DAY", "VIDEO_TITLE"],
            "filters": {
                "videoOwnerChannelSlug": "<your_channel_slug>"
            },
            "product": "CONTENT",
            "startDate": "2018-07-01",
            "endDate": "2018-07-04"
        }
    }
}
  1. Pass in the dimensions, metrics, filters and date range you want to generate the report for. 
  2. Replace the <ACCESS_TOKEN> with the one generated from authentication request. 

Table for guidance.

Example of response body:

{
    "data": {
        "askPartnerReportFile": {
            "reportFile" {
                "reportToken":"eyJ0eX...sAG7__nZ7w"
            }
        }
    }
}

Step 4: Check report status.

It can take up to two hours to generate the report once a job has been created. To check the status:

POST https://graphql.api.dailymotion.com

Example of request header:

Content-Type: application/json
Authorization: Bearer <ACCESS_TOKEN>

Example of request body:

{
    "query": "query PartnerGetReportFile($reportToken: String!) {
        partner {
            reportFile(reportToken: $reportToken) {
                status
                downloadLinks {
                    edges {
                        node {
                            link
                        }
                    }
                }
            }
        }
    }",
    "variables": {
        "reportToken": "<REPORT_TOKEN>"
    }
}
  1. Make sure to replace <REPORT_TOKEN> with the token generated from the previous request.
  2. Send a check status request. Make sure to replace the <ACCESS_TOKEN> with the one generated from the authentication request.

Example of response body (report generation still in progress):

{
    "data": {
        "partner": {
            "reportFile": {
                "status": "IN_PROGRESS",
                "downloadLinks": {
                    "edges": []
                }
            }
        }
    }
}

Example of response body (report generation finished):

{
    "data": {
        "partner": {
            "reportFile": {
                "status":"FINISHED",
                "downloadLinks": {
                    "edges": [
                        {
                            "node": {
                                "link":"https://storage.googleapis.com/dailymotion-stats-report/21da4e2e74..."
                            }
                        }
                    ]
                }
            }
        }
    }
}

Step 5: Download the generated report.

You can download the report once the status displays FINISHED. The download link is located in the response (inside the downloadLinks node).

Please note that big report requests can lead to several report files. Be sure to download all the files in order to get a complete report.

Code samples

You can use the following code samples in order to test report generation and automatically download the resulting files.

Don’t forget to change the variable values (app key, app secret, username, password, report dimensions, report metrics, report filters and report start/end date) to match your configuration and needs.

Bash
PHP
Python
#!/usr/bin/env bash

# Authenticate on the API in order to get an access token
get_access_token () {
    local APP_KEY=$1
    local APP_SECRET=$2
    local USERNAME=$3
    local PASSWORD=$4

    ACCESS_TOKEN=$(curl -s -X POST \
        https://graphql.api.dailymotion.com/oauth/token \
        -H "Content-Type: application/x-www-form-urlencoded" \
        -d "client_id=$APP_KEY&client_secret=$APP_SECRET&username=$USERNAME&password=$PASSWORD&grant_type=password&version=2" \
        | jq '.access_token' | sed -e 's/^"//' -e 's/"$//' | cat)
}

# Creating a report request
create_report_request () {
    declare -a DIMENSIONS=("${!1}")
    declare -a METRICS=("${!2}")
    local START_DATE=$3
    local END_DATE=$4
    declare -a FILTERS=("${!5}")
    local PRODUCT=$6

    local GRAPHQL_FILTERS=""
    local firstItem=1
    for filter in ${FILTERS[@]}; do
        if [ "$firstItem" -eq 1 ]; then separator=''; else separator=','; fi
        filter_parts=($(echo $filter | tr "=" " "))
        GRAPHQL_FILTERS="${GRAPHQL_FILTERS}${separator}\"${filter_parts[0]}\": \"${filter_parts[1]}\""
        firstItem=0
    done

    local GRAPHQL_DIMENSIONS=""
    local firstItem=1
    for dimension in ${DIMENSIONS[@]}; do
        if [ "$firstItem" -eq 1 ]; then separator=''; else separator=','; fi
        GRAPHQL_DIMENSIONS="${GRAPHQL_DIMENSIONS}${separator}\"$dimension\""
        firstItem=0
    done

    local GRAPHQL_METRICS=""
    local firstItem=1
    for metric in ${METRICS[@]}; do
        if [ "$firstItem" -eq 1 ]; then separator=''; else separator=','; fi
        GRAPHQL_METRICS="${GRAPHQL_METRICS}${separator}\"$metric\""
        firstItem=0
    done

    local REQUEST
    read -r -d '' REQUEST <<EOF
{
    "query": "mutation (\$input: AskPartnerReportFileInput!) {
        askPartnerReportFile(input: \$input) {
            reportFile {
                reportToken
            }
        }
    }",
    "variables": {
        "input": {
            "metrics": [$GRAPHQL_METRICS],
            "dimensions": [$GRAPHQL_DIMENSIONS],
            "filters": {$GRAPHQL_FILTERS},
            "startDate": "$START_DATE",
            "endDate": "$END_DATE",
            "product": "$PRODUCT"
        }
    }
}
EOF

    REPORT_TOKEN=$(echo $REQUEST | jq -c '.' | curl -s -X POST \
        https://graphql.api.dailymotion.com \
        -H "Content-Type: application/json" \
        -H "Authorization: Bearer $ACCESS_TOKEN" \
        -d @- | jq '.data.askPartnerReportFile.reportFile.reportToken' | sed -e 's/^"//' -e 's/"$//' | cat)
}

# Checking the status of the reporting request
function check_report_status () {
    read -r -d '' REQUEST <<EOF
{
    "query": "query PartnerGetReportFile(\$reportToken: String!) {
        partner {
            reportFile(reportToken: \$reportToken) {
                status
                downloadLinks {
                    edges {
                        node {
                            link
                        }
                    }
                }
            }
        }
    }",
    "variables": {
        "reportToken": "$REPORT_TOKEN"
    }
}
EOF

    local report=$(echo $REQUEST | jq -c '.' | curl -s -X POST \
        https://graphql.api.dailymotion.com \
        -H "Content-Type: application/json" \
        -H "Authorization: Bearer $ACCESS_TOKEN" \
        -d @- | jq '.data.partner.reportFile' | cat)

    local report_status=$(echo $report | jq '.status' | sed -e 's/^"//' -e 's/"$//' | cat)

    if [ "$report_status" == "FINISHED" ]; then
        download_links=$(echo $report | jq '.downloadLinks.edges[].node.link' | sed -e 's/^"//' -e 's/"$//' | cat)
    fi
}

# Downloading the report files
function download_report () {
    local base_path=$PWD
    if [ -n "$1" ]; then
        base_path=$1
    fi
    local cpt=1
    local file_path

    for url in ${download_links[@]}; do
        file_path="$base_path/report_$cpt.csv"
        curl -s $url --output "$file_path"
        echo "Report file $cpt downloaded: $file_path"
        let cpt++
    done
}

# Generate an access token
APP_KEY='<your_api_key>'
APP_SECRET='<your_api_secret>'
USERNAME='<your_username>'
PASSWORD='<your_password>'

echo "Generating access token..."
get_access_token $APP_KEY $APP_SECRET $USERNAME $PASSWORD

echo "Creating report request..."
dimensions=("DAY" "VIDEO_TITLE")
metrics=("VIEWS")
start_date="2018-07-01"
end_date="2018-07-04"
product="CONTENT"
filters=("videoOwnerChannelSlug=<your_channel_slug>")
create_report_request dimensions[@] metrics[@] $start_date $end_date filters[@] $product

download_links=()
while [ ${#download_links[@]} -eq 0 ]; do
    echo "Checking report status..."
    # Checks every 15secs the report status
    sleep 15
    check_report_status
done

download_report
#!/usr/bin/env php
<?php

/**
 * Authenticate on the API in order to get an access token
 */
function get_access_token($app_key, $app_secret, $username, $password) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://graphql.api.dailymotion.com/oauth/token');
    $headers = [
        'Content-Type: application/x-www-form-urlencoded'
    ];
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
        'client_id' => $app_key,
        'client_secret' => $app_secret,
        'username' => $username,
        'password' => $password,
        'grant_type' => 'password',
        'version' => '2'
    ]));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $response = curl_exec($ch);
    curl_close($ch);

    $tokens = json_decode($response, true);
    if (false === $tokens) {
        throw new \Exception('Invalid authentication response');
    }
    return $tokens['access_token'];
}

/**
 * Creating a report request
 */
function create_report_request($access_token, array $dimensions, array $metrics, $start_date, $end_date, $product, array $filters = []) {
    $report_request = [
        'query' => '
            mutation ($input: AskPartnerReportFileInput!) {
                askPartnerReportFile(input: $input) {
                    reportFile {
                        reportToken
                    }
                }
            }',
        'variables' => [
            'input' => [
                'metrics' => $metrics,
                'dimensions' => $dimensions,
                'filters' => $filters,
                'startDate' => $start_date,
                'endDate' => $end_date,
                'product' => $product
            ]
        ]
    ];

    $report_request = json_encode($report_request);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://graphql.api.dailymotion.com');
    $headers = [
        'Authorization: Bearer '.$access_token,
        'Content-Type: application/json',
        'Content-Length: ' . strlen($report_request)
    ];
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $report_request);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $response = curl_exec($ch);
    curl_close($ch);

    $report_info = json_decode($response, true);
    if (false === $report_info) {
        throw new \Exception('Invalid response');
    }
    return $report_info['data']['askPartnerReportFile']['reportFile']['reportToken'];
}

/**
 * Checking the status of the reporting request
 */
function check_report_status($access_token, $report_token) {
    $report_check_request = [
        'query' => '
            query PartnerGetReportFile ($reportToken: String!) {
                partner {
                    reportFile(reportToken: $reportToken) {
                        status
                        downloadLinks {
                            edges {
                                node {
                                    link
                                }
                            }
                        }
                    }
                }
            }
        ',
        'variables' => [
            'reportToken' => $report_token
        ]
    ];

    $report_check_request = json_encode($report_check_request);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://graphql.api.dailymotion.com');
    $headers = [
        'Authorization: Bearer '.$access_token,
        'Content-Type: application/json',
        'Content-Length: ' . strlen($report_check_request)
    ];
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $report_check_request);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $response = curl_exec($ch);
    curl_close($ch);

    $report_info = json_decode($response, true);
    if (false === $report_info) {
        throw new \Exception('Invalid response');
    }
    $report_status = $report_info['data']['partner']['reportFile']['status'];

    if ($report_status === 'FINISHED') {
        $download_links = [];
        foreach ($report_info['data']['partner']['reportFile']['downloadLinks']['edges'] as $edge) {
            $download_links[] = $edge['node']['link'];
        }

        return $download_links;
    } else {
        return null;
    }
}

/**
 * Downloading the report files
 */
function download_report($download_links, $base_path = null) {
    $cpt = 1;
    if (null === $base_path) {
        $base_path = getcwd();
    }
    foreach ($download_links as $url) {
        $file_path = sprintf("%s/report_%s.csv", $base_path, $cpt);
        file_put_contents($file_path, fopen($url, 'r'));
        echo  sprintf("Raport file %s downloaded: %s\n", $cpt, $file_path);
        $cpt += 1;
    }
}


$app_key = '<your_api_key>';
$app_secret = '<your_api_secret>';
$username = '<your_username>';
$password = '<your_password>';

echo  "Generating access token...\n";
$access_token = get_access_token($app_key, $app_secret, $username, $password);

$dimensions = ['DAY', 'VIDEO_TITLE'];
$metrics = ['VIEWS'];
$filters = [
    'videoOwnerChannelSlug' => '<your_channel_slug>'
];
$start_date = '2018-07-01';
$end_date = '2018-07-04';
$product = 'CONTENT';
echo  "Creating report request...\n";
$report_token = create_report_request($access_token, $dimensions, $metrics, $start_date, $end_date, $product, $filters);

$download_links = null;
while (!$download_links) {
    echo  "Checking report status...\n";
    // Checks every 15secs the report status
    sleep(15);
    $download_links = check_report_status($access_token, $report_token);
}

download_report($download_links);
#!/usr/bin/env python
import requests
import os
import time

def get_access_token(app_key, app_secret, username, password):
    '''
    Authenticate on the API in order to get an access token
    '''
    response = requests.post('https://graphql.api.dailymotion.com/oauth/token', data={
        'client_id': app_key,
        'client_secret': app_secret,
        'username': username,
        'password': password,
        'grant_type': 'password',
        'version': '2'
    })

    if response.status_code != 200 or not 'access_token' in response.json():
        raise Exception('Invalid authentication response')

    return response.json()['access_token']

def create_report_request(access_token, dimensions, metrics, start_date, end_date, product, filters = None):
    '''
    Creating a report request
    '''
    reportRequest = """
    mutation ($input: AskPartnerReportFileInput!) {
        askPartnerReportFile(input: $input) {
            reportFile {
                reportToken
            }
        }
    }
    """
    response = requests.post(
        'https://graphql.api.dailymotion.com',
        json={
            'query': reportRequest,
            'variables': {
                'input': {
                    'metrics': metrics,
                    'dimensions': dimensions,
                    'filters': filters,
                    'startDate': start_date,
                    'endDate': end_date,
                    'product': product,
                }
            }
        },
        headers={'Authorization': 'Bearer ' + access_token}
    )

    if response.status_code != 200 or not 'data' in response.json():
        raise Exception('Invalid response')

    return response.json()['data']['askPartnerReportFile']['reportFile']['reportToken'];

def check_report_status(access_token, report_token):
    '''
    Checking the status of the reporting request
    '''
    report_request_status_check = """
    query PartnerGetReportFile ($reportToken: String!) {
        partner {
            reportFile(reportToken: $reportToken) {
                status
                downloadLinks {
                    edges {
                        node {
                            link
                        }
                    }
                }
            }
        }
    }
    """
    response = requests.post(
        'https://graphql.api.dailymotion.com',
        json={
            'query': report_request_status_check,
            'variables': {
                'reportToken': report_token
            }
        },
        headers={'Authorization': 'Bearer ' + access_token}
    )

    if response.status_code != 200 or not 'data' in response.json():
        raise Exception('Invalid response')

    status = response.json()['data']['partner']['reportFile']['status'];

    if (status == 'FINISHED'):
        download_links = []
        for url in map(lambda edge: edge['node']['link'], response.json()['data']['partner']['reportFile']['downloadLinks']['edges']):
            download_links.append(url)
        return download_links
    else:
        return None

def download_report(download_links, base_path=None):
    '''
    Downloading the report files
    '''
    cpt = 1
    if not base_path:
        base_path = os.getcwd()

    for url in download_links:
        r = requests.get(url)
        filename = 'report_{}.csv'.format(cpt)
        file_path = os.path.join(base_path, filename)
        open(file_path, 'wb').write(r.content)
        print('Report file {} downloaded: {}'.format(cpt, file_path))
        cpt += 1

print('Generating access token...')
access_token = get_access_token(
    app_key='<your_api_key>',
    app_secret='<your_api_secret>',
    username='<your_username>',
    password='<your_password>'
)

print('Creating report request...')
report_token = create_report_request(
    access_token=access_token,
    dimensions=('DAY', 'VIDEO_TITLE'),
    metrics=('VIEWS'),
    filters={'videoOwnerChannelSlug': '<your_channel_slug>'},
    start_date='2018-07-01',
    end_date='2018-07-04',
    product='CONTENT',
)

download_links = None
while not download_links:
    print('Checking report status...')
    # Checks every 15secs the report status
    time.sleep(15)
    download_links = check_report_status(
        access_token=access_token,
        report_token=report_token
    )

download_report(download_links=download_links)

Dimensions, filters, and metrics

Note: dimensions, filters, and metrics are case sensitive and must be utilized as shown in these tables.

DimensionDefinitions
MONTHMonth
DAYDay
HOURHour
MINUTEMinute
CHANNEL_SLUGChannel owner’s channel URL Slug
VIDEO_OWNER_CHANNEL_SLUGContent owner’s channel URL Slug
VIDEO_IDVideo ID
VIDEO_TITLETitle of the video
MEDIA_TYPEType of video: LIVE or VIDEO
VISITOR_DOMAIN_GROUPVisitor domain
VISITOR_SUBDOMAINVisitor subdomain
VISITOR_PAGE_URLVisitor page URL
VISITOR_COUNTRYVisitor country
VISITOR_DEVICE_TYPEVisitor device type
MONETIZATION_TYPEMonetization category: video or website
INVENTORY_POSITIONPosition of the ad opportunity. Usually one of the following – preroll, midroll, postroll, ivv
OUTCOMEBreakdown of missed impression by category
NOAD_REASON_READABLENo ads grouped by why they were not available for monetization. Click here to learn more about no ad reason
AD_ERROR_READABLEAd errors returned by our advertising system for the selected metric
AD_ERROR_CODEAd error code returned by our advertising system for the selected metric
BUYERPotential and actual buyers of the inventory
BUYER_TYPEType of buyer of the inventory. Usually either P1 or Dailymotion
ACTIONAction defines how a view or inventory was generated by clarifying the stakeholders involved

Example my content played on other properties shows that the ad inventory was generated because one of my content was being played on another account’s website or application
AD_FORMATType of ad being displayed. Usually one of the following:
– instream: a video ad 
– display_preroll: a static image ad
PLAYER_IDID(s) of the player(s) used to play your content.
The ID(s) listed can be yours or from third parties.
PLAYER_TITLETitle(s) of the player(s) used to play your content.
The title(s) listed can be yours or from third parties.
PLAYLIST_IDID(s) of the playlist(s) used to play your content.
The ID(s) listed can be yours or from third parties.
PLAYLIST_TITLETitle(s) of the playlist(s) used to play your content.
The title(s) listed can be yours or from third parties.
FiltersDefinitionsTypePossible values
channelSlugLimits the result set to a specific channelVariable valuesN/A
videoOwnerChannelSlugLimits the result set to a specific video owner channelVariable valuesN/A
mediaTypeLimits the result set to a specific media type: LIVE or VIDEOFixed valuesVIDEOLIVE
visitorDomainGroupLimits the result set to a specific visitor domain groupVariable valuesN/A
monetizationTypeLimits the monetization category to either Video Monetization or Website MonetizationFixed valuesVideo monetizationWebsite monetizationclaim
MetricsDefinitions
VIEWSNumber of views
TIME_WATCHED_SECONDSTime watched in seconds
VIEW_THROUGH_RATEView through rate
UPLOADSVideos uploaded
LIVE_VIEWERSLive viewers
LIVE_TIME_WATCHED_SECONDSLive time watched
ESTIMATED_EARNINGS_USDEstimated earnings in USD
ESTIMATED_EARNINGS_EUREstimated earnings in EUR
TOTAL_INVENTORYTotal ad opportunities generated by your content or your embeds
NO_ADSAd opportunities identified to be not eligible for monetization
NO_AD_RATEShare of ad opportunities not eligible for monetization

No ad rate = No ads / Total inventory
SELLABLE_INVENTORYAd opportunities available for monetization
NB_IMPRESSIONTotal number of ads displayed
FILL_RATEShare of sellable inventories filled with an ad impression

Fill rate = Impressions / Sellable inventory
NB_MISSED_IMPRESSIONMonetizable ad opportunities that were not filled with an ad impression. It includes ad errors, timeouts and nofills

Missed impressions = Sellable inventory – impressions

eCPM
Estimated earnings per 1000 impressions (buyer type = Dailymotion only)

eCPM = (Estimated earnings / Impressions) * 1000
eRPMEstimated earnings per 1000 sellable inventory (buyer type = Dailymotion only)

eRPM = (Estimated earnings / sellable inventory) * 1000

Compatibility matrix

Not all metrics and dimensions can be combined in a single report. Refer to this table for guidance.

MetricsSupported dimensions
Audience dataVIEWS,
TIME_WATCHED_SECONDS,
VIEW_THROUGH_RATE
MONTH, DAY, HOUR, VIDEO_OWNER_CHANNEL_SLUG, VIDEO_ID, VIDEO_TITLE, MEDIA_TYPE, VISITOR_COUNTRY, VISITOR_DOMAIN_GROUP, VISITOR_SUBDOMAIN, VISITOR_PAGE_URL, VISITOR_DEVICE_TYPE, ACTION, PLAYER_ID, PLAYER_TITLE, PLAYLIST_ID, PLAYLIST_TITLE
Account dataUPLOADSMONTH, DAY,
VIDEO_OWNER_CHANNEL_SLUG, VIDEO_ID, VIDEO_TITLE
VISIBILITY
Live streaming dataLIVE_VIEWERS,
LIVE_TIME_WATCHED_SECONDS
MONTH, DAY, HOUR, MINUTE
VIDEO_OWNER_CHANNEL_SLUG, VIDEO_ID, VIDEO_TITLE
VISITOR_COUNTRY, VISITOR_DOMAIN_GROUP, VISITOR_SUBDOMAIN, VISITOR_DEVICE_TYPE, PLAYER_ID, PLAYER_TITLE
Revenue dataESTIMATED_EARNINGS_USD, 
ESTIMATED_EARNINGS_EUR,
ECPM_USD, ERPM_USD,
ECPM_EUR, ERPM_EUR
MONTH, DAY,
CHANNEL_SLUG, VIDEO_ID, VIDEO_TITLE
VISITOR_COUNTRY, VISITOR_DOMAIN_GROUP, VISITOR_SUBDOMAIN, VISITOR_PAGE_URL, VISITOR_DEVICE_TYPE,
INVENTORY_POSITION, ACTION, PLAYER_ID, PLAYER_TITLE, PLAYLIST_ID, PLAYLIST_TITLE
Ads dataTOTAL_INVENTORY, NO_ADS, NO_AD_RATE, SELLABLE_INVENTORY,  FILL_RATE, NB_IMPRESSION, NB_MISSED_IMPRESSION, AD_ERRORS, NO_FILLS, TIMEOUTS,
SELLABLE_INVENTORY,  FILL_RATE, NB_IMPRESSION, NB_MISSED_IMPRESSION, AD_ERRORS, NO_FILLS, TIMEOUTS
NB_MISSED_IMPRESSION
MONTH, DAY,
VIDEO_OWNER_CHANNEL_SLUG, VIDEO_ID, VIDEO_TITLE
VISITOR_COUNTRY, VISITOR_DOMAIN_GROUP, VISITOR_SUBDOMAIN, VISITOR_PAGE_URL, VISITOR_DEVICE_TYPE
INVENTORY_POSITION, ACTION

BUYER

OUTCOME, AD_ERROR_READABLE, AD_ERROR_CODE
AD_FORMAT

PLAYER_ID, PLAYER_TITLE
PLAYLIST_ID, PLAYLIST_TITLE
Quality dataIVT_SCORE, VIEWABILITY_SCORE
MONTH, DAY,
VISITOR_DOMAIN_GROUP, VISITOR_SUBDOMAIN, VISITOR_PAGE_URL, VISITOR_DEVICE_TYPE
PLAYER_SIZE_BUCKET
PLAYER_ID, PLAYER_TITLE

FiltersVIEWSTIME_WATCHED_SECONDSIMPRESSIONSESTIMATED_EARNINGS_*
channelSlug
videoOwnerChannelSlug
mediaType
visitorDomainGroup
monetizationType

Changelog

2022-07-25

You can now track Playlists and Players performances via the Reporting API:

  • 4 new dimensions have been added: PLAYER_ID, PLAYER_TITLE, PLAYLIST_ID, PLAYLIST_TITLE
  • The compatibility matrix has been updated with the new dimensions.

2022-03-16

  • 1 metric has been deprecated: Monetization_type
  • 2 new metrics have been added: eCPM and eRPM
  • 3 new dimensions have been added: Buyer_type, Action, Ad_format
  • The compatibily matrix has been updated with the new metrics and dimensions