CINXE.COM
PHP Code Samples | YouTube Analytics and Reporting APIs | Google for Developers
<!doctype html> <html lang="en" dir="ltr"> <head> <meta name="google-signin-client-id" content="721724668570-nbkv1cfusk7kk4eni4pjvepaus73b13t.apps.googleusercontent.com"> <meta name="google-signin-scope" content="profile email https://www.googleapis.com/auth/developerprofiles https://www.googleapis.com/auth/developerprofiles.award"> <meta property="og:site_name" content="Google for Developers"> <meta property="og:type" content="website"><meta name="theme-color" content="#ff0000"><meta charset="utf-8"> <meta content="IE=Edge" http-equiv="X-UA-Compatible"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="manifest" href="/_pwa/developers/manifest.json" crossorigin="use-credentials"> <link rel="preconnect" href="//www.gstatic.com" crossorigin> <link rel="preconnect" href="//fonts.gstatic.com" crossorigin> <link rel="preconnect" href="//fonts.googleapis.com" crossorigin> <link rel="preconnect" href="//apis.google.com" crossorigin> <link rel="preconnect" href="//www.google-analytics.com" crossorigin><link rel="stylesheet" href="//fonts.googleapis.com/css?family=Google+Sans:400,500|Roboto:400,400italic,500,500italic,700,700italic|Roboto+Mono:400,500,700&display=swap"> <link rel="stylesheet" href="//fonts.googleapis.com/css2?family=Material+Icons&family=Material+Symbols+Outlined&display=block"><link rel="stylesheet" href="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/developers/css/app.css"> <link rel="shortcut icon" href="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/developers/images/favicon-new.png"> <link rel="apple-touch-icon" href="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/developers/images/touchicon-180-new.png"><link rel="canonical" href="https://developers.google.com/youtube/reporting/v1/code_samples/php"><link rel="search" type="application/opensearchdescription+xml" title="Google for Developers" href="https://developers.google.com/s/opensearch.xml"> <link rel="alternate" hreflang="en" href="https://developers.google.com/youtube/reporting/v1/code_samples/php" /><link rel="alternate" hreflang="x-default" href="https://developers.google.com/youtube/reporting/v1/code_samples/php" /><link rel="alternate" hreflang="ar" href="https://developers.google.com/youtube/reporting/v1/code_samples/php?hl=ar" /><link rel="alternate" hreflang="bn" href="https://developers.google.com/youtube/reporting/v1/code_samples/php?hl=bn" /><link rel="alternate" hreflang="zh-Hans" href="https://developers.google.com/youtube/reporting/v1/code_samples/php?hl=zh-cn" /><link rel="alternate" hreflang="zh-Hant" href="https://developers.google.com/youtube/reporting/v1/code_samples/php?hl=zh-tw" /><link rel="alternate" hreflang="fa" href="https://developers.google.com/youtube/reporting/v1/code_samples/php?hl=fa" /><link rel="alternate" hreflang="fr" href="https://developers.google.com/youtube/reporting/v1/code_samples/php?hl=fr" /><link rel="alternate" hreflang="de" href="https://developers.google.com/youtube/reporting/v1/code_samples/php?hl=de" /><link rel="alternate" hreflang="he" href="https://developers.google.com/youtube/reporting/v1/code_samples/php?hl=he" /><link rel="alternate" hreflang="hi" href="https://developers.google.com/youtube/reporting/v1/code_samples/php?hl=hi" /><link rel="alternate" hreflang="id" href="https://developers.google.com/youtube/reporting/v1/code_samples/php?hl=id" /><link rel="alternate" hreflang="it" href="https://developers.google.com/youtube/reporting/v1/code_samples/php?hl=it" /><link rel="alternate" hreflang="ja" href="https://developers.google.com/youtube/reporting/v1/code_samples/php?hl=ja" /><link rel="alternate" hreflang="ko" href="https://developers.google.com/youtube/reporting/v1/code_samples/php?hl=ko" /><link rel="alternate" hreflang="pl" href="https://developers.google.com/youtube/reporting/v1/code_samples/php?hl=pl" /><link rel="alternate" hreflang="pt-BR" href="https://developers.google.com/youtube/reporting/v1/code_samples/php?hl=pt-br" /><link rel="alternate" hreflang="ru" href="https://developers.google.com/youtube/reporting/v1/code_samples/php?hl=ru" /><link rel="alternate" hreflang="es-419" href="https://developers.google.com/youtube/reporting/v1/code_samples/php?hl=es-419" /><link rel="alternate" hreflang="th" href="https://developers.google.com/youtube/reporting/v1/code_samples/php?hl=th" /><link rel="alternate" hreflang="tr" href="https://developers.google.com/youtube/reporting/v1/code_samples/php?hl=tr" /><link rel="alternate" hreflang="vi" href="https://developers.google.com/youtube/reporting/v1/code_samples/php?hl=vi" /><title>PHP Code Samples | YouTube Analytics and Reporting APIs | Google for Developers</title> <meta property="og:title" content="PHP Code Samples | YouTube Analytics and Reporting APIs | Google for Developers"><meta property="og:url" content="https://developers.google.com/youtube/reporting/v1/code_samples/php"><meta property="og:image" content="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/developers/images/opengraph/youtube-theme.png"> <meta property="og:image:width" content="1200"> <meta property="og:image:height" content="675"><meta property="og:locale" content="en"><meta name="twitter:card" content="summary_large_image"><script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Article", "headline": "PHP Code Samples" } </script><script type="application/ld+json"> { "@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [{ "@type": "ListItem", "position": 1, "name": "YouTube", "item": "https://developers.google.com/youtube" },{ "@type": "ListItem", "position": 2, "name": "Analytics and Reporting APIs", "item": "https://developers.google.com/youtube/analytics" },{ "@type": "ListItem", "position": 3, "name": "PHP Code Samples", "item": "https://developers.google.com/youtube/reporting/v1/code_samples/php" }] } </script> {# Vars for auth docs %} <link rel="stylesheet" href="/extras.css"></head> <body class="" template="page" theme="youtube-theme" type="article" layout="docs" concierge='closed' display-toc pending> <devsite-progress type="indeterminate" id="app-progress"></devsite-progress> <section class="devsite-wrapper"> <devsite-cookie-notification-bar></devsite-cookie-notification-bar><devsite-header role="banner"> <div class="devsite-header--inner nocontent"> <div class="devsite-top-logo-row-wrapper-wrapper"> <div class="devsite-top-logo-row-wrapper"> <div class="devsite-top-logo-row"> <button type="button" id="devsite-hamburger-menu" class="devsite-header-icon-button button-flat material-icons gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Navigation menu button" visually-hidden aria-label="Open menu"> </button> <div class="devsite-product-name-wrapper"> <a href="https://developers.google.com/youtube"> <div class="devsite-product-logo-container" size="medium" > <picture> <img class="devsite-product-logo" alt="YouTube" src="https://developers.google.com/static/site-assets/logo-youtube.svg" srcset=" /static/site-assets/logo-youtube.svg" sizes="64px" loading="lazy" > </picture> </div> </a> <span class="devsite-product-name"> <ul class="devsite-breadcrumb-list" aria-label="Product breadcrumb"> <li class="devsite-breadcrumb-item "> <a href="https://developers.google.com/youtube" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Upper Header" data-value="1" track-type="globalNav" track-name="breadcrumb" track-metadata-position="1" track-metadata-eventdetail="YouTube" > YouTube </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://developers.google.com/youtube/analytics" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Upper Header" data-value="2" track-type="globalNav" track-name="breadcrumb" track-metadata-position="2" track-metadata-eventdetail="YouTube Analytics and Reporting APIs" > Analytics and Reporting APIs </a> </li> </ul> </span> </div> <div class="devsite-top-logo-row-middle"> <div class="devsite-header-upper-tabs"> </div> <devsite-search enable-signin enable-search enable-suggestions enable-query-completion project-name="YouTube Analytics and Reporting APIs" tenant-name="Google for Developers" project-scope="/youtube/analytics" url-scoped="https://developers.google.com/s/results/youtube/analytics" > <form class="devsite-search-form" action="https://developers.google.com/s/results" method="GET"> <div class="devsite-search-container"> <button type="button" search-open class="devsite-search-button devsite-header-icon-button button-flat material-icons" aria-label="Open search"></button> <div class="devsite-searchbox"> <input aria-activedescendant="" aria-autocomplete="list" aria-label="Search" aria-expanded="false" aria-haspopup="listbox" autocomplete="off" class="devsite-search-field devsite-search-query" name="q" placeholder="Search" role="combobox" type="text" value="" > <div class="devsite-search-image material-icons" aria-hidden="true"> </div> <div class="devsite-search-shortcut-icon-container" aria-hidden="true"> <kbd class="devsite-search-shortcut-icon">/</kbd> </div> </div> </div> </form> <button type="button" search-close class="devsite-search-button devsite-header-icon-button button-flat material-icons" aria-label="Close search"></button> </devsite-search> </div> <devsite-language-selector> <ul role="presentation"> <li role="presentation"> <a role="menuitem" lang="en" >English</a> </li> <li role="presentation"> <a role="menuitem" lang="de" >Deutsch</a> </li> <li role="presentation"> <a role="menuitem" lang="es" >Español</a> </li> <li role="presentation"> <a role="menuitem" lang="es_419" >Español – América Latina</a> </li> <li role="presentation"> <a role="menuitem" lang="fr" >Français</a> </li> <li role="presentation"> <a role="menuitem" lang="id" >Indonesia</a> </li> <li role="presentation"> <a role="menuitem" lang="it" >Italiano</a> </li> <li role="presentation"> <a role="menuitem" lang="pl" >Polski</a> </li> <li role="presentation"> <a role="menuitem" lang="pt_br" >Português – Brasil</a> </li> <li role="presentation"> <a role="menuitem" lang="vi" >Tiếng Việt</a> </li> <li role="presentation"> <a role="menuitem" lang="tr" >Türkçe</a> </li> <li role="presentation"> <a role="menuitem" lang="ru" >Русский</a> </li> <li role="presentation"> <a role="menuitem" lang="he" >עברית</a> </li> <li role="presentation"> <a role="menuitem" lang="ar" >العربيّة</a> </li> <li role="presentation"> <a role="menuitem" lang="fa" >فارسی</a> </li> <li role="presentation"> <a role="menuitem" lang="hi" >हिंदी</a> </li> <li role="presentation"> <a role="menuitem" lang="bn" >বাংলা</a> </li> <li role="presentation"> <a role="menuitem" lang="th" >ภาษาไทย</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_cn" >中文 – 简体</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_tw" >中文 – 繁體</a> </li> <li role="presentation"> <a role="menuitem" lang="ja" >日本語</a> </li> <li role="presentation"> <a role="menuitem" lang="ko" >한국어</a> </li> </ul> </devsite-language-selector> <devsite-user enable-profiles fp-auth id="devsite-user"> <span class="button devsite-top-button" aria-hidden="true" visually-hidden>Sign in</span> </devsite-user> </div> </div> </div> <div class="devsite-collapsible-section "> <div class="devsite-header-background"> <div class="devsite-doc-set-nav-row"> <devsite-tabs class="lower-tabs"> <nav class="devsite-tabs-wrapper" aria-label="Lower tabs"> <tab > <a href="https://developers.google.com/youtube/analytics" track-metadata-eventdetail="https://developers.google.com/youtube/analytics" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - home" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Home" track-name="home" > Home </a> </tab> <tab > <a href="https://developers.google.com/youtube/reporting" track-metadata-eventdetail="https://developers.google.com/youtube/reporting" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - overview" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Overview" track-name="overview" > Overview </a> </tab> <tab > <a href="https://developers.google.com/youtube/reporting/guides/authorization" track-metadata-eventdetail="https://developers.google.com/youtube/reporting/guides/authorization" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - authorization" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Authorization" track-name="authorization" > Authorization </a> </tab> <tab > <a href="https://developers.google.com/youtube/reporting/v1/reports" track-metadata-eventdetail="https://developers.google.com/youtube/reporting/v1/reports" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - bulk reports" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Bulk Reports" track-name="bulk reports" > Bulk Reports </a> </tab> <tab > <a href="https://developers.google.com/youtube/analytics/data_model" track-metadata-eventdetail="https://developers.google.com/youtube/analytics/data_model" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - targeted queries" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Targeted Queries" track-name="targeted queries" > Targeted Queries </a> </tab> <tab class="devsite-active"> <a href="https://developers.google.com/youtube/reporting/v1/code_samples" track-metadata-eventdetail="https://developers.google.com/youtube/reporting/v1/code_samples" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - resources" track-metadata-module="primary nav" aria-label="Resources, selected" data-category="Site-Wide Custom Events" data-label="Tab: Resources" track-name="resources" > Resources </a> </tab> </nav> </devsite-tabs> </div> </div> </div> </div> </devsite-header> <devsite-book-nav scrollbars > <div class="devsite-book-nav-filter" > <span class="filter-list-icon material-icons" aria-hidden="true"></span> <input type="text" placeholder="Filter" aria-label="Type to filter" role="searchbox"> <span class="filter-clear-button hidden" data-title="Clear filter" aria-label="Clear filter" role="button" tabindex="0"></span> </div> <nav class="devsite-book-nav devsite-nav nocontent" aria-label="Side menu"> <div class="devsite-mobile-header"> <button type="button" id="devsite-close-nav" class="devsite-header-icon-button button-flat material-icons gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Close navigation" aria-label="Close navigation"> </button> <div class="devsite-product-name-wrapper"> <a href="https://developers.google.com/youtube"> <div class="devsite-product-logo-container" size="medium" > <picture> <img class="devsite-product-logo" alt="YouTube" src="https://developers.google.com/static/site-assets/logo-youtube.svg" srcset=" /static/site-assets/logo-youtube.svg" sizes="64px" loading="lazy" > </picture> </div> </a> <span class="devsite-product-name"> <ul class="devsite-breadcrumb-list" aria-label="Upper header breadcrumb"> <li class="devsite-breadcrumb-item "> <a href="https://developers.google.com/youtube" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Upper Header" data-value="1" track-type="globalNav" track-name="breadcrumb" track-metadata-position="1" track-metadata-eventdetail="YouTube" > YouTube </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://developers.google.com/youtube/analytics" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Upper Header" data-value="2" track-type="globalNav" track-name="breadcrumb" track-metadata-position="2" track-metadata-eventdetail="YouTube Analytics and Reporting APIs" > Analytics and Reporting APIs </a> </li> </ul> </span> </div> </div> <div class="devsite-book-nav-wrapper"> <div class="devsite-mobile-nav-top"> <ul class="devsite-nav-list"> <li class="devsite-nav-item"> <a href="/youtube/analytics" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Home" track-name="home" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Home" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Home </span> </a> </li> <li class="devsite-nav-item"> <a href="/youtube/reporting" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Overview" track-name="overview" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Overview" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Overview </span> </a> </li> <li class="devsite-nav-item"> <a href="/youtube/reporting/guides/authorization" class="devsite-nav-title gc-analytics-event devsite-nav-has-children " data-category="Site-Wide Custom Events" data-label="Tab: Authorization" track-name="authorization" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Authorization" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Authorization </span> <span class="devsite-nav-icon material-icons" data-icon="forward" > </span> </a> </li> <li class="devsite-nav-item"> <a href="/youtube/reporting/v1/reports" class="devsite-nav-title gc-analytics-event devsite-nav-has-children " data-category="Site-Wide Custom Events" data-label="Tab: Bulk Reports" track-name="bulk reports" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Bulk Reports" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Bulk Reports </span> <span class="devsite-nav-icon material-icons" data-icon="forward" > </span> </a> </li> <li class="devsite-nav-item"> <a href="/youtube/analytics/data_model" class="devsite-nav-title gc-analytics-event devsite-nav-has-children " data-category="Site-Wide Custom Events" data-label="Tab: Targeted Queries" track-name="targeted queries" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Targeted Queries" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Targeted Queries </span> <span class="devsite-nav-icon material-icons" data-icon="forward" > </span> </a> </li> <li class="devsite-nav-item"> <a href="/youtube/reporting/v1/code_samples" class="devsite-nav-title gc-analytics-event devsite-nav-has-children devsite-nav-active" data-category="Site-Wide Custom Events" data-label="Tab: Resources" track-name="resources" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Resources" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Resources </span> <span class="devsite-nav-icon material-icons" data-icon="forward" > </span> </a> </li> </ul> </div> <div class="devsite-mobile-nav-bottom"> <ul class="devsite-nav-list" menu="_book"> <li class="devsite-nav-item"><a href="/youtube/reporting/v1/code_samples" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /youtube/reporting/v1/code_samples" track-type="bookNav" track-name="click" track-metadata-eventdetail="/youtube/reporting/v1/code_samples" ><span class="devsite-nav-text" tooltip>Summary</span></a></li> <li class="devsite-nav-item"><a href="/youtube/reporting/tools" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /youtube/reporting/tools" track-type="bookNav" track-name="click" track-metadata-eventdetail="/youtube/reporting/tools" ><span class="devsite-nav-text" tooltip>Overview</span></a></li> <li class="devsite-nav-item devsite-nav-break"></li> <li class="devsite-nav-item devsite-nav-heading"><div class="devsite-nav-title devsite-nav-title-no-path"> <span class="devsite-nav-text" tooltip>Code samples</span> </div></li> <li class="devsite-nav-item"><a href="/youtube/reporting/v1/code_samples/java" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /youtube/reporting/v1/code_samples/java" track-type="bookNav" track-name="click" track-metadata-eventdetail="/youtube/reporting/v1/code_samples/java" ><span class="devsite-nav-text" tooltip>Java</span></a></li> <li class="devsite-nav-item"><a href="/youtube/analytics/v1/code_samples/javascript" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /youtube/analytics/v1/code_samples/javascript" track-type="bookNav" track-name="click" track-metadata-eventdetail="/youtube/analytics/v1/code_samples/javascript" ><span class="devsite-nav-text" tooltip>JavaScript</span></a></li> <li class="devsite-nav-item"><a href="/youtube/reporting/v1/code_samples/php" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /youtube/reporting/v1/code_samples/php" track-type="bookNav" track-name="click" track-metadata-eventdetail="/youtube/reporting/v1/code_samples/php" ><span class="devsite-nav-text" tooltip>PHP</span></a></li> <li class="devsite-nav-item"><a href="/youtube/reporting/v1/code_samples/python" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /youtube/reporting/v1/code_samples/python" track-type="bookNav" track-name="click" track-metadata-eventdetail="/youtube/reporting/v1/code_samples/python" ><span class="devsite-nav-text" tooltip>Python</span></a></li> <li class="devsite-nav-item devsite-nav-heading"><div class="devsite-nav-title devsite-nav-title-no-path"> <span class="devsite-nav-text" tooltip>APIs Explorer</span> </div></li> <li class="devsite-nav-item devsite-nav-external"><a href="https://developers.google.com/apis-explorer/#p/youtubeReporting/v1/" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: https://developers.google.com/apis-explorer/#p/youtubeReporting/v1/" track-type="bookNav" track-name="click" track-metadata-eventdetail="https://developers.google.com/apis-explorer/#p/youtubeReporting/v1/" ><span class="devsite-nav-text" tooltip>Targeted queries</span><span class="devsite-nav-icon material-icons" data-icon="external" data-title="External" aria-hidden="true"></span></a></li> <li class="devsite-nav-item devsite-nav-external"><a href="https://developers.google.com/apis-explorer/#p/youtubeReporting/v1/" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: https://developers.google.com/apis-explorer/#p/youtubeReporting/v1/" track-type="bookNav" track-name="click" track-metadata-eventdetail="https://developers.google.com/apis-explorer/#p/youtubeReporting/v1/" ><span class="devsite-nav-text" tooltip>Bulk reports</span><span class="devsite-nav-icon material-icons" data-icon="external" data-title="External" aria-hidden="true"></span></a></li> <li class="devsite-nav-item devsite-nav-break"></li> <li class="devsite-nav-item devsite-nav-heading"><div class="devsite-nav-title devsite-nav-title-no-path"> <span class="devsite-nav-text" tooltip>Client Libraries</span> </div></li> <li class="devsite-nav-item devsite-nav-external"><a href="https://github.com/google/google-api-go-client" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: https://github.com/google/google-api-go-client" track-type="bookNav" track-name="click" track-metadata-eventdetail="https://github.com/google/google-api-go-client" ><span class="devsite-nav-text" tooltip>Go</span><span class="devsite-nav-icon material-icons" data-icon="external" data-title="External" aria-hidden="true"></span></a></li> <li class="devsite-nav-item devsite-nav-external"><a href="/api-client-library/java" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /api-client-library/java" track-type="bookNav" track-name="click" track-metadata-eventdetail="/api-client-library/java" ><span class="devsite-nav-text" tooltip>Java</span><span class="devsite-nav-icon material-icons" data-icon="external" data-title="External" aria-hidden="true"></span></a></li> <li class="devsite-nav-item devsite-nav-external"><a href="/api-client-library/javascript/start/start-js" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /api-client-library/javascript/start/start-js" track-type="bookNav" track-name="click" track-metadata-eventdetail="/api-client-library/javascript/start/start-js" ><span class="devsite-nav-text" tooltip>JavaScript</span><span class="devsite-nav-icon material-icons" data-icon="external" data-title="External" aria-hidden="true"></span></a></li> <li class="devsite-nav-item devsite-nav-external"><a href="/api-client-library/dotnet/get_started" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /api-client-library/dotnet/get_started" track-type="bookNav" track-name="click" track-metadata-eventdetail="/api-client-library/dotnet/get_started" ><span class="devsite-nav-text" tooltip>.NET</span><span class="devsite-nav-icon material-icons" data-icon="external" data-title="External" aria-hidden="true"></span></a></li> <li class="devsite-nav-item devsite-nav-external"><a href="/api-client-library/php" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /api-client-library/php" track-type="bookNav" track-name="click" track-metadata-eventdetail="/api-client-library/php" ><span class="devsite-nav-text" tooltip>PHP</span><span class="devsite-nav-icon material-icons" data-icon="external" data-title="External" aria-hidden="true"></span></a></li> <li class="devsite-nav-item devsite-nav-external"><a href="/api-client-library/python" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /api-client-library/python" track-type="bookNav" track-name="click" track-metadata-eventdetail="/api-client-library/python" ><span class="devsite-nav-text" tooltip>Python</span><span class="devsite-nav-icon material-icons" data-icon="external" data-title="External" aria-hidden="true"></span></a></li> <li class="devsite-nav-item devsite-nav-external"><a href="/api-client-library/ruby/start/get_started" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /api-client-library/ruby/start/get_started" track-type="bookNav" track-name="click" track-metadata-eventdetail="/api-client-library/ruby/start/get_started" ><span class="devsite-nav-text" tooltip>Ruby</span><span class="devsite-nav-icon material-icons" data-icon="external" data-title="External" aria-hidden="true"></span></a></li> </ul> </div> </div> </nav> </devsite-book-nav> <section id="gc-wrapper"> <main role="main" class="devsite-main-content" has-book-nav > <devsite-content> <article class="devsite-article"><style> .yt-reporting-api-report-name { color: red; font: 500 16px/32px Roboto,sans-serif; } .yt-reporting-api-section .kd-tabbutton { max-width: 340px; } section.yt-reporting-api-section header.kd-tabbutton { text-transform: lowercase; } article.yt-reporting-api-report div { padding: 10px 10px; } article.yt-reporting-api-report div.current-report { background: #e0f2f1; color: #00897b; font-weight: bold } article.yt-reporting-api-report div.deprecated-report { background: #fff3e0; color: #dd2c00; } article.yt-reporting-api-report div.obsolete-report { background: #fbe9e7; color: #d50000; } </style> <div class="devsite-article-meta nocontent" role="navigation"> <ul class="devsite-breadcrumb-list" aria-label="Breadcrumb"> <li class="devsite-breadcrumb-item "> <a href="https://developers.google.com/" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="1" track-type="globalNav" track-name="breadcrumb" track-metadata-position="1" track-metadata-eventdetail="" > Home </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://developers.google.com/products" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="2" track-type="globalNav" track-name="breadcrumb" track-metadata-position="2" track-metadata-eventdetail="" > Products </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://developers.google.com/youtube" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="3" track-type="globalNav" track-name="breadcrumb" track-metadata-position="3" track-metadata-eventdetail="YouTube" > YouTube </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://developers.google.com/youtube/analytics" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="4" track-type="globalNav" track-name="breadcrumb" track-metadata-position="4" track-metadata-eventdetail="YouTube Analytics and Reporting APIs" > Analytics and Reporting APIs </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://developers.google.com/youtube/reporting/v1/code_samples" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="5" track-type="globalNav" track-name="breadcrumb" track-metadata-position="5" track-metadata-eventdetail="" > Resources </a> </li> </ul> <devsite-thumb-rating position="header"> </devsite-thumb-rating> </div> <h1 class="devsite-page-title" tabindex="-1"> PHP Code Samples </h1> <devsite-feature-tooltip ack-key="AckCollectionsBookmarkTooltipDismiss" analytics-category="Site-Wide Custom Events" analytics-action-show="Callout Profile displayed" analytics-action-close="Callout Profile dismissed" analytics-label="Create Collection Callout" class="devsite-page-bookmark-tooltip nocontent" dismiss-button="true" id="devsite-collections-dropdown" dismiss-button-text="Dismiss" close-button-text="Got it"> <devsite-bookmark></devsite-bookmark> <span slot="popout-heading"> Stay organized with collections </span> <span slot="popout-contents"> Save and categorize content based on your preferences. </span> </devsite-feature-tooltip> <div class="devsite-page-title-meta"><devsite-view-release-notes></devsite-view-release-notes></div> <devsite-toc class="devsite-nav" depth="2" devsite-toc-embedded > </devsite-toc> <div class="devsite-article-body clearfix "> <p>The following code samples, which use the <a href="https://developers.google.com/api-client-library/php/">Google API Client Library for <span class="notranslate">PHP</span></a>, are available for the <span class="notranslate">YouTube Reporting API</span>. You can download these code samples from the <code translate="no" dir="ltr">php</code> folder of the <a href="https://github.com/youtube/api-samples">YouTube APIs code sample repository on GitHub</a>. </p> <ol style="list-style-type: none"> <li><a href="#create_a_reporting_job">Create a reporting job</a> (<code translate="no" dir="ltr"><a href="/youtube/reporting/v1/reference/rest/v1/reportTypes/list">reportTypes.list</a></code>, <code translate="no" dir="ltr"><a href="/youtube/reporting/v1/reference/rest/v1/jobs/create">jobs.create</a></code>)</li> <li><a href="#retrieve_reports">Retrieve reports</a> (<code translate="no" dir="ltr"><a href="/youtube/reporting/v1/reference/rest/v1/jobs/list">jobs.list</a></code>, <code translate="no" dir="ltr"><a href="/youtube/reporting/v1/reference/rest/v1/jobs.reports/list">jobs.reports.list</a></code>)</li> </ol> <h2 id="create_a_reporting_job" data-text="Create a reporting job" tabindex="-1">Create a reporting job</h2> <p>This sample demonstrates how to create a reporting job. It calls the <code translate="no" dir="ltr">reportTypes.list</code> method to retrieve a list of available report types. It then calls the <code translate="no" dir="ltr">jobs.create</code> method to create a new reporting job.</p> <div></div><devsite-code><pre class="devsite-click-to-copy notranslate" dir="ltr" is-upgraded syntax="PHP"><<span class="devsite-syntax-x">?php</span> <span class="devsite-syntax-x">/**</span> <span class="devsite-syntax-x"> * This sample creates a reporting job by:</span> <span class="devsite-syntax-x"> *</span> <span class="devsite-syntax-x"> * 1. Listing the available report types using the "reportTypes.list" method.</span> <span class="devsite-syntax-x"> * 2. Creating a reporting job using the "jobs.create" method.</span> <span class="devsite-syntax-x"> *</span> <span class="devsite-syntax-x"> * @author Ibrahim Ulukaya</span> <span class="devsite-syntax-x"> */</span> <span class="devsite-syntax-x">/**</span> <span class="devsite-syntax-x"> * Library Requirements</span> <span class="devsite-syntax-x"> *</span> <span class="devsite-syntax-x"> * 1. Install composer (https://getcomposer.org)</span> <span class="devsite-syntax-x"> * 2. On the command line, change to this directory (api-samples/php)</span> <span class="devsite-syntax-x"> * 3. Require the google/apiclient library</span> <span class="devsite-syntax-x"> * $ composer require google/apiclient:~2.0</span> <span class="devsite-syntax-x"> */</span> <span class="devsite-syntax-x">if (!file_exists(__DIR__ . '/vendor/autoload.php')) {</span> <span class="devsite-syntax-x"> throw new \Exception('please run "composer require google/apiclient:~2.0" in "' . __DIR__ .'"');</span> <span class="devsite-syntax-x">}</span> <span class="devsite-syntax-x">require_once __DIR__ . '/vendor/autoload.php';</span> <span class="devsite-syntax-x">session_start();</span> <span class="devsite-syntax-x">/*</span> <span class="devsite-syntax-x"> * You can acquire an OAuth 2.0 client ID and client secret from the</span> <span class="devsite-syntax-x"> * {{ Google Cloud Console }} <{{ https://cloud.google.com/console }}</span>> <span class="devsite-syntax-x"> * For more information about using OAuth 2.0 to access Google APIs, please see:</span> <span class="devsite-syntax-x"> * <https://developers.google.com/youtube/v3/guides/authentication></span> <span class="devsite-syntax-x"> * Please ensure that you have enabled the YouTube Data API for your project.</span> <span class="devsite-syntax-x"> */</span> <span class="devsite-syntax-x">$OAUTH2_CLIENT_ID = 'REPLACE_ME';</span> <span class="devsite-syntax-x">$OAUTH2_CLIENT_SECRET = 'REPLACE_ME';</span> <span class="devsite-syntax-x">$client = new Google_Client();</span> <span class="devsite-syntax-x">$client->setClientId($OAUTH2_CLIENT_ID);</span> <span class="devsite-syntax-x">$client->setClientSecret($OAUTH2_CLIENT_SECRET);</span> <span class="devsite-syntax-x">/*</span> <span class="devsite-syntax-x"> * This OAuth 2.0 access scope allows for read access to the YouTube Analytics monetary reports for</span> <span class="devsite-syntax-x"> * authenticated user's account. Any request that retrieves earnings or ad performance metrics must</span> <span class="devsite-syntax-x"> * use this scope.</span> <span class="devsite-syntax-x"> */</span> <span class="devsite-syntax-x">$client->setScopes('https://www.googleapis.com/auth/yt-analytics-monetary.readonly');</span> <span class="devsite-syntax-x">$redirect = filter_var('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'],</span> <span class="devsite-syntax-x"> FILTER_SANITIZE_URL);</span> <span class="devsite-syntax-x">$client->setRedirectUri($redirect);</span> <span class="devsite-syntax-x">// YouTube Reporting object used to make YouTube Reporting API requests.</span> <span class="devsite-syntax-x">$youtubeReporting = new Google_Service_YouTubeReporting($client);</span> <span class="devsite-syntax-x">// Check if an auth token exists for the required scopes</span> <span class="devsite-syntax-x">$tokenSessionKey = 'token-' . $client->prepareScopes();</span> <span class="devsite-syntax-x">if (isset($_GET['code'])) {</span> <span class="devsite-syntax-x"> if (strval($_SESSION['state']) !== strval($_GET['state'])) {</span> <span class="devsite-syntax-x"> die('The session state did not match.');</span> <span class="devsite-syntax-x"> }</span> <span class="devsite-syntax-x"> $client->authenticate($_GET['code']);</span> <span class="devsite-syntax-x"> $_SESSION[$tokenSessionKey] = $client->getAccessToken();</span> <span class="devsite-syntax-x"> header('Location: ' . $redirect);</span> <span class="devsite-syntax-x">}</span> <span class="devsite-syntax-x">if (isset($_SESSION[$tokenSessionKey])) {</span> <span class="devsite-syntax-x"> $client->setAccessToken($_SESSION[$tokenSessionKey]);</span> <span class="devsite-syntax-x">}</span> <span class="devsite-syntax-x">// Check to ensure that the access token was successfully acquired.</span> <span class="devsite-syntax-x">if ($client->getAccessToken()) {</span> <span class="devsite-syntax-x"> // This code executes if the user enters a name in the form</span> <span class="devsite-syntax-x"> // and submits the form. Otherwise, the page displays the form above.</span> <span class="devsite-syntax-x"> try {</span> <span class="devsite-syntax-x"> if (empty(listReportTypes($youtubeReporting, $htmlBody))) {</span> <span class="devsite-syntax-x"> $htmlBody .= sprintf('<p>No report types found.</p>');</span> <span class="devsite-syntax-x"> } else if ($_GET['reportTypeId']){</span> <span class="devsite-syntax-x"> createReportingJob($youtubeReporting, $_GET['reportTypeId'], $_GET['jobName'], $htmlBody);</span> <span class="devsite-syntax-x"> }</span> <span class="devsite-syntax-x"> } catch (Google_Service_Exception $e) {</span> <span class="devsite-syntax-x"> $htmlBody = sprintf('<p>A service error occurred: <code>%s</code></p>',</span> <span class="devsite-syntax-x"> htmlspecialchars($e->getMessage()));</span> <span class="devsite-syntax-x"> } catch (Google_Exception $e) {</span> <span class="devsite-syntax-x"> $htmlBody = sprintf('<p>An client error occurred: <code>%s</code></p>',</span> <span class="devsite-syntax-x"> htmlspecialchars($e->getMessage()));</span> <span class="devsite-syntax-x"> }</span> <span class="devsite-syntax-x"> $_SESSION[$tokenSessionKey] = $client->getAccessToken();</span> <span class="devsite-syntax-x">} elseif ($OAUTH2_CLIENT_ID == 'REPLACE_ME') {</span> <span class="devsite-syntax-x"> $htmlBody = <<<END</span> <span class="devsite-syntax-x"> <h3>Client Credentials Required</h3></span> <span class="devsite-syntax-x"> <p></span> <span class="devsite-syntax-x"> You need to set <code>\$OAUTH2_CLIENT_ID</code> and</span> <span class="devsite-syntax-x"> <code>\$OAUTH2_CLIENT_ID</code> before proceeding.</span> <span class="devsite-syntax-x"> <p></span> <span class="devsite-syntax-x">END;</span> <span class="devsite-syntax-x">} else {</span> <span class="devsite-syntax-x"> // If the user hasn't authorized the app, initiate the OAuth flow</span> <span class="devsite-syntax-x"> $state = mt_rand();</span> <span class="devsite-syntax-x"> $client->setState($state);</span> <span class="devsite-syntax-x"> $_SESSION['state'] = $state;</span> <span class="devsite-syntax-x"> $authUrl = $client->createAuthUrl();</span> <span class="devsite-syntax-x"> $htmlBody = <<<END</span> <span class="devsite-syntax-x"> <h3>Authorization Required</h3></span> <span class="devsite-syntax-x"> <p>You need to <a href="$authUrl">authorize access</a> before proceeding.<p></span> <span class="devsite-syntax-x">END;</span> <span class="devsite-syntax-x">}</span> <span class="devsite-syntax-x">/**</span> <span class="devsite-syntax-x"> * Creates a reporting job. (jobs.create)</span> <span class="devsite-syntax-x"> *</span> <span class="devsite-syntax-x"> * @param Google_Service_YouTubereporting $youtubeReporting YouTube Reporting service object.</span> <span class="devsite-syntax-x"> * @param string $reportTypeId Id of the job's report type.</span> <span class="devsite-syntax-x"> * @param string $name name of the job.</span> <span class="devsite-syntax-x"> * @param $htmlBody - html body.</span> <span class="devsite-syntax-x"> */</span> <span class="devsite-syntax-x">function createReportingJob(Google_Service_YouTubeReporting $youtubeReporting, $reportTypeId,</span> <span class="devsite-syntax-x"> $name, &$htmlBody) {</span> <span class="devsite-syntax-x"> # Create a reporting job with a name and a report type id.</span> <span class="devsite-syntax-x"> $reportingJob = new Google_Service_YouTubeReporting_Job();</span> <span class="devsite-syntax-x"> $reportingJob->setReportTypeId($reportTypeId);</span> <span class="devsite-syntax-x"> $reportingJob->setName($name);</span> <span class="devsite-syntax-x"> // Call the YouTube Reporting API's jobs.create method to create a job.</span> <span class="devsite-syntax-x"> $jobCreateResponse = $youtubeReporting->jobs->create($reportingJob);</span> <span class="devsite-syntax-x"> $htmlBody .= "<h2>Created reporting job</h2><ul>";</span> <span class="devsite-syntax-x"> $htmlBody .= sprintf('<li>"%s" for reporting type "%s" at "%s"</li>',</span> <span class="devsite-syntax-x"> $jobCreateResponse['name'], $jobCreateResponse['reportTypeId'], $jobCreateResponse['createTime']);</span> <span class="devsite-syntax-x"> $htmlBody .= '</ul>';</span> <span class="devsite-syntax-x">}</span> <span class="devsite-syntax-x">/**</span> <span class="devsite-syntax-x"> * Returns a list of report types. (reportTypes.listReportTypes)</span> <span class="devsite-syntax-x"> *</span> <span class="devsite-syntax-x"> * @param Google_Service_YouTubereporting $youtubeReporting YouTube Reporting service object.</span> <span class="devsite-syntax-x"> * @param $htmlBody - html body.</span> <span class="devsite-syntax-x"> */</span> <span class="devsite-syntax-x">function listReportTypes(Google_Service_YouTubeReporting $youtubeReporting, &$htmlBody) {</span> <span class="devsite-syntax-x"> // Call the YouTube Reporting API's reportTypes.list method to retrieve report types.</span> <span class="devsite-syntax-x"> $reportTypes = $youtubeReporting->reportTypes->listReportTypes();</span> <span class="devsite-syntax-x"> $htmlBody .= "<h3>Report Types</h3><ul>";</span> <span class="devsite-syntax-x"> foreach ($reportTypes as $reportType) {</span> <span class="devsite-syntax-x"> $htmlBody .= sprintf('<li>id: "%s", name: "%s"</li>', $reportType['id'], $reportType['name']);</span> <span class="devsite-syntax-x"> }</span> <span class="devsite-syntax-x"> $htmlBody .= '</ul>';</span> <span class="devsite-syntax-x"> return $reportTypes;</span> <span class="devsite-syntax-x">}</span> <span class="devsite-syntax-x">?</span>> <<span class="devsite-syntax-x">!doctype html</span>> <<span class="devsite-syntax-x">html</span>> <<span class="devsite-syntax-x">head</span>> <<span class="devsite-syntax-x">title>Create a reporting job</title></span> <<span class="devsite-syntax-x">/head</span>> <<span class="devsite-syntax-x">body</span>> <span class="devsite-syntax-x"> <form method="GET"></span> <span class="devsite-syntax-x"> <div></span> <span class="devsite-syntax-x"> Job Name: <input type="text" id="jobName" name="jobName" placeholder="Enter Job Name"></span> <span class="devsite-syntax-x"> </div></span> <span class="devsite-syntax-x"> <br></span> <span class="devsite-syntax-x"> <div></span> <span class="devsite-syntax-x"> Report Type Id: <input type="text" id="reportTypeId" name="reportTypeId" placeholder="Enter Report Type Id"></span> <span class="devsite-syntax-x"> </div></span> <span class="devsite-syntax-x"> <br></span> <span class="devsite-syntax-x"> <input type="submit" value="Create!"></span> <span class="devsite-syntax-x"> </form></span> <span class="devsite-syntax-x"> <?=$htmlBody?></span> <<span class="devsite-syntax-x">/body</span>> <<span class="devsite-syntax-x">/html</span>> <div class="devsite-github-link nocode no-select"><a target="_top" href="https://github.com/youtube/api-samples/blob/07263305b59a7c3275bc7e925f9ce6cabf774022/php/create_reporting_job.php" class="gc-analytics-event" data-category="github_link" data-label="youtube/api-samples/php/create_reporting_job.php" data-code-snippet="true" data-github-path="youtube/api-samples/php/create_reporting_job.php"><span class="devsite-syntax-x">create_reporting_job.php</span></a></div></pre></devsite-code> <h2 id="retrieve_reports" data-text="Retrieve reports" tabindex="-1">Retrieve reports</h2> <p>This sample demonstrates how to retrieve reports created by a specific job. It calls the <code translate="no" dir="ltr">jobs.list</code> method to retrieve reporting jobs. It then calls the <code translate="no" dir="ltr">reports.list</code> method with the <code translate="no" dir="ltr">jobId</code> parameter set to a specific job ID to retrieve reports created by that job. Finally, the sample prints out the download URL for each report.</p> <div></div><devsite-code><pre class="devsite-click-to-copy notranslate" dir="ltr" is-upgraded syntax="PHP"><<span class="devsite-syntax-x">?php</span> <span class="devsite-syntax-x">/**</span> <span class="devsite-syntax-x"> * This sample supports the following use cases:</span> <span class="devsite-syntax-x"> *</span> <span class="devsite-syntax-x"> * 1. Retrieve reporting jobs by content owner:</span> <span class="devsite-syntax-x"> * Ex: php retrieve_reports.php --contentOwner=="CONTENT_OWNER_ID"</span> <span class="devsite-syntax-x"> * Ex: php retrieve_reports.php --contentOwner=="CONTENT_OWNER_ID" --includeSystemManaged==True</span> <span class="devsite-syntax-x"> * 2. Retrieving list of downloadable reports for a particular job:</span> <span class="devsite-syntax-x"> * Ex: php retrieve_reports.php --contentOwner=="CONTENT_OWNER_ID" --jobId="JOB_ID"</span> <span class="devsite-syntax-x"> * 3. Download a report:</span> <span class="devsite-syntax-x"> * Ex: php retrieve_reports.php --contentOwner=="CONTENT_OWNER_ID" --downloadUrl="DOWNLOAD_URL" --outputFile="report.txt"</span> <span class="devsite-syntax-x"> */</span> <span class="devsite-syntax-x">/**</span> <span class="devsite-syntax-x"> * Library Requirements</span> <span class="devsite-syntax-x"> *</span> <span class="devsite-syntax-x"> * 1. Install composer (https://getcomposer.org)</span> <span class="devsite-syntax-x"> * 2. On the command line, change to this directory (api-samples/php)</span> <span class="devsite-syntax-x"> * 3. Require the google/apiclient library</span> <span class="devsite-syntax-x"> * $ composer require google/apiclient:~2.0</span> <span class="devsite-syntax-x"> */</span> <span class="devsite-syntax-x">if (!file_exists(__DIR__ . '/vendor/autoload.php')) {</span> <span class="devsite-syntax-x"> throw new \Exception('please run "composer require google/apiclient:~2.2.0" in "' . __DIR__ .'"');</span> <span class="devsite-syntax-x">}</span> <span class="devsite-syntax-x">require_once __DIR__ . '/vendor/autoload.php';</span> <span class="devsite-syntax-x">session_start();</span> <span class="devsite-syntax-x">define('CREDENTIALS_PATH', '~/.credentials/youtube-php.json');</span> <span class="devsite-syntax-x">$longOptions = array(</span> <span class="devsite-syntax-x"> 'contentOwner::',</span> <span class="devsite-syntax-x"> 'downloadUrl::',</span> <span class="devsite-syntax-x"> 'includeSystemManaged::',</span> <span class="devsite-syntax-x"> 'jobId::',</span> <span class="devsite-syntax-x"> 'outputFile::',</span> <span class="devsite-syntax-x">);</span> <span class="devsite-syntax-x">$options = getopt('', $longOptions);</span> <span class="devsite-syntax-x">$CONTENT_OWNER_ID = ($options['contentOwner'] ? $options['contentOwner'] : '');</span> <span class="devsite-syntax-x">$DOWNLOAD_URL = (array_key_exists('downloadUrl', $options) ?</span> <span class="devsite-syntax-x"> $options['downloadUrl'] : '');</span> <span class="devsite-syntax-x">$INCLUDE_SYSTEM_MANAGED = (array_key_exists('includeSystemManaged', $options) ?</span> <span class="devsite-syntax-x"> $options['includeSystemManaged'] : '');</span> <span class="devsite-syntax-x">$JOB_ID = (array_key_exists('jobId', $options) ? $options['jobId'] : '');</span> <span class="devsite-syntax-x">$OUTPUT_FILE = (array_key_exists('outputFile', $options) ?</span> <span class="devsite-syntax-x"> $options['outputFile'] : '');</span> <span class="devsite-syntax-x">/*</span> <span class="devsite-syntax-x"> * You can obtain an OAuth 2.0 client ID and client secret from the</span> <span class="devsite-syntax-x"> * {{ Google Cloud Console }} <{{ https://cloud.google.com/console }}</span>> <span class="devsite-syntax-x"> * For more information about using OAuth 2.0 to access Google APIs, please see:</span> <span class="devsite-syntax-x"> * <https://developers.google.com/youtube/v3/guides/authentication></span> <span class="devsite-syntax-x"> * Please ensure that you have enabled the YouTube Data API for your project.</span> <span class="devsite-syntax-x"> */</span> <span class="devsite-syntax-x">function getClient() {</span> <span class="devsite-syntax-x"> $client = new Google_Client();</span> <span class="devsite-syntax-x"> $client->setAuthConfigFile('client_secrets_php.json');</span> <span class="devsite-syntax-x"> $client->addScope(</span> <span class="devsite-syntax-x"> 'https://www.googleapis.com/auth/yt-analytics-monetary.readonly');</span> <span class="devsite-syntax-x"> $client->setRedirectUri('urn:ietf:wg:oauth:2.0:oob');</span> <span class="devsite-syntax-x"> $client->setAccessType('offline');</span> <span class="devsite-syntax-x"> // Load previously authorized credentials from a file.</span> <span class="devsite-syntax-x"> $credentialsPath = expandHomeDirectory(CREDENTIALS_PATH);</span> <span class="devsite-syntax-x"> if (file_exists($credentialsPath)) {</span> <span class="devsite-syntax-x"> $accessToken = json_decode(file_get_contents($credentialsPath), true);</span> <span class="devsite-syntax-x"> } else {</span> <span class="devsite-syntax-x"> // Request authorization from the user.</span> <span class="devsite-syntax-x"> $authUrl = $client->createAuthUrl();</span> <span class="devsite-syntax-x"> printf('Open the following link in your browser:\n%s\n', $authUrl);</span> <span class="devsite-syntax-x"> print 'Enter verification code: ';</span> <span class="devsite-syntax-x"> $authCode = trim(fgets(STDIN));</span> <span class="devsite-syntax-x"> // Exchange authorization code for an access token.</span> <span class="devsite-syntax-x"> $accessToken = $client->authenticate($authCode);</span> <span class="devsite-syntax-x"> $refreshToken = $client->getRefreshToken();</span> <span class="devsite-syntax-x"> // Store the credentials to disk.</span> <span class="devsite-syntax-x"> if(!file_exists(dirname($credentialsPath))) {</span> <span class="devsite-syntax-x"> mkdir(dirname($credentialsPath), 0700, true);</span> <span class="devsite-syntax-x"> }</span> <span class="devsite-syntax-x"> file_put_contents($credentialsPath, json_encode($accessToken));</span> <span class="devsite-syntax-x"> printf('Credentials saved to %s\n', $credentialsPath);</span> <span class="devsite-syntax-x"> //fclose($fp);</span> <span class="devsite-syntax-x"> }</span> <span class="devsite-syntax-x"> $client->setAccessToken($accessToken);</span> <span class="devsite-syntax-x"> // Refresh the token if it's expired.</span> <span class="devsite-syntax-x"> if ($client->isAccessTokenExpired()) {</span> <span class="devsite-syntax-x"> $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());</span> <span class="devsite-syntax-x"> file_put_contents($credentialsPath, json_encode($client->getAccessToken()));</span> <span class="devsite-syntax-x"> }</span> <span class="devsite-syntax-x"> return $client;</span> <span class="devsite-syntax-x">}</span> <span class="devsite-syntax-x">/**</span> <span class="devsite-syntax-x"> * Expands the home directory alias '~' to the full path.</span> <span class="devsite-syntax-x"> * @param string $path the path to expand.</span> <span class="devsite-syntax-x"> * @return string the expanded path.</span> <span class="devsite-syntax-x"> */</span> <span class="devsite-syntax-x">function expandHomeDirectory($path) {</span> <span class="devsite-syntax-x"> $homeDirectory = getenv('HOME');</span> <span class="devsite-syntax-x"> if (empty($homeDirectory)) {</span> <span class="devsite-syntax-x"> $homeDirectory = getenv('HOMEDRIVE') . getenv('HOMEPATH');</span> <span class="devsite-syntax-x"> }</span> <span class="devsite-syntax-x"> return str_replace('~', realpath($homeDirectory), $path);</span> <span class="devsite-syntax-x">}</span> <span class="devsite-syntax-x">/**</span> <span class="devsite-syntax-x"> * Returns a list of reporting jobs. (jobs.listJobs)</span> <span class="devsite-syntax-x"> *</span> <span class="devsite-syntax-x"> * @param Google_Service_YouTubereporting $youtubeReporting YouTube Reporting service object.</span> <span class="devsite-syntax-x"> * @param string $onBehalfOfContentOwner A content owner ID.</span> <span class="devsite-syntax-x"> */</span> <span class="devsite-syntax-x">function listReportingJobs(Google_Service_YouTubeReporting $youtubeReporting,</span> <span class="devsite-syntax-x"> $onBehalfOfContentOwner = '', $includeSystemManaged = False) {</span> <span class="devsite-syntax-x"> $reportingJobs = $youtubeReporting->jobs->listJobs(</span> <span class="devsite-syntax-x"> array('onBehalfOfContentOwner' => $onBehalfOfContentOwner,</span> <span class="devsite-syntax-x"> 'includeSystemManaged' => $includeSystemManaged));</span> <span class="devsite-syntax-x"> print ('REPORTING JOBS' . PHP_EOL . '**************' . PHP_EOL);</span> <span class="devsite-syntax-x"> foreach ($reportingJobs as $job) {</span> <span class="devsite-syntax-x"> print($job['reportTypeId'] . ':' . $job['id'] . PHP_EOL);</span> <span class="devsite-syntax-x"> }</span> <span class="devsite-syntax-x"> print(PHP_EOL);</span> <span class="devsite-syntax-x">}</span> <span class="devsite-syntax-x">/**</span> <span class="devsite-syntax-x"> * Lists reports created by a specific job. (reports.listJobsReports)</span> <span class="devsite-syntax-x"> *</span> <span class="devsite-syntax-x"> * @param Google_Service_YouTubereporting $youtubeReporting YouTube Reporting service object.</span> <span class="devsite-syntax-x"> * @param string $jobId The ID of the job.</span> <span class="devsite-syntax-x"> * @param string $onBehalfOfContentOwner A content owner ID.</span> <span class="devsite-syntax-x"> */</span> <span class="devsite-syntax-x">function listReportsForJob(Google_Service_YouTubeReporting $youtubeReporting,</span> <span class="devsite-syntax-x"> $jobId, $onBehalfOfContentOwner = '') {</span> <span class="devsite-syntax-x"> $reports = $youtubeReporting->jobs_reports->listJobsReports($jobId,</span> <span class="devsite-syntax-x"> array('onBehalfOfContentOwner' => $onBehalfOfContentOwner));</span> <span class="devsite-syntax-x"> print ('DOWNLOADABLE REPORTS' . PHP_EOL . '********************' . PHP_EOL);</span> <span class="devsite-syntax-x"> foreach ($reports['reports'] as $report) {</span> <span class="devsite-syntax-x"> print('Created: ' . date('d M Y', strtotime($report['createTime'])) .</span> <span class="devsite-syntax-x"> ' (' . date('d M Y', strtotime($report['startTime'])) .</span> <span class="devsite-syntax-x"> ' to ' . date('d M Y', strtotime($report['endTime'])) . ')' .</span> <span class="devsite-syntax-x"> PHP_EOL . ' ' . $report['downloadUrl'] . PHP_EOL . PHP_EOL);</span> <span class="devsite-syntax-x"> }</span> <span class="devsite-syntax-x">}</span> <span class="devsite-syntax-x">/**</span> <span class="devsite-syntax-x"> * Download the report specified by the URL. (media.download)</span> <span class="devsite-syntax-x"> *</span> <span class="devsite-syntax-x"> * @param Google_Service_YouTubereporting $youtubeReporting YouTube Reporting service object.</span> <span class="devsite-syntax-x"> * @param string $reportUrl The URL of the report to be downloaded.</span> <span class="devsite-syntax-x"> * @param string $outputFile The file to write the report to locally.</span> <span class="devsite-syntax-x"> * @param $htmlBody - html body.</span> <span class="devsite-syntax-x"> */</span> <span class="devsite-syntax-x">function downloadReport(Google_Service_YouTubeReporting $youtubeReporting,</span> <span class="devsite-syntax-x"> $reportUrl, $outputFile) {</span> <span class="devsite-syntax-x"> $client = $youtubeReporting->getClient();</span> <span class="devsite-syntax-x"> // Setting the defer flag to true tells the client to return a request that</span> <span class="devsite-syntax-x"> // can be called with ->execute(); instead of making the API call immediately.</span> <span class="devsite-syntax-x"> $client->setDefer(true);</span> <span class="devsite-syntax-x"> // Call YouTube Reporting API's media.download method to download a report.</span> <span class="devsite-syntax-x"> $request = $youtubeReporting->media->download('', array('alt' => 'media'));</span> <span class="devsite-syntax-x"> $request = $request->withUri(new \GuzzleHttp\Psr7\Uri($reportUrl));</span> <span class="devsite-syntax-x"> $responseBody = '';</span> <span class="devsite-syntax-x"> try {</span> <span class="devsite-syntax-x"> $response = $client->execute($request);</span> <span class="devsite-syntax-x"> $responseBody = $response->getBody();</span> <span class="devsite-syntax-x"> } catch (Google_Service_Exception $e) {</span> <span class="devsite-syntax-x"> $responseBody = $e->getTrace()[0]['args'][0]->getResponseBody();</span> <span class="devsite-syntax-x"> }</span> <span class="devsite-syntax-x"> file_put_contents($outputFile, $responseBody);</span> <span class="devsite-syntax-x"> $client->setDefer(false);</span> <span class="devsite-syntax-x">}</span> <span class="devsite-syntax-x">// Define an object that will be used to make all API requests.</span> <span class="devsite-syntax-x">$client = getClient();</span> <span class="devsite-syntax-x">// YouTube Reporting object used to make YouTube Reporting API requests.</span> <span class="devsite-syntax-x">$youtubeReporting = new Google_Service_YouTubeReporting($client);</span> <span class="devsite-syntax-x">if ($CONTENT_OWNER_ID) {</span> <span class="devsite-syntax-x"> if (!$DOWNLOAD_URL && !$JOB_ID) {</span> <span class="devsite-syntax-x"> listReportingJobs($youtubeReporting, $CONTENT_OWNER_ID,</span> <span class="devsite-syntax-x"> $INCLUDE_SYSTEM_MANAGED);</span> <span class="devsite-syntax-x"> } else if ($JOB_ID) {</span> <span class="devsite-syntax-x"> listReportsForJob($youtubeReporting, $JOB_ID, $CONTENT_OWNER_ID);</span> <span class="devsite-syntax-x"> } else if ($DOWNLOAD_URL && $OUTPUT_FILE) {</span> <span class="devsite-syntax-x"> downloadReport($youtubeReporting, $DOWNLOAD_URL, $OUTPUT_FILE);</span> <span class="devsite-syntax-x"> }</span> <span class="devsite-syntax-x">}</span> <span class="devsite-syntax-x">?</span>> <div class="devsite-github-link nocode no-select"><a target="_top" href="https://github.com/youtube/api-samples/blob/07263305b59a7c3275bc7e925f9ce6cabf774022/php/retrieve_reports.php" class="gc-analytics-event" data-category="github_link" data-label="youtube/api-samples/php/retrieve_reports.php" data-code-snippet="true" data-github-path="youtube/api-samples/php/retrieve_reports.php"><span class="devsite-syntax-x">retrieve_reports.php</span></a></div></pre></devsite-code> </div> <devsite-recommendations display="in-page" hidden yield> </devsite-recommendations> <devsite-thumb-rating position="footer"> </devsite-thumb-rating> <devsite-recommendations id="recommendations-link" yield></devsite-recommendations> <div class="devsite-floating-action-buttons"> </div> </article> <devsite-content-footer class="nocontent"> <p>Except as otherwise noted, the content of this page is licensed under the <a href="https://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 License</a>, and code samples are licensed under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache 2.0 License</a>. For details, see the <a href="https://developers.google.com/site-policies">Google Developers Site Policies</a>. Java is a registered trademark of Oracle and/or its affiliates.</p> <p>Last updated 2022-11-04 UTC.</p> </devsite-content-footer> <devsite-notification > </devsite-notification> <div class="devsite-content-data"> <template class="devsite-content-data-template"> [[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2022-11-04 UTC."],[],[]] </template> </div> </devsite-content> </main> <devsite-footer-promos class="devsite-footer"> <nav class="devsite-footer-promos nocontent" aria-label="Promotions"> <ul class="devsite-footer-promos-list"> <li class="devsite-footer-promo"> <a href="https://blog.youtube" class="devsite-footer-promo-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Promo Link (index 1)" > <picture> <img class="devsite-footer-promo-icon" src="/static/site-assets/logo-youtube.svg" loading="lazy" alt="Blog"> </picture> <span class="devsite-footer-promo-label"> Blog </span> </a> <div class="devsite-footer-promo-description">The latest news on the YouTube blog</div> </li> <li class="devsite-footer-promo"> <a href="https://github.com/youtube/api-samples" class="devsite-footer-promo-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Promo Link (index 2)" > <picture> <img class="devsite-footer-promo-icon" src="/static/site-assets/logo-github.svg" loading="lazy" alt="GitHub"> </picture> <span class="devsite-footer-promo-label"> GitHub </span> </a> <div class="devsite-footer-promo-description">Find API code samples and other YouTube open-source projects.</div> </li> <li class="devsite-footer-promo"> <a href="https://issuetracker.google.com/issues/new?component=186600&template=874803" class="devsite-footer-promo-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Promo Link (index 3)" > <picture> <img class="devsite-footer-promo-icon" src="/static/site-assets/developers_64dp.png" loading="lazy" alt="Issue Tracker"> </picture> <span class="devsite-footer-promo-label"> Issue Tracker </span> </a> <div class="devsite-footer-promo-description">Something wrong? Send us a bug report!</div> </li> <li class="devsite-footer-promo"> <a href="http://stackoverflow.com/questions/ask?tags=youtube-api" class="devsite-footer-promo-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Promo Link (index 4)" > <picture> <img class="devsite-footer-promo-icon" src="/static/site-assets/logo-stack-overflow.svg" loading="lazy" alt="Stack Overflow"> </picture> <span class="devsite-footer-promo-label"> Stack Overflow </span> </a> <div class="devsite-footer-promo-description">Ask a question under the youtube-api tag</div> </li> <li class="devsite-footer-promo"> <a href="https://research.youtube/" class="devsite-footer-promo-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Promo Link (index 5)" > <picture> <img class="devsite-footer-promo-icon" src="/static/site-assets/logo-youtube.svg" loading="lazy" alt="YouTube Researcher Program"> </picture> <span class="devsite-footer-promo-label"> YouTube Researcher Program </span> </a> <div class="devsite-footer-promo-description">For researchers interested in using data from YouTube’s global API</div> </li> </ul> </nav> </devsite-footer-promos> <devsite-footer-linkboxes class="devsite-footer"> <nav class="devsite-footer-linkboxes nocontent" aria-label="Footer links"> <ul class="devsite-footer-linkboxes-list"> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Tools</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="https://developers.google.com/apis-explorer/#p/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Google APIs Explorer </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/youtube/youtube_player_demo" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > YouTube Player Demo </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/youtube/youtube_subscribe_button" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > Configure a Subscribe Button </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Issue Tracker</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="https://issuetracker.google.com/issues/new?component=186600&template=874803" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > File a bug </a> </li> <li class="devsite-footer-linkbox-item"> <a href="https://issuetracker.google.com/issues/new?component=186600&template=874803" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Request a feature </a> </li> <li class="devsite-footer-linkbox-item"> <a href="https://issuetracker.google.com/issues?q=componentid:186600" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > See open issues </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Product Info</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/youtube/terms/api-services-terms-of-service" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Terms of Service </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/youtube/terms/developer-policies" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Developer Policies </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/youtube/terms/required-minimum-functionality" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > Required Minimum Functionality </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/youtube/terms/branding-guidelines" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > Branding Guidelines </a> </li> </ul> </li> </ul> </nav> </devsite-footer-linkboxes> <devsite-footer-utility class="devsite-footer"> <div class="devsite-footer-utility nocontent"> <nav class="devsite-footer-sites" aria-label="Other Google Developers websites"> <a href="https://developers.google.com/" class="devsite-footer-sites-logo-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Google Developers Link"> <picture> <img class="devsite-footer-sites-logo" src="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/developers/images/lockup-google-for-developers.svg" loading="lazy" alt="Google Developers"> </picture> </a> <ul class="devsite-footer-sites-list"> <li class="devsite-footer-sites-item"> <a href="//developer.android.com" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Android Link" > Android </a> </li> <li class="devsite-footer-sites-item"> <a href="//developer.chrome.com/home" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Chrome Link" > Chrome </a> </li> <li class="devsite-footer-sites-item"> <a href="//firebase.google.com" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Firebase Link" > Firebase </a> </li> <li class="devsite-footer-sites-item"> <a href="//cloud.google.com" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Google Cloud Platform Link" > Google Cloud Platform </a> </li> <li class="devsite-footer-sites-item"> <a href="//ai.google.dev/" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Google AI Link" > Google AI </a> </li> <li class="devsite-footer-sites-item"> <a href="/products" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer All products Link" > All products </a> </li> </ul> </nav> <nav class="devsite-footer-utility-links" aria-label="Utility links"> <ul class="devsite-footer-utility-list"> <li class="devsite-footer-utility-item "> <a class="devsite-footer-utility-link gc-analytics-event" href="/terms/site-terms" data-category="Site-Wide Custom Events" data-label="Footer Terms link" > Terms </a> </li> <li class="devsite-footer-utility-item "> <a class="devsite-footer-utility-link gc-analytics-event" href="//policies.google.com/privacy" data-category="Site-Wide Custom Events" data-label="Footer Privacy link" > Privacy </a> </li> <li class="devsite-footer-utility-item glue-cookie-notification-bar-control"> <a class="devsite-footer-utility-link gc-analytics-event" href="#" data-category="Site-Wide Custom Events" data-label="Footer Manage cookies link" aria-hidden="true" > Manage cookies </a> </li> <li class="devsite-footer-utility-item devsite-footer-utility-button"> <span class="devsite-footer-utility-description">Sign up for the Google for Developers newsletter</span> <a class="devsite-footer-utility-link gc-analytics-event" href="/newsletter/subscribe" data-category="Site-Wide Custom Events" data-label="Footer Subscribe link" > Subscribe </a> </li> </ul> <devsite-language-selector> <ul role="presentation"> <li role="presentation"> <a role="menuitem" lang="en" >English</a> </li> <li role="presentation"> <a role="menuitem" lang="de" >Deutsch</a> </li> <li role="presentation"> <a role="menuitem" lang="es" >Español</a> </li> <li role="presentation"> <a role="menuitem" lang="es_419" >Español – América Latina</a> </li> <li role="presentation"> <a role="menuitem" lang="fr" >Français</a> </li> <li role="presentation"> <a role="menuitem" lang="id" >Indonesia</a> </li> <li role="presentation"> <a role="menuitem" lang="it" >Italiano</a> </li> <li role="presentation"> <a role="menuitem" lang="pl" >Polski</a> </li> <li role="presentation"> <a role="menuitem" lang="pt_br" >Português – Brasil</a> </li> <li role="presentation"> <a role="menuitem" lang="vi" >Tiếng Việt</a> </li> <li role="presentation"> <a role="menuitem" lang="tr" >Türkçe</a> </li> <li role="presentation"> <a role="menuitem" lang="ru" >Русский</a> </li> <li role="presentation"> <a role="menuitem" lang="he" >עברית</a> </li> <li role="presentation"> <a role="menuitem" lang="ar" >العربيّة</a> </li> <li role="presentation"> <a role="menuitem" lang="fa" >فارسی</a> </li> <li role="presentation"> <a role="menuitem" lang="hi" >हिंदी</a> </li> <li role="presentation"> <a role="menuitem" lang="bn" >বাংলা</a> </li> <li role="presentation"> <a role="menuitem" lang="th" >ภาษาไทย</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_cn" >中文 – 简体</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_tw" >中文 – 繁體</a> </li> <li role="presentation"> <a role="menuitem" lang="ja" >日本語</a> </li> <li role="presentation"> <a role="menuitem" lang="ko" >한국어</a> </li> </ul> </devsite-language-selector> </nav> </div> </devsite-footer-utility> <devsite-panel></devsite-panel> <devsite-concierge data-info-panel data-ai-panel data-api-explorer-panel > </devsite-concierge> </section></section> <devsite-sitemask></devsite-sitemask> <devsite-snackbar></devsite-snackbar> <devsite-tooltip ></devsite-tooltip> <devsite-heading-link></devsite-heading-link> <devsite-analytics> <script type="application/json" analytics>[{"dimensions": {"dimension1": "Signed out", "dimension11": false, "dimension6": "en", "dimension4": "YouTube Analytics and Reporting APIs", "dimension3": false, "dimension5": "en"}, "gaid": "UA-24532603-1", "metrics": {"ratings_value": "metric1", "ratings_count": "metric2"}, "purpose": 1}]</script> <script type="application/json" tag-management>{"at": "True", "ga4": [{"id": "G-272J68FCRF", "purpose": 1}], "ga4p": [{"id": "G-272J68FCRF", "purpose": 1}], "gtm": [], "parameters": {"internalUser": "False", "language": {"machineTranslated": "False", "requested": "en", "served": "en"}, "pageType": "article", "projectName": "YouTube Analytics and Reporting APIs", "signedIn": "False", "tenant": "developers", "recommendations": {"sourcePage": "", "sourceType": 0, "sourceRank": 0, "sourceIdenticalDescriptions": 0, "sourceTitleWords": 0, "sourceDescriptionWords": 0, "experiment": ""}, "experiment": {"ids": ""}}}</script> </devsite-analytics> <devsite-badger></devsite-badger> <script nonce="tEIBKwq3TPYcgc1fq9Pv2pY54+RB2h"> (function(d,e,v,s,i,t,E){d['GoogleDevelopersObject']=i; t=e.createElement(v);t.async=1;t.src=s;E=e.getElementsByTagName(v)[0]; E.parentNode.insertBefore(t,E);})(window, document, 'script', 'https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/developers/js/app_loader.js', '[1,"en",null,"/js/devsite_app_module.js","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/developers","https://developers-dot-devsite-v2-prod.appspot.com",null,null,["/_pwa/developers/manifest.json","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/images/video-placeholder.svg","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/developers/images/favicon-new.png","https://fonts.googleapis.com/css?family=Google+Sans:400,500|Roboto:400,400italic,500,500italic,700,700italic|Roboto+Mono:400,500,700&display=swap"],1,null,[1,6,8,12,14,17,21,25,50,52,63,70,75,76,80,87,91,92,93,97,98,100,101,102,103,104,105,107,108,109,110,112,113,117,118,120,122,124,125,126,127,129,130,131,132,133,134,135,136,138,140,141,147,148,149,151,152,156,157,158,159,161,163,164,168,169,170,179,180,182,183,186,191,193,196],"AIzaSyAP-jjEJBzmIyKR4F-3XITp8yM9T1gEEI8","AIzaSyB6xiKGDR5O3Ak2okS4rLkauxGUG7XP0hg","developers.google.com","AIzaSyAQk0fBONSGUqCNznf6Krs82Ap1-NV6J4o","AIzaSyCCxcqdrZ_7QMeLCRY20bh_SXdAYqy70KY",null,null,null,["Profiles__enable_complete_playlist_endpoint","Cloud__enable_cloud_shell","Search__enable_dynamic_content_confidential_banner","MiscFeatureFlags__developers_footer_dark_image","Cloud__enable_free_trial_server_call","Cloud__enable_cloud_dlp_service","Cloud__enable_cloudx_experiment_ids","TpcFeatures__enable_mirror_tenant_redirects","Cloud__enable_llm_concierge_chat","Cloud__enable_cloud_facet_chat","Profiles__enable_awarding_url","MiscFeatureFlags__developers_footer_image","Search__enable_suggestions_from_borg","MiscFeatureFlags__emergency_css","MiscFeatureFlags__enable_variable_operator","DevPro__enable_cloud_innovators_plus","Concierge__enable_pushui","Profiles__enable_page_saving","EngEduTelemetry__enable_engedu_telemetry","Concierge__enable_concierge_restricted","Cloud__enable_cloudx_ping","MiscFeatureFlags__enable_project_variables","CloudShell__cloud_code_overflow_menu","Experiments__reqs_query_experiments","Profiles__enable_dashboard_curated_recommendations","BookNav__enable_tenant_cache_key","TpcFeatures__enable_required_headers","Profiles__enable_profile_collections","MiscFeatureFlags__enable_view_transitions","Search__enable_ai_search_summaries_restricted","MiscFeatureFlags__enable_firebase_utm","Profiles__enable_release_notes_notifications","Profiles__require_profile_eligibility_for_signin","CloudShell__cloud_shell_button","Profiles__enable_public_developer_profiles","Profiles__enable_completecodelab_endpoint","Cloud__enable_cloud_shell_fte_user_flow","MiscFeatureFlags__enable_explain_this_code","Concierge__enable_concierge","Profiles__enable_recognition_badges","Search__enable_page_map","Significatio__enable_by_tenant","Search__enable_ai_eligibility_checks","Cloud__enable_legacy_calculator_redirect","DevPro__enable_developer_subscriptions","Search__enable_ai_search_summaries","Profiles__enable_developer_profiles_callout","Analytics__enable_clearcut_logging"],null,null,"AIzaSyBLEMok-5suZ67qRPzx0qUtbnLmyT_kCVE","https://developerscontentserving-pa.clients6.google.com","AIzaSyCM4QpTRSqP5qI4Dvjt4OAScIN8sOUlO-k","https://developerscontentsearch-pa.clients6.google.com",1,4,null,"https://developerprofiles-pa.clients6.google.com",[1,"developers","Google for Developers","developers.google.com",null,"developers-dot-devsite-v2-prod.appspot.com",null,null,[1,1,[1],null,null,null,null,null,null,null,null,[1],null,null,null,null,null,null,[1],[1,null,null,[1,20],"/recommendations/information"],null,null,null,[1,1,1],[1,1,null,1,1]],null,[null,null,null,null,null,null,"/images/lockup-new.svg","/images/touchicon-180-new.png",null,null,null,null,1,null,null,null,null,null,null,null,null,1,null,null,null,"/images/lockup-dark-theme-new.svg",[]],[],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[6,1,14,15,20,22,23,29,32,36],null,[[null,null,null,[3,7,10,2,39,17,4,32,24,11,12,13,34,15,25],null,null,[1,[["docType","Choose a content type",[["Tutorial",null,null,null,null,null,null,null,null,"Tutorial"],["Guide",null,null,null,null,null,null,null,null,"Guide"],["Sample",null,null,null,null,null,null,null,null,"Sample"]]],["product","Choose a product",[["Android",null,null,null,null,null,null,null,null,"Android"],["ARCore",null,null,null,null,null,null,null,null,"ARCore"],["ChromeOS",null,null,null,null,null,null,null,null,"ChromeOS"],["Firebase",null,null,null,null,null,null,null,null,"Firebase"],["Flutter",null,null,null,null,null,null,null,null,"Flutter"],["Assistant",null,null,null,null,null,null,null,null,"Google Assistant"],["GoogleCloud",null,null,null,null,null,null,null,null,"Google Cloud"],["GoogleMapsPlatform",null,null,null,null,null,null,null,null,"Google Maps Platform"],["GooglePay",null,null,null,null,null,null,null,null,"Google Pay & Google Wallet"],["GooglePlay",null,null,null,null,null,null,null,null,"Google Play"],["Tensorflow",null,null,null,null,null,null,null,null,"TensorFlow"]]],["category","Choose a topic",[["AiAndMachineLearning",null,null,null,null,null,null,null,null,"AI and Machine Learning"],["Data",null,null,null,null,null,null,null,null,"Data"],["Enterprise",null,null,null,null,null,null,null,null,"Enterprise"],["Gaming",null,null,null,null,null,null,null,null,"Gaming"],["Mobile",null,null,null,null,null,null,null,null,"Mobile"],["Web",null,null,null,null,null,null,null,null,"Web"]]]]]],[1,1],null,1],[[["UA-24532603-1"],["UA-22084204-5"],null,null,["UA-24532603-5"],null,null,[["G-272J68FCRF"],null,null,[["G-272J68FCRF",2]]],[["UA-24532603-1",2]],null,[["UA-24532603-5",2]],null,1],[[12,9],[5,4],[1,1],[16,13],[11,8],[6,5],[15,12],[3,2],[14,11],[4,3],[13,10]],[[1,1],[2,2]]],null,4,null,null,null,null,null,null,null,null,null,null,null,null,null,"developers.devsite.google"],null,"pk_live_5170syrHvgGVmSx9sBrnWtA5luvk9BwnVcvIi7HizpwauFG96WedXsuXh790rtij9AmGllqPtMLfhe2RSwD6Pn38V00uBCydV4m"]') </script> <devsite-a11y-announce></devsite-a11y-announce> </body> </html>