CINXE.COM
Google Ads Developer Blog: 2011
<!DOCTYPE html> <html class='v2 list-page' dir='ltr' itemscope='' itemtype='http://schema.org/Blog' lang='en' xmlns='http://www.w3.org/1999/xhtml' xmlns:b='http://www.google.com/2005/gml/b' xmlns:data='http://www.google.com/2005/gml/data' xmlns:expr='http://www.google.com/2005/gml/expr'> <head> <link href='https://www.blogger.com/static/v1/widgets/3566091532-css_bundle_v2.css' rel='stylesheet' type='text/css'/> <title> Google Ads Developer Blog: 2011 </title> <meta content='width=device-width, height=device-height, minimum-scale=1.0, initial-scale=1.0, user-scalable=0' name='viewport'/> <meta content='IE=Edge' http-equiv='X-UA-Compatible'/> <meta content='Google Ads Developer Blog' property='og:title'/> <meta content='en_US' property='og:locale'/> <meta content='http://ads-developers.googleblog.com/2011/' property='og:url'/> <meta content='Google Ads Developer Blog' property='og:site_name'/> <!-- Twitter Card properties --> <meta content='Google Ads Developer Blog' property='og:title'/> <meta content='summary' name='twitter:card'/> <meta content='@google' name='twitter:creator'/> <link href='https://fonts.googleapis.com/css?family=Roboto:400italic,400,500,500italic,700,700italic' rel='stylesheet' type='text/css'/> <link href='https://fonts.googleapis.com/icon?family=Material+Icons' rel='stylesheet'/> <script src='https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js' type='text/javascript'></script> <script> (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-82055326-1', 'auto'); ga('send', 'pageview'); </script> <!-- End --> <style id='page-skin-1' type='text/css'><!-- /* <Group description="Header Color" selector="header"> <Variable name="header.background.color" description="Header Background" type="color" default="#ffffff"/> </Group> */ .header-outer { border-bottom: 1px solid #e0e0e0; background: #ffffff; } html, .Label h2, #sidebar .rss a, .BlogArchive h2, .FollowByEmail h2.title, .widget .post h2 { font-family: Roboto, sans-serif; } .plusfollowers h2.title, .post h2.title, .widget h2.title { font-family: Roboto, sans-serif; } .widget-item-control { height: 100%; } .widget.Header, #header { position: relative; height: 100%; width: 100%; } } .widget.Header .header-logo1 { float: left; margin-right: 15px; padding-right: 15px; border-right: 1px solid #ddd; } .header-title h2 { color: rgba(0,0,0,.54); display: inline-block; font-size: 40px; font-family: Roboto, sans-serif; font-weight: normal; line-height: 48px; vertical-align: top; } .header-inner { background-repeat: no-repeat; background-position: right 0px; } .post-author, .byline-author { font-size: 14px; font-weight: normal; color: #757575; color: rgba(0,0,0,.54); } .post-content .img-border { border: 1px solid rgb(235, 235, 235); padding: 4px; } .header-title a { text-decoration: none !important; } pre { border: 1px solid #bbbbbb; margin-top: 1em 0 0 0; padding: 0.99em; overflow-x: auto; overflow-y: auto; } pre, code { font-size: 9pt; background-color: #fafafa; line-height: 125%; font-family: monospace; } pre, code { color: #060; font: 13px/1.54 "courier new",courier,monospace; } .header-left .header-logo1 { width: 128px !important; } .header-desc { line-height: 20px; margin-top: 8px; } .fb-custom img, .twitter-custom img, .gplus-share img { cursor: pointer; opacity: 0.54; } .fb-custom img:hover, .twitter-custom img:hover, .gplus-share img:hover { opacity: 0.87; } .fb-like { width: 80px; } .post .share { float: right; } #twitter-share{ border: #CCC solid 1px; border-radius: 3px; background-image: -webkit-linear-gradient(top,#ffffff,#dedede); } .twitter-follow { background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVVfowXWI6SI8HNCGPfnKyNRe-wyiGsM28Jazt5og63q6Ula3__QjfJ0krie-XTOtpO6IlDOtulriyGWBdin3XU7HN6VY_J5mT7lWez8I8QjoqsXHq5qmxyqePXRBJ_G-NZfaqplhFFBfg/s1600/twitter-bird.png) no-repeat left center; padding-left: 18px; font: normal normal normal 11px/18px 'Helvetica Neue',Arial,sans-serif; font-weight: bold; text-shadow: 0 1px 0 rgba(255,255,255,.5); cursor: pointer; margin-bottom: 10px; } .twitter-fb { padding-top: 2px; } .fb-follow-button { background: -webkit-linear-gradient(#4c69ba, #3b55a0); background: -moz-linear-gradient(#4c69ba, #3b55a0); background: linear-gradient(#4c69ba, #3b55a0); border-radius: 2px; height: 18px; padding: 4px 0 0 3px; width: 57px; border: #4c69ba solid 1px; } .fb-follow-button a { text-decoration: none !important; text-shadow: 0 -1px 0 #354c8c; text-align: center; white-space: nowrap; font-size: 11px; color: white; vertical-align: top; } .fb-follow-button a:visited { color: white; } .fb-follow { padding: 0px 5px 3px 0px; width: 14px; vertical-align: bottom; } .gplus-wrapper { margin-top: 3px; display: inline-block; vertical-align: top; } .twitter-custom, .gplus-share { margin-right: 12px; } .fb-follow-button{ margin: 10px auto; } --></style> <style id='template-skin-1' type='text/css'><!-- .header-outer { clear: both; } .header-inner { margin: auto; padding: 0px; } .footer-outer { background: #f5f5f5; clear: both; margin: 0; } .footer-inner { margin: auto; padding: 0px; } .footer-inner-2 { /* Account for right hand column elasticity. */ max-width: calc(100% - 248px); } .google-footer-outer { clear: both; } .cols-wrapper, .google-footer-outer, .footer-inner, .header-inner { max-width: 978px; margin-left: auto; margin-right: auto; } .cols-wrapper { margin: auto; clear: both; margin-top: 60px; margin-bottom: 60px; overflow: hidden; } .col-main-wrapper { float: left; width: 100%; } .col-main { margin-right: 278px; max-width: 660px; } .col-right { float: right; width: 248px; margin-left: -278px; } /* Tweaks for layout mode. */ body#layout .google-footer-outer { display: none; } body#layout .header-outer, body#layout .footer-outer { background: none; } body#layout .header-inner { height: initial; } body#layout .cols-wrapper { margin-top: initial; margin-bottom: initial; } --></style> <!-- start all head --> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='blogger' name='generator'/> <link href="//ads-developers.googleblog.com/favicon.ico" rel="icon" type="image/x-icon"> <link href='http://ads-developers.googleblog.com/2011/' rel='canonical'/> <link rel="alternate" type="application/atom+xml" title="Google Ads Developer Blog - Atom" href="http://ads-developers.googleblog.com/feeds/posts/default" /> <link rel="alternate" type="application/rss+xml" title="Google Ads Developer Blog - RSS" href="http://ads-developers.googleblog.com/feeds/posts/default?alt=rss" /> <link rel="service.post" type="application/atom+xml" title="Google Ads Developer Blog - Atom" href="https://www.blogger.com/feeds/7815614485808579332/posts/default" /> <!--Can't find substitution for tag [blog.ieCssRetrofitLinks]--> <meta content='http://ads-developers.googleblog.com/2011/' property='og:url'/> <meta content='Google Ads Developer Blog' property='og:title'/> <meta content='The official blog for information about the Google Ads, Google Ad Manager, Google Mobile Ads SDKs for AdMob and IMA SDKs, and other Google Advertising Platform developer tools.' property='og:description'/> <!-- end all head --> <base target='_self'/> <style> html { font-family: Roboto, sans-serif; -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; } body { padding: 0; /* This ensures that the scroll bar is always present, which is needed */ /* because content render happens after page load; otherwise the header */ /* would "bounce" in-between states. */ min-height: 150%; } h2 { font-size: 16px; } h1, h2, h3, h4, h5 { line-height: 2em; } html, h4, h5, h6 { font-size: 14px; } a, a:visited { color: #4184F3; text-decoration: none; } a:focus, a:hover, a:active { text-decoration: none; } .Header { margin-top: 15px; } .Header h1 { font-size: 32px; font-weight: 300; line-height: 32px; height: 42px; } .header-inner .Header .titlewrapper { padding: 0; margin-top: 30px; } .header-inner .Header .descriptionwrapper { padding: 0; margin: 0; } .cols-wrapper { margin-top: 56px; } .header-outer, .cols-wrapper, .footer-outer, .google-footer-outer { padding: 0 60px; } .header-inner { height: 256px; position: relative; } html, .header-inner a { color: #212121; color: rgba(0,0,0,.87); } .header-inner .google-logo { display: inline-block; background-size: contain; z-index: 1; height: 46px; overflow: hidden; margin-top: 4px; margin-right: 8px; } .header-left { position: absolute; top: 50%; -webkit-transform: translateY(-50%); transform: translateY(-50%); margin-top: 12px; width: 100%; } .google-logo { margin-left: -4px; } #google-footer { position: relative; font-size: 13px; list-style: none; text-align: right; } #google-footer a { color: #444; } #google-footer ul { margin: 0; padding: 0; height: 144px; line-height: 144px; } #google-footer ul li { display: inline; } #google-footer ul li:before { color: #999; content: "\00b7"; font-weight: bold; margin: 5px; } #google-footer ul li:first-child:before { content: ''; } #google-footer .google-logo-dark { left: 0; margin-top: -16px; position: absolute; top: 50%; } /** Sitemap links. **/ .footer-inner-2 { font-size: 14px; padding-top: 42px; padding-bottom: 74px; } .footer-inner-2 .HTML h2 { color: #212121; color: rgba(0,0,0,.87); font-size: 14px; font-weight: 500; padding-left: 0; margin: 10px 0; } .footer-inner-2 .HTML ul { font-weight: normal; list-style: none; padding-left: 0; } .footer-inner-2 .HTML li { line-height: 24px; padding: 0; } .footer-inner-2 li a { color: rgba(65,132,243,.87); } /** Archive widget. **/ .BlogArchive { font-size: 13px; font-weight: normal; } .BlogArchive .widget-content { display: none; } .BlogArchive h2, .Label h2 { color: #4184F3; text-decoration: none; } .BlogArchive .hierarchy li { display: inline-block; } /* Specificity needed here to override widget CSS defaults. */ .BlogArchive #ArchiveList ul li, .BlogArchive #ArchiveList ul ul li { margin: 0; padding-left: 0; text-indent: 0; } .BlogArchive .intervalToggle { cursor: pointer; } .BlogArchive .expanded .intervalToggle .new-toggle { -ms-transform: rotate(180deg); transform: rotate(180deg); } .BlogArchive .new-toggle { float: right; padding-top: 3px; opacity: 0.87; } #ArchiveList { text-transform: uppercase; } #ArchiveList .expanded > ul:last-child { margin-bottom: 16px; } #ArchiveList .archivedate { width: 100%; } /* Months */ .BlogArchive .items { max-width: 150px; margin-left: -4px; } .BlogArchive .expanded .items { margin-bottom: 10px; overflow: hidden; } .BlogArchive .items > ul { float: left; height: 32px; } .BlogArchive .items a { padding: 0 4px; } .Label { font-size: 13px; font-weight: normal; } .sidebar-icon { display: inline-block; width: 24px; height: 24px; vertical-align: middle; margin-right: 12px; margin-top: -1px } .Label a { margin-right: 4px; } .Label .widget-content { display: none; } .FollowByEmail { font-size: 13px; font-weight: normal; } .FollowByEmail h2 { background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAALCAYAAACZIGYHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAUBJREFUeNrMkSGLAlEUhb+ZB4JFi8mx2cz+ApvhRUGTcUCrNqNJDYIi+DO0GUwmQXDK2DSIoGgZcSaIjDrzwrK4ssvChj1w0733O+fdp+m6PozH4yQSCfb7Pa7r8pOi0SjJZBLP8zgej4gAIMvlMuPxmADIYrHger1+C6lUKmo+NJ/NZojb7SZDWiwWo1qtks1msW2bw+HwZdkwDHq9HvV6nel0SqvVYrvdIh6Ph3Qch+VyqRYLhQJSSjRNw7IsfN9XgGKxSLfbJZfL0e/3aTabrFYr7vc7IujLcOh8PqunrNdr0uk0pVKJVCpFJBJRgEajweVyod1uMxgM2O12BAGUgRbU8DV2JpOhVquRz+cRQii3+XxOp9NRN3jVR5LPOp1OjEYjlSL8hclkgmmabDabt4d+m+S30vkD/R/IU4ABAPTZgnZdmG/PAAAAAElFTkSuQmCC"); background-repeat: no-repeat; background-position: 0 50%; text-indent: 30px; } .FollowByEmail .widget-content { display: none; } .searchBox input { border: 1px solid #eee; color: #212121; color: rgba(0,0,0,.87); font-size: 14px; padding: 8px 8px 8px 40px; width: 164px; font-family: Roboto, sans-serif; background: url("https://www.gstatic.com/images/icons/material/system/1x/search_grey600_24dp.png") 8px center no-repeat; } .searchBox ::-webkit-input-placeholder { /* WebKit, Blink, Edge */ color: rgba(0,0,0,.54); } .searchBox :-moz-placeholder { /* Mozilla Firefox 4 to 18 */ color: #000; opacity: 0.54; } .searchBox ::-moz-placeholder { /* Mozilla Firefox 19+ */ color: #000; opacity: 0.54; } .searchBox :-ms-input-placeholder { /* Internet Explorer 10-11 */ color: #757575; } .widget-item-control { margin-top: 0px; } .section { margin: 0; padding: 0; } #sidebar-top { border: 1px solid #eee; } #sidebar-top > div { margin: 16px 0; } .widget ul { line-height: 1.6; } /*main post*/ .post { margin-bottom:30px; } #main .post .title { margin: 0; } #main .post .title a { color: #212121; color: rgba(0,0,0,.87); font-weight: normal; font-size: 24px; } #main .post .title a:hover { text-decoration:none; color:#4184F3; } .message, #main .post .post-header { margin: 0; padding: 0; } #main .post .post-header .caption, #main .post .post-header .labels-caption, #main .post .post-footer .caption, #main .post .post-footer .labels-caption { color: #444; font-weight: 500; } #main .tr-caption-container td { text-align: left; } #main .post .tr-caption { color: #757575; color: rgba(0,0,0,.54); display: block; max-width: 560px; padding-bottom: 20px; } #main .post .tr-caption-container { line-height: 24px; margin: -1px 0 0 0 !important; padding: 4px 0; text-align: left; } #main .post .post-header .published{ font-size:11px; font-weight:bold; } .post-header .publishdate { font-size: 17px; font-weight:normal; color: #757575; color: rgba(0,0,0,.54); } #main .post .post-footer{ font-size:12px; padding-bottom: 21px; } .label-footer { margin-bottom: 12px; margin-top: 12px; } .comment-img { margin-right: 16px; opacity: 0.54; vertical-align: middle; } #main .post .post-header .published { margin-bottom: 40px; margin-top: -2px; } .post .post-content { color: #212121; color: rgba(0,0,0,.87); font-size: 17px; margin: 25px 0 36px 0; line-height: 32px; } .post-body .post-content ul, .post-body .post-content ol { margin: 16px 0; padding: 0 48px; } .post-summary { display: none; } /* Another old-style caption. */ .post-content div i, .post-content div + i { font-size: 14px; font-style: normal; color: #757575; color: rgba(0,0,0,.54); display: block; line-height: 24px; margin-bottom: 16px; text-align: left; } /* Another old-style caption (with link) */ .post-content a > i { color: #4184F3 !important; } /* Old-style captions for images. */ .post-content .separator + div:not(.separator) { margin-top: -16px; } /* Capture section headers. */ .post-content br + br + b, .post-content .space + .space + b, .post-content .separator + b { display: inline-block; margin-bottom: 8px; margin-top: 24px; } .post-content li { line-height: 32px; } /* Override all post images/videos to left align. */ .post-content .separator, .post-content > div { text-align: left; } .post-content .separator > a, .post-content .separator > span { margin-left: 0 !important; } /*.post-content img { max-width: 100%; height: auto; width: auto; }*/ .post-content .tr-caption-container img { margin-bottom: 12px; } .post-content iframe, .post-content embed { max-width: 100%; } .post-content .carousel-container { margin-bottom: 48px; } #main .post-content b { font-weight: 500; } /* These are the main paragraph spacing tweaks. */ #main .post-content br { content: ' '; display: block; padding: 4px; } .post-content .space { display: block; height: 8px; } .post-content iframe + .space, .post-content iframe + br { padding: 0 !important; } #main .post .jump-link { margin-bottom:10px; } .post-content img, .post-content iframe { margin: 30px 0 20px 0; } .post-content > img:first-child, .post-content > iframe:first-child { margin-top: 0; } .col-right .section { padding: 0 16px; } #aside { background:#fff; border:1px solid #eee; border-top: 0; } #aside .widget { margin:0; } #aside .widget h2, #ArchiveList .toggle + a.post-count-link { color: #212121; color: rgba(0,0,0,.87); font-weight: 400 !important; margin: 0; } #ArchiveList .toggle { float: right; } #ArchiveList .toggle .material-icons { padding-top: 4px; } #sidebar .tab { cursor: pointer; } #sidebar .tab .arrow { display: inline-block; float: right; } #sidebar .tab .icon { display: inline-block; vertical-align: top; height: 24px; width: 24px; margin-right: 13px; margin-left: -1px; margin-top: 1px; color: #757575; color: rgba(0,0,0,.54); } #sidebar .widget-content > :first-child { padding-top: 8px; } #sidebar .active .tab .arrow { -ms-transform: rotate(180deg); transform: rotate(180deg); } #sidebar .arrow { color: #757575; color: rgba(0,0,0,.54); } #sidebar .widget h2 { font-size: 14px; font-weight: normal; } #sidebar .Label h2, #sidebar .BlogArchive h2 { display: inline-block; } .HTML .feed-title { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAX5JREFUeNqsVDGSgkAQHL2rIiIikohIc/EBRkbwAIwuwgfwAXiAD9AHSI7kEkECRCb6AIyINDLx7K0aa6kT7uq0q7YYtnZ7umdnt7darXbr9Zpegeu61DNNc0dvwCcH4/GYJpMJnc9nOhwOVJbl/4hAAokMECZJQtvt9k+kH7qufyEYDAakqqqYxFdRFBqNRmTbNg2HQ0rTlK7XayvR0xqBdDqdkuM4dE/0ULhYLOh4PHYrknG5XGi/31MYhuL/nkwonM1mlGUZ1XXdrsiyLGEDhY7juJEZ1u5tIixDGdYhmYw+B7CAzPP5nDabjdgIAgCksMX1832/3drtdqPT6SQWapomiGEFNkDEdpDMMAzK81ys/7XYy+XyoQgq2WoURSIJ2iIIgp/WZCCTvFm2wgeAU31aI3Q2GhIDMeB53qPYPIcm5VrxXIOIOxsDMStjVawAc1VViRgN22lNBiuQN3GR+SY07hpOoStmFQAKXRRFY93bnpG+fONfedi+BRgAbkS8Fxp7QQIAAAAASUVORK5CYII="); background-repeat: no-repeat; background-position: 0 50%; text-indent: 30px; } #sidebar .widget .BlogArchive { padding-bottom: 8px; } #sidebar .widget { border-bottom: 1px solid #eee; box-shadow: 0px 1px 0 white; margin-bottom: 0; padding: 14px 0; min-height: 20px; } #sidebar .widget:last-child { border-bottom: none; box-shadow: none; margin-bottom: 0; } #sidebar ul { margin: 0; padding: 0; } #sidebar ul li { list-style:none; padding:0; } #sidebar ul li a { line-height: 32px; } #sidebar .archive { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAYCAYAAADzoH0MAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAE1JREFUeNpiNDY23s9AAWBioBCwYBM8c+YMVsUmJibEGYBNMS5DaeMFfDYSZQA2v9I3FrB5AZeriI4FmnrBccCT8mhmGs1MwyAzAQQYAKEWG9zm9QFEAAAAAElFTkSuQmCC"); height: 24px; line-height: 24px; padding-left: 30px; } #sidebar .labels { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAUxJREFUeNpiNDY23s9AAMycOfM7UF05kHkZmzwTMkdSUhKrIcXFxZy3bt3qBjIN8RrS09PDsHnzZjCNDr58+cKQlpbGDjSoHcg1w2oIyAUODg5gARCNzUVIBrUCuVYYhjx//pzhwIEDYAEQDeJjA1CDWIAGNQK59jBxRuSABbkAlwHIgIeHh2HWrFn/1NTU2oDcvSgBS4wBSC5iArqoCsj1YGIgEyAZVMoEchqlBjEB/cZAiUHg2AEGznpKDAImxOeM////B4VLKtBvEUCngZ1ILKivr3/u6+ubBzJAGZQ9gC5aQoqLgAY8BhkAZL4BuQQkxgXE34A4BuiiZEIuAhrwEGhAEZD5DpzYoIaA2UAM4kQADUrHZRDUgAIg8wO2XAwzbQXQa5OweQ1owB10AyA6gS7BgX1u3ry5397eHow3bdo0EyjGi00tQIABANPgyAH1q1eaAAAAAElFTkSuQmCC"); height: 20px; line-height: 20px; padding-left: 30px; } #sidebar .rss a { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAX5JREFUeNqsVDGSgkAQHL2rIiIikohIc/EBRkbwAIwuwgfwAXiAD9AHSI7kEkECRCb6AIyINDLx7K0aa6kT7uq0q7YYtnZ7umdnt7darXbr9Zpegeu61DNNc0dvwCcH4/GYJpMJnc9nOhwOVJbl/4hAAokMECZJQtvt9k+kH7qufyEYDAakqqqYxFdRFBqNRmTbNg2HQ0rTlK7XayvR0xqBdDqdkuM4dE/0ULhYLOh4PHYrknG5XGi/31MYhuL/nkwonM1mlGUZ1XXdrsiyLGEDhY7juJEZ1u5tIixDGdYhmYw+B7CAzPP5nDabjdgIAgCksMX1832/3drtdqPT6SQWapomiGEFNkDEdpDMMAzK81ys/7XYy+XyoQgq2WoURSIJ2iIIgp/WZCCTvFm2wgeAU31aI3Q2GhIDMeB53qPYPIcm5VrxXIOIOxsDMStjVawAc1VViRgN22lNBiuQN3GR+SY07hpOoStmFQAKXRRFY93bnpG+fONfedi+BRgAbkS8Fxp7QQIAAAAASUVORK5CYII="); } #sidebar .subscription a { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAALCAYAAACZIGYHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAUBJREFUeNrMkSGLAlEUhb+ZB4JFi8mx2cz+ApvhRUGTcUCrNqNJDYIi+DO0GUwmQXDK2DSIoGgZcSaIjDrzwrK4ssvChj1w0733O+fdp+m6PozH4yQSCfb7Pa7r8pOi0SjJZBLP8zgej4gAIMvlMuPxmADIYrHger1+C6lUKmo+NJ/NZojb7SZDWiwWo1qtks1msW2bw+HwZdkwDHq9HvV6nel0SqvVYrvdIh6Ph3Qch+VyqRYLhQJSSjRNw7IsfN9XgGKxSLfbJZfL0e/3aTabrFYr7vc7IujLcOh8PqunrNdr0uk0pVKJVCpFJBJRgEajweVyod1uMxgM2O12BAGUgRbU8DV2JpOhVquRz+cRQii3+XxOp9NRN3jVR5LPOp1OjEYjlSL8hclkgmmabDabt4d+m+S30vkD/R/IU4ABAPTZgnZdmG/PAAAAAElFTkSuQmCC"); } #sidebar-bottom { background: #f5f5f5; border-top:1px solid #eee; } #sidebar-bottom .widget { border-bottom: 1px solid #e0e0e0; padding: 15px 0; /*text-align: center;*/ } #sidebar-bottom > div:last-child { border-bottom: 0; } #sidebar-bottom .text { line-height: 20px; } /* Home, forward, and backward pagination. */ .blog-pager { border-top : 1px #e0e0e0 solid; padding-top: 10px; margin-top: 15px; text-align: right !important; } #blog-pager { margin-botom: 0; margin-top: -14px; padding: 16px 0 0 0; } #blog-pager a { display: inline-block; } .blog-pager i.disabled { opacity: 0.2 !important; } .blog-pager i { color: black; margin-left: 16px; opacity: 0.54; } .blog-pager i:hover, .blog-pager i:active { opacity: 0.87; } #blog-pager-older-link, #blog-pager-newer-link { float: none; } .gplus-profile { background-color: #fafafa; border: 1px solid #eee; overflow: hidden; width: 212px; } .gplus-profile-inner { margin-left: -1px; margin-top: -1px; } /* Sidebar follow buttons. */ .followgooglewrapper { padding: 12px 0 0 0; } .loading { visibility: hidden; } .detail-page .post-footer .cmt_iframe_holder { padding-top: 40px !important; } /** Desktop **/ @media (max-width: 900px) { .col-right { display: none; } .col-main { margin-right: 0; min-width: initial; } .footer-outer { display: none; } .cols-wrapper { min-width: initial; } .google-footer-outer { background-color: #f5f5f5; } } /** Tablet **/ @media (max-width: 712px) { .header-outer, .cols-wrapper, .footer-outer, .google-footer-outer { padding: 0 40px; } } /* An extra breakpoint accommodating for long blog titles. */ @media (max-width: 600px) { .header-left { height: 100%; top: inherit; margin-top: 0; -webkit-transform: initial; transform: initial; } .header-title { margin-top: 18px; } .header-inner .google-logo { height: 40px; margin-top: 3px; } .header-inner .google-logo img { height: 42px; } .header-title h2 { font-size: 32px; line-height: 40px; } .header-desc { bottom: 24px; position: absolute; } } /** Mobile/small desktop window; also landscape. **/ @media (max-width: 480px), (max-height: 480px) { .header-outer, .cols-wrapper, .footer-outer, .google-footer-outer { padding: 0 16px; } .cols-wrapper { margin-top: 0; } .post-header .publishdate, .post .post-content { font-size: 16px; } .post .post-content { line-height: 28px; margin-bottom: 30px; } .post { margin-top: 30px; } .byline-author { display: block; font-size: 12px; line-height: 24px; margin-top: 6px; } #main .post .title a { font-weight: 500; color: #4c4c4c; color: rgba(0,0,0,.70); } #main .post .post-header { padding-bottom: 12px; } #main .post .post-header .published { margin-bottom: -8px; margin-top: 3px; } .post .read-more { display: block; margin-top: 14px; } .post .tr-caption { font-size: 12px; } #main .post .title a { font-size: 20px; line-height: 30px; } .post-content iframe { /* iframe won't keep aspect ratio when scaled down. */ max-height: 240px; } .post-content .separator img, .post-content .tr-caption-container img, .post-content iframe { margin-left: -16px; max-width: inherit; width: calc(100% + 32px); } .post-content table, .post-content td { width: 100%; } #blog-pager { margin: 0; padding: 16px 0; } /** List page tweaks. **/ .list-page .post-original { display: none; } .list-page .post-summary { display: block; } .list-page .comment-container { display: none; } .list-page #blog-pager { padding-top: 0; border: 0; margin-top: -8px; } .list-page .label-footer { display: none; } .list-page #main .post .post-footer { border-bottom: 1px solid #eee; margin: -16px 0 0 0; padding: 0 0 20px 0; } .list-page .post .share { display: none; } /** Detail page tweaks. **/ .detail-page .post-footer .cmt_iframe_holder { padding-top: 32px !important; } .detail-page .label-footer { margin-bottom: 0; } .detail-page #main .post .post-footer { padding-bottom: 0; } .detail-page #comments { display: none; } } [data-about-pullquote], [data-is-preview], [data-about-syndication] { display: none; } </style> <noscript> <style> .loading { visibility: visible }</style> </noscript> <!-- Google tag (gtag.js) --> <script async='true' src='https://www.googletagmanager.com/gtag/js?id=G-E4MSGF2SF9'></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-E4MSGF2SF9'); </script> <link href='https://www.blogger.com/dyn-css/authorization.css?targetBlogID=7815614485808579332&zx=9069ca84-be54-4ec1-91e8-db3279f51ab9' media='none' onload='if(media!='all')media='all'' rel='stylesheet'/><noscript><link href='https://www.blogger.com/dyn-css/authorization.css?targetBlogID=7815614485808579332&zx=9069ca84-be54-4ec1-91e8-db3279f51ab9' rel='stylesheet'/></noscript> <meta name='google-adsense-platform-account' content='ca-host-pub-1556223355139109'/> <meta name='google-adsense-platform-domain' content='blogspot.com'/> </head> <body> <script type='text/javascript'> //<![CDATA[ var axel = Math.random() + ""; var a = axel * 10000000000000; document.write('<iframe src="https://2542116.fls.doubleclick.net/activityi;src=2542116;type=gblog;cat=googl0;ord=ord=' + a + '?" width="1" height="1" frameborder="0" style="display:none"></iframe>'); //]]> </script> <noscript> <img alt='' height='1' src='https://ad.doubleclick.net/ddm/activity/src=2542116;type=gblog;cat=googl0;ord=1?' width='1'/> </noscript> <!-- Header --> <div class='header-outer'> <div class='header-inner'> <div class='section' id='header'><div class='widget Header' data-version='1' id='Header1'> <div class='header-left'> <div class='header-title'> <a class='google-logo' href='http://ads-developers.googleblog.com/'> <img height='50' src='https://www.gstatic.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png'/> </a> <a href='/.'> <h2> Ads Developer Blog </h2> </a> </div> <div class='header-desc'> The official blog for information about the Google Ads, Google Ad Manager, Google Mobile Ads SDKs for AdMob and IMA SDKs, and other Google Advertising Platform developer tools. </div> </div> </div></div> </div> </div> <!-- all content wrapper start --> <div class='cols-wrapper loading'> <div class='col-main-wrapper'> <div class='col-main'> <div class='section' id='main'><div class='widget Blog' data-version='1' id='Blog1'> <div class='post' data-id='809553900445557328' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2011/12/meet-adsense-api-engineer-nick-johnson.html' itemprop='url' title='Meet an AdSense API Engineer: Nick Johnson'> Meet an AdSense API Engineer: Nick Johnson </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Wednesday, December 28, 2011 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <div dir="ltr" style="text-align: left;" trbidi="on"> <div class="separator" style="text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzvaFCcMpQyx81XtrSkQPVKM__ZxSu7h-S5RvV18siFTyRAiKUwScP-QeFhyhHc5LXBp44hXwIUloLvdTsX1qHlyf8duhcSmmEsqbjgbvUWvA4iDxL2do7pgdnv_3ypBvn3YAjuHTrldw/s1600/picture1b.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzvaFCcMpQyx81XtrSkQPVKM__ZxSu7h-S5RvV18siFTyRAiKUwScP-QeFhyhHc5LXBp44hXwIUloLvdTsX1qHlyf8duhcSmmEsqbjgbvUWvA4iDxL2do7pgdnv_3ypBvn3YAjuHTrldw/s320/picture1b.jpg" width="320" /></a></div> <div class="separator" style="text-align: center;"> <br /></div> A few weeks ago, we caught up with <a href="http://googleadsdeveloper.blogspot.com/2011/12/meet-adsense-api-engineer-ben-birt.html">Ben Birt</a> from our AdSense API Engineering team in London. Today, we'd like to introduce you to another member of the team -- Nick Johnson, a Software Engineer who joined Google in May 2011.<br /> <b><br /></b> <b>What’s your main contribution to API development?</b><br /> I could tell you... but then I would have to use one of those flashy things from Men in Black on you. (We have those at Google). Then I’d probably have to use it on me. I’m essentially a general purpose code monkey at this point in time, but I have some very cool stuff coming into the pipeline soon.<br /> <br /> <b>Describe your average day at work</b><br /> My average day starts with me grabbing a coffee and some cereal from the kitchen. Aside from our (seated) stand up team meeting, everything else changes on a daily basis. So long as I get to do some coding, I’m generally happy.<br /> <b><br /></b> <b>What do you like most about the <a href="http://code.google.com/apis/adsense/management/">AdSense Management API</a>?</b><br /> I think the Ad Clients list call is my favourite. It’s less typing, so that makes it pretty ideal for making test calls. In all seriousness though, I think the thing I like best is the potential. The ways in which you can use and combine your data are entirely in your hands now.<br /> <br /> We have some pretty cool surprises coming from inside Google (but when is that not true?), but we also can’t wait to see what third party developers create.<br /> <b><br /></b> <b>Tell us one best practice about the API</b><br /> Think about what you have, and what you need. Be smart with your calls and make the most of them. Try to multiplex and retrieve as much of the data you need in the least number of calls. You need to balance this with the responsiveness of your app though. Quite obviously more data will take more time.<br /> <br /> Another important thing is that if you have any problems or feature suggestions, then by all means, please...<br /> ...<a href="https://groups.google.com/group/adsense-api">tell Silvano and Sérgio</a> :) (members of the AdSense API Developer Relations team) <br /> <br /> <div class="separator" style="text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVC65T9OYFVN37LOwJLdQrbFzzqPCbyPLk1-o1dIsflEko5U3wXQTXBGPLjkFUlf-udvzp1A8_EDLsZRbl1fWicrTZJrquvXlWJUDyV7NfWqnOafYWLeP5pmAfUA9QMqGZrtzBQa_81sU/s1600/picture2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVC65T9OYFVN37LOwJLdQrbFzzqPCbyPLk1-o1dIsflEko5U3wXQTXBGPLjkFUlf-udvzp1A8_EDLsZRbl1fWicrTZJrquvXlWJUDyV7NfWqnOafYWLeP5pmAfUA9QMqGZrtzBQa_81sU/s320/picture2.jpg" width="320" /></a></div> <div class="separator" style="text-align: center;"> <br /></div> <b>Enough work stuff, let’s go personal. We’ve heard that you lived in Scotland for some years. Is it true that they deep fry everything up there?</b><br /> I think we both know that science has proven any foodstuff can be improved by submerging it in a large quantity of hot fat. It’s like adding “in space” to the end of a plot description. I did live in the beautiful city of <a href="http://en.wikipedia.org/wiki/Edinburgh">Edinburgh</a> (s’up to my homies on the Morningsi-ide) for ten extremely pleasant years, before I moved down to the big smoke for a job with the big G.<br /> <br /> No, it’s not true that the Scottish deep fry everything. It would be far more accurate to say they will deep fry anything. Don’t knock it until you’ve tried it though. Deep fried Mars bars are <a href="//www.youtube.com/watch?v=Tvt-CYmBPI8">very real</a>, but I’m afraid I never tried them. I was worried I might like them.<br /> <b><br /></b> <b>Ok, let me ask you some geeky questions now. I’ve heard that you like functional programming...</b><br /> Truly, your wit is sharp as a pillow.<br /> <br /> Functional programming is something I’m slowly getting my head around, but the biggest barrier (for me, at least) is the attitude of the functional programming evangelists. It’s like talking to someone who thinks Emacs is better than Vim.<br /> <br /> I mean, come on.<br /> <b><br /></b> <b>Since it’s obligatory in these sorts of interviews, why don’t you throw some film and book recommendations our way?</b><br /> I’m at least as big a film nerd as I am a computer nerd (and I do the latter for a living!), so I could literally talk to you all day about that. If I’m completely honest, the film I saw in 2011 which I enjoyed the most was almost certainly Fast [and Furious] 5, but I’m not sure I’d go so far as to say it’s the best film I saw this year. I will always love The Matrix, Fight Club, Pitch Black and Amélie, and right now I’m really quite excited about Joss Whedon(!)’s The Avengers.<br /> <br /> If I had to recommend one book it would probably be either The Hitchhiker’s Guide to the Galaxy, or Neal Stephenson’s Cryptonomicon (though that is really not a light read, in any sense of the word). Recently I read, and loved, “The Alloy of Law”, Brandon Sanderson’s follow up to his brilliant Mistborn trilogy, so I think I’ll also have to recommend those books.<br /> <b><br /></b> <b>Will you fix my computer?</b><br /> No.<br /> <b><br /></b> <b>Fine. Will you code my favorite API?</b><br /> I’m on it.</div><br /> <br /> <span class="post-author"> <a href="https://plus.google.com/118276561380249048216/about"><img src="https://lh5.googleusercontent.com/-RMp-hn38AZI/AAAAAAAAAAI/AAAAAAAAADE/59YQber32iU/photo.jpg?sz=20" style="vertical-align: middle; border: none;" /></a> - <a href="https://plus.google.com/118276561380249048216/about" rel="author">Silvano Luciani</a>, AdSense API Team</span> <br /> <span class="post-author"> <a href="https://plus.google.com/103951349449629293779/about"><img src="https://lh5.googleusercontent.com/-IF04-WU5f0s/AAAAAAAAAAI/AAAAAAAAAD0/p7rs13Nv1VE/photo.jpg?sz=20" style="vertical-align: middle; border: none;" /></a> - <a href="https://plus.google.com/103951349449629293779/about" >Nick Johnson</a>, AdSense API Team</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <div dir="ltr" style="text-align: left;" trbidi="on"> <div class="separator" style="text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzvaFCcMpQyx81XtrSkQPVKM__ZxSu7h-S5RvV18siFTyRAiKUwScP-QeFhyhHc5LXBp44hXwIUloLvdTsX1qHlyf8duhcSmmEsqbjgbvUWvA4iDxL2do7pgdnv_3ypBvn3YAjuHTrldw/s1600/picture1b.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzvaFCcMpQyx81XtrSkQPVKM__ZxSu7h-S5RvV18siFTyRAiKUwScP-QeFhyhHc5LXBp44hXwIUloLvdTsX1qHlyf8duhcSmmEsqbjgbvUWvA4iDxL2do7pgdnv_3ypBvn3YAjuHTrldw/s320/picture1b.jpg" width="320" /></a></div> <div class="separator" style="text-align: center;"> <br /></div> A few weeks ago, we caught up with <a href="http://googleadsdeveloper.blogspot.com/2011/12/meet-adsense-api-engineer-ben-birt.html">Ben Birt</a> from our AdSense API Engineering team in London. Today, we'd like to introduce you to another member of the team -- Nick Johnson, a Software Engineer who joined Google in May 2011.<br /> <b><br /></b> <b>What’s your main contribution to API development?</b><br /> I could tell you... but then I would have to use one of those flashy things from Men in Black on you. (We have those at Google). Then I’d probably have to use it on me. I’m essentially a general purpose code monkey at this point in time, but I have some very cool stuff coming into the pipeline soon.<br /> <br /> <b>Describe your average day at work</b><br /> My average day starts with me grabbing a coffee and some cereal from the kitchen. Aside from our (seated) stand up team meeting, everything else changes on a daily basis. So long as I get to do some coding, I’m generally happy.<br /> <b><br /></b> <b>What do you like most about the <a href="http://code.google.com/apis/adsense/management/">AdSense Management API</a>?</b><br /> I think the Ad Clients list call is my favourite. It’s less typing, so that makes it pretty ideal for making test calls. In all seriousness though, I think the thing I like best is the potential. The ways in which you can use and combine your data are entirely in your hands now.<br /> <br /> We have some pretty cool surprises coming from inside Google (but when is that not true?), but we also can’t wait to see what third party developers create.<br /> <b><br /></b> <b>Tell us one best practice about the API</b><br /> Think about what you have, and what you need. Be smart with your calls and make the most of them. Try to multiplex and retrieve as much of the data you need in the least number of calls. You need to balance this with the responsiveness of your app though. Quite obviously more data will take more time.<br /> <br /> Another important thing is that if you have any problems or feature suggestions, then by all means, please...<br /> ...<a href="https://groups.google.com/group/adsense-api">tell Silvano and Sérgio</a> :) (members of the AdSense API Developer Relations team) <br /> <br /> <div class="separator" style="text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVC65T9OYFVN37LOwJLdQrbFzzqPCbyPLk1-o1dIsflEko5U3wXQTXBGPLjkFUlf-udvzp1A8_EDLsZRbl1fWicrTZJrquvXlWJUDyV7NfWqnOafYWLeP5pmAfUA9QMqGZrtzBQa_81sU/s1600/picture2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVC65T9OYFVN37LOwJLdQrbFzzqPCbyPLk1-o1dIsflEko5U3wXQTXBGPLjkFUlf-udvzp1A8_EDLsZRbl1fWicrTZJrquvXlWJUDyV7NfWqnOafYWLeP5pmAfUA9QMqGZrtzBQa_81sU/s320/picture2.jpg" width="320" /></a></div> <div class="separator" style="text-align: center;"> <br /></div> <b>Enough work stuff, let’s go personal. We’ve heard that you lived in Scotland for some years. Is it true that they deep fry everything up there?</b><br /> I think we both know that science has proven any foodstuff can be improved by submerging it in a large quantity of hot fat. It’s like adding “in space” to the end of a plot description. I did live in the beautiful city of <a href="http://en.wikipedia.org/wiki/Edinburgh">Edinburgh</a> (s’up to my homies on the Morningsi-ide) for ten extremely pleasant years, before I moved down to the big smoke for a job with the big G.<br /> <br /> No, it’s not true that the Scottish deep fry everything. It would be far more accurate to say they will deep fry anything. Don’t knock it until you’ve tried it though. Deep fried Mars bars are <a href="//www.youtube.com/watch?v=Tvt-CYmBPI8">very real</a>, but I’m afraid I never tried them. I was worried I might like them.<br /> <b><br /></b> <b>Ok, let me ask you some geeky questions now. I’ve heard that you like functional programming...</b><br /> Truly, your wit is sharp as a pillow.<br /> <br /> Functional programming is something I’m slowly getting my head around, but the biggest barrier (for me, at least) is the attitude of the functional programming evangelists. It’s like talking to someone who thinks Emacs is better than Vim.<br /> <br /> I mean, come on.<br /> <b><br /></b> <b>Since it’s obligatory in these sorts of interviews, why don’t you throw some film and book recommendations our way?</b><br /> I’m at least as big a film nerd as I am a computer nerd (and I do the latter for a living!), so I could literally talk to you all day about that. If I’m completely honest, the film I saw in 2011 which I enjoyed the most was almost certainly Fast [and Furious] 5, but I’m not sure I’d go so far as to say it’s the best film I saw this year. I will always love The Matrix, Fight Club, Pitch Black and Amélie, and right now I’m really quite excited about Joss Whedon(!)’s The Avengers.<br /> <br /> If I had to recommend one book it would probably be either The Hitchhiker’s Guide to the Galaxy, or Neal Stephenson’s Cryptonomicon (though that is really not a light read, in any sense of the word). Recently I read, and loved, “The Alloy of Law”, Brandon Sanderson’s follow up to his brilliant Mistborn trilogy, so I think I’ll also have to recommend those books.<br /> <b><br /></b> <b>Will you fix my computer?</b><br /> No.<br /> <b><br /></b> <b>Fine. Will you code my favorite API?</b><br /> I’m on it.</div><br /> <br /> <span class="post-author"> <a href="https://plus.google.com/118276561380249048216/about"><img src="https://lh5.googleusercontent.com/-RMp-hn38AZI/AAAAAAAAAAI/AAAAAAAAADE/59YQber32iU/photo.jpg?sz=20" style="vertical-align: middle; border: none;" /></a> - <a href="https://plus.google.com/118276561380249048216/about" rel="author">Silvano Luciani</a>, AdSense API Team</span> <br /> <span class="post-author"> <a href="https://plus.google.com/103951349449629293779/about"><img src="https://lh5.googleusercontent.com/-IF04-WU5f0s/AAAAAAAAAAI/AAAAAAAAAD0/p7rs13Nv1VE/photo.jpg?sz=20" style="vertical-align: middle; border: none;" /></a> - <a href="https://plus.google.com/103951349449629293779/about" >Nick Johnson</a>, AdSense API Team</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Meet an AdSense API Engineer: Nick Johnson&url=http://ads-developers.googleblog.com/2011/12/meet-adsense-api-engineer-nick-johnson.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2011/12/meet-adsense-api-engineer-nick-johnson.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2011/12/meet-adsense-api-engineer-nick-johnson.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/adsense_api' rel='tag'> adsense_api </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/interview' rel='tag'> interview </a> </span> </div> </div> </div> <div class='post' data-id='3750809328016180875' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2011/12/admob-and-adwhirl-refresh-rates-subtle.html' itemprop='url' title='AdMob and AdWhirl Refresh Rates - A Subtle but Important Difference'> AdMob and AdWhirl Refresh Rates - A Subtle but Important Difference </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Wednesday, December 28, 2011 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p>The <a href="http://code.google.com/p/adwhirl/">AdWhirl SDK</a> provides a framework that allows developers to display banner ads from different ad networks in their iOS and Android applications. You simply tell AdWhirl what ad networks you want to use and the percentage of requests to allocate to each network, and AdWhirl handles the ad requests. But how do you choose an acceptable refresh rate, and what settings should you use for both AdWhirl and your individual ad networks?</p> <p>AdWhirl has its own refresh rate; when it comes time to refresh, AdWhirl removes the current network’s ad view, chooses a new ad network, and creates a new ad view for that network. So how is this different from the AdMob refresh rate? Well, the AdMob refresh rate determines when its own ad view will request a new ad.</p> <p>AdWhirl does not know about the specific ad networks’ refresh rates. Most networks expose the refresh rate on the client side; AdWhirl takes advantage of this by turning off refreshing for these networks. AdMob, however, only supports configuring the refresh rate on the server side. Therefore, AdWhirl must rely on you, the developer, to turn off the network refresh rate. Forgetting to do so may result in unexpected refreshes. This is best demonstrated with an example.</p> <p>Let’s say AdWhirl has selected the AdMob network for displaying an ad, and your AdMob refresh rate is 29 seconds while your AdWhirl refresh rate is 30 seconds. AdWhirl will load up an AdMob view, and then the AdMob view will request and show an ad. After 29 seconds, AdMob decides it's time to refresh, grabs a new ad on it's own, and displays a new ad. AdWhirl has no idea that AdMob just refreshed. One second later, AdWhirl decides it’s time to refresh (30 seconds have passed), and removes the AdMob view and picks a new ad network from which to show an ad.</p> <p>In the above example, AdMob displayed a new ad that was shown for only one second--it had virtually no chance of being clicked. This results in extra impressions that reduce your click through rate and confuse your customers. To avoid having AdMob refresh on its own, make sure to turn off automatic refreshing for the AdMob publisher ID you are mediating with!</p> <p>Please post to the <a href="https://groups.google.com/forum/#!forum/adwhirl-users">forum</a> for any questions regarding refresh rates. You’re also welcome to attend one of our <a href="http://googleadsdeveloper.blogspot.com/search/label/admob_sdk">office hours</a> hangouts.</p> <p><span class="post-author"><a href="https://plus.google.com/112870803958713211515/"><img height="20" src="https://lh4.googleusercontent.com/-VjOdMVF5_qc/AAAAAAAAAAI/AAAAAAAAAB8/aYikCy7pZmw/photo.jpg?sz=20" style="vertical-align:middle; border:none;" width="20"></a> - <a href="https://plus.google.com/112870803958713211515/" rel="author">Eric Leichtenschlag</a>, AdMob Team</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p>The <a href="http://code.google.com/p/adwhirl/">AdWhirl SDK</a> provides a framework that allows developers to display banner ads from different ad networks in their iOS and Android applications. You simply tell AdWhirl what ad networks you want to use and the percentage of requests to allocate to each network, and AdWhirl handles the ad requests. But how do you choose an acceptable refresh rate, and what settings should you use for both AdWhirl and your individual ad networks?</p> <p>AdWhirl has its own refresh rate; when it comes time to refresh, AdWhirl removes the current network’s ad view, chooses a new ad network, and creates a new ad view for that network. So how is this different from the AdMob refresh rate? Well, the AdMob refresh rate determines when its own ad view will request a new ad.</p> <p>AdWhirl does not know about the specific ad networks’ refresh rates. Most networks expose the refresh rate on the client side; AdWhirl takes advantage of this by turning off refreshing for these networks. AdMob, however, only supports configuring the refresh rate on the server side. Therefore, AdWhirl must rely on you, the developer, to turn off the network refresh rate. Forgetting to do so may result in unexpected refreshes. This is best demonstrated with an example.</p> <p>Let’s say AdWhirl has selected the AdMob network for displaying an ad, and your AdMob refresh rate is 29 seconds while your AdWhirl refresh rate is 30 seconds. AdWhirl will load up an AdMob view, and then the AdMob view will request and show an ad. After 29 seconds, AdMob decides it's time to refresh, grabs a new ad on it's own, and displays a new ad. AdWhirl has no idea that AdMob just refreshed. One second later, AdWhirl decides it’s time to refresh (30 seconds have passed), and removes the AdMob view and picks a new ad network from which to show an ad.</p> <p>In the above example, AdMob displayed a new ad that was shown for only one second--it had virtually no chance of being clicked. This results in extra impressions that reduce your click through rate and confuse your customers. To avoid having AdMob refresh on its own, make sure to turn off automatic refreshing for the AdMob publisher ID you are mediating with!</p> <p>Please post to the <a href="https://groups.google.com/forum/#!forum/adwhirl-users">forum</a> for any questions regarding refresh rates. You’re also welcome to attend one of our <a href="http://googleadsdeveloper.blogspot.com/search/label/admob_sdk">office hours</a> hangouts.</p> <p><span class="post-author"><a href="https://plus.google.com/112870803958713211515/"><img height="20" src="https://lh4.googleusercontent.com/-VjOdMVF5_qc/AAAAAAAAAAI/AAAAAAAAAB8/aYikCy7pZmw/photo.jpg?sz=20" style="vertical-align:middle; border:none;" width="20"></a> - <a href="https://plus.google.com/112870803958713211515/" rel="author">Eric Leichtenschlag</a>, AdMob Team</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:AdMob and AdWhirl Refresh Rates - A Subtle but Important Difference&url=http://ads-developers.googleblog.com/2011/12/admob-and-adwhirl-refresh-rates-subtle.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2011/12/admob-and-adwhirl-refresh-rates-subtle.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2011/12/admob-and-adwhirl-refresh-rates-subtle.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/admob_sdk' rel='tag'> admob_sdk </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/adwhirl' rel='tag'> adwhirl </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile' rel='tag'> mobile </a> </span> </div> </div> </div> <div class='post' data-id='3934115252016169996' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2011/12/incorporating-google-admob-ads-into.html' itemprop='url' title='Incorporating Google AdMob ads into a Table View in iOS'> Incorporating Google AdMob ads into a Table View in iOS </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Thursday, December 22, 2011 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p>Perfecting the look of your application is challenging, and incorporating ads into your application requires careful thinking. When using the AdMob SDK with <a href="http://developer.apple.com/library/IOS/#documentation/UIKit/Reference/UITableView_Class/Reference/Reference.html">Table Views</a> in iOS, a typical challenge is that ads do not stay docked properly to a certain position on the screen. This blog post outlines a simple solution to this common problem.</p> <br/> <b>Challenge</b> <p>Consider a simple application in which a <a href="http://developer.apple.com/library/IOS/#documentation/UIKit/Reference/UITableViewController_Class/Reference/Reference.html ">UITableViewController</a> is used to handle a list mechanism. If this is the main top level view in the application, getting the ad to remain docked to the bottom or top of the view while the content scrolls is problematic. This is usually because the ad has been placed inside the <a href="http://developer.apple.com/library/IOS/#documentation/UIKit/Reference/UITableView_Class/Reference/Reference.html ">Table View</a>.</p> <br/> <center> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGDJXJI3MK6j9CHhzxssB4ud22_KHKF3zGaVp3OWlGGYltZkTMN-WqWQjjT2t5HG2ZmxZFeVQrivb-fPVW0nwg49lCrN1Qz3POVEd9m-otKS1aXJR6sZI1kUQQAAnHlhKbPjLsOxbASc4/s1600/Screen+shot+2011-12-22+at+12.03.43+PM.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="191" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGDJXJI3MK6j9CHhzxssB4ud22_KHKF3zGaVp3OWlGGYltZkTMN-WqWQjjT2t5HG2ZmxZFeVQrivb-fPVW0nwg49lCrN1Qz3POVEd9m-otKS1aXJR6sZI1kUQQAAnHlhKbPjLsOxbASc4/s320/Screen+shot+2011-12-22+at+12.03.43+PM.png" width="320" /></a></center> <br/> <b>Solution</b> <p>One way to dock the ad is to encompass the <a href="http://developer.apple.com/library/IOS/#documentation/UIKit/Reference/UITableView_Class/Reference/Reference.html ">Table View</a> into a container view (e.g. a <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIView_Class/UIView/UIView.html ">UIView</a>). This way, instead of inserting the ad into the <a href="http://developer.apple.com/library/IOS/#documentation/UIKit/Reference/UITableView_Class/Reference/Reference.html ">Table View</a> as a subview, it’s inserted into the encompassing container view (as a sibling of the <a href="http://developer.apple.com/library/IOS/#documentation/UIKit/Reference/UITableView_Class/Reference/Reference.html ">Table View</a>). Here is an example of the code snippet in the header file:</p> <pre class="prettyprint"> @interface AdsOutOfTableView : UIViewController<GADBannerViewDelegate> { @private UITableView *tableView_; //Other private variables here } @property(nonatomic,retain) IBOutlet UITableView *tableView; @end </pre> <p>As shown in this <a href="http://code.google.com/mobile/ads/docs/ios/fundamentals.html#addbannerview ">example</a>, the GADBannerView is initialized with a frame that has an origin at the bottom of the screen.</p> <p>Now when the ad is received, it should be added into the container view, and the size of the <a href="http://developer.apple.com/library/IOS/#documentation/UIKit/Reference/UITableView_Class/Reference/Reference.html">Table View</a> should be modified accordingly. The height of the <a href="http://developer.apple.com/library/IOS/#documentation/UIKit/Reference/UITableView_Class/Reference/Reference.html">Table View</a>'s frame cannot be modified directly, but this can be done using an intermediate frame as shown below.</p> <pre class="prettyprint"> -(void)resizeTable { CGRect tableFrame = tableView_.frame; tableFrame.size.height = tableFrame.size.height - bannerView_.frame.size.height; tableView_.frame = tableFrame; } </pre> <p>Now, no matter how much the <a href="http://developer.apple.com/library/IOS/#documentation/UIKit/Reference/UITableView_Class/Reference/Reference.html ">Table View</a> is scrolled, the <a href="http://code.google.com/mobile/ads/docs/ios/fundamentals.html#addbannerview ">GADBannerView</a> stays docked to the bottom of the screen.</p> <p>Alternatively, keeping the ad docked to the top of the <a href="http://developer.apple.com/library/IOS/#documentation/UIKit/Reference/UITableView_Class/Reference/Reference.html ">Table View</a> is very similar to the situation shown above. The only difference is that the <a href="http://code.google.com/mobile/ads/docs/ios/fundamentals.html#addbannerview">GADBannerView</a> must be created and drawn at the top of the screen. The resizeTable: method now also has to to shift itself down by the height of the ad:</p> <pre class="prettyprint"> CGRect tableFrame = tableView_.frame; tableFrame.size.height = tableFrame.size.height - bannerView_.frame.size.height; tableFrame.origin.y = bannerView_.frame.size.height; tableView_.frame = tableFrame; </pre> <p>With those minor tweaks, you will have ads set up correctly alongside your <a href="http://developer.apple.com/library/IOS/#documentation/UIKit/Reference/UITableView_Class/Reference/Reference.html">Table View</a>! If you have any questions about this or any other SDK topics, feel free to post them in our <a href="https://groups.google.com/forum/#!forum/google-admob-ads-sdk">forum</a>. </p> <br/> <span class="post-author"><a href="https://plus.google.com/102708799507737837368"><img height="20" src="https://lh3.googleusercontent.com/-RonljIAjNbg/AAAAAAAAAAI/AAAAAAAAAps/nM93tw3iYSk/s200-c-k/photo.jpg?sz=20" style="vertical-align:middle; border:none;" width="20"></a> - <a href="https://plus.google.com/102708799507737837368" rel="author">Raj Parameswaran</a>, AdMob Team</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p>Perfecting the look of your application is challenging, and incorporating ads into your application requires careful thinking. When using the AdMob SDK with <a href="http://developer.apple.com/library/IOS/#documentation/UIKit/Reference/UITableView_Class/Reference/Reference.html">Table Views</a> in iOS, a typical challenge is that ads do not stay docked properly to a certain position on the screen. This blog post outlines a simple solution to this common problem.</p> <br/> <b>Challenge</b> <p>Consider a simple application in which a <a href="http://developer.apple.com/library/IOS/#documentation/UIKit/Reference/UITableViewController_Class/Reference/Reference.html ">UITableViewController</a> is used to handle a list mechanism. If this is the main top level view in the application, getting the ad to remain docked to the bottom or top of the view while the content scrolls is problematic. This is usually because the ad has been placed inside the <a href="http://developer.apple.com/library/IOS/#documentation/UIKit/Reference/UITableView_Class/Reference/Reference.html ">Table View</a>.</p> <br/> <center> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGDJXJI3MK6j9CHhzxssB4ud22_KHKF3zGaVp3OWlGGYltZkTMN-WqWQjjT2t5HG2ZmxZFeVQrivb-fPVW0nwg49lCrN1Qz3POVEd9m-otKS1aXJR6sZI1kUQQAAnHlhKbPjLsOxbASc4/s1600/Screen+shot+2011-12-22+at+12.03.43+PM.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="191" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGDJXJI3MK6j9CHhzxssB4ud22_KHKF3zGaVp3OWlGGYltZkTMN-WqWQjjT2t5HG2ZmxZFeVQrivb-fPVW0nwg49lCrN1Qz3POVEd9m-otKS1aXJR6sZI1kUQQAAnHlhKbPjLsOxbASc4/s320/Screen+shot+2011-12-22+at+12.03.43+PM.png" width="320" /></a></center> <br/> <b>Solution</b> <p>One way to dock the ad is to encompass the <a href="http://developer.apple.com/library/IOS/#documentation/UIKit/Reference/UITableView_Class/Reference/Reference.html ">Table View</a> into a container view (e.g. a <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIView_Class/UIView/UIView.html ">UIView</a>). This way, instead of inserting the ad into the <a href="http://developer.apple.com/library/IOS/#documentation/UIKit/Reference/UITableView_Class/Reference/Reference.html ">Table View</a> as a subview, it’s inserted into the encompassing container view (as a sibling of the <a href="http://developer.apple.com/library/IOS/#documentation/UIKit/Reference/UITableView_Class/Reference/Reference.html ">Table View</a>). Here is an example of the code snippet in the header file:</p> <pre class="prettyprint"> @interface AdsOutOfTableView : UIViewController<GADBannerViewDelegate> { @private UITableView *tableView_; //Other private variables here } @property(nonatomic,retain) IBOutlet UITableView *tableView; @end </pre> <p>As shown in this <a href="http://code.google.com/mobile/ads/docs/ios/fundamentals.html#addbannerview ">example</a>, the GADBannerView is initialized with a frame that has an origin at the bottom of the screen.</p> <p>Now when the ad is received, it should be added into the container view, and the size of the <a href="http://developer.apple.com/library/IOS/#documentation/UIKit/Reference/UITableView_Class/Reference/Reference.html">Table View</a> should be modified accordingly. The height of the <a href="http://developer.apple.com/library/IOS/#documentation/UIKit/Reference/UITableView_Class/Reference/Reference.html">Table View</a>'s frame cannot be modified directly, but this can be done using an intermediate frame as shown below.</p> <pre class="prettyprint"> -(void)resizeTable { CGRect tableFrame = tableView_.frame; tableFrame.size.height = tableFrame.size.height - bannerView_.frame.size.height; tableView_.frame = tableFrame; } </pre> <p>Now, no matter how much the <a href="http://developer.apple.com/library/IOS/#documentation/UIKit/Reference/UITableView_Class/Reference/Reference.html ">Table View</a> is scrolled, the <a href="http://code.google.com/mobile/ads/docs/ios/fundamentals.html#addbannerview ">GADBannerView</a> stays docked to the bottom of the screen.</p> <p>Alternatively, keeping the ad docked to the top of the <a href="http://developer.apple.com/library/IOS/#documentation/UIKit/Reference/UITableView_Class/Reference/Reference.html ">Table View</a> is very similar to the situation shown above. The only difference is that the <a href="http://code.google.com/mobile/ads/docs/ios/fundamentals.html#addbannerview">GADBannerView</a> must be created and drawn at the top of the screen. The resizeTable: method now also has to to shift itself down by the height of the ad:</p> <pre class="prettyprint"> CGRect tableFrame = tableView_.frame; tableFrame.size.height = tableFrame.size.height - bannerView_.frame.size.height; tableFrame.origin.y = bannerView_.frame.size.height; tableView_.frame = tableFrame; </pre> <p>With those minor tweaks, you will have ads set up correctly alongside your <a href="http://developer.apple.com/library/IOS/#documentation/UIKit/Reference/UITableView_Class/Reference/Reference.html">Table View</a>! If you have any questions about this or any other SDK topics, feel free to post them in our <a href="https://groups.google.com/forum/#!forum/google-admob-ads-sdk">forum</a>. </p> <br/> <span class="post-author"><a href="https://plus.google.com/102708799507737837368"><img height="20" src="https://lh3.googleusercontent.com/-RonljIAjNbg/AAAAAAAAAAI/AAAAAAAAAps/nM93tw3iYSk/s200-c-k/photo.jpg?sz=20" style="vertical-align:middle; border:none;" width="20"></a> - <a href="https://plus.google.com/102708799507737837368" rel="author">Raj Parameswaran</a>, AdMob Team</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Incorporating Google AdMob ads into a Table View in iOS&url=http://ads-developers.googleblog.com/2011/12/incorporating-google-admob-ads-into.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2011/12/incorporating-google-admob-ads-into.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2011/12/incorporating-google-admob-ads-into.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/admob_sdk' rel='tag'> admob_sdk </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/iOS' rel='tag'> iOS </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile' rel='tag'> mobile </a> </span> </div> </div> </div> <div class='post' data-id='1294202733461947118' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2011/12/google-app-engine-for-java-meet-dfp-api.html' itemprop='url' title='Google App Engine for Java meet DFP API, Part 1: Hello World'> Google App Engine for Java meet DFP API, Part 1: Hello World </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Thursday, December 22, 2011 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p>We are excited to start discussing how to use the <a href="http://code.google.com/apis/dfp/">DFP API</a> from within the <a href="http://code.google.com/appengine/">Google App Engine</a> (Java) environment. This first blog post in the series focuses on setting up your environment and understanding how to use the API from App Engine. Future posts in this series will build upon the same project to create a sample application. Ultimately, you will be able to make DFP information more accessible within your organization, while also leveraging the ease of scale and deployability that comes with creating applications on Google App Engine.</p> <p><b>Setting up your environment</b><br/><br/>For simplicity sake we will focus on utilizing Eclipse and the Google App Engine Plugin available for Eclipse. Information about setting them up can be found <a href="http://code.google.com/appengine/docs/java/tools/eclipse.html">here</a>. If you prefer a different environment setup, you can always view the <a href="http://code.google.com/appengine/docs/java/gettingstarted/">Getting Started Guide for App Engine</a> for more information.<br /><br /><b>Create an App Engine project</b><br /><br/>You’ll need a place to do your coding so create an App Engine project in a similar manner to the screenshots below.</p> <br> <a href="https://lh5.googleusercontent.com/7QOduFQYuZMbWv8dUFsygi6mHQciCDfQvXOrC4FdrE90LGnWvIXTxtAL7EJPNfDSjv8h54-9qvJurrxx1mJ8fvFRzYS2KbQRLEtDd-lD4PNR9pHQsB8"><img src="https://lh5.googleusercontent.com/7QOduFQYuZMbWv8dUFsygi6mHQciCDfQvXOrC4FdrE90LGnWvIXTxtAL7EJPNfDSjv8h54-9qvJurrxx1mJ8fvFRzYS2KbQRLEtDd-lD4PNR9pHQsB8" width="250" /></a><a href="https://lh6.googleusercontent.com/Lso2PT0dpPham3cSGiYc9BVK6vO6UassXzazokh6zF1WLs8x9QL1uOWbIVDYRHJijmljVpGvRKQbUFuec5qcuVfhJyvIi_3dCtnpX-5YEaJyTAmE0gQ"><img src="https://lh6.googleusercontent.com/Lso2PT0dpPham3cSGiYc9BVK6vO6UassXzazokh6zF1WLs8x9QL1uOWbIVDYRHJijmljVpGvRKQbUFuec5qcuVfhJyvIi_3dCtnpX-5YEaJyTAmE0gQ" width="250" /></a> <p>Note: If you would like to download all of the source code in this blog post to follow along you can do so as a <a href="http://code.google.com/p/google-api-dfp-java/downloads/detail?name=dfp-appenginesample.tar.gz&can=2&q=">tarball</a> or you can browse the code base from our <a href="http://code.google.com/p/google-api-dfp-java/source/browse/#svn%2Fapps%2Fdfponappengine">svn repository</a>.</p> <p><b>Dependencies</b><br /><br/>The App Engine Java environment requires JAX-WS when dealing with SOAP interfaces like DFP API so you won’t be able to use the normal Java <a href="http://code.google.com/p/google-api-dfp-java/">client library</a>. You’ll need to download <a href="http://code.google.com/p/google-api-dfp-java/source/browse/apps/dfponappengine/src/com/google/api/ads/dfp/samples/appengine/ClientLoginAuth.java">this client login auth file</a> to help with authentication. Place this file in your project’s src directory. Next, you’ll need a <a href="http://code.google.com/p/google-api-dfp-java/source/browse/apps/dfponappengine/war/WEB-INF/lib/dfp-api-jax-ws-20111220.jar">jar</a> and a <a href="http://code.google.com/p/google-api-dfp-java/source/browse/apps/dfponappengine/war/WEB-INF/CombinedWsdl.wsdl">wsdl</a> file that we’ve compiled with JAX-WS; place them in the WEB-INF/lib and WEB-INF directory, respectively. See the files highlighted in their respective locations below.</p> <br> <a href="https://lh4.googleusercontent.com/Wu8AAUApedNt367zp5LSQU-wTNnOPNRhwGEcfrLvA1nRglQW21aUMwL3T-Y6CuA-G2dQ2nRc2ZCMJ7N_TjVV2nDXNyVnP4DjW1uZ2j7vs4CI9g83kKE"><img src="https://lh4.googleusercontent.com/Wu8AAUApedNt367zp5LSQU-wTNnOPNRhwGEcfrLvA1nRglQW21aUMwL3T-Y6CuA-G2dQ2nRc2ZCMJ7N_TjVV2nDXNyVnP4DjW1uZ2j7vs4CI9g83kKE" width="500" /></a> <p><b>Write some code</b><br /><br/>Now that you’re set up, it’s time to write some code that uses the DFP API. This first snippet of code performs some setup for your App Engine Servlet.</p> <pre class="prettyprint"> /** * Perform initialization of servlet and cached resources used to * access DFP API. */ @Override public void init(ServletConfig config) throws ServletException { super.init(config); // Generate an authToken. try { authToken = regenerateAuthToken(); } catch (Exception exception) { throw new ServletException("Could not generate an Auth Token.", exception); } } /** * Regenerate the client login auth token that the servlet uses. * * @throws Exception */ public synchronized String regenerateAuthToken() throws Exception { ClientLoginAuth clientLoginAuth = new ClientLoginAuth(EMAIL_ADDRESS, EMAIL_ADDRESS_PASSWORD); return clientLoginAuth.getAuthToken(); } </pre> <p>This next snippet of code handles the actual web browser requests.</p> <pre class="prettyprint"> @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException { try { // Retrieve an object handle to our network service. NetworkService networkService = new NetworkService(); NetworkServiceInterface networkServiceInterface = networkService.getNetworkServiceInterfacePort(); // Prepare header object to make server call SoapRequestHeader requestHeader = new SoapRequestHeader(); requestHeader.setApplicationName("Hello World"); ClientLogin clientLogin = new ClientLogin(); clientLogin.setToken(authToken); requestHeader.setAuthentication(clientLogin); // Make protected call to the server. String rootAdUnitId = ""; Network currentNetwork = networkServiceInterface.getCurrentNetwork( requestHeader, null); // Extract data from object returned from server. rootAdUnitId = currentNetwork.getEffectiveRootAdUnitId(); resp.setContentType("text/plain"); resp.getWriter().println("Hello, world. Your root ad unit id is: " + rootAdUnitId); } catch (Exception e) { // Perform exception handling. e.printStackTrace(); throw new ServletException("Error occurred. Check logs for specific " " details about the error."); } } </pre> <p>This particular code snippet retrieves the root ad unit for our network whenever someone accesses the application. You can view the full sample servlet code <a href="http://code.google.com/p/google-api-dfp-java/source/browse/apps/dfponappengine/src/com/google/api/ads/dfp/samples/appengine/DfpAppEngineServlet.java">here</a>.<br /><br /><b>Testing</b><br /><br/>To make sure your code works, let’s deploy the project locally. Right-click on your project and then choose “Run” and select the “Web Application” option from the submenu. This will deploy your code to a locally running App Engine server. The console will display the URL to access the application (usually <a href="http://localhost:8888/">http://localhost:8888/</a>). Clicking on this link and then the subsequent servlet link should return a page similar to this.</p> <br> <a href="https://lh6.googleusercontent.com/xLkcrweB0ZC-PlfKrgNPBHQHCF2hg-XDtAYJuHLlyy1YrHFHiAkCeEsubIum3fBRvMISNl-4Uq3AhkEJiNeGvfc7IeIF4-Y0igY8Afo2EB6sSvMUHXY"><img src="https://lh6.googleusercontent.com/xLkcrweB0ZC-PlfKrgNPBHQHCF2hg-XDtAYJuHLlyy1YrHFHiAkCeEsubIum3fBRvMISNl-4Uq3AhkEJiNeGvfc7IeIF4-Y0igY8Afo2EB6sSvMUHXY" width="500" /></a><br /><br /><a href="https://lh3.googleusercontent.com/qMMOCzICbIUipTiiUWjXPo_qnZ2EoBbzBdd4-2EFm72dPflhSntqoDMrJFMCNVDUZ9n5_6qOCHrWreL-qg7p1GXdjUWbWtfQprjBFZB9_rCfxQ3Q5kI"><img src="https://lh3.googleusercontent.com/qMMOCzICbIUipTiiUWjXPo_qnZ2EoBbzBdd4-2EFm72dPflhSntqoDMrJFMCNVDUZ9n5_6qOCHrWreL-qg7p1GXdjUWbWtfQprjBFZB9_rCfxQ3Q5kI" width="500" /></a> <p><b>Next Time</b><br /><br/>Next time, we’ll extend the project to do some background processing and start using some other services from the DFP API.<br /><br /><b>Troubleshooting</b><br /><br/>We really hope you didn’t have an issue, but if you did there is a troubleshooting README file included in the <a href="http://code.google.com/p/google-api-dfp-java/source/browse/apps/dfponappengine/README">sample code</a>.</p> <p><a href="http://code.google.com/apis/dfp/forum/discussions.html">Let us know</a> if you have any questions, and happy holidays!</p> <br /> <span class="post-author"><a href="https://plus.google.com/104679465567407024302/"><img height="20" src="https://lh5.googleusercontent.com/oQZTvGY1RNICm4p-kpeNseyIOgEfFdRDfMNyaMs0hrBVvzjZQODeEnRRPbHA0SoebObwNhQnL7bEDImdE16tYXjwViv-90GTbywThxtii7XS7MO3RzE?sz=20" style="vertical-align:middle; border:none;" width="20"></a> - <a href="https://plus.google.com/104679465567407024302/" rel="author">Paul Rashidi</a>, DFP API Team</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p>We are excited to start discussing how to use the <a href="http://code.google.com/apis/dfp/">DFP API</a> from within the <a href="http://code.google.com/appengine/">Google App Engine</a> (Java) environment. This first blog post in the series focuses on setting up your environment and understanding how to use the API from App Engine. Future posts in this series will build upon the same project to create a sample application. Ultimately, you will be able to make DFP information more accessible within your organization, while also leveraging the ease of scale and deployability that comes with creating applications on Google App Engine.</p> <p><b>Setting up your environment</b><br/><br/>For simplicity sake we will focus on utilizing Eclipse and the Google App Engine Plugin available for Eclipse. Information about setting them up can be found <a href="http://code.google.com/appengine/docs/java/tools/eclipse.html">here</a>. If you prefer a different environment setup, you can always view the <a href="http://code.google.com/appengine/docs/java/gettingstarted/">Getting Started Guide for App Engine</a> for more information.<br /><br /><b>Create an App Engine project</b><br /><br/>You’ll need a place to do your coding so create an App Engine project in a similar manner to the screenshots below.</p> <br> <a href="https://lh5.googleusercontent.com/7QOduFQYuZMbWv8dUFsygi6mHQciCDfQvXOrC4FdrE90LGnWvIXTxtAL7EJPNfDSjv8h54-9qvJurrxx1mJ8fvFRzYS2KbQRLEtDd-lD4PNR9pHQsB8"><img src="https://lh5.googleusercontent.com/7QOduFQYuZMbWv8dUFsygi6mHQciCDfQvXOrC4FdrE90LGnWvIXTxtAL7EJPNfDSjv8h54-9qvJurrxx1mJ8fvFRzYS2KbQRLEtDd-lD4PNR9pHQsB8" width="250" /></a><a href="https://lh6.googleusercontent.com/Lso2PT0dpPham3cSGiYc9BVK6vO6UassXzazokh6zF1WLs8x9QL1uOWbIVDYRHJijmljVpGvRKQbUFuec5qcuVfhJyvIi_3dCtnpX-5YEaJyTAmE0gQ"><img src="https://lh6.googleusercontent.com/Lso2PT0dpPham3cSGiYc9BVK6vO6UassXzazokh6zF1WLs8x9QL1uOWbIVDYRHJijmljVpGvRKQbUFuec5qcuVfhJyvIi_3dCtnpX-5YEaJyTAmE0gQ" width="250" /></a> <p>Note: If you would like to download all of the source code in this blog post to follow along you can do so as a <a href="http://code.google.com/p/google-api-dfp-java/downloads/detail?name=dfp-appenginesample.tar.gz&can=2&q=">tarball</a> or you can browse the code base from our <a href="http://code.google.com/p/google-api-dfp-java/source/browse/#svn%2Fapps%2Fdfponappengine">svn repository</a>.</p> <p><b>Dependencies</b><br /><br/>The App Engine Java environment requires JAX-WS when dealing with SOAP interfaces like DFP API so you won’t be able to use the normal Java <a href="http://code.google.com/p/google-api-dfp-java/">client library</a>. You’ll need to download <a href="http://code.google.com/p/google-api-dfp-java/source/browse/apps/dfponappengine/src/com/google/api/ads/dfp/samples/appengine/ClientLoginAuth.java">this client login auth file</a> to help with authentication. Place this file in your project’s src directory. Next, you’ll need a <a href="http://code.google.com/p/google-api-dfp-java/source/browse/apps/dfponappengine/war/WEB-INF/lib/dfp-api-jax-ws-20111220.jar">jar</a> and a <a href="http://code.google.com/p/google-api-dfp-java/source/browse/apps/dfponappengine/war/WEB-INF/CombinedWsdl.wsdl">wsdl</a> file that we’ve compiled with JAX-WS; place them in the WEB-INF/lib and WEB-INF directory, respectively. See the files highlighted in their respective locations below.</p> <br> <a href="https://lh4.googleusercontent.com/Wu8AAUApedNt367zp5LSQU-wTNnOPNRhwGEcfrLvA1nRglQW21aUMwL3T-Y6CuA-G2dQ2nRc2ZCMJ7N_TjVV2nDXNyVnP4DjW1uZ2j7vs4CI9g83kKE"><img src="https://lh4.googleusercontent.com/Wu8AAUApedNt367zp5LSQU-wTNnOPNRhwGEcfrLvA1nRglQW21aUMwL3T-Y6CuA-G2dQ2nRc2ZCMJ7N_TjVV2nDXNyVnP4DjW1uZ2j7vs4CI9g83kKE" width="500" /></a> <p><b>Write some code</b><br /><br/>Now that you’re set up, it’s time to write some code that uses the DFP API. This first snippet of code performs some setup for your App Engine Servlet.</p> <pre class="prettyprint"> /** * Perform initialization of servlet and cached resources used to * access DFP API. */ @Override public void init(ServletConfig config) throws ServletException { super.init(config); // Generate an authToken. try { authToken = regenerateAuthToken(); } catch (Exception exception) { throw new ServletException("Could not generate an Auth Token.", exception); } } /** * Regenerate the client login auth token that the servlet uses. * * @throws Exception */ public synchronized String regenerateAuthToken() throws Exception { ClientLoginAuth clientLoginAuth = new ClientLoginAuth(EMAIL_ADDRESS, EMAIL_ADDRESS_PASSWORD); return clientLoginAuth.getAuthToken(); } </pre> <p>This next snippet of code handles the actual web browser requests.</p> <pre class="prettyprint"> @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException { try { // Retrieve an object handle to our network service. NetworkService networkService = new NetworkService(); NetworkServiceInterface networkServiceInterface = networkService.getNetworkServiceInterfacePort(); // Prepare header object to make server call SoapRequestHeader requestHeader = new SoapRequestHeader(); requestHeader.setApplicationName("Hello World"); ClientLogin clientLogin = new ClientLogin(); clientLogin.setToken(authToken); requestHeader.setAuthentication(clientLogin); // Make protected call to the server. String rootAdUnitId = ""; Network currentNetwork = networkServiceInterface.getCurrentNetwork( requestHeader, null); // Extract data from object returned from server. rootAdUnitId = currentNetwork.getEffectiveRootAdUnitId(); resp.setContentType("text/plain"); resp.getWriter().println("Hello, world. Your root ad unit id is: " + rootAdUnitId); } catch (Exception e) { // Perform exception handling. e.printStackTrace(); throw new ServletException("Error occurred. Check logs for specific " " details about the error."); } } </pre> <p>This particular code snippet retrieves the root ad unit for our network whenever someone accesses the application. You can view the full sample servlet code <a href="http://code.google.com/p/google-api-dfp-java/source/browse/apps/dfponappengine/src/com/google/api/ads/dfp/samples/appengine/DfpAppEngineServlet.java">here</a>.<br /><br /><b>Testing</b><br /><br/>To make sure your code works, let’s deploy the project locally. Right-click on your project and then choose “Run” and select the “Web Application” option from the submenu. This will deploy your code to a locally running App Engine server. The console will display the URL to access the application (usually <a href="http://localhost:8888/">http://localhost:8888/</a>). Clicking on this link and then the subsequent servlet link should return a page similar to this.</p> <br> <a href="https://lh6.googleusercontent.com/xLkcrweB0ZC-PlfKrgNPBHQHCF2hg-XDtAYJuHLlyy1YrHFHiAkCeEsubIum3fBRvMISNl-4Uq3AhkEJiNeGvfc7IeIF4-Y0igY8Afo2EB6sSvMUHXY"><img src="https://lh6.googleusercontent.com/xLkcrweB0ZC-PlfKrgNPBHQHCF2hg-XDtAYJuHLlyy1YrHFHiAkCeEsubIum3fBRvMISNl-4Uq3AhkEJiNeGvfc7IeIF4-Y0igY8Afo2EB6sSvMUHXY" width="500" /></a><br /><br /><a href="https://lh3.googleusercontent.com/qMMOCzICbIUipTiiUWjXPo_qnZ2EoBbzBdd4-2EFm72dPflhSntqoDMrJFMCNVDUZ9n5_6qOCHrWreL-qg7p1GXdjUWbWtfQprjBFZB9_rCfxQ3Q5kI"><img src="https://lh3.googleusercontent.com/qMMOCzICbIUipTiiUWjXPo_qnZ2EoBbzBdd4-2EFm72dPflhSntqoDMrJFMCNVDUZ9n5_6qOCHrWreL-qg7p1GXdjUWbWtfQprjBFZB9_rCfxQ3Q5kI" width="500" /></a> <p><b>Next Time</b><br /><br/>Next time, we’ll extend the project to do some background processing and start using some other services from the DFP API.<br /><br /><b>Troubleshooting</b><br /><br/>We really hope you didn’t have an issue, but if you did there is a troubleshooting README file included in the <a href="http://code.google.com/p/google-api-dfp-java/source/browse/apps/dfponappengine/README">sample code</a>.</p> <p><a href="http://code.google.com/apis/dfp/forum/discussions.html">Let us know</a> if you have any questions, and happy holidays!</p> <br /> <span class="post-author"><a href="https://plus.google.com/104679465567407024302/"><img height="20" src="https://lh5.googleusercontent.com/oQZTvGY1RNICm4p-kpeNseyIOgEfFdRDfMNyaMs0hrBVvzjZQODeEnRRPbHA0SoebObwNhQnL7bEDImdE16tYXjwViv-90GTbywThxtii7XS7MO3RzE?sz=20" style="vertical-align:middle; border:none;" width="20"></a> - <a href="https://plus.google.com/104679465567407024302/" rel="author">Paul Rashidi</a>, DFP API Team</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Google App Engine for Java meet DFP API, Part 1: Hello World&url=http://ads-developers.googleblog.com/2011/12/google-app-engine-for-java-meet-dfp-api.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2011/12/google-app-engine-for-java-meet-dfp-api.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2011/12/google-app-engine-for-java-meet-dfp-api.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/app_engine' rel='tag'> app_engine </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/dfp_api' rel='tag'> dfp_api </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/dfp_appengine' rel='tag'> dfp_appengine </a> </span> </div> </div> </div> <div class='post' data-id='6197712991551892135' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2011/12/look-back-at-mobile-in-2011.html' itemprop='url' title='A look back at mobile in 2011'> A look back at mobile in 2011 </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Tuesday, December 20, 2011 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <div dir="ltr" style="text-align: left;" trbidi="on"> <i>Editor’s note: As many of you are planning your 2012 advertisement strategy, we’d like to share with you this <a href="http://googlemobileads.blogspot.com/2011/12/look-back-at-2011.html">post</a> from Karim Temsamani. It’s a look back on 2011 and provides a great perspective on how <a href="http://googleadsdeveloper.blogspot.com/search/label/mobile">mobile</a> really took a step forward in the advertising ecosystem. -- Stan Grinberg, Ads Developer Relations Team</i> <p> Mobile turned a corner this year. As smartphones and tablets became a part of our everyday lives, business owners’ conversations shifted from 'Why should I advertise on mobile or build a mobile website?' to 'How do I get started?’.<br /><br /> Five major industry trends emerged in 2011 that will carry us into 2012, and beyond. </p> <p> <b>1 - Everyone goes mobile</b><br /> Smartphones and tablets proved that they weren’t just for the geekiest - er, ‘tech savviest’ - among us. These devices are <a href="http://blog.nielsen.com/nielsenwire/online_mobile/report-the-rise-of-smartphones-apps-and-the-mobile-web/">increasingly becoming the norm</a> and they continue to change how people connect with each other, and with businesses, everywhere. According to our <a href="http://googlemobileads.blogspot.com/2011/04/smartphone-user-study-shows-mobile.html">research with IPSOS</a> earlier this year: <ul><li>79% of smartphone consumers use their phones to help with shopping, from comparing prices, to finding more product info, to locating a retailer.</li><li>70% use their smartphones while in a store.</li><li>77% have contacted a business via mobile, with 61% calling and 59% visiting the local business.</li></ul> It’s not just that more people are using smartphones and tablets (though the numbers are skyrocketing at an accelerating pace)—it’s that a huge, and fast-growing base of smartphone users, now expect to engage with businesses on mobile. The mainstream consumer got mobilized in 2011. </p> <p> <b>2 - Mobile search transforms shopping, forever</b> <br /> Analyzing mobile search trends helped the industry better understand how people were using their mobile devices in 2011. For starters, we learned a lot about the ‘timing’ of mobile and tablets. These devices enable us to be constantly connected to the internet, as <a href="http://googlemobileads.blogspot.com/2011/09/new-search-data-reveal-that-when-sun.html">mobile usage has proven to be complementary to the desktop</a>. We got a clearer picture of how search is changing the ways we shop and connect with businesses. More people are looking for deals both en route to stores and within them on mobile - in the retail category, “Black Friday” related mobile queries were over 200% higher this year than in 2010. Users have also developed some mobile-specific shopping habits - for example, <a href="http://googlemobileads.blogspot.com/2011/09/holiday-retail-mobile-insights.html">44% of all searches for last minute gifts and store locator terms</a> are projected to come from mobile devices this holiday season. For procrastinators, mobile has come to the rescue!<br /><br /> In October, we looked at some of the newest ways marketers can build their businesses via <a href="http://googleblog.blogspot.com/2011/10/mo-mentum-whats-new-with-mobile-search.html">mobile search</a>. But, this is only the beginning - whether people are trying to find or call a business, compare prices in a store, or visit a site or app directly from their phones, search and search ads will be the tools that shape a new shopping experience, enabling us connect with businesses, research and buy products on or offline, all via mobile. </p> <p> <b>3 - Progress with the mobile advertising pipes</b><br /> As an industry, we came a long way in terms of improving the ‘pipes’ - the systems, products and technologies that advertisers use to build, serve, and measure mobile ads. It’s still early days, but the progress with standards like <a href="http://googlemobileads.blogspot.com/2011/09/industry-standards-coming-to-mobile.html">MRAID</a> and the momentum behind HTML5, are helping to rally the mobile community and make it easier for marketers and customers to connect on the platform. Getting existing tools to ‘speak mobile’ has been another key to helping mobile advertising grow-up as quickly users and businesses want it to. Across <a href="http://googlemobileads.blogspot.com/2011/09/mobile-website-optimization-now-factors.html">search</a> and <a href="http://googlemobileads.blogspot.com/2011/05/delivering-mobile-branding-at-scale.html">display</a>, the tools the industry is already familiar with are getting mobilized. There’s plenty of work still to do, but significant progress is being made - watch this space in 2012. </p> <p> <b>4 - Tablets join the mobile party</b><br /> Tablets made quite a splash this year. Usage trends sharpened - we’re seeing that people people use these devices <a href="http://googlemobileads.blogspot.com/2011/11/consumers-on-tablet-devices-having-fun.html">to shop, consume media, have fun</a>, and they do so most frequently <a href="http://googlemobileads.blogspot.com/2011/09/new-search-data-reveal-that-when-sun.html">in the evenings</a>. Tablets are a third screen to be reckoned with for marketers - we saw a 440% growth in traffic from tablets in November 2011 compared to December 2010 on the AdMob network. The business potential is tremendous: not only are users more inclined to shop and make purchases on tablets, but because campaigns can be more effective running across several screens instead of one, tablets offer an incremental opportunity for marketers. Our research with Nielsen showed that campaigns on several screens can be ‘Better Together’ - indeed, in cases like <a href="http://googlemobileads.blogspot.com/2011/09/better-together-new-insights-on-display.html">Adidas’</a>, that proved to be true. </p> <p> <b>5 - Businesses start (actually) thinking mobile first</b><br /> Smartphones and tablets aren’t small desktop computers - they’re new devices being used in entirely new ways. This year, businesses began to embrace this at scale and many saw good things happen when they built <a href="http://googlemobileads.blogspot.com/2011/02/mobile-best-practice-separate-out.html">ad campaigns</a> and <a href="http://googlemobileads.blogspot.com/2011/11/gomo-ten-mobile-site-best-practices.html">websites</a> specifically for mobile. <a href="http://googlemobileads.blogspot.com/2011/11/gomo-ticketsnow-sees-100-spike-in.html">Ticketsnow’s success</a> with a mobile optimized site - increased site traffic, and more ticket sales - is just one example of the benefits of building for mobile. Initiatives like <a href="http://googlemobileads.blogspot.com/2011/11/gomo-helping-businesses-create-mobile.html">GoMo</a> and <a href="http://googlemobileads.blogspot.com/2011/12/engaging-consumers-on-tablets-new-ad.html">platform-specific ad features</a> will help businesses better connect with mobile customers in the coming months, and beyond.<br /><br /> It’s hard to believe, but as far as the industry has come in 2011, we’re still in the earliest chapters of mobile’s story. The ways people connect to businesses on their mobile devices and the tools they’re using to connect from them progressed by leaps and bounds this year and soon, we’ll see the mainstream shift that changes the way mobile connects people with brick-and-mortar storefronts as well. Mobile will be moving full speed ahead in 2012 so keep those sleeves rolled-up and those seatbelts fastened - we’ll see you then.<br/><br/> </p> Posted by: Karim Temsamani, VP Mobile Ads</div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <div dir="ltr" style="text-align: left;" trbidi="on"> <i>Editor’s note: As many of you are planning your 2012 advertisement strategy, we’d like to share with you this <a href="http://googlemobileads.blogspot.com/2011/12/look-back-at-2011.html">post</a> from Karim Temsamani. It’s a look back on 2011 and provides a great perspective on how <a href="http://googleadsdeveloper.blogspot.com/search/label/mobile">mobile</a> really took a step forward in the advertising ecosystem. -- Stan Grinberg, Ads Developer Relations Team</i> <p> Mobile turned a corner this year. As smartphones and tablets became a part of our everyday lives, business owners’ conversations shifted from 'Why should I advertise on mobile or build a mobile website?' to 'How do I get started?’.<br /><br /> Five major industry trends emerged in 2011 that will carry us into 2012, and beyond. </p> <p> <b>1 - Everyone goes mobile</b><br /> Smartphones and tablets proved that they weren’t just for the geekiest - er, ‘tech savviest’ - among us. These devices are <a href="http://blog.nielsen.com/nielsenwire/online_mobile/report-the-rise-of-smartphones-apps-and-the-mobile-web/">increasingly becoming the norm</a> and they continue to change how people connect with each other, and with businesses, everywhere. According to our <a href="http://googlemobileads.blogspot.com/2011/04/smartphone-user-study-shows-mobile.html">research with IPSOS</a> earlier this year: <ul><li>79% of smartphone consumers use their phones to help with shopping, from comparing prices, to finding more product info, to locating a retailer.</li><li>70% use their smartphones while in a store.</li><li>77% have contacted a business via mobile, with 61% calling and 59% visiting the local business.</li></ul> It’s not just that more people are using smartphones and tablets (though the numbers are skyrocketing at an accelerating pace)—it’s that a huge, and fast-growing base of smartphone users, now expect to engage with businesses on mobile. The mainstream consumer got mobilized in 2011. </p> <p> <b>2 - Mobile search transforms shopping, forever</b> <br /> Analyzing mobile search trends helped the industry better understand how people were using their mobile devices in 2011. For starters, we learned a lot about the ‘timing’ of mobile and tablets. These devices enable us to be constantly connected to the internet, as <a href="http://googlemobileads.blogspot.com/2011/09/new-search-data-reveal-that-when-sun.html">mobile usage has proven to be complementary to the desktop</a>. We got a clearer picture of how search is changing the ways we shop and connect with businesses. More people are looking for deals both en route to stores and within them on mobile - in the retail category, “Black Friday” related mobile queries were over 200% higher this year than in 2010. Users have also developed some mobile-specific shopping habits - for example, <a href="http://googlemobileads.blogspot.com/2011/09/holiday-retail-mobile-insights.html">44% of all searches for last minute gifts and store locator terms</a> are projected to come from mobile devices this holiday season. For procrastinators, mobile has come to the rescue!<br /><br /> In October, we looked at some of the newest ways marketers can build their businesses via <a href="http://googleblog.blogspot.com/2011/10/mo-mentum-whats-new-with-mobile-search.html">mobile search</a>. But, this is only the beginning - whether people are trying to find or call a business, compare prices in a store, or visit a site or app directly from their phones, search and search ads will be the tools that shape a new shopping experience, enabling us connect with businesses, research and buy products on or offline, all via mobile. </p> <p> <b>3 - Progress with the mobile advertising pipes</b><br /> As an industry, we came a long way in terms of improving the ‘pipes’ - the systems, products and technologies that advertisers use to build, serve, and measure mobile ads. It’s still early days, but the progress with standards like <a href="http://googlemobileads.blogspot.com/2011/09/industry-standards-coming-to-mobile.html">MRAID</a> and the momentum behind HTML5, are helping to rally the mobile community and make it easier for marketers and customers to connect on the platform. Getting existing tools to ‘speak mobile’ has been another key to helping mobile advertising grow-up as quickly users and businesses want it to. Across <a href="http://googlemobileads.blogspot.com/2011/09/mobile-website-optimization-now-factors.html">search</a> and <a href="http://googlemobileads.blogspot.com/2011/05/delivering-mobile-branding-at-scale.html">display</a>, the tools the industry is already familiar with are getting mobilized. There’s plenty of work still to do, but significant progress is being made - watch this space in 2012. </p> <p> <b>4 - Tablets join the mobile party</b><br /> Tablets made quite a splash this year. Usage trends sharpened - we’re seeing that people people use these devices <a href="http://googlemobileads.blogspot.com/2011/11/consumers-on-tablet-devices-having-fun.html">to shop, consume media, have fun</a>, and they do so most frequently <a href="http://googlemobileads.blogspot.com/2011/09/new-search-data-reveal-that-when-sun.html">in the evenings</a>. Tablets are a third screen to be reckoned with for marketers - we saw a 440% growth in traffic from tablets in November 2011 compared to December 2010 on the AdMob network. The business potential is tremendous: not only are users more inclined to shop and make purchases on tablets, but because campaigns can be more effective running across several screens instead of one, tablets offer an incremental opportunity for marketers. Our research with Nielsen showed that campaigns on several screens can be ‘Better Together’ - indeed, in cases like <a href="http://googlemobileads.blogspot.com/2011/09/better-together-new-insights-on-display.html">Adidas’</a>, that proved to be true. </p> <p> <b>5 - Businesses start (actually) thinking mobile first</b><br /> Smartphones and tablets aren’t small desktop computers - they’re new devices being used in entirely new ways. This year, businesses began to embrace this at scale and many saw good things happen when they built <a href="http://googlemobileads.blogspot.com/2011/02/mobile-best-practice-separate-out.html">ad campaigns</a> and <a href="http://googlemobileads.blogspot.com/2011/11/gomo-ten-mobile-site-best-practices.html">websites</a> specifically for mobile. <a href="http://googlemobileads.blogspot.com/2011/11/gomo-ticketsnow-sees-100-spike-in.html">Ticketsnow’s success</a> with a mobile optimized site - increased site traffic, and more ticket sales - is just one example of the benefits of building for mobile. Initiatives like <a href="http://googlemobileads.blogspot.com/2011/11/gomo-helping-businesses-create-mobile.html">GoMo</a> and <a href="http://googlemobileads.blogspot.com/2011/12/engaging-consumers-on-tablets-new-ad.html">platform-specific ad features</a> will help businesses better connect with mobile customers in the coming months, and beyond.<br /><br /> It’s hard to believe, but as far as the industry has come in 2011, we’re still in the earliest chapters of mobile’s story. The ways people connect to businesses on their mobile devices and the tools they’re using to connect from them progressed by leaps and bounds this year and soon, we’ll see the mainstream shift that changes the way mobile connects people with brick-and-mortar storefronts as well. Mobile will be moving full speed ahead in 2012 so keep those sleeves rolled-up and those seatbelts fastened - we’ll see you then.<br/><br/> </p> Posted by: Karim Temsamani, VP Mobile Ads</div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:A look back at mobile in 2011&url=http://ads-developers.googleblog.com/2011/12/look-back-at-mobile-in-2011.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2011/12/look-back-at-mobile-in-2011.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2011/12/look-back-at-mobile-in-2011.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/admob_sdk' rel='tag'> admob_sdk </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/adwords_api' rel='tag'> adwords_api </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/dfa_api' rel='tag'> dfa_api </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/dfp_api' rel='tag'> dfp_api </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile' rel='tag'> mobile </a> </span> </div> </div> </div> <div class='post' data-id='104120910099774031' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2011/12/animating-banner-ads-in-admob-sdk-for.html' itemprop='url' title='Animating Banner Ads in AdMob SDK for iOS'> Animating Banner Ads in AdMob SDK for iOS </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Tuesday, December 20, 2011 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p>Adding animations to banner ads can provide a nice touch to how the ad transitions onto the screen. This blog post will show you how to animate an AdMob banner on iOS.</p> <p>We will specifically focus on <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/uiview_class/uiview/uiview.html ">block-based animation methods</a> which were introduced in iOS 4. If you’re using an older version of iOS, you can achieve the same effect using the <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIView_Class/UIView/UIView.html">beginAnimations:context:</a> and <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIView_Class/UIView/UIView.html">commitAnimations:</a> class methods in <a href="tp://developer.apple.com/library/ios/#documentation/uikit/reference/UIView_Class/UIView/UIView.html ">UIView</a>.</p> <br/> <b>Sliding a banner up onto the screen</b> <p>The key to animating banners is changing one of the animatable properties in <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIView_Class/UIView/UIView.html ">UIView</a> across a certain period of time. iOS will then choose how to animate the AdMob banner across this specified time using its internal logic along with any options that have been specified. Let’s look at how to animate a banner to slide up onto the application’s screen. </p> <p>First, the AdMob banner is initialized with a frame outside of the bounds of the screen (specifically underneath the bottom of the screen). Once the ad is received, it can be animated upwards through its height. Since the banner is sliding up and onto the screen, only the y-coordinate will change during animation. The code for initializing the banner is shown below.</p> <pre class="prettyprint"> // Initialize the banner off of the screen self.adBanner = [[[GADBannerView alloc] initWithFrame:CGRectMake(0.0, self.view.frame.size.height, GAD_SIZE_320x50.width, GAD_SIZE_320x50.height)] autorelease]; </pre> <p>The next step is to implement <a href="http://code.google.com/mobile/ads/docs/ios/intermediate.html ">adViewDidReceiveAd:</a> to set the final frame for the AdMob banner and tell iOS to animate across the two values using the <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/uiview_class/uiview/uiview.html">animateWithDuration:animations:</a> method. </p> <pre class="prettyprint"> - (void)adViewDidReceiveAd:(GADBannerView *)adView { [UIView animateWithDuration:1.0 animations:^ { // Final frame of ad should be docked to bottom of screen adView.frame = CGRectMake(0.0, self.view.frame.size.height - adView.frame.size.height, adView.frame.size.width, adView.frame.size.height); }]; } </pre> <p>It’s as easy as that! Now, instead of instantly appearing on the screen, the banner ad gracefully slides up in the application using animation.</p> <br/> <center> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCFsM8p5E7DLZ8SKrvyIYViH2Qq-xDoR8COo1p4MuDWddF-tAt_8Ny8_sP5ZYNu5ETvM0smfxh-STxB2n881I4qdfReomdV_6dlZGwA_aYNoAT8-35B8fnrpg8Dv8yCMitCMsT2HygJs0/s1600/Screen+shot+2011-12-20+at+2.43.51+PM.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="194" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCFsM8p5E7DLZ8SKrvyIYViH2Qq-xDoR8COo1p4MuDWddF-tAt_8Ny8_sP5ZYNu5ETvM0smfxh-STxB2n881I4qdfReomdV_6dlZGwA_aYNoAT8-35B8fnrpg8Dv8yCMitCMsT2HygJs0/s320/Screen+shot+2011-12-20+at+2.43.51+PM.png" width="320" /></a></center> <br/> <b>Customized animations</b> <p>You can experiment with other animatable properties of <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIView_Class/UIView/UIView.html">UIView</a> as well. For example, try sliding the banner onto the screen from left to right by changing the initial frame to the left of the screen instead of beneath it. If you want to get even more creative, try experimenting with the <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIView_Class/UIView/UIView.html">Core Animation</a> classes. These classes give you powerful animation functionality and allow you to customize keyframe and timing functions. </p> <p>Pro tip: Be thoughtful about where and how you’re going to use animations. It’s easy to go overboard.</p> <p>If you have any questions about animations on iOS or about the AdMob SDK in general, feel free to post them in our <a href="https://groups.google.com/forum/#!forum/google-admob-ads-sdk">forum</a>. Have fun animating!</p> <br/> <span class="post-author"><a href="https://plus.google.com/102708799507737837368/"><img height="20" src="https://lh3.googleusercontent.com/-RonljIAjNbg/AAAAAAAAAAI/AAAAAAAAAps/nM93tw3iYSk/photo.jpg?sz=20" style="vertical-align:middle; border:none;" width="20"></a> - <a href="https://plus.google.com/102708799507737837368/" rel="author">Raj Parameswaran</a>, AdMob Team</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p>Adding animations to banner ads can provide a nice touch to how the ad transitions onto the screen. This blog post will show you how to animate an AdMob banner on iOS.</p> <p>We will specifically focus on <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/uiview_class/uiview/uiview.html ">block-based animation methods</a> which were introduced in iOS 4. If you’re using an older version of iOS, you can achieve the same effect using the <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIView_Class/UIView/UIView.html">beginAnimations:context:</a> and <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIView_Class/UIView/UIView.html">commitAnimations:</a> class methods in <a href="tp://developer.apple.com/library/ios/#documentation/uikit/reference/UIView_Class/UIView/UIView.html ">UIView</a>.</p> <br/> <b>Sliding a banner up onto the screen</b> <p>The key to animating banners is changing one of the animatable properties in <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIView_Class/UIView/UIView.html ">UIView</a> across a certain period of time. iOS will then choose how to animate the AdMob banner across this specified time using its internal logic along with any options that have been specified. Let’s look at how to animate a banner to slide up onto the application’s screen. </p> <p>First, the AdMob banner is initialized with a frame outside of the bounds of the screen (specifically underneath the bottom of the screen). Once the ad is received, it can be animated upwards through its height. Since the banner is sliding up and onto the screen, only the y-coordinate will change during animation. The code for initializing the banner is shown below.</p> <pre class="prettyprint"> // Initialize the banner off of the screen self.adBanner = [[[GADBannerView alloc] initWithFrame:CGRectMake(0.0, self.view.frame.size.height, GAD_SIZE_320x50.width, GAD_SIZE_320x50.height)] autorelease]; </pre> <p>The next step is to implement <a href="http://code.google.com/mobile/ads/docs/ios/intermediate.html ">adViewDidReceiveAd:</a> to set the final frame for the AdMob banner and tell iOS to animate across the two values using the <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/uiview_class/uiview/uiview.html">animateWithDuration:animations:</a> method. </p> <pre class="prettyprint"> - (void)adViewDidReceiveAd:(GADBannerView *)adView { [UIView animateWithDuration:1.0 animations:^ { // Final frame of ad should be docked to bottom of screen adView.frame = CGRectMake(0.0, self.view.frame.size.height - adView.frame.size.height, adView.frame.size.width, adView.frame.size.height); }]; } </pre> <p>It’s as easy as that! Now, instead of instantly appearing on the screen, the banner ad gracefully slides up in the application using animation.</p> <br/> <center> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCFsM8p5E7DLZ8SKrvyIYViH2Qq-xDoR8COo1p4MuDWddF-tAt_8Ny8_sP5ZYNu5ETvM0smfxh-STxB2n881I4qdfReomdV_6dlZGwA_aYNoAT8-35B8fnrpg8Dv8yCMitCMsT2HygJs0/s1600/Screen+shot+2011-12-20+at+2.43.51+PM.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="194" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCFsM8p5E7DLZ8SKrvyIYViH2Qq-xDoR8COo1p4MuDWddF-tAt_8Ny8_sP5ZYNu5ETvM0smfxh-STxB2n881I4qdfReomdV_6dlZGwA_aYNoAT8-35B8fnrpg8Dv8yCMitCMsT2HygJs0/s320/Screen+shot+2011-12-20+at+2.43.51+PM.png" width="320" /></a></center> <br/> <b>Customized animations</b> <p>You can experiment with other animatable properties of <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIView_Class/UIView/UIView.html">UIView</a> as well. For example, try sliding the banner onto the screen from left to right by changing the initial frame to the left of the screen instead of beneath it. If you want to get even more creative, try experimenting with the <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIView_Class/UIView/UIView.html">Core Animation</a> classes. These classes give you powerful animation functionality and allow you to customize keyframe and timing functions. </p> <p>Pro tip: Be thoughtful about where and how you’re going to use animations. It’s easy to go overboard.</p> <p>If you have any questions about animations on iOS or about the AdMob SDK in general, feel free to post them in our <a href="https://groups.google.com/forum/#!forum/google-admob-ads-sdk">forum</a>. Have fun animating!</p> <br/> <span class="post-author"><a href="https://plus.google.com/102708799507737837368/"><img height="20" src="https://lh3.googleusercontent.com/-RonljIAjNbg/AAAAAAAAAAI/AAAAAAAAAps/nM93tw3iYSk/photo.jpg?sz=20" style="vertical-align:middle; border:none;" width="20"></a> - <a href="https://plus.google.com/102708799507737837368/" rel="author">Raj Parameswaran</a>, AdMob Team</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Animating Banner Ads in AdMob SDK for iOS&url=http://ads-developers.googleblog.com/2011/12/animating-banner-ads-in-admob-sdk-for.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2011/12/animating-banner-ads-in-admob-sdk-for.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2011/12/animating-banner-ads-in-admob-sdk-for.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/admob_sdk' rel='tag'> admob_sdk </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/animation' rel='tag'> animation </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/iOS' rel='tag'> iOS </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile' rel='tag'> mobile </a> </span> </div> </div> </div> <div class='post' data-id='7315562871821695385' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2011/12/discover-dfp-api-v201111-more-power-in.html' itemprop='url' title='Discover DFP API v201111: More Power in Reporting'> Discover DFP API v201111: More Power in Reporting </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Tuesday, December 20, 2011 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <div dir="ltr" style="text-align: left;" trbidi="on"> <div dir="ltr" style="text-align: left;" trbidi="on"> In this installment of the <a href="http://googleadsdeveloper.blogspot.com/search/label/dfp_v201111">Discover DFP API v201111 series</a>, we present new features we’ve added to reports in the API. In addition to <a href="http://code.google.com/apis/dfp/docs/reference/v201111/ReportService.Column.html#MERGED_AD_SERVER_IMPRESSIONS">merged ad server columns</a>, which helps upgraded publishers reports on both DART and DFP ad servers, you can now use <a href="http://code.google.com/apis/dfp/docs/reference/v201111/ReportService.DimensionAttribute.html">dimension attributes</a> for greater control in reporting.<br /> <br /> <b>Dimension Attributes</b><br /> <br /> Dimension attributes let you break down your report by additional fields associated with the <a href="http://code.google.com/apis/dfp/docs/reference/v201111/ReportService.Dimension.html">dimension</a>. For example, you can now add the <a href="http://code.google.com/apis/dfp/docs/reference/v201111/ReportService.DimensionAttribute.html#ORDER_TRAFFICKER">trafficker</a>, <a href="http://code.google.com/apis/dfp/docs/reference/v201111/ReportService.DimensionAttribute.html#ORDER_EXTERNAL_ID">external ID</a>, and <a href="http://code.google.com/apis/dfp/docs/reference/v201111/ReportService.DimensionAttribute.html#ORDER_START_DATE_TIME">order start date</a> as dimension attributes associated to your order dimension in a delivery report. This is useful if you would like to see how each of your orders is doing <i>and</i> which trafficker was responsible for that order.<br /> <br /> In the past, you would get this information by running a report for orders and then looking up the orders with <a href="http://code.google.com/apis/dfp/docs/reference/v201111/OrderService.html">Order Service</a> to inspect the attributes. Now, it’s as simple as adding values to the <a href="http://code.google.com/apis/dfp/docs/reference/v201111/ReportService.ReportQuery.html#dimensionAttributes">dimensionAttributes</a> field on your <a href="http://code.google.com/apis/dfp/docs/reference/v201111/ReportService.ReportQuery.html">ReportQuery</a> object and the corresponding fields will be integrated into the report. The following code snippet shows you how to create a <a href="http://code.google.com/apis/dfp/docs/reference/v201111/ReportService.ReportJob.html">report job</a> with dimension attributes: <br /> <pre class="prettyprint">// Create report job. ReportJob reportJob = new ReportJob(); // Create report query. ReportQuery reportQuery = new ReportQuery(); reportQuery.setDateRangeType(DateRangeType.LAST_MONTH); reportQuery.setDimensions(new Dimension[] {Dimension.ORDER}); // Set dimension attributes for order dimension. reportQuery.setDimensionAttributes(new DimensionAttribute[] { DimensionAttribute.ORDER_TRAFFICKER, DimensionAttribute.ORDER_START_DATE_TIME, DimensionAttribute.ORDER_END_DATE_TIME}); // Set columns to report on. reportQuery.setColumns(new Column[] { Column.AD_SERVER_IMPRESSIONS, Column.AD_SERVER_CLICKS}); reportJob.setReportQuery(reportQuery); </pre> You can check out the full example in the <a href="http://code.google.com/p/google-api-dfp-java/source/browse/trunk/examples/v201111/reportservice/RunDeliveryReportExample.java">RunDeliveryReportExample</a> in the Java client library. Notice that you can only add dimension attributes for dimensions that you have in the report. For example, if you tried to add <a href="http://code.google.com/apis/dfp/docs/reference/v201111/ReportService.DimensionAttribute.html#LINE_ITEM_EXTERNAL_ID">LINE_ITEM_EXTERNAL_ID</a>, and you only have order (but not line item) as a dimension, you will get the following error:<br /> <br /> ReportError.ATTRIBUTES_NOT_SUPPORTED_FOR_REQUEST<br /> <br /> Be sure to check out our updated reporting examples in the <a href="http://code.google.com/apis/dfp/docs/clients.html">client libraries</a> and take a look at our <a href="http://code.google.com/apis/dfp/docs/reference/v201111/ReportService.DimensionAttribute.html">documentation</a> for a full mapping of supported dimension attributes and the fields they represent.<br /> <br /> We are always looking for ways to improve the API and we’d love to get your feedback. Let us know what you’d like to see in the API or discussed in a blog post by posting on our <a href="http://code.google.com/apis/dfp/forum/discussions.html">forum</a>. We’re also more than happy to chat during one of our <a href="http://googleadsdeveloper.blogspot.com/search/label/dfp_api">office hours</a> hangouts.</div> <br /> <span class="post-author"><a href="https://plus.google.com/u/0/115474229489284556707"><img height="20" src="https://lh3.googleusercontent.com/-pDdv2kTjyNw/AAAAAAAAAAI/AAAAAAAAAnE/q_kK4BYy-mM/photo.jpg?sz=20" style="border: none; vertical-align: middle;" width="20" /></a> - <a href="https://plus.google.com/u/0/115474229489284556707" rel="author">Jeffrey Sham</a>, DFP API Team</span> </div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <div dir="ltr" style="text-align: left;" trbidi="on"> <div dir="ltr" style="text-align: left;" trbidi="on"> In this installment of the <a href="http://googleadsdeveloper.blogspot.com/search/label/dfp_v201111">Discover DFP API v201111 series</a>, we present new features we’ve added to reports in the API. In addition to <a href="http://code.google.com/apis/dfp/docs/reference/v201111/ReportService.Column.html#MERGED_AD_SERVER_IMPRESSIONS">merged ad server columns</a>, which helps upgraded publishers reports on both DART and DFP ad servers, you can now use <a href="http://code.google.com/apis/dfp/docs/reference/v201111/ReportService.DimensionAttribute.html">dimension attributes</a> for greater control in reporting.<br /> <br /> <b>Dimension Attributes</b><br /> <br /> Dimension attributes let you break down your report by additional fields associated with the <a href="http://code.google.com/apis/dfp/docs/reference/v201111/ReportService.Dimension.html">dimension</a>. For example, you can now add the <a href="http://code.google.com/apis/dfp/docs/reference/v201111/ReportService.DimensionAttribute.html#ORDER_TRAFFICKER">trafficker</a>, <a href="http://code.google.com/apis/dfp/docs/reference/v201111/ReportService.DimensionAttribute.html#ORDER_EXTERNAL_ID">external ID</a>, and <a href="http://code.google.com/apis/dfp/docs/reference/v201111/ReportService.DimensionAttribute.html#ORDER_START_DATE_TIME">order start date</a> as dimension attributes associated to your order dimension in a delivery report. This is useful if you would like to see how each of your orders is doing <i>and</i> which trafficker was responsible for that order.<br /> <br /> In the past, you would get this information by running a report for orders and then looking up the orders with <a href="http://code.google.com/apis/dfp/docs/reference/v201111/OrderService.html">Order Service</a> to inspect the attributes. Now, it’s as simple as adding values to the <a href="http://code.google.com/apis/dfp/docs/reference/v201111/ReportService.ReportQuery.html#dimensionAttributes">dimensionAttributes</a> field on your <a href="http://code.google.com/apis/dfp/docs/reference/v201111/ReportService.ReportQuery.html">ReportQuery</a> object and the corresponding fields will be integrated into the report. The following code snippet shows you how to create a <a href="http://code.google.com/apis/dfp/docs/reference/v201111/ReportService.ReportJob.html">report job</a> with dimension attributes: <br /> <pre class="prettyprint">// Create report job. ReportJob reportJob = new ReportJob(); // Create report query. ReportQuery reportQuery = new ReportQuery(); reportQuery.setDateRangeType(DateRangeType.LAST_MONTH); reportQuery.setDimensions(new Dimension[] {Dimension.ORDER}); // Set dimension attributes for order dimension. reportQuery.setDimensionAttributes(new DimensionAttribute[] { DimensionAttribute.ORDER_TRAFFICKER, DimensionAttribute.ORDER_START_DATE_TIME, DimensionAttribute.ORDER_END_DATE_TIME}); // Set columns to report on. reportQuery.setColumns(new Column[] { Column.AD_SERVER_IMPRESSIONS, Column.AD_SERVER_CLICKS}); reportJob.setReportQuery(reportQuery); </pre> You can check out the full example in the <a href="http://code.google.com/p/google-api-dfp-java/source/browse/trunk/examples/v201111/reportservice/RunDeliveryReportExample.java">RunDeliveryReportExample</a> in the Java client library. Notice that you can only add dimension attributes for dimensions that you have in the report. For example, if you tried to add <a href="http://code.google.com/apis/dfp/docs/reference/v201111/ReportService.DimensionAttribute.html#LINE_ITEM_EXTERNAL_ID">LINE_ITEM_EXTERNAL_ID</a>, and you only have order (but not line item) as a dimension, you will get the following error:<br /> <br /> ReportError.ATTRIBUTES_NOT_SUPPORTED_FOR_REQUEST<br /> <br /> Be sure to check out our updated reporting examples in the <a href="http://code.google.com/apis/dfp/docs/clients.html">client libraries</a> and take a look at our <a href="http://code.google.com/apis/dfp/docs/reference/v201111/ReportService.DimensionAttribute.html">documentation</a> for a full mapping of supported dimension attributes and the fields they represent.<br /> <br /> We are always looking for ways to improve the API and we’d love to get your feedback. Let us know what you’d like to see in the API or discussed in a blog post by posting on our <a href="http://code.google.com/apis/dfp/forum/discussions.html">forum</a>. We’re also more than happy to chat during one of our <a href="http://googleadsdeveloper.blogspot.com/search/label/dfp_api">office hours</a> hangouts.</div> <br /> <span class="post-author"><a href="https://plus.google.com/u/0/115474229489284556707"><img height="20" src="https://lh3.googleusercontent.com/-pDdv2kTjyNw/AAAAAAAAAAI/AAAAAAAAAnE/q_kK4BYy-mM/photo.jpg?sz=20" style="border: none; vertical-align: middle;" width="20" /></a> - <a href="https://plus.google.com/u/0/115474229489284556707" rel="author">Jeffrey Sham</a>, DFP API Team</span> </div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Discover DFP API v201111: More Power in Reporting&url=http://ads-developers.googleblog.com/2011/12/discover-dfp-api-v201111-more-power-in.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2011/12/discover-dfp-api-v201111-more-power-in.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2011/12/discover-dfp-api-v201111-more-power-in.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/dfp_api' rel='tag'> dfp_api </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/dfp_v201111' rel='tag'> dfp_v201111 </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/reports' rel='tag'> reports </a> </span> </div> </div> </div> <div class='post' data-id='601252190731266008' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2011/12/geotargeting-in-dfa-api.html' itemprop='url' title='Geotargeting in the DFA API'> Geotargeting in the DFA API </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Monday, December 19, 2011 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p>We’ve heard some questions recently about the degree that geotargeting is supported through our API. Let’s explore how geotargeting can be managed through the DFA API.</p> <p>First, here’s a reminder about how geotargeting works in the DoubleClick for Advertisers product. As explained in <a href="//www.google.com/support/dfa/bin/answer.py?hl=en&answer=146729">this help center article</a> (DFA sign-in required), combining multiple locations even if they are within different geographic categories always results in an “OR” relationship between them. Targeting the countries Mexico and the United States alongside the Canadian province of Ontario will cause your ad to be displayed if the impression originates from the United States or Mexico or Ontario.</p> <p>Let’s see how this example plays out through the API. We need to use the <a href="http://code.google.com/apis/dfa/docs/reference/current/ad/objects/State.html">State</a> and <a href="http://code.google.com/apis/dfa/docs/reference/current/ad/objects/Country.html">Country</a> classes. These classes contain extra fields that are filled in with descriptions when the objects are returned from our server. You only need to fill in the <code>id</code> field when you send us an object that represents a target criterion for an ad. As explained on our <a href="http://code.google.com/apis/dfa/docs/bestpractices.html#cache_types">best practices page</a>, our ID numbers rarely change and caching them locally is always a good idea. If you have to retrieve them, reference our <a href="https://code.google.com/p/google-api-ads-python/source/browse/trunk/examples/adspygoogle/dfa/v1.15/get_countries.py?r=51">example code</a> and the <a href="http://code.google.com/apis/dfa/docs/reference/current/ad/service.html">ad service documentation</a>.</p> <p>Once you have the numbers, you can retrieve your ad from our server and add the desired targets. For example, this Python code will add the United States, Mexico, and Ontario as desired targets to an ad:</p> <pre class="prettyprint"># Get the ad that needs geotargeting added. ad = ad_service.GetAd(targetable_ad_id)[0] # Create and add country targeting criteria. country_targeting_criteria = { 'exclude': 'False', 'countries': [{'id': UNITED_STATES_COUNTRY_ID}, {'id': MEXICO_COUNTRY_ID}] } ad['countryTargetingCriteria'] = country_targeting_criteria # Add state targeting. Provinces are considered states. ad['states'] = [{'id': ONTARIO_STATE_ID}] # Save changes. This ad now serves only when an impression originates from # the United States, Mexico, or Ontario. ad_save_result = ad_service.SaveAd(ad)[0]</pre> <p>Remember that only ad types that extend <a href="http://code.google.com/apis/dfa/docs/reference/current/ad/objects/TargetableAdBase.html">TargetableAdBase</a> are targetable. If you run into any problems or have questions about targeting through the API, we’d be glad to help on our <a href="https://groups.google.com/group/google-doubleclick-for-advertisers-api">forum</a>.</p> <span class="post-author"><a href="https://plus.google.com/113204894998269100367/"><img height="20" src="https://lh5.googleusercontent.com/-jfMpzPefhpA/AAAAAAAAAAI/AAAAAAAAAC4/RiK3R7FaK-8/photo.jpg?sz=20" style="border: none; vertical-align: middle;" width="20" /></a> - <a href="https://plus.google.com/113204894998269100367/" rel="author">Joseph DiLallo</a>, DFA API Team</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p>We’ve heard some questions recently about the degree that geotargeting is supported through our API. Let’s explore how geotargeting can be managed through the DFA API.</p> <p>First, here’s a reminder about how geotargeting works in the DoubleClick for Advertisers product. As explained in <a href="//www.google.com/support/dfa/bin/answer.py?hl=en&answer=146729">this help center article</a> (DFA sign-in required), combining multiple locations even if they are within different geographic categories always results in an “OR” relationship between them. Targeting the countries Mexico and the United States alongside the Canadian province of Ontario will cause your ad to be displayed if the impression originates from the United States or Mexico or Ontario.</p> <p>Let’s see how this example plays out through the API. We need to use the <a href="http://code.google.com/apis/dfa/docs/reference/current/ad/objects/State.html">State</a> and <a href="http://code.google.com/apis/dfa/docs/reference/current/ad/objects/Country.html">Country</a> classes. These classes contain extra fields that are filled in with descriptions when the objects are returned from our server. You only need to fill in the <code>id</code> field when you send us an object that represents a target criterion for an ad. As explained on our <a href="http://code.google.com/apis/dfa/docs/bestpractices.html#cache_types">best practices page</a>, our ID numbers rarely change and caching them locally is always a good idea. If you have to retrieve them, reference our <a href="https://code.google.com/p/google-api-ads-python/source/browse/trunk/examples/adspygoogle/dfa/v1.15/get_countries.py?r=51">example code</a> and the <a href="http://code.google.com/apis/dfa/docs/reference/current/ad/service.html">ad service documentation</a>.</p> <p>Once you have the numbers, you can retrieve your ad from our server and add the desired targets. For example, this Python code will add the United States, Mexico, and Ontario as desired targets to an ad:</p> <pre class="prettyprint"># Get the ad that needs geotargeting added. ad = ad_service.GetAd(targetable_ad_id)[0] # Create and add country targeting criteria. country_targeting_criteria = { 'exclude': 'False', 'countries': [{'id': UNITED_STATES_COUNTRY_ID}, {'id': MEXICO_COUNTRY_ID}] } ad['countryTargetingCriteria'] = country_targeting_criteria # Add state targeting. Provinces are considered states. ad['states'] = [{'id': ONTARIO_STATE_ID}] # Save changes. This ad now serves only when an impression originates from # the United States, Mexico, or Ontario. ad_save_result = ad_service.SaveAd(ad)[0]</pre> <p>Remember that only ad types that extend <a href="http://code.google.com/apis/dfa/docs/reference/current/ad/objects/TargetableAdBase.html">TargetableAdBase</a> are targetable. If you run into any problems or have questions about targeting through the API, we’d be glad to help on our <a href="https://groups.google.com/group/google-doubleclick-for-advertisers-api">forum</a>.</p> <span class="post-author"><a href="https://plus.google.com/113204894998269100367/"><img height="20" src="https://lh5.googleusercontent.com/-jfMpzPefhpA/AAAAAAAAAAI/AAAAAAAAAC4/RiK3R7FaK-8/photo.jpg?sz=20" style="border: none; vertical-align: middle;" width="20" /></a> - <a href="https://plus.google.com/113204894998269100367/" rel="author">Joseph DiLallo</a>, DFA API Team</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Geotargeting in the DFA API&url=http://ads-developers.googleblog.com/2011/12/geotargeting-in-dfa-api.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2011/12/geotargeting-in-dfa-api.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2011/12/geotargeting-in-dfa-api.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/dfa_ad_service' rel='tag'> dfa_ad_service </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/dfa_api' rel='tag'> dfa_api </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/geotargeting' rel='tag'> geotargeting </a> </span> </div> </div> </div> <div class='post' data-id='9051322889334922217' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2011/12/discover-dfp-api-v201111-creative.html' itemprop='url' title='Discover DFP API v201111: Creative Creatives'> Discover DFP API v201111: Creative Creatives </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Friday, December 16, 2011 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> Last month, we <a href="http://googleadsdeveloper.blogspot.com/2011/11/announcing-version-v201111-of-dfp-api.html">announced</a> the ability to create both <a href="http://code.google.com/apis/dfp/docs/reference/latest/CreativeService.CustomCreative.html">custom</a> and <a href="http://code.google.com/apis/dfp/docs/reference/latest/CreativeService.TemplateCreative.html">template creatives</a> using the DFP API. Today we’ll show you can use these premium-only features to create richer creatives with custom HTML.<br /> <br /> <b>Custom or template</b><br /> <br /> The difference between custom and template creatives is that custom creatives have their <a href="http://code.google.com/apis/dfp/docs/reference/v201111/CreativeService.CustomCreative.html#htmlSnippet">HTML snippet</a> set within them, while template creatives are instantiated from system or user defined HTML snippets. Deciding which one to use depends on your network’s needs. If your network deals primarily with traffickers using the DFP UI, it may be beneficial for them to use creative templates in their workflow. The API could be used to retrieve these templates and report on them, but your traffickers would most likely want to create the creatives from templates in the UI.<br /> <br /> However, if you are developing a platform in which traffickers spend most of their day, it may scale better to template the HTML yourself within your content management system (CMS) and use custom creatives for the advertisements. You could store custom HTML snippets and prompt the user for assets to insert. In essence, you would be creating your own templates, but without the overhead of template creatives.<br /> <br /> <b>Creating custom creatives</b><br /> <br /> To create a custom creative, you first have to define your HTML snippet:<br /> <pre class="prettyprint"> String htmlSnippet = "<a href='%%CLICK_URL_UNESC%%%%DEST_URL%%'>" + "<img src='%%FILE:IMAGE_ASSET%%'/></a><br>Click for great deals!"); CustomCreative customCreative = new CustomCreative(); customCreative.setHtmlSnippet(htmlSnippet); </pre> Notice here that the CLICK_URL_UNESC, DEST_URL, and FILE macros are used to customize the creative at serving time. CLICK_URL_UNESC will insert the clickthrough URL while DEST_URL inserts the URL that the ad points to. The FILE macro will reference any attached assets to the creative, in this case one named IMAGE_ASSET. <br /> <pre class="prettyprint"> // Set the custom creative image asset. CustomCreativeAsset customCreativeAsset = new CustomCreativeAsset(); customCreativeAsset.setMacroName("IMAGE_ASSET"); customCreativeAsset.setAssetByteArray(/* Byte array from image. */); customCreativeAsset.setFileName( String.format("image%s.jpg", System.currentTimeMillis())); customCreative.setCustomCreativeAssets( new CustomCreativeAsset[] {customCreativeAsset}); </pre> You would then call <a href="http://code.google.com/apis/dfp/docs/reference/latest/CreativeService.html#createCreative">CreativeService.createCreative</a> on customCreative to instantiate on the server. After creating the creative, you can then review it using the creative’s <a href="http://code.google.com/apis/dfp/docs/reference/latest/CreativeService.CustomCreative.html#previewUrl">previewUrl</a> attribute or the newly added <a href="http://code.google.com/apis/dfp/docs/reference/latest/LineItemCreativeAssociationService.html#getPreviewUrl">getPreviewUrl</a> method. When updating custom creatives, you don’t need to pass the asset byte array each time. Instead, you can leave it null with <a href="http://code.google.com/apis/dfp/docs/reference/latest/CreativeService.CustomCreativeAsset.html#assetId">assetId</a> set to what it was assigned to when created. The <a href="http://code.google.com/p/google-api-dfp-java/source/browse/trunk/examples/v201111/creativeservice/CreateCustomCreativeExample.java">full example</a> can be found on the Java client library page, as well as in our <a href="http://code.google.com/apis/dfp/docs/clients.html">other libraries</a>.<br /> <br /> As a final note, custom creatives can be used for many other purposes beyond the simple image ad above. Including a SWF file as an asset, for example, is a common way of creating flash banner ads. You can even include a <a href="//www.google.com/webmasters/+1/button/#customize-snippet">Google+ +1 button</a> and customize the +1’s destination URL with the DEST_URL macro.<br /> <br /> We have a few more posts lined up for the <a href="http://googleadsdeveloper.blogspot.com/search/label/dfp_v201111">Discover DFP API v201111 series</a>, but if there’s any other topics you’d like to see, please let us know on the <a href="http://code.google.com/apis/dfp/forum/discussions.html">forum</a>.<br /> <br /> <a href="https://plus.google.com/100742954389084668497"><img alt="" border="0" height="20" id="BLOGGER_PHOTO_ID_5677875414712016498" src="https://lh4.googleusercontent.com/-tcqfAdWqCFc/AAAAAAAAAAI/AAAAAAABT3Y/JU6vWx64NbU/photo.jpg?sz=20" style="border: none; vertical-align: middle;" width="20" /></a> - <a href="https://plus.google.com/100742954389084668497" rel="author">Adam Rogal</a>, DFP API Team <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> Last month, we <a href="http://googleadsdeveloper.blogspot.com/2011/11/announcing-version-v201111-of-dfp-api.html">announced</a> the ability to create both <a href="http://code.google.com/apis/dfp/docs/reference/latest/CreativeService.CustomCreative.html">custom</a> and <a href="http://code.google.com/apis/dfp/docs/reference/latest/CreativeService.TemplateCreative.html">template creatives</a> using the DFP API. Today we’ll show you can use these premium-only features to create richer creatives with custom HTML.<br /> <br /> <b>Custom or template</b><br /> <br /> The difference between custom and template creatives is that custom creatives have their <a href="http://code.google.com/apis/dfp/docs/reference/v201111/CreativeService.CustomCreative.html#htmlSnippet">HTML snippet</a> set within them, while template creatives are instantiated from system or user defined HTML snippets. Deciding which one to use depends on your network’s needs. If your network deals primarily with traffickers using the DFP UI, it may be beneficial for them to use creative templates in their workflow. The API could be used to retrieve these templates and report on them, but your traffickers would most likely want to create the creatives from templates in the UI.<br /> <br /> However, if you are developing a platform in which traffickers spend most of their day, it may scale better to template the HTML yourself within your content management system (CMS) and use custom creatives for the advertisements. You could store custom HTML snippets and prompt the user for assets to insert. In essence, you would be creating your own templates, but without the overhead of template creatives.<br /> <br /> <b>Creating custom creatives</b><br /> <br /> To create a custom creative, you first have to define your HTML snippet:<br /> <pre class="prettyprint"> String htmlSnippet = "<a href='%%CLICK_URL_UNESC%%%%DEST_URL%%'>" + "<img src='%%FILE:IMAGE_ASSET%%'/></a><br>Click for great deals!"); CustomCreative customCreative = new CustomCreative(); customCreative.setHtmlSnippet(htmlSnippet); </pre> Notice here that the CLICK_URL_UNESC, DEST_URL, and FILE macros are used to customize the creative at serving time. CLICK_URL_UNESC will insert the clickthrough URL while DEST_URL inserts the URL that the ad points to. The FILE macro will reference any attached assets to the creative, in this case one named IMAGE_ASSET. <br /> <pre class="prettyprint"> // Set the custom creative image asset. CustomCreativeAsset customCreativeAsset = new CustomCreativeAsset(); customCreativeAsset.setMacroName("IMAGE_ASSET"); customCreativeAsset.setAssetByteArray(/* Byte array from image. */); customCreativeAsset.setFileName( String.format("image%s.jpg", System.currentTimeMillis())); customCreative.setCustomCreativeAssets( new CustomCreativeAsset[] {customCreativeAsset}); </pre> You would then call <a href="http://code.google.com/apis/dfp/docs/reference/latest/CreativeService.html#createCreative">CreativeService.createCreative</a> on customCreative to instantiate on the server. After creating the creative, you can then review it using the creative’s <a href="http://code.google.com/apis/dfp/docs/reference/latest/CreativeService.CustomCreative.html#previewUrl">previewUrl</a> attribute or the newly added <a href="http://code.google.com/apis/dfp/docs/reference/latest/LineItemCreativeAssociationService.html#getPreviewUrl">getPreviewUrl</a> method. When updating custom creatives, you don’t need to pass the asset byte array each time. Instead, you can leave it null with <a href="http://code.google.com/apis/dfp/docs/reference/latest/CreativeService.CustomCreativeAsset.html#assetId">assetId</a> set to what it was assigned to when created. The <a href="http://code.google.com/p/google-api-dfp-java/source/browse/trunk/examples/v201111/creativeservice/CreateCustomCreativeExample.java">full example</a> can be found on the Java client library page, as well as in our <a href="http://code.google.com/apis/dfp/docs/clients.html">other libraries</a>.<br /> <br /> As a final note, custom creatives can be used for many other purposes beyond the simple image ad above. Including a SWF file as an asset, for example, is a common way of creating flash banner ads. You can even include a <a href="//www.google.com/webmasters/+1/button/#customize-snippet">Google+ +1 button</a> and customize the +1’s destination URL with the DEST_URL macro.<br /> <br /> We have a few more posts lined up for the <a href="http://googleadsdeveloper.blogspot.com/search/label/dfp_v201111">Discover DFP API v201111 series</a>, but if there’s any other topics you’d like to see, please let us know on the <a href="http://code.google.com/apis/dfp/forum/discussions.html">forum</a>.<br /> <br /> <a href="https://plus.google.com/100742954389084668497"><img alt="" border="0" height="20" id="BLOGGER_PHOTO_ID_5677875414712016498" src="https://lh4.googleusercontent.com/-tcqfAdWqCFc/AAAAAAAAAAI/AAAAAAABT3Y/JU6vWx64NbU/photo.jpg?sz=20" style="border: none; vertical-align: middle;" width="20" /></a> - <a href="https://plus.google.com/100742954389084668497" rel="author">Adam Rogal</a>, DFP API Team <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Discover DFP API v201111: Creative Creatives&url=http://ads-developers.googleblog.com/2011/12/discover-dfp-api-v201111-creative.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2011/12/discover-dfp-api-v201111-creative.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2011/12/discover-dfp-api-v201111-creative.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/creatives' rel='tag'> creatives </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/dfp_api' rel='tag'> dfp_api </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/dfp_v201111' rel='tag'> dfp_v201111 </a> </span> </div> </div> </div> <div class='post' data-id='8863412005622753916' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2011/12/zero-impression-data-in-adwords-api.html' itemprop='url' title='Zero-impression data in AdWords API reports'> Zero-impression data in AdWords API reports </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Friday, December 16, 2011 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p>In addition to retrieving performance statistics, AdWords API developers often use the reporting system to get structural information about an account. These reports can be used to quickly synchronize a local database without having to make a series of expensive <code>get()</code> calls to the API. Unlike v13 which had a dedicated <a href="http://code.google.com/apis/adwords/docs/developer/adwords_api_report_structure.html">Structure Report</a> for this purpose, newer versions of the API support this use case by allowing for zero-impression data to be returned in all of the normal performance reports. Zero-impression rows are simply those that received no impressions over the timespan of the report, which provide little use when calculating performance but are are needed to download the full contents of the account.</p> <p>In v201109 we added the field <code><a href="http://code.google.com/apis/adwords/docs/reference/latest/ReportDefinitionService.ReportDefinition.html#includeZeroImpressions">ReportDefinition.includeZeroImpressions</a></code>, which you can use to influence whether or not zero-impression data is included in your report. Setting this field to "false" will remove zero-impression data from your reports, but be aware that setting it to "true" does not guarantee that zero-impression rows will be returned.</p> <p>Fields that segment the report, such as "Date", "AdNetworkType1", or "ClickType", will prevent zero-impression data from being returned even if includeZeroImpressions is explicitly enabled on the report definition. This is done is to ensure that reports don’t grow too large, as segmentation splits a single row into many. Additionally, in many cases it’s not possible to assign a zero-impression row to one of the segments. For example, there is no ad slot (top vs. other) value that makes sense to assign to a keyword that never had an impression. The "Notes" column of the <a href="http://code.google.com/apis/adwords/docs/appendix/reports.html#ad">report types documentation</a> indicates which fields will prevent zero-impression rows from being returned.</p> <p>Because segmentation and zero-impression rows are not compatible, we recommend that you use one set of reports for downloading the account structure and another set for getting performance statistics. This allows you to get the zero-impression rows you need without sacrificing the powerful insights that segmentation provides. If you have any questions on how to leverage reports in your application, you can reach us on the <a href="http://code.google.com/apis/adwords/community/">developer forum</a> or during <a href="http://code.google.com/apis/adwords/community/officehours.html">office hours</a>.</p> <p><span class="post-author"><a href="https://plus.google.com/u/0/103231502413952116096"><img height="20" src="https://lh4.googleusercontent.com/-qbaZRXjidts/AAAAAAAAAAI/AAAAAAAAABo/HfCK2T4S-14/photo.jpg?sz=20" style="vertical-align:middle; border:none;" width="20"></a> - <a href="https://plus.google.com/u/0/103231502413952116096" rel="author">Eric Koleda</a>, AdWords API Team</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p>In addition to retrieving performance statistics, AdWords API developers often use the reporting system to get structural information about an account. These reports can be used to quickly synchronize a local database without having to make a series of expensive <code>get()</code> calls to the API. Unlike v13 which had a dedicated <a href="http://code.google.com/apis/adwords/docs/developer/adwords_api_report_structure.html">Structure Report</a> for this purpose, newer versions of the API support this use case by allowing for zero-impression data to be returned in all of the normal performance reports. Zero-impression rows are simply those that received no impressions over the timespan of the report, which provide little use when calculating performance but are are needed to download the full contents of the account.</p> <p>In v201109 we added the field <code><a href="http://code.google.com/apis/adwords/docs/reference/latest/ReportDefinitionService.ReportDefinition.html#includeZeroImpressions">ReportDefinition.includeZeroImpressions</a></code>, which you can use to influence whether or not zero-impression data is included in your report. Setting this field to "false" will remove zero-impression data from your reports, but be aware that setting it to "true" does not guarantee that zero-impression rows will be returned.</p> <p>Fields that segment the report, such as "Date", "AdNetworkType1", or "ClickType", will prevent zero-impression data from being returned even if includeZeroImpressions is explicitly enabled on the report definition. This is done is to ensure that reports don’t grow too large, as segmentation splits a single row into many. Additionally, in many cases it’s not possible to assign a zero-impression row to one of the segments. For example, there is no ad slot (top vs. other) value that makes sense to assign to a keyword that never had an impression. The "Notes" column of the <a href="http://code.google.com/apis/adwords/docs/appendix/reports.html#ad">report types documentation</a> indicates which fields will prevent zero-impression rows from being returned.</p> <p>Because segmentation and zero-impression rows are not compatible, we recommend that you use one set of reports for downloading the account structure and another set for getting performance statistics. This allows you to get the zero-impression rows you need without sacrificing the powerful insights that segmentation provides. If you have any questions on how to leverage reports in your application, you can reach us on the <a href="http://code.google.com/apis/adwords/community/">developer forum</a> or during <a href="http://code.google.com/apis/adwords/community/officehours.html">office hours</a>.</p> <p><span class="post-author"><a href="https://plus.google.com/u/0/103231502413952116096"><img height="20" src="https://lh4.googleusercontent.com/-qbaZRXjidts/AAAAAAAAAAI/AAAAAAAAABo/HfCK2T4S-14/photo.jpg?sz=20" style="vertical-align:middle; border:none;" width="20"></a> - <a href="https://plus.google.com/u/0/103231502413952116096" rel="author">Eric Koleda</a>, AdWords API Team</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Zero-impression data in AdWords API reports&url=http://ads-developers.googleblog.com/2011/12/zero-impression-data-in-adwords-api.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2011/12/zero-impression-data-in-adwords-api.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2011/12/zero-impression-data-in-adwords-api.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/adwords_api' rel='tag'> adwords_api </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/reporting' rel='tag'> reporting </a> </span> </div> </div> </div> <div class='post' data-id='6142108602122646585' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2011/12/introducing-adsense-management-services.html' itemprop='url' title='Introducing AdSense Management Services in Apps Script'> Introducing AdSense Management Services in Apps Script </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Thursday, December 15, 2011 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> Starting today, the AdSense Management API is available as part of <a href="http://code.google.com/googleapps/appsscript/service_adsense.html">AdSense Services</a> in <a href="http://code.google.com/googleapps/appsscript/">Google Apps Script</a>. This means that you’ll be able to do things like: <ul> <li>Create AdSense <a href="http://code.google.com/googleapps/appsscript/articles/adsense_tutorial.html#section3">performance reports</a> for your AdSense accounts in a Google spreadsheet</li> <li>Create a <a href="http://code.google.com/googleapps/appsscript/articles/adsense_tutorial.html#section4">chart based on your AdSense reporting data</a> and display it in a Google Spreadsheet</li> <li><a href="http://code.google.com/googleapps/appsscript/articles/getting-started-with-sites.html">Embed</a> your scripts in a Google Sites page, for instance to import a chart</li> <li>Use <a href="http://code.google.com/googleapps/appsscript/guide_events.html#TimeTriggers">triggers</a> to schedule the execution of your scripts, for instance to periodically update the chart imported in the Google Sites page</li> </ul> Accessing the API from Google Apps Scripts is very easy. The following snippet of code shows how to generate a report and populate columns of a spreadsheet with the data retrieved: <br /> <pre class="prettyprint">function generateReport() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName('Reports'); var startDate = Browser.inputBox( "Enter a start date (format: 'yyyy-mm-dd')"); var endDate = Browser.inputBox( "Enter an end date (format: 'yyyy-mm-dd')"); var args = { 'metric': ['PAGE_VIEWS', 'AD_REQUESTS', 'MATCHED_AD_REQUESTS', 'INDIVIDUAL_AD_IMPRESSIONS'], 'dimension': ['MONTH']}; var report = AdSense.Reports.generate(startDate, endDate, args).getRows(); for (var i=0; i<report.length; i++) { var row = report[i]; sheet.getRange('A' + String(i+2)).setValue(row[0]); sheet.getRange('B' + String(i+2)).setValue(row[1]); sheet.getRange('C' + String(i+2)).setValue(row[2]); sheet.getRange('D' + String(i+2)).setValue(row[3]); sheet.getRange('E' + String(i+2)).setValue(row[4]); } } </pre> If you want to generate a chart from your data instead of populating the spreadsheet, that’s very easy as well: <br /> <pre class="prettyprint">function generateLineChart() { var doc = SpreadsheetApp.getActiveSpreadsheet(); var startDate = Browser.inputBox( "Enter a start date (format: 'yyyy-mm-dd')"); var endDate = Browser.inputBox( "Enter an end date (format: 'yyyy-mm-dd')"); var adClientId = Browser.inputBox("Enter an ad client id"); var args = { 'filter': ['AD_CLIENT_ID==' + adClientId], 'metric': ['PAGE_VIEWS', 'AD_REQUESTS', 'MATCHED_AD_REQUESTS', 'INDIVIDUAL_AD_IMPRESSIONS'], 'dimension': ['MONTH']}; var report = AdSense.Reports.generate(startDate, endDate, args).getRows(); var data = Charts.newDataTable() .addColumn(Charts.ColumnType.STRING, "Month") .addColumn(Charts.ColumnType.NUMBER, "Page views") .addColumn(Charts.ColumnType.NUMBER, "Ad requests") .addColumn(Charts.ColumnType.NUMBER, "Matched ad requests") .addColumn(Charts.ColumnType.NUMBER, "Individual ad impressions"); // Convert the metrics to numeric values. for (var i=0; i<report.length; i++) { var row = report[i]; data.addRow([row[0],parseInt(row[1]),parseInt(row[2]), parseInt(row[3]),parseInt(row[4])]); } data.build(); var chart = Charts.newLineChart() .setDataTable(data) .setTitle("Performances per Month") .build(); var app = UiApp.createApplication().setTitle("Performances"); var panel = app.createVerticalPanel() .setHeight('350') .setWidth('700'); panel.add(chart); app.add(panel); doc.show(app); } </pre> A shiny line chart will be displayed in your spreadsheet, as shown in the following picture:<br /><br /> <div class="separator" text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqvFyaxtN2Qh8DnkZTiXsynW2LOHJSky8XRTRJUxaUWH542k7hynJ-Imsde-bjQQYr1TwCRfe4dG1GoYCgaEcm5fRJFI9_eA9I0zO9e1NGwbTf592HmSY_tUS8acLyxFQGJvf5lC9cL7U/s1600/spread_chart_small.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="185" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqvFyaxtN2Qh8DnkZTiXsynW2LOHJSky8XRTRJUxaUWH542k7hynJ-Imsde-bjQQYr1TwCRfe4dG1GoYCgaEcm5fRJFI9_eA9I0zO9e1NGwbTf592HmSY_tUS8acLyxFQGJvf5lC9cL7U/s320/spread_chart_small.png" width="320" /></a></div> <br /> You can start using the service by checking out the <a href="http://code.google.com/googleapps/appsscript/service_adsense.html">reference documentation</a>, that contains also some sample scripts, and <a href="http://code.google.com/googleapps/appsscript/articles/adsense_tutorial.html">this tutorial</a> that implements the use cases mentioned above.<br /><br /> Happy Google Apps Scripting with the AdSense Management API!<br /> <p><span style="color: red;">Edit</span>: fixed typo.</p> <br /> <span class="post-author"> <a href="https://plus.google.com/118276561380249048216/about"><img src="https://lh5.googleusercontent.com/-RMp-hn38AZI/AAAAAAAAAAI/AAAAAAAAADE/59YQber32iU/photo.jpg?sz=20" style="border: none; vertical-align: middle;" /></a> - <a href="https://plus.google.com/118276561380249048216/about" rel="author">Silvano Luciani</a>, AdSense API Team</span></report.length;></pre> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> Starting today, the AdSense Management API is available as part of <a href="http://code.google.com/googleapps/appsscript/service_adsense.html">AdSense Services</a> in <a href="http://code.google.com/googleapps/appsscript/">Google Apps Script</a>. This means that you’ll be able to do things like: <ul> <li>Create AdSense <a href="http://code.google.com/googleapps/appsscript/articles/adsense_tutorial.html#section3">performance reports</a> for your AdSense accounts in a Google spreadsheet</li> <li>Create a <a href="http://code.google.com/googleapps/appsscript/articles/adsense_tutorial.html#section4">chart based on your AdSense reporting data</a> and display it in a Google Spreadsheet</li> <li><a href="http://code.google.com/googleapps/appsscript/articles/getting-started-with-sites.html">Embed</a> your scripts in a Google Sites page, for instance to import a chart</li> <li>Use <a href="http://code.google.com/googleapps/appsscript/guide_events.html#TimeTriggers">triggers</a> to schedule the execution of your scripts, for instance to periodically update the chart imported in the Google Sites page</li> </ul> Accessing the API from Google Apps Scripts is very easy. The following snippet of code shows how to generate a report and populate columns of a spreadsheet with the data retrieved: <br /> <pre class="prettyprint">function generateReport() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName('Reports'); var startDate = Browser.inputBox( "Enter a start date (format: 'yyyy-mm-dd')"); var endDate = Browser.inputBox( "Enter an end date (format: 'yyyy-mm-dd')"); var args = { 'metric': ['PAGE_VIEWS', 'AD_REQUESTS', 'MATCHED_AD_REQUESTS', 'INDIVIDUAL_AD_IMPRESSIONS'], 'dimension': ['MONTH']}; var report = AdSense.Reports.generate(startDate, endDate, args).getRows(); for (var i=0; i<report.length; i++) { var row = report[i]; sheet.getRange('A' + String(i+2)).setValue(row[0]); sheet.getRange('B' + String(i+2)).setValue(row[1]); sheet.getRange('C' + String(i+2)).setValue(row[2]); sheet.getRange('D' + String(i+2)).setValue(row[3]); sheet.getRange('E' + String(i+2)).setValue(row[4]); } } </pre> If you want to generate a chart from your data instead of populating the spreadsheet, that’s very easy as well: <br /> <pre class="prettyprint">function generateLineChart() { var doc = SpreadsheetApp.getActiveSpreadsheet(); var startDate = Browser.inputBox( "Enter a start date (format: 'yyyy-mm-dd')"); var endDate = Browser.inputBox( "Enter an end date (format: 'yyyy-mm-dd')"); var adClientId = Browser.inputBox("Enter an ad client id"); var args = { 'filter': ['AD_CLIENT_ID==' + adClientId], 'metric': ['PAGE_VIEWS', 'AD_REQUESTS', 'MATCHED_AD_REQUESTS', 'INDIVIDUAL_AD_IMPRESSIONS'], 'dimension': ['MONTH']}; var report = AdSense.Reports.generate(startDate, endDate, args).getRows(); var data = Charts.newDataTable() .addColumn(Charts.ColumnType.STRING, "Month") .addColumn(Charts.ColumnType.NUMBER, "Page views") .addColumn(Charts.ColumnType.NUMBER, "Ad requests") .addColumn(Charts.ColumnType.NUMBER, "Matched ad requests") .addColumn(Charts.ColumnType.NUMBER, "Individual ad impressions"); // Convert the metrics to numeric values. for (var i=0; i<report.length; i++) { var row = report[i]; data.addRow([row[0],parseInt(row[1]),parseInt(row[2]), parseInt(row[3]),parseInt(row[4])]); } data.build(); var chart = Charts.newLineChart() .setDataTable(data) .setTitle("Performances per Month") .build(); var app = UiApp.createApplication().setTitle("Performances"); var panel = app.createVerticalPanel() .setHeight('350') .setWidth('700'); panel.add(chart); app.add(panel); doc.show(app); } </pre> A shiny line chart will be displayed in your spreadsheet, as shown in the following picture:<br /><br /> <div class="separator" text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqvFyaxtN2Qh8DnkZTiXsynW2LOHJSky8XRTRJUxaUWH542k7hynJ-Imsde-bjQQYr1TwCRfe4dG1GoYCgaEcm5fRJFI9_eA9I0zO9e1NGwbTf592HmSY_tUS8acLyxFQGJvf5lC9cL7U/s1600/spread_chart_small.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="185" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqvFyaxtN2Qh8DnkZTiXsynW2LOHJSky8XRTRJUxaUWH542k7hynJ-Imsde-bjQQYr1TwCRfe4dG1GoYCgaEcm5fRJFI9_eA9I0zO9e1NGwbTf592HmSY_tUS8acLyxFQGJvf5lC9cL7U/s320/spread_chart_small.png" width="320" /></a></div> <br /> You can start using the service by checking out the <a href="http://code.google.com/googleapps/appsscript/service_adsense.html">reference documentation</a>, that contains also some sample scripts, and <a href="http://code.google.com/googleapps/appsscript/articles/adsense_tutorial.html">this tutorial</a> that implements the use cases mentioned above.<br /><br /> Happy Google Apps Scripting with the AdSense Management API!<br /> <p><span style="color: red;">Edit</span>: fixed typo.</p> <br /> <span class="post-author"> <a href="https://plus.google.com/118276561380249048216/about"><img src="https://lh5.googleusercontent.com/-RMp-hn38AZI/AAAAAAAAAAI/AAAAAAAAADE/59YQber32iU/photo.jpg?sz=20" style="border: none; vertical-align: middle;" /></a> - <a href="https://plus.google.com/118276561380249048216/about" rel="author">Silvano Luciani</a>, AdSense API Team</span></report.length;></pre> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Introducing AdSense Management Services in Apps Script&url=http://ads-developers.googleblog.com/2011/12/introducing-adsense-management-services.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2011/12/introducing-adsense-management-services.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2011/12/introducing-adsense-management-services.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/adsense_api' rel='tag'> adsense_api </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/adsense_management_api' rel='tag'> adsense_management_api </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/google_apps_script' rel='tag'> google_apps_script </a> </span> </div> </div> </div> <div class='post' data-id='3735202540609016306' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2011/12/google-analytics-enhancements-for.html' itemprop='url' title='Google Analytics Enhancements for Mobile Apps'> Google Analytics Enhancements for Mobile Apps </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Thursday, December 15, 2011 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p>Yesterday, the Google Analytics team <a href="http://analytics.blogspot.com/2011/12/google-analytics-enhancements-for.html">posted</a> some exciting new enhancements to the Google Analytics SDK: <ul> <li><b>EasyTracking Library</b> - EasyTracker libraries for both iOS and Android enable tracking of your application down to the Activity (or UIViewController for iOS) level with almost no coding required on your part. Additionally, improved integration with the Google Analytics SDK means better responsiveness on iOS as well as automatic session management on both platforms.</li> <li><b>Updated Google Analytics SDK</b> - Newly released iOS version 1.4 and Android version 1.4.2 contain several bug fixes, including more reliable methods for sending hits on iOS and a fix for the Android Market referral issue.</li> <li><b>More samples</b> - New open source application aimed to help reduce the ramp-up time for new developers who want to track their apps. This application exercises all the Google Analytics APIs that are available to mobile application developers. You can find them at <a href="http://code.google.com/p/analytics-api-samples/source/browse/#svn%2Ftrunk%2Fsrc%2Ftracking%2Fmobile ">trunk/src/tracking/mobile</a>.</li> </ul></p> <p>To read more, check out the <a href="http://analytics.blogspot.com/2011/12/google-analytics-enhancements-for.html">full post</a> on the <a href="http://analytics.blogspot.com/ ">Google Analytics Blog</a>.</p> <br /> <span class="post-author"> - Jim Cotugno, Mobile Application Tracking Rockstar</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p>Yesterday, the Google Analytics team <a href="http://analytics.blogspot.com/2011/12/google-analytics-enhancements-for.html">posted</a> some exciting new enhancements to the Google Analytics SDK: <ul> <li><b>EasyTracking Library</b> - EasyTracker libraries for both iOS and Android enable tracking of your application down to the Activity (or UIViewController for iOS) level with almost no coding required on your part. Additionally, improved integration with the Google Analytics SDK means better responsiveness on iOS as well as automatic session management on both platforms.</li> <li><b>Updated Google Analytics SDK</b> - Newly released iOS version 1.4 and Android version 1.4.2 contain several bug fixes, including more reliable methods for sending hits on iOS and a fix for the Android Market referral issue.</li> <li><b>More samples</b> - New open source application aimed to help reduce the ramp-up time for new developers who want to track their apps. This application exercises all the Google Analytics APIs that are available to mobile application developers. You can find them at <a href="http://code.google.com/p/analytics-api-samples/source/browse/#svn%2Ftrunk%2Fsrc%2Ftracking%2Fmobile ">trunk/src/tracking/mobile</a>.</li> </ul></p> <p>To read more, check out the <a href="http://analytics.blogspot.com/2011/12/google-analytics-enhancements-for.html">full post</a> on the <a href="http://analytics.blogspot.com/ ">Google Analytics Blog</a>.</p> <br /> <span class="post-author"> - Jim Cotugno, Mobile Application Tracking Rockstar</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Google Analytics Enhancements for Mobile Apps&url=http://ads-developers.googleblog.com/2011/12/google-analytics-enhancements-for.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2011/12/google-analytics-enhancements-for.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2011/12/google-analytics-enhancements-for.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/analytics' rel='tag'> analytics </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/android' rel='tag'> android </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/iOS' rel='tag'> iOS </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile' rel='tag'> mobile </a> </span> </div> </div> </div> <div class='post' data-id='4923677023372561575' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2011/12/adsense-management-api-v11.html' itemprop='url' title='AdSense Management API v1.1'> AdSense Management API v1.1 </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Thursday, December 15, 2011 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> We’re happy to announce we’ve just launched AdSense Management API v1.1!<br /> <br /> With the new features in this release, you’ll be able to retrieve ad units via custom channels (and vice-versa), make GET calls on most inventory items, and access extended targeting information on custom channels.<br /> <br /> Take a look at our <a href="http://code.google.com/apis/adsense/management/overview.html" target="_blank">updated documentation</a> for more details.<br /> <br /> <a href="http://code.google.com/apis/adsense/management/forum.html" target="_blank">Let us know</a> if you have any questions, and happy holidays!<br /> <br /> <span class="post-author"><a href="https://plus.google.com/112096250552967536954/about"><img height="20" src="https://lh3.googleusercontent.com/-u76jADy19ZQ/AAAAAAAAAAI/AAAAAAAAAjs/LIewZ4FCgoY/photo.jpg?sz=20" style="border: none; vertical-align: middle;" width="20" /></a> - <a href="https://plus.google.com/112096250552967536954/about" rel="author">Sérgio Gomes</a>, AdSense API Team</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> We’re happy to announce we’ve just launched AdSense Management API v1.1!<br /> <br /> With the new features in this release, you’ll be able to retrieve ad units via custom channels (and vice-versa), make GET calls on most inventory items, and access extended targeting information on custom channels.<br /> <br /> Take a look at our <a href="http://code.google.com/apis/adsense/management/overview.html" target="_blank">updated documentation</a> for more details.<br /> <br /> <a href="http://code.google.com/apis/adsense/management/forum.html" target="_blank">Let us know</a> if you have any questions, and happy holidays!<br /> <br /> <span class="post-author"><a href="https://plus.google.com/112096250552967536954/about"><img height="20" src="https://lh3.googleusercontent.com/-u76jADy19ZQ/AAAAAAAAAAI/AAAAAAAAAjs/LIewZ4FCgoY/photo.jpg?sz=20" style="border: none; vertical-align: middle;" width="20" /></a> - <a href="https://plus.google.com/112096250552967536954/about" rel="author">Sérgio Gomes</a>, AdSense API Team</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:AdSense Management API v1.1&url=http://ads-developers.googleblog.com/2011/12/adsense-management-api-v11.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2011/12/adsense-management-api-v11.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2011/12/adsense-management-api-v11.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/adsense_api' rel='tag'> adsense_api </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/adsense_management_api' rel='tag'> adsense_management_api </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/adsense_management_api_v1.1' rel='tag'> adsense_management_api_v1.1 </a> </span> </div> </div> </div> <div class='post' data-id='5276635936650890239' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2011/12/introducing-dfa-api-v116.html' itemprop='url' title='Introducing DFA API v1.16'> Introducing DFA API v1.16 </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Monday, December 12, 2011 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p>A new version of the DoubleClick for Advertisers (DFA) API has arrived: v1.16. This release consists entirely of security and performance enhancements. It does not alter the objects exposed by the API.</p> <h2>Deprecation of v1.14</h2> <p>The version from two releases ago, v1.14, is now considered to be deprecated. As <a href="http://doubleclickadvertisersapi.blogspot.com/2011/09/introducing-dfa-api-v115.html">previously announced</a>, v1.14 will be removed from service on January 21st, 2012. Be sure to migrate any applications currently using v1.14 by this time. Consider it an opportunity to move to v1.16!</p> <h2>Sunset of v1.15 in Early March</h2> <p>It’s always sad to see a friend go before its time, but our faithful companion v1.15 will be leaving us slightly earlier than usual. This version will be sunset in early March, a period of 6 months from its release date instead of the usual 7 months. We expect this to be the only version whose lifetime is shortened within the next few release cycles. Please use this time window to test out and migrate to v1.16.</p> <p>With the release of v1.16, we have updated our <a href="http://code.google.com/apis/dfa/docs/release_notes.html">release notes page</a>. Please bring any feedback or questions you may have to our <a href="https://groups.google.com/group/google-doubleclick-for-advertisers-api">forum</a>.</p> <span class="post-author"><a href="https://plus.google.com/113204894998269100367/"><img height="20" src="https://lh5.googleusercontent.com/-jfMpzPefhpA/AAAAAAAAAAI/AAAAAAAAAC4/RiK3R7FaK-8/photo.jpg?sz=20" style="border: none; vertical-align: middle;" width="20" /></a> - <a href="https://plus.google.com/113204894998269100367/" rel="author">Joseph DiLallo</a>, DFA API Team</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p>A new version of the DoubleClick for Advertisers (DFA) API has arrived: v1.16. This release consists entirely of security and performance enhancements. It does not alter the objects exposed by the API.</p> <h2>Deprecation of v1.14</h2> <p>The version from two releases ago, v1.14, is now considered to be deprecated. As <a href="http://doubleclickadvertisersapi.blogspot.com/2011/09/introducing-dfa-api-v115.html">previously announced</a>, v1.14 will be removed from service on January 21st, 2012. Be sure to migrate any applications currently using v1.14 by this time. Consider it an opportunity to move to v1.16!</p> <h2>Sunset of v1.15 in Early March</h2> <p>It’s always sad to see a friend go before its time, but our faithful companion v1.15 will be leaving us slightly earlier than usual. This version will be sunset in early March, a period of 6 months from its release date instead of the usual 7 months. We expect this to be the only version whose lifetime is shortened within the next few release cycles. Please use this time window to test out and migrate to v1.16.</p> <p>With the release of v1.16, we have updated our <a href="http://code.google.com/apis/dfa/docs/release_notes.html">release notes page</a>. Please bring any feedback or questions you may have to our <a href="https://groups.google.com/group/google-doubleclick-for-advertisers-api">forum</a>.</p> <span class="post-author"><a href="https://plus.google.com/113204894998269100367/"><img height="20" src="https://lh5.googleusercontent.com/-jfMpzPefhpA/AAAAAAAAAAI/AAAAAAAAAC4/RiK3R7FaK-8/photo.jpg?sz=20" style="border: none; vertical-align: middle;" width="20" /></a> - <a href="https://plus.google.com/113204894998269100367/" rel="author">Joseph DiLallo</a>, DFA API Team</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Introducing DFA API v1.16&url=http://ads-developers.googleblog.com/2011/12/introducing-dfa-api-v116.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2011/12/introducing-dfa-api-v116.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2011/12/introducing-dfa-api-v116.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/dfa_api' rel='tag'> dfa_api </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/dfa_v1.16' rel='tag'> dfa_v1.16 </a> </span> </div> </div> </div> <div class='post' data-id='6935749618247800926' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2011/12/discover-dfp-api-v201111-suggested-ad.html' itemprop='url' title='Discover DFP API v201111: Suggested Ad Units'> Discover DFP API v201111: Suggested Ad Units </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Friday, December 9, 2011 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> The <a href="http://googleadsdeveloper.blogspot.com/2011/11/announcing-version-v201111-of-dfp-api.html">v201111 version</a> of the DoubleClick for Publishers (DFP) API introduces <a href="http://code.google.com/apis/dfp/docs/reference/v201111/SuggestedAdUnitService.html">SuggestedAdUnitService</a> which lets you get and approve those ad units that have tags on your web pages, but no corresponding ad units in DFP. By default, only ad tags that have 10 or more requests will be returned as <a href="http://code.google.com/apis/dfp/docs/reference/v201111/SuggestedAdUnitService.SuggestedAdUnit.html">suggested ad units</a>. They can be approved using <a href="http://code.google.com/apis/dfp/docs/reference/v201111/SuggestedAdUnitService.html#performSuggestedAdUnitAction">performSuggestedAdUnitAction</a>, after which they become ad units and you can manipulate them using <a href="http://code.google.com/apis/dfp/docs/reference/v201111/InventoryService.html">InventoryService</a>. To use this service, please make sure you have a <a href="http://code.google.com/apis/dfp/docs/account_types.html">premium account</a> and that you have enabled the feature in the User Interface.<br /> <br /> <b>Why Use Suggested Ad Units?</b> <br /><br /> A simple use case for suggested ad units is for new publishers or blog owners to create new tags for articles and posts on their site and approve suggested ad units based on the number of impressions they generate. This gives you the chance to see how well your content does before targeting line items to your ad units. The <a href="http://code.google.com/p/google-api-dfp-java/source/browse/trunk/examples/v201111/suggestedadunitservice/ApproveSuggestedAdUnitsExample.java">ApproveSuggestedAdUnitsExample</a> from the <a href="http://code.google.com/apis/dfp/docs/clients.html">client libraries</a> will show you how to do this.<br /> <br /> A more involved use case for publishing platforms is to tag all the pages generated by the users and perform some operations on content that generates a sizable number of impressions. These operations can include:<br /> <ol start="1"> <li>Approving the suggested ad unit and targeting line items to it</li> <li>Promoting the page as featured content</li> <li>Recognize the user for quality content and auto-approve their pages</li> </ol> Here's a Java code sample of how you would do this:<br /> <pre class="prettyprint">// Set the number of requests to 50 or more. Long NUMBER_OF_REQUESTS = 50L; // Statement to fetch suggested ad units in descending order by number of // requests. String statementText = "ORDER BY numRequests DESC LIMIT 500"; Statement filterStatement = new StatementBuilder(statementText).toStatement(); SuggestedAdUnitPage page = new SuggestedAdUnitPage(); // List of suggested ad unit ids to approve. List<String> suggestedAdUnitIds = new ArrayList<String>(); page = suggestedAdUnitService.getSuggestedAdUnitsByStatement( filterStatement); if (page.getResults() != null) { for (SuggestedAdUnit suggestedAdUnit : page.getResults()) { if (suggestedAdUnit.getNumRequests() >= NUMBER_OF_REQUESTS) { // Add it to the ID list to be approved. suggestedAdUnitIds.add(suggestedAdUnit.getId()); /* * Promoting the page as a featured content. * Recognize the user for quality content and auto-approve their * pages. */ } } } if (suggestedAdUnitIds.size() > 0) { // Modify statement to select suggested ad units from the list. filterStatement.setQuery( "WHERE id IN (" + StringUtils.join(suggestedAdUnitIds, ",") + ")"); // Create action to approve suggested ad units. ApproveSuggestedAdUnit action = new ApproveSuggestedAdUnit(); // Perform the action. UpdateResult result = suggestedAdUnitService.performSuggestedAdUnitAction( action, filterStatement); } </pre> These are just some of the things we think suggested ad units can be used for; we'd love to hear your ideas on our <a href="http://code.google.com/apis/dfp/forum/discussions.html"></a><a href="http://code.google.com/apis/dfp/forum/discussions.html">forum</a> or at an Office Hours Hangout. <br /> <br /> <span class="post-author"><a href="https://plus.google.com/u/0/115474229489284556707"><img height="20" src="https://lh3.googleusercontent.com/-pDdv2kTjyNw/AAAAAAAAAAI/AAAAAAAAAnE/q_kK4BYy-mM/photo.jpg?sz=20" style="border: none; vertical-align: middle;" width="20" /></a> - <a href="https://plus.google.com/u/0/115474229489284556707" rel="author">Jeffrey Sham</a>, DFP API Team</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> The <a href="http://googleadsdeveloper.blogspot.com/2011/11/announcing-version-v201111-of-dfp-api.html">v201111 version</a> of the DoubleClick for Publishers (DFP) API introduces <a href="http://code.google.com/apis/dfp/docs/reference/v201111/SuggestedAdUnitService.html">SuggestedAdUnitService</a> which lets you get and approve those ad units that have tags on your web pages, but no corresponding ad units in DFP. By default, only ad tags that have 10 or more requests will be returned as <a href="http://code.google.com/apis/dfp/docs/reference/v201111/SuggestedAdUnitService.SuggestedAdUnit.html">suggested ad units</a>. They can be approved using <a href="http://code.google.com/apis/dfp/docs/reference/v201111/SuggestedAdUnitService.html#performSuggestedAdUnitAction">performSuggestedAdUnitAction</a>, after which they become ad units and you can manipulate them using <a href="http://code.google.com/apis/dfp/docs/reference/v201111/InventoryService.html">InventoryService</a>. To use this service, please make sure you have a <a href="http://code.google.com/apis/dfp/docs/account_types.html">premium account</a> and that you have enabled the feature in the User Interface.<br /> <br /> <b>Why Use Suggested Ad Units?</b> <br /><br /> A simple use case for suggested ad units is for new publishers or blog owners to create new tags for articles and posts on their site and approve suggested ad units based on the number of impressions they generate. This gives you the chance to see how well your content does before targeting line items to your ad units. The <a href="http://code.google.com/p/google-api-dfp-java/source/browse/trunk/examples/v201111/suggestedadunitservice/ApproveSuggestedAdUnitsExample.java">ApproveSuggestedAdUnitsExample</a> from the <a href="http://code.google.com/apis/dfp/docs/clients.html">client libraries</a> will show you how to do this.<br /> <br /> A more involved use case for publishing platforms is to tag all the pages generated by the users and perform some operations on content that generates a sizable number of impressions. These operations can include:<br /> <ol start="1"> <li>Approving the suggested ad unit and targeting line items to it</li> <li>Promoting the page as featured content</li> <li>Recognize the user for quality content and auto-approve their pages</li> </ol> Here's a Java code sample of how you would do this:<br /> <pre class="prettyprint">// Set the number of requests to 50 or more. Long NUMBER_OF_REQUESTS = 50L; // Statement to fetch suggested ad units in descending order by number of // requests. String statementText = "ORDER BY numRequests DESC LIMIT 500"; Statement filterStatement = new StatementBuilder(statementText).toStatement(); SuggestedAdUnitPage page = new SuggestedAdUnitPage(); // List of suggested ad unit ids to approve. List<String> suggestedAdUnitIds = new ArrayList<String>(); page = suggestedAdUnitService.getSuggestedAdUnitsByStatement( filterStatement); if (page.getResults() != null) { for (SuggestedAdUnit suggestedAdUnit : page.getResults()) { if (suggestedAdUnit.getNumRequests() >= NUMBER_OF_REQUESTS) { // Add it to the ID list to be approved. suggestedAdUnitIds.add(suggestedAdUnit.getId()); /* * Promoting the page as a featured content. * Recognize the user for quality content and auto-approve their * pages. */ } } } if (suggestedAdUnitIds.size() > 0) { // Modify statement to select suggested ad units from the list. filterStatement.setQuery( "WHERE id IN (" + StringUtils.join(suggestedAdUnitIds, ",") + ")"); // Create action to approve suggested ad units. ApproveSuggestedAdUnit action = new ApproveSuggestedAdUnit(); // Perform the action. UpdateResult result = suggestedAdUnitService.performSuggestedAdUnitAction( action, filterStatement); } </pre> These are just some of the things we think suggested ad units can be used for; we'd love to hear your ideas on our <a href="http://code.google.com/apis/dfp/forum/discussions.html"></a><a href="http://code.google.com/apis/dfp/forum/discussions.html">forum</a> or at an Office Hours Hangout. <br /> <br /> <span class="post-author"><a href="https://plus.google.com/u/0/115474229489284556707"><img height="20" src="https://lh3.googleusercontent.com/-pDdv2kTjyNw/AAAAAAAAAAI/AAAAAAAAAnE/q_kK4BYy-mM/photo.jpg?sz=20" style="border: none; vertical-align: middle;" width="20" /></a> - <a href="https://plus.google.com/u/0/115474229489284556707" rel="author">Jeffrey Sham</a>, DFP API Team</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Discover DFP API v201111: Suggested Ad Units&url=http://ads-developers.googleblog.com/2011/12/discover-dfp-api-v201111-suggested-ad.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2011/12/discover-dfp-api-v201111-suggested-ad.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2011/12/discover-dfp-api-v201111-suggested-ad.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/dfp_api' rel='tag'> dfp_api </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/dfp_v201111' rel='tag'> dfp_v201111 </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/suggested_ad_units' rel='tag'> suggested_ad_units </a> </span> </div> </div> </div> <div class='post' data-id='1856470846611575402' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2011/12/discover-adwords-api-v201109-xml.html' itemprop='url' title='Discover AdWords API v201109: XML validation'> Discover AdWords API v201109: XML validation </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Friday, December 9, 2011 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p>You might not realize it if you use our <a href="http://code.google.com/apis/adwords/docs/clientlibraries.html">client libraries</a>, but at its core the AdWords API is based on <a href="http://en.wikipedia.org/wiki/SOAP">SOAP</a> and <a href="http://en.wikipedia.org/wiki/XML">XML</a>. Crafting a request by hand can be tricky, and even some SOAP toolkits have problems serializing to the correct format. In version v201109 of the API we enabled additional XML validation so that you will now be alerted to structural issues with your requests.</p> <p>The format of the request’s XML payload is specified by an <a href="http://en.wikipedia.org/wiki/XML_Schema_(W3C)">XML Schema definition</a> (XSD) embedded in the <a href="http://en.wikipedia.org/wiki/Web_Services_Description_Language">WSDL</a> document for the service. The schema describes very precisely the types and elements that can appear in the request. In past versions of the API the server was somewhat lenient in how it processed the incoming XML. For example, it would silently ignore unknown elements. This had the potential to hide problems with your code or cause mysterious behavior.</p> <p>With enhanced XML validation enabled, the aforementioned errors can be caught earlier, as the request payload must fully match the format in the schema. Below is a sample request and response showing a validation error for an unknown element.</p> <h2>Request</h2> <pre class="prettyprint"> <?xml version="1.0"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header> <RequestHeader xmlns="https://adwords.google.com/api/adwords/cm/v201109"> <applicationToken>...</applicationToken> <authToken>...</authToken> <clientCustomerId>...</clientCustomerId> <developerToken>...</developerToken> <userAgent>...</userAgent> </RequestHeader> </soapenv:Header> <soapenv:Body> <get xmlns="https://adwords.google.com/api/adwords/cm/v201109"> <serviceSelector> <fields>Id</fields> <fields>Name</fields> <ordering> <field>Name</field> </ordering> <strong><foo>bar</foo></strong> </serviceSelector> </get> </soapenv:Body> </soapenv:Envelope> </pre> <h2>Response</h2> <pre class="prettyprint"> <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <soap:Fault> <faultcode>soap:Client</faultcode> <faultstring> Unmarshalling Error: cvc-complex-type.2.4.a: Invalid content was found starting with element 'foo'. One of '{ "https://adwords.google.com/api/adwords/cm/v201109":ordering, "https://adwords.google.com/api/adwords/cm/v201109":paging }' is expected. </faultstring> </soap:Fault> </soap:Body> </soap:Envelope> </pre> <p>In this case the response is indicating that only the elements "ordering" or "paging" are permitted in this part of the request. Please note that this error is thrown as a raw SOAP fault, and is not wrapped in an <a href="http://code.google.com/apis/adwords/docs/reference/latest/CampaignService.ApiError.html">ApiError</a> object. There is no need to add special exception handling for these errors, as they are designed to be detected and resolved during the development phase of your application. If they do occur in your production environment you should log them for later analysis.</p> <p>There are some side effects of using stricter XML validation that you should be aware of:</p> <ul> <li>The order of the elements in the request now matters. The XSD lists elements in a sequence, and the order of the elements in the request must match. That same order is reflected in the API’s reference documentation, and our client libraries ensure that it is always respected. <li>Correct element ordering is also required for <a href="http://code.google.com/apis/adwords/docs/reportingtopics.html#adhoc">ad-hoc report download</a> requests. <li>The xsi:type attributes in a request will always be checked and the values must use the correct namespace. </ul> <p>This additional XML validation has been <a href="https://groups.google.com/d/msg/adwords-api/9QV6z0OLxwI/LbNoj8QKfuAJ">enabled in the sandbox</a> environment for a year and half, so if your application already works there then this change should be transparent. If you have any questions about this or other aspects of the API, you can reach us on the <a href="http://code.google.com/apis/adwords/community/">developer forum</a> or during <a href="http://code.google.com/apis/adwords/community/officehours.html">office hours</a>.</p> <p><span class="post-author"><a href="https://plus.google.com/u/0/103231502413952116096"><img height="20" src="https://lh4.googleusercontent.com/-qbaZRXjidts/AAAAAAAAAAI/AAAAAAAAABo/HfCK2T4S-14/photo.jpg?sz=20" style="vertical-align:middle; border:none;" width="20"></a> - <a href="https://plus.google.com/u/0/103231502413952116096" rel="author">Eric Koleda</a>, AdWords API Team</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p>You might not realize it if you use our <a href="http://code.google.com/apis/adwords/docs/clientlibraries.html">client libraries</a>, but at its core the AdWords API is based on <a href="http://en.wikipedia.org/wiki/SOAP">SOAP</a> and <a href="http://en.wikipedia.org/wiki/XML">XML</a>. Crafting a request by hand can be tricky, and even some SOAP toolkits have problems serializing to the correct format. In version v201109 of the API we enabled additional XML validation so that you will now be alerted to structural issues with your requests.</p> <p>The format of the request’s XML payload is specified by an <a href="http://en.wikipedia.org/wiki/XML_Schema_(W3C)">XML Schema definition</a> (XSD) embedded in the <a href="http://en.wikipedia.org/wiki/Web_Services_Description_Language">WSDL</a> document for the service. The schema describes very precisely the types and elements that can appear in the request. In past versions of the API the server was somewhat lenient in how it processed the incoming XML. For example, it would silently ignore unknown elements. This had the potential to hide problems with your code or cause mysterious behavior.</p> <p>With enhanced XML validation enabled, the aforementioned errors can be caught earlier, as the request payload must fully match the format in the schema. Below is a sample request and response showing a validation error for an unknown element.</p> <h2>Request</h2> <pre class="prettyprint"> <?xml version="1.0"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header> <RequestHeader xmlns="https://adwords.google.com/api/adwords/cm/v201109"> <applicationToken>...</applicationToken> <authToken>...</authToken> <clientCustomerId>...</clientCustomerId> <developerToken>...</developerToken> <userAgent>...</userAgent> </RequestHeader> </soapenv:Header> <soapenv:Body> <get xmlns="https://adwords.google.com/api/adwords/cm/v201109"> <serviceSelector> <fields>Id</fields> <fields>Name</fields> <ordering> <field>Name</field> </ordering> <strong><foo>bar</foo></strong> </serviceSelector> </get> </soapenv:Body> </soapenv:Envelope> </pre> <h2>Response</h2> <pre class="prettyprint"> <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <soap:Fault> <faultcode>soap:Client</faultcode> <faultstring> Unmarshalling Error: cvc-complex-type.2.4.a: Invalid content was found starting with element 'foo'. One of '{ "https://adwords.google.com/api/adwords/cm/v201109":ordering, "https://adwords.google.com/api/adwords/cm/v201109":paging }' is expected. </faultstring> </soap:Fault> </soap:Body> </soap:Envelope> </pre> <p>In this case the response is indicating that only the elements "ordering" or "paging" are permitted in this part of the request. Please note that this error is thrown as a raw SOAP fault, and is not wrapped in an <a href="http://code.google.com/apis/adwords/docs/reference/latest/CampaignService.ApiError.html">ApiError</a> object. There is no need to add special exception handling for these errors, as they are designed to be detected and resolved during the development phase of your application. If they do occur in your production environment you should log them for later analysis.</p> <p>There are some side effects of using stricter XML validation that you should be aware of:</p> <ul> <li>The order of the elements in the request now matters. The XSD lists elements in a sequence, and the order of the elements in the request must match. That same order is reflected in the API’s reference documentation, and our client libraries ensure that it is always respected. <li>Correct element ordering is also required for <a href="http://code.google.com/apis/adwords/docs/reportingtopics.html#adhoc">ad-hoc report download</a> requests. <li>The xsi:type attributes in a request will always be checked and the values must use the correct namespace. </ul> <p>This additional XML validation has been <a href="https://groups.google.com/d/msg/adwords-api/9QV6z0OLxwI/LbNoj8QKfuAJ">enabled in the sandbox</a> environment for a year and half, so if your application already works there then this change should be transparent. If you have any questions about this or other aspects of the API, you can reach us on the <a href="http://code.google.com/apis/adwords/community/">developer forum</a> or during <a href="http://code.google.com/apis/adwords/community/officehours.html">office hours</a>.</p> <p><span class="post-author"><a href="https://plus.google.com/u/0/103231502413952116096"><img height="20" src="https://lh4.googleusercontent.com/-qbaZRXjidts/AAAAAAAAAAI/AAAAAAAAABo/HfCK2T4S-14/photo.jpg?sz=20" style="vertical-align:middle; border:none;" width="20"></a> - <a href="https://plus.google.com/u/0/103231502413952116096" rel="author">Eric Koleda</a>, AdWords API Team</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Discover AdWords API v201109: XML validation&url=http://ads-developers.googleblog.com/2011/12/discover-adwords-api-v201109-xml.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2011/12/discover-adwords-api-v201109-xml.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2011/12/discover-adwords-api-v201109-xml.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/adwords_api' rel='tag'> adwords_api </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/adwords_v201109' rel='tag'> adwords_v201109 </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/xml' rel='tag'> xml </a> </span> </div> </div> </div> <div class='post' data-id='4718068565030399473' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2011/12/hangout-with-us-adwords-api-office.html' itemprop='url' title='Hangout with us: AdWords API Office Hours in December'> Hangout with us: AdWords API Office Hours in December </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Friday, December 9, 2011 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p>Last month we <a href="http://adwordsapi.blogspot.com/2011/11/hangout-with-us-adwords-api-office.html" target="_blank">provided a new channel</a> for developers to reach us: AdWords API office hours on Google+ Hangouts. Based on positive feedback from participants, we've decided to schedule additional Hangouts.</p> <p>In this next round we are including one more time slot for the European region. Please join us via <a href="//www.google.com/support/plus/bin/static.py?page=guide.cs&guide=1257349" target="_blank">Google+ Hangouts</a> during the following hours:</p> <p><ul> <li>U.S. session: Friday, 16th Dec, 1PM EST / 10AM PST;</li> <li>Europe session: Friday, 16th Dec, 11AM London / 12 PM Frankfurt / 3PM Moscow.</li> </ul></p> <p>These Hangouts have no set agendas, so please come with questions and issues you'd like to discuss, such as, challenges you're having during migration to v201109 or issues while using one of our <a href="http://code.google.com/apis/adwords/docs/clientlibraries.html" target="_blank">client libraries</a>.</p> <p>You can find the up-to-date schedule and how-to-join instructions on our <a href="http://code.google.com/apis/adwords/community/officehours.html" target="_blank">community page</a>. We look forward to talking with you face-to-face, but until then you can reach us on the <a href="http://code.google.com/apis/adwords/community/" target="_blank">AdWords API forum</a> with any comments or questions.</p> <br /> <p><b>Update</b><br/>The AdWords API office hours for European region has started!<br/> </p> <a href="https://plus.google.com/116761214452114671837?rel=author"><img height="20" src="https://lh5.googleusercontent.com/-Hq6rboNwMwM/AAAAAAAAAAI/AAAAAAAAAB8/h6qaLWk4PzE/photo.jpg?sz=20" style="vertical-align:middle; border:none;" width="20" /></a> - <a href="https://plus.google.com/116761214452114671837?rel=author" rel="author">Danial Klimkin</a>, AdWords API Team. <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p>Last month we <a href="http://adwordsapi.blogspot.com/2011/11/hangout-with-us-adwords-api-office.html" target="_blank">provided a new channel</a> for developers to reach us: AdWords API office hours on Google+ Hangouts. Based on positive feedback from participants, we've decided to schedule additional Hangouts.</p> <p>In this next round we are including one more time slot for the European region. Please join us via <a href="//www.google.com/support/plus/bin/static.py?page=guide.cs&guide=1257349" target="_blank">Google+ Hangouts</a> during the following hours:</p> <p><ul> <li>U.S. session: Friday, 16th Dec, 1PM EST / 10AM PST;</li> <li>Europe session: Friday, 16th Dec, 11AM London / 12 PM Frankfurt / 3PM Moscow.</li> </ul></p> <p>These Hangouts have no set agendas, so please come with questions and issues you'd like to discuss, such as, challenges you're having during migration to v201109 or issues while using one of our <a href="http://code.google.com/apis/adwords/docs/clientlibraries.html" target="_blank">client libraries</a>.</p> <p>You can find the up-to-date schedule and how-to-join instructions on our <a href="http://code.google.com/apis/adwords/community/officehours.html" target="_blank">community page</a>. We look forward to talking with you face-to-face, but until then you can reach us on the <a href="http://code.google.com/apis/adwords/community/" target="_blank">AdWords API forum</a> with any comments or questions.</p> <br /> <p><b>Update</b><br/>The AdWords API office hours for European region has started!<br/> </p> <a href="https://plus.google.com/116761214452114671837?rel=author"><img height="20" src="https://lh5.googleusercontent.com/-Hq6rboNwMwM/AAAAAAAAAAI/AAAAAAAAAB8/h6qaLWk4PzE/photo.jpg?sz=20" style="vertical-align:middle; border:none;" width="20" /></a> - <a href="https://plus.google.com/116761214452114671837?rel=author" rel="author">Danial Klimkin</a>, AdWords API Team. <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Hangout with us: AdWords API Office Hours in December&url=http://ads-developers.googleblog.com/2011/12/hangout-with-us-adwords-api-office.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2011/12/hangout-with-us-adwords-api-office.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2011/12/hangout-with-us-adwords-api-office.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/adwords_api' rel='tag'> adwords_api </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/hangout' rel='tag'> hangout </a> </span> </div> </div> </div> <div class='post' data-id='3078253445712191571' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2011/12/incorporating-android-admob-ads-into.html' itemprop='url' title='Incorporating Android AdMob Ads Into A Scrollable View'> Incorporating Android AdMob Ads Into A Scrollable View </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Wednesday, December 7, 2011 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p>The <a href="http://code.google.com/mobile/ads/">Google AdMob SDK</a> makes it easy to serve AdMob ads and monetize your mobile applications. If your app contains a <a href="http://developer.android.com/reference/android/widget/ScrollView.html">ScrollView</a>, the placement of the ad in your layout can be tricky. In this post, we will discuss the best practice for adding AdMob ads to scrollable content.</p> <p>Consider the following XML snippet (XML attributes omitted for brevity):</p> <pre class="prettyprint"> <ScrollView> <LinearLayout> <TextView android:text="Place very long string here..."/> </LinearLayout> </ScrollView> </pre> <p>Let’s say we want to place an ad in this layout. Defining an <a href="http://code.google.com/mobile/ads/docs/android/banner_xml.html">AdView in XML</a> is pretty straightforward with the Google AdMob SDK:</p> <pre class="prettyprint"> <com.google.ads.AdView xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads" android:id="@+id/adView" android:layout_width="wrap_content" android:layout_height="wrap_content" ads:adUnitId="INSERT_YOUR_AD_UNIT_ID_HERE" ads:adSize="BANNER" ads:testDevices="TEST_EMULATOR" ads:loadAdOnCreate="true"/> </pre> <p>Now we have to determine where to insert the <code>AdView</code> in the layout. If we were to insert the <code>AdView</code> inside the <a href="http://developer.android.com/reference/android/widget/LinearLayout.html">LinearLayout</a> after the <a href="http://developer.android.com/reference/android/widget/TextView.html">TextView</a>, the ad would be displayed at the bottom of the <code>ScrollView</code>.</p> <br> <center> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdS5LNDqBde27unxfO9LH6We9-0d4M2eEqGpQitdmhpzLshXwCZVNvDTIT9AiTahQojdlgoFu98XGUY0COWd5XJ1k6bkqO0BvvJXuJfDly_67Eg2mmckY1D3rnhgwcchwx_3oPDTPq1ac/s1600/AdsInsideScrollView.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="303" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdS5LNDqBde27unxfO9LH6We9-0d4M2eEqGpQitdmhpzLshXwCZVNvDTIT9AiTahQojdlgoFu98XGUY0COWd5XJ1k6bkqO0BvvJXuJfDly_67Eg2mmckY1D3rnhgwcchwx_3oPDTPq1ac/s400/AdsInsideScrollView.png" width="400" /></a> </center> <p>This is a poor ad placement from the user's perspective. Depending on the length of the app content, the ad either sits awkwardly somewhere in the middle of the screen or is hidden at the bottom of the <code>ScrollView</code>.</p> <p>To improve the user experience, we can move the ad outside the <code>ScrollView</code> and use a <a href="http://developer.android.com/reference/android/widget/RelativeLayout.html">RelativeLayout</a> to pin the ad to the bottom of the screen. This is the needed XML markup:</p> <pre class="prettyprint"> <?xml version="1.0" encoding="utf-8"?> <<b>RelativeLayout</b> xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ScrollView android:id="@+id/scrollLayout" android:layout_height="fill_parent" android:layout_width="fill_parent" <b>android:layout_above="@+id/adView"</b>> <LinearLayout android:layout_height="fill_parent" android:layout_width="fill_parent"> <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="Place very long string here..."/> </LinearLayout> </ScrollView> <com.google.ads.AdView xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads" android:id="@id/adView" android:layout_width="wrap_content" android:layout_height="wrap_content" <b>android:layout_alignParentBottom="true"</b> ads:adUnitId="INSERT_YOUR_AD_UNIT_ID_HERE" ads:adSize="BANNER" ads:testDevices="TEST_EMULATOR" ads:loadAdOnCreate="true"/> </RelativeLayout> </pre> <p>The <code>layout_alignParentBottom</code> attribute pins the <code>AdView</code> to the bottom of the screen and the <code>android:layout_above</code> attribute sets the <code>ScrollView</code> above the <code>AdView</code>. If the <code>ScrollView</code> is not explicitly set to sit above the <code>AdView</code>, the ad will overlay the bottom of the <code>ScrollView</code>. Let’s see what the final result looks like.</p> <br> <center> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAzSBXPGYVy5h0VamCwwNVc22kwOg8wPNB5YnMQ-wDcgofEt0pNhAJ6KrgZhTa1zPrRRSsAplTww-DyV5T1g5K_stNtxAQKFoltFLbdO0IgsL_RIX_PZF8ryAWga_Rua0nKfbl3LMZ7Y4/s1600/AdsOutsideScrollView.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="303" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAzSBXPGYVy5h0VamCwwNVc22kwOg8wPNB5YnMQ-wDcgofEt0pNhAJ6KrgZhTa1zPrRRSsAplTww-DyV5T1g5K_stNtxAQKFoltFLbdO0IgsL_RIX_PZF8ryAWga_Rua0nKfbl3LMZ7Y4/s400/AdsOutsideScrollView.png" width="400" /></a> </center> <p>This layout looks much cleaner! The ad is displayed at the bottom of the screen and will stay locked to the bottom as we scroll through the app content, providing a more natural user experience.</p> <p>If you have questions about this post or about the AdMob SDK, feel free to ask us in the <a href="https://groups.google.com/forum/#!forum/google-admob-ads-sdk">forum</a> or join us at our upcoming <a href="https://developers.google.com/events/ahNzfmdvb2dsZS1kZXZlbG9wZXJzcg0LEgVFdmVudBicyA8M/">office hours Hangout</a> session. Start monetizing your mobile applications today!</p> <br> <span class="post-author"><a href="https://plus.google.com/112870803958713211515/"><img height="20" src="https://lh4.googleusercontent.com/-VjOdMVF5_qc/AAAAAAAAAAI/AAAAAAAAAB8/aYikCy7pZmw/photo.jpg?sz=20" style="vertical-align:middle; border:none;" width="20"></a> - <a href="https://plus.google.com/112870803958713211515/" rel="author">Eric Leichtenschlag</a>, AdMob Team</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p>The <a href="http://code.google.com/mobile/ads/">Google AdMob SDK</a> makes it easy to serve AdMob ads and monetize your mobile applications. If your app contains a <a href="http://developer.android.com/reference/android/widget/ScrollView.html">ScrollView</a>, the placement of the ad in your layout can be tricky. In this post, we will discuss the best practice for adding AdMob ads to scrollable content.</p> <p>Consider the following XML snippet (XML attributes omitted for brevity):</p> <pre class="prettyprint"> <ScrollView> <LinearLayout> <TextView android:text="Place very long string here..."/> </LinearLayout> </ScrollView> </pre> <p>Let’s say we want to place an ad in this layout. Defining an <a href="http://code.google.com/mobile/ads/docs/android/banner_xml.html">AdView in XML</a> is pretty straightforward with the Google AdMob SDK:</p> <pre class="prettyprint"> <com.google.ads.AdView xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads" android:id="@+id/adView" android:layout_width="wrap_content" android:layout_height="wrap_content" ads:adUnitId="INSERT_YOUR_AD_UNIT_ID_HERE" ads:adSize="BANNER" ads:testDevices="TEST_EMULATOR" ads:loadAdOnCreate="true"/> </pre> <p>Now we have to determine where to insert the <code>AdView</code> in the layout. If we were to insert the <code>AdView</code> inside the <a href="http://developer.android.com/reference/android/widget/LinearLayout.html">LinearLayout</a> after the <a href="http://developer.android.com/reference/android/widget/TextView.html">TextView</a>, the ad would be displayed at the bottom of the <code>ScrollView</code>.</p> <br> <center> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdS5LNDqBde27unxfO9LH6We9-0d4M2eEqGpQitdmhpzLshXwCZVNvDTIT9AiTahQojdlgoFu98XGUY0COWd5XJ1k6bkqO0BvvJXuJfDly_67Eg2mmckY1D3rnhgwcchwx_3oPDTPq1ac/s1600/AdsInsideScrollView.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="303" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdS5LNDqBde27unxfO9LH6We9-0d4M2eEqGpQitdmhpzLshXwCZVNvDTIT9AiTahQojdlgoFu98XGUY0COWd5XJ1k6bkqO0BvvJXuJfDly_67Eg2mmckY1D3rnhgwcchwx_3oPDTPq1ac/s400/AdsInsideScrollView.png" width="400" /></a> </center> <p>This is a poor ad placement from the user's perspective. Depending on the length of the app content, the ad either sits awkwardly somewhere in the middle of the screen or is hidden at the bottom of the <code>ScrollView</code>.</p> <p>To improve the user experience, we can move the ad outside the <code>ScrollView</code> and use a <a href="http://developer.android.com/reference/android/widget/RelativeLayout.html">RelativeLayout</a> to pin the ad to the bottom of the screen. This is the needed XML markup:</p> <pre class="prettyprint"> <?xml version="1.0" encoding="utf-8"?> <<b>RelativeLayout</b> xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ScrollView android:id="@+id/scrollLayout" android:layout_height="fill_parent" android:layout_width="fill_parent" <b>android:layout_above="@+id/adView"</b>> <LinearLayout android:layout_height="fill_parent" android:layout_width="fill_parent"> <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="Place very long string here..."/> </LinearLayout> </ScrollView> <com.google.ads.AdView xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads" android:id="@id/adView" android:layout_width="wrap_content" android:layout_height="wrap_content" <b>android:layout_alignParentBottom="true"</b> ads:adUnitId="INSERT_YOUR_AD_UNIT_ID_HERE" ads:adSize="BANNER" ads:testDevices="TEST_EMULATOR" ads:loadAdOnCreate="true"/> </RelativeLayout> </pre> <p>The <code>layout_alignParentBottom</code> attribute pins the <code>AdView</code> to the bottom of the screen and the <code>android:layout_above</code> attribute sets the <code>ScrollView</code> above the <code>AdView</code>. If the <code>ScrollView</code> is not explicitly set to sit above the <code>AdView</code>, the ad will overlay the bottom of the <code>ScrollView</code>. Let’s see what the final result looks like.</p> <br> <center> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAzSBXPGYVy5h0VamCwwNVc22kwOg8wPNB5YnMQ-wDcgofEt0pNhAJ6KrgZhTa1zPrRRSsAplTww-DyV5T1g5K_stNtxAQKFoltFLbdO0IgsL_RIX_PZF8ryAWga_Rua0nKfbl3LMZ7Y4/s1600/AdsOutsideScrollView.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="303" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAzSBXPGYVy5h0VamCwwNVc22kwOg8wPNB5YnMQ-wDcgofEt0pNhAJ6KrgZhTa1zPrRRSsAplTww-DyV5T1g5K_stNtxAQKFoltFLbdO0IgsL_RIX_PZF8ryAWga_Rua0nKfbl3LMZ7Y4/s400/AdsOutsideScrollView.png" width="400" /></a> </center> <p>This layout looks much cleaner! The ad is displayed at the bottom of the screen and will stay locked to the bottom as we scroll through the app content, providing a more natural user experience.</p> <p>If you have questions about this post or about the AdMob SDK, feel free to ask us in the <a href="https://groups.google.com/forum/#!forum/google-admob-ads-sdk">forum</a> or join us at our upcoming <a href="https://developers.google.com/events/ahNzfmdvb2dsZS1kZXZlbG9wZXJzcg0LEgVFdmVudBicyA8M/">office hours Hangout</a> session. Start monetizing your mobile applications today!</p> <br> <span class="post-author"><a href="https://plus.google.com/112870803958713211515/"><img height="20" src="https://lh4.googleusercontent.com/-VjOdMVF5_qc/AAAAAAAAAAI/AAAAAAAAAB8/aYikCy7pZmw/photo.jpg?sz=20" style="vertical-align:middle; border:none;" width="20"></a> - <a href="https://plus.google.com/112870803958713211515/" rel="author">Eric Leichtenschlag</a>, AdMob Team</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Incorporating Android AdMob Ads Into A Scrollable View&url=http://ads-developers.googleblog.com/2011/12/incorporating-android-admob-ads-into.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2011/12/incorporating-android-admob-ads-into.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2011/12/incorporating-android-admob-ads-into.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/admob_sdk' rel='tag'> admob_sdk </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/admob_v4.3.1' rel='tag'> admob_v4.3.1 </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/android' rel='tag'> android </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/android_layout' rel='tag'> android_layout </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile' rel='tag'> mobile </a> </span> </div> </div> </div> <div class='post' data-id='4946999315833730363' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2011/12/meet-adsense-api-engineer-ben-birt.html' itemprop='url' title='Meet an AdSense API Engineer: Ben Birt'> Meet an AdSense API Engineer: Ben Birt </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Wednesday, December 7, 2011 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <div class="separator" style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvDMbvkv_Cdrkhao1HtiEZVV-3KHaclzvj4wPAsVlmqqmrGQ3iVD6PS-FJHS5a9rANJ1T2TjC9gIUbn2UExY9nBeKPAgLkyDYMSB7GLgLEMCBV0AtdsDAdCya1_608aFVDlkZMuXChJuM/s1600/picture1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvDMbvkv_Cdrkhao1HtiEZVV-3KHaclzvj4wPAsVlmqqmrGQ3iVD6PS-FJHS5a9rANJ1T2TjC9gIUbn2UExY9nBeKPAgLkyDYMSB7GLgLEMCBV0AtdsDAdCya1_608aFVDlkZMuXChJuM/s320/picture1.jpg" width="320" /></a></div><br /> Following the launch of the AdSense Management API in October 2011, we visited our AdSense API Engineers in London to get to know them a bit better. Our guest today is Ben Birt, a Software Engineer who has worked on the AdSense API team since October 2010.<br /> <br /> <b>What’s your main contribution to API development?</b><br /> I write a lot of the code! More seriously, my general concerns are on the reports side of the API, as well as general code design/maintenance.<br /> <br /> <b>Describe your average day at work.</b><br /> An average day usually consists of the usual: reading/answering email, maybe attending a meeting or two, and then the more fun stuff: actually writing code. I usually end up working on two or three code-related tasks at a time, each of which might take me a week or so.<br /> <br /> <b>What do you like most about the AdSense Management API?</b><br /> I’m really happy that for the first time ever, AdSense publishers have access to data that has traditionally been limited to the AdSense website. App developers have in the past been forced to screenscrape AdSense, but now have access to a much more robust method of data access that is safer for the end user (since they don’t have to give up their password), and easier to use for the developer.<br /> <br /> I also really like that because we have built a standard Google API, we get a bunch of integrated tools for free: auto-generated client libraries for just about any language you can name, command-line access to the API (via GoogleCL), and more!<br /> <br /> <b>Tell us one best practice about the API.</b><br /> Being intelligent about the requests you make will save you bandwidth and API quota. Inventory really doesn’t change all that often (especially ad clients), so it’s fine to cache some data for at least a little while.<br /> <br /> You can also use <a href="http://en.wikipedia.org/wiki/HTTP_ETag">ETags</a> to help with this. However, don’t worry about requesting more quota - we fully expect any developer with a moderately successful app/website to need more fairly quickly.<br /> <br /> <div class="separator" style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPHVsfQuFpafxfRdG_se1Ja1jYqvC2CF9ZNW5nJsbB6IKZw2qGixpEm0Fbyv58PQu4peChgae2UBbveP7E_9xbYoS3qvfNQV_AWWA1GLqbXLsV8U5aMsdttgG-ClNj2qcIUVahDU7qkHU/s1600/picture2.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPHVsfQuFpafxfRdG_se1Ja1jYqvC2CF9ZNW5nJsbB6IKZw2qGixpEm0Fbyv58PQu4peChgae2UBbveP7E_9xbYoS3qvfNQV_AWWA1GLqbXLsV8U5aMsdttgG-ClNj2qcIUVahDU7qkHU/s320/picture2.jpg" width="320" /></a></div><br /> <br /> <br /> <b>Ok, now we want to know more about you outside work. Tell us one thing that you like about London.</b><br /> I grew up in the middle of the countryside, so I love the sheer number of things to see, places to eat, and activities to do here. It’s also really easy to get around.<br /> <br /> <b>Let’s talk about hobbies. What book, movie and TV show would you recommend to our users?</b><br /> I’m just going to end up sounding like a sci-fi geek, but here you are:<br /> Book: If you’re into sci-fi, I strongly recommend pretty much anything by Iain M. Banks. I really love his writing style; especially anything set in the “Culture” universe.<br /> Movie: Star Trek (as in the new one). I think it’s a great action-oriented reboot of the franchise with fast pace and excellent cast.<br /> TV show: I really love QI. You might not have heard of it if you’re not British. <br /> It’s a quiz show hosted by Stephen Fry who is one of the funniest and most interesting people on Earth, but it’s not really anything like any other quiz show - the contestants are usually all comedians so every episode is hilarious.<br /> <br /> <b>Mmm, now we want to know how much of a geek you are. Top Games of 2011?</b><br /> These are in no particular order:<br /> The Witcher 2: The makers of this game managed to improve on what was already a near-perfect game in the original Witcher. The game has a really well-thought-out plot - nearly every single task/quest is linked to the main story in some way; it could almost be read like a book. The game also looks gorgeous.<br /> The Elder Scrolls V Skyrim: The game looks amazing, particularly when you’re outside, halfway up a mountain and can see across half of Skyrim! I love the sheer number of things you can do in this world: it’s not all connected up in a (near) single narrative like The Witcher 2; instead you get a massive open world where you can literally do whatever you want.<br /> <br /> <b>Thanks Ben, please go back to code our favorite API!</b><br /> Sorry, I just got Skyrim delivered - I’ll be working from home. ;)<br /> <br /> <p><span style="color: red;">Edit</span>: fixed typo.</p> <br /> <span class="post-author"> <a href="https://plus.google.com/118276561380249048216/about"><img src="https://lh5.googleusercontent.com/-RMp-hn38AZI/AAAAAAAAAAI/AAAAAAAAADE/59YQber32iU/photo.jpg?sz=20" style="vertical-align: middle; border: none;" /></a> - <a href="https://plus.google.com/118276561380249048216/about" rel="author">Silvano Luciani</a>, AdSense API Team</span><br /> <span class="post-author"> <a href="https://plus.google.com/109127609156422653195/about"><img src="https://lh5.googleusercontent.com/-j6Av8wIpB64/AAAAAAAAAAI/AAAAAAAAABc/7UfYxKezUpE/photo.jpg?sz=20" style="vertical-align: middle; border: none;" /></a> - <a href="https://plus.google.com/109127609156422653195/about">Ben Birt</a>, AdSense API Team</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <div class="separator" style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvDMbvkv_Cdrkhao1HtiEZVV-3KHaclzvj4wPAsVlmqqmrGQ3iVD6PS-FJHS5a9rANJ1T2TjC9gIUbn2UExY9nBeKPAgLkyDYMSB7GLgLEMCBV0AtdsDAdCya1_608aFVDlkZMuXChJuM/s1600/picture1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvDMbvkv_Cdrkhao1HtiEZVV-3KHaclzvj4wPAsVlmqqmrGQ3iVD6PS-FJHS5a9rANJ1T2TjC9gIUbn2UExY9nBeKPAgLkyDYMSB7GLgLEMCBV0AtdsDAdCya1_608aFVDlkZMuXChJuM/s320/picture1.jpg" width="320" /></a></div><br /> Following the launch of the AdSense Management API in October 2011, we visited our AdSense API Engineers in London to get to know them a bit better. Our guest today is Ben Birt, a Software Engineer who has worked on the AdSense API team since October 2010.<br /> <br /> <b>What’s your main contribution to API development?</b><br /> I write a lot of the code! More seriously, my general concerns are on the reports side of the API, as well as general code design/maintenance.<br /> <br /> <b>Describe your average day at work.</b><br /> An average day usually consists of the usual: reading/answering email, maybe attending a meeting or two, and then the more fun stuff: actually writing code. I usually end up working on two or three code-related tasks at a time, each of which might take me a week or so.<br /> <br /> <b>What do you like most about the AdSense Management API?</b><br /> I’m really happy that for the first time ever, AdSense publishers have access to data that has traditionally been limited to the AdSense website. App developers have in the past been forced to screenscrape AdSense, but now have access to a much more robust method of data access that is safer for the end user (since they don’t have to give up their password), and easier to use for the developer.<br /> <br /> I also really like that because we have built a standard Google API, we get a bunch of integrated tools for free: auto-generated client libraries for just about any language you can name, command-line access to the API (via GoogleCL), and more!<br /> <br /> <b>Tell us one best practice about the API.</b><br /> Being intelligent about the requests you make will save you bandwidth and API quota. Inventory really doesn’t change all that often (especially ad clients), so it’s fine to cache some data for at least a little while.<br /> <br /> You can also use <a href="http://en.wikipedia.org/wiki/HTTP_ETag">ETags</a> to help with this. However, don’t worry about requesting more quota - we fully expect any developer with a moderately successful app/website to need more fairly quickly.<br /> <br /> <div class="separator" style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPHVsfQuFpafxfRdG_se1Ja1jYqvC2CF9ZNW5nJsbB6IKZw2qGixpEm0Fbyv58PQu4peChgae2UBbveP7E_9xbYoS3qvfNQV_AWWA1GLqbXLsV8U5aMsdttgG-ClNj2qcIUVahDU7qkHU/s1600/picture2.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPHVsfQuFpafxfRdG_se1Ja1jYqvC2CF9ZNW5nJsbB6IKZw2qGixpEm0Fbyv58PQu4peChgae2UBbveP7E_9xbYoS3qvfNQV_AWWA1GLqbXLsV8U5aMsdttgG-ClNj2qcIUVahDU7qkHU/s320/picture2.jpg" width="320" /></a></div><br /> <br /> <br /> <b>Ok, now we want to know more about you outside work. Tell us one thing that you like about London.</b><br /> I grew up in the middle of the countryside, so I love the sheer number of things to see, places to eat, and activities to do here. It’s also really easy to get around.<br /> <br /> <b>Let’s talk about hobbies. What book, movie and TV show would you recommend to our users?</b><br /> I’m just going to end up sounding like a sci-fi geek, but here you are:<br /> Book: If you’re into sci-fi, I strongly recommend pretty much anything by Iain M. Banks. I really love his writing style; especially anything set in the “Culture” universe.<br /> Movie: Star Trek (as in the new one). I think it’s a great action-oriented reboot of the franchise with fast pace and excellent cast.<br /> TV show: I really love QI. You might not have heard of it if you’re not British. <br /> It’s a quiz show hosted by Stephen Fry who is one of the funniest and most interesting people on Earth, but it’s not really anything like any other quiz show - the contestants are usually all comedians so every episode is hilarious.<br /> <br /> <b>Mmm, now we want to know how much of a geek you are. Top Games of 2011?</b><br /> These are in no particular order:<br /> The Witcher 2: The makers of this game managed to improve on what was already a near-perfect game in the original Witcher. The game has a really well-thought-out plot - nearly every single task/quest is linked to the main story in some way; it could almost be read like a book. The game also looks gorgeous.<br /> The Elder Scrolls V Skyrim: The game looks amazing, particularly when you’re outside, halfway up a mountain and can see across half of Skyrim! I love the sheer number of things you can do in this world: it’s not all connected up in a (near) single narrative like The Witcher 2; instead you get a massive open world where you can literally do whatever you want.<br /> <br /> <b>Thanks Ben, please go back to code our favorite API!</b><br /> Sorry, I just got Skyrim delivered - I’ll be working from home. ;)<br /> <br /> <p><span style="color: red;">Edit</span>: fixed typo.</p> <br /> <span class="post-author"> <a href="https://plus.google.com/118276561380249048216/about"><img src="https://lh5.googleusercontent.com/-RMp-hn38AZI/AAAAAAAAAAI/AAAAAAAAADE/59YQber32iU/photo.jpg?sz=20" style="vertical-align: middle; border: none;" /></a> - <a href="https://plus.google.com/118276561380249048216/about" rel="author">Silvano Luciani</a>, AdSense API Team</span><br /> <span class="post-author"> <a href="https://plus.google.com/109127609156422653195/about"><img src="https://lh5.googleusercontent.com/-j6Av8wIpB64/AAAAAAAAAAI/AAAAAAAAABc/7UfYxKezUpE/photo.jpg?sz=20" style="vertical-align: middle; border: none;" /></a> - <a href="https://plus.google.com/109127609156422653195/about">Ben Birt</a>, AdSense API Team</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Meet an AdSense API Engineer: Ben Birt&url=http://ads-developers.googleblog.com/2011/12/meet-adsense-api-engineer-ben-birt.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2011/12/meet-adsense-api-engineer-ben-birt.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2011/12/meet-adsense-api-engineer-ben-birt.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/adsense_api' rel='tag'> adsense_api </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/interview' rel='tag'> interview </a> </span> </div> </div> </div> <div class='post' data-id='7651666165521857984' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2011/12/come-hangout-with-admob-sdk-team.html' itemprop='url' title='Come Hangout With The AdMob SDK Team'> Come Hangout With The AdMob SDK Team </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Tuesday, December 6, 2011 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p>Mobile developers--let’s Hangout! We have been answering your questions on the AdMob <a href="https://groups.google.com/forum/#!forum/google-admob-ads-sdk">forum</a>, but we want to take support to another level. That’s why we are excited to announce our first <a href="//www.google.com/support/plus/bin/static.py?page=guide.cs&guide=1257349">Google+ Hangout</a> Office hours on <a href="https://developers.google.com/events/ahNzfmdvb2dsZS1kZXZlbG9wZXJzcg0LEgVFdmVudBicyA8M/">December 14th at 5pm Eastern (2pm Pacific)</a>. We are looking forward to leveraging this technology to connect with you in a way we haven’t been able to before.</p><br/> <center> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5mrtHEpZV7rGYxW1zrfHiiG6dz8-9aF0tTy6aUDY3CxXSSmgWTc7cYCoUJ0fX8iSdLsKIx8DEkacGLpmNz7CRjvmILkhtSiA1EVM7alsvtNTfsHO0sVUo20x_1_w5KChyphenhyphenBhlOTJl4bng/s1600/AdMobOfficeHours_ScreenShotPng3.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="224" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5mrtHEpZV7rGYxW1zrfHiiG6dz8-9aF0tTy6aUDY3CxXSSmgWTc7cYCoUJ0fX8iSdLsKIx8DEkacGLpmNz7CRjvmILkhtSiA1EVM7alsvtNTfsHO0sVUo20x_1_w5KChyphenhyphenBhlOTJl4bng/s320/AdMobOfficeHours_ScreenShotPng3.png" width="320" /></a> </center> <p>With the recent upgrade to both the Android and iOS SDKs, there should be plenty to discuss. We’ll be on hand to answer any technical questions you may have or take in your feedback. If you’ve got a brain teaser of a question, please add it to this <a href="https://groups.google.com/forum/#!topic/google-admob-ads-sdk/aelYHtVvPpo">forum post</a> ahead of time so we can make sure to get you an answer.</p> <p> You will need 3 things to Hangout with us: <ol> <li>A Google+ account (<a href="https://plus.google.com/">sign up here</a>)</li> <li>The <a href="//www.google.com/tools/dlpage/res/talkvideo/hangouts/">Google voice and video plugin</a> installed on your computer</li> <li>A quiet place to hangout so we can hear you</li> </ol></p> <p>Please let us know if you’re planning on attending by clicking the “I’ll be there” button on our <a href="https://developers.google.com/events/ahNzfmdvb2dsZS1kZXZlbG9wZXJzcg0LEgVFdmVudBicyA8M/">event page</a>. Hangouts are limited to 10 people at a time, so if you can’t get in right away please try again later in the hour. For more information about Hangouts, visit the <a href="//www.google.com/support/plus/bin/static.py?page=guide.cs&guide=1257349">Google+ Help Center</a>. We look forward to seeing you soon, but until then feel free to post any questions you may have in our <a href="https://groups.google.com/forum/#!forum/google-admob-ads-sdk">forum</a>.</p><br/> <span class="post-author"><a href="https://plus.google.com/102708799507737837368/"><img height="20" src="https://lh3.googleusercontent.com/-RonljIAjNbg/AAAAAAAAAAI/AAAAAAAAAps/nM93tw3iYSk/photo.jpg?sz=20" style="border: none; vertical-align: middle;" width="20" /></a> - <a href="https://plus.google.com/102708799507737837368/" rel="author">Raj Parameswaran</a>, AdMob Team</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p>Mobile developers--let’s Hangout! We have been answering your questions on the AdMob <a href="https://groups.google.com/forum/#!forum/google-admob-ads-sdk">forum</a>, but we want to take support to another level. That’s why we are excited to announce our first <a href="//www.google.com/support/plus/bin/static.py?page=guide.cs&guide=1257349">Google+ Hangout</a> Office hours on <a href="https://developers.google.com/events/ahNzfmdvb2dsZS1kZXZlbG9wZXJzcg0LEgVFdmVudBicyA8M/">December 14th at 5pm Eastern (2pm Pacific)</a>. We are looking forward to leveraging this technology to connect with you in a way we haven’t been able to before.</p><br/> <center> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5mrtHEpZV7rGYxW1zrfHiiG6dz8-9aF0tTy6aUDY3CxXSSmgWTc7cYCoUJ0fX8iSdLsKIx8DEkacGLpmNz7CRjvmILkhtSiA1EVM7alsvtNTfsHO0sVUo20x_1_w5KChyphenhyphenBhlOTJl4bng/s1600/AdMobOfficeHours_ScreenShotPng3.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="224" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5mrtHEpZV7rGYxW1zrfHiiG6dz8-9aF0tTy6aUDY3CxXSSmgWTc7cYCoUJ0fX8iSdLsKIx8DEkacGLpmNz7CRjvmILkhtSiA1EVM7alsvtNTfsHO0sVUo20x_1_w5KChyphenhyphenBhlOTJl4bng/s320/AdMobOfficeHours_ScreenShotPng3.png" width="320" /></a> </center> <p>With the recent upgrade to both the Android and iOS SDKs, there should be plenty to discuss. We’ll be on hand to answer any technical questions you may have or take in your feedback. If you’ve got a brain teaser of a question, please add it to this <a href="https://groups.google.com/forum/#!topic/google-admob-ads-sdk/aelYHtVvPpo">forum post</a> ahead of time so we can make sure to get you an answer.</p> <p> You will need 3 things to Hangout with us: <ol> <li>A Google+ account (<a href="https://plus.google.com/">sign up here</a>)</li> <li>The <a href="//www.google.com/tools/dlpage/res/talkvideo/hangouts/">Google voice and video plugin</a> installed on your computer</li> <li>A quiet place to hangout so we can hear you</li> </ol></p> <p>Please let us know if you’re planning on attending by clicking the “I’ll be there” button on our <a href="https://developers.google.com/events/ahNzfmdvb2dsZS1kZXZlbG9wZXJzcg0LEgVFdmVudBicyA8M/">event page</a>. Hangouts are limited to 10 people at a time, so if you can’t get in right away please try again later in the hour. For more information about Hangouts, visit the <a href="//www.google.com/support/plus/bin/static.py?page=guide.cs&guide=1257349">Google+ Help Center</a>. We look forward to seeing you soon, but until then feel free to post any questions you may have in our <a href="https://groups.google.com/forum/#!forum/google-admob-ads-sdk">forum</a>.</p><br/> <span class="post-author"><a href="https://plus.google.com/102708799507737837368/"><img height="20" src="https://lh3.googleusercontent.com/-RonljIAjNbg/AAAAAAAAAAI/AAAAAAAAAps/nM93tw3iYSk/photo.jpg?sz=20" style="border: none; vertical-align: middle;" width="20" /></a> - <a href="https://plus.google.com/102708799507737837368/" rel="author">Raj Parameswaran</a>, AdMob Team</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Come Hangout With The AdMob SDK Team&url=http://ads-developers.googleblog.com/2011/12/come-hangout-with-admob-sdk-team.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2011/12/come-hangout-with-admob-sdk-team.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2011/12/come-hangout-with-admob-sdk-team.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/admob_sdk' rel='tag'> admob_sdk </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/hangout' rel='tag'> hangout </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile' rel='tag'> mobile </a> </span> </div> </div> </div> <div class='post' data-id='2718060154747491266' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2011/12/announcing-adwhirl-v311.html' itemprop='url' title='Announcing AdWhirl v3.1.1'> Announcing AdWhirl v3.1.1 </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Tuesday, December 6, 2011 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p>We’re very pleased to announce the release of <a href="http://www.adwhirl.com/">AdWhirl</a> v3.1.1 for both Android and iOS platforms. This update heralds support for the <a href="http://www.nexage.com/">Nexage</a> ad network and includes refreshed adapters for <a href="http://www.millennialmedia.com/">Millennial Media</a>, <a href="http://www.inmobi.com/">InMobi</a>, and <a href="http://www.admob.com/">AdMob</a>—ensuring support for their latest SDK versions.</p><p>Additionally, we’ve taken the opportunity to fix several bugs, specifically:</p><ul><li>(iOS) Reachability NPE [<a href="http://code.google.com/p/adwhirl/issues/detail?id=118">Issue 118</a>]</li> <li>(iOS) Null dereference error [<a href="http://code.google.com/p/adwhirl/issues/detail?id=179">Issue 179</a>]</li> <li>(Android) Build rules for creating the AdWhirl jar</li> <li>(Android) Fixes for Android 1.5/1.6 crashes [<a href="http://code.google.com/p/adwhirl/issues/detail?id=221">Issue 221</a>]</li> </ul><p>Go ahead and kick the tires; you can find the zips listed on our <a href="http://code.google.com/p/adwhirl/downloads/list">downloads</a> page. As always, holler at us on the <a href="http://groups.google.com/group/adwhirl-users/">forum</a> if you encounter any issues.</p><br /> <span class="post-author"><a href="https://plus.google.com/u/0/100951976559465900344"><img height="20" src="https://lh4.googleusercontent.com/-JJsLfLVCckY/AAAAAAAAAAI/AAAAAAABVog/oL3K4YTTcJA/photo.jpg?sz=20" style="vertical-align:middle; border:none;" width="20"></a> - <a href="https://plus.google.com/u/0/100951976559465900344" rel="author">Wes Goodman</a>, AdMob Team</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p>We’re very pleased to announce the release of <a href="http://www.adwhirl.com/">AdWhirl</a> v3.1.1 for both Android and iOS platforms. This update heralds support for the <a href="http://www.nexage.com/">Nexage</a> ad network and includes refreshed adapters for <a href="http://www.millennialmedia.com/">Millennial Media</a>, <a href="http://www.inmobi.com/">InMobi</a>, and <a href="http://www.admob.com/">AdMob</a>—ensuring support for their latest SDK versions.</p><p>Additionally, we’ve taken the opportunity to fix several bugs, specifically:</p><ul><li>(iOS) Reachability NPE [<a href="http://code.google.com/p/adwhirl/issues/detail?id=118">Issue 118</a>]</li> <li>(iOS) Null dereference error [<a href="http://code.google.com/p/adwhirl/issues/detail?id=179">Issue 179</a>]</li> <li>(Android) Build rules for creating the AdWhirl jar</li> <li>(Android) Fixes for Android 1.5/1.6 crashes [<a href="http://code.google.com/p/adwhirl/issues/detail?id=221">Issue 221</a>]</li> </ul><p>Go ahead and kick the tires; you can find the zips listed on our <a href="http://code.google.com/p/adwhirl/downloads/list">downloads</a> page. As always, holler at us on the <a href="http://groups.google.com/group/adwhirl-users/">forum</a> if you encounter any issues.</p><br /> <span class="post-author"><a href="https://plus.google.com/u/0/100951976559465900344"><img height="20" src="https://lh4.googleusercontent.com/-JJsLfLVCckY/AAAAAAAAAAI/AAAAAAABVog/oL3K4YTTcJA/photo.jpg?sz=20" style="vertical-align:middle; border:none;" width="20"></a> - <a href="https://plus.google.com/u/0/100951976559465900344" rel="author">Wes Goodman</a>, AdMob Team</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Announcing AdWhirl v3.1.1&url=http://ads-developers.googleblog.com/2011/12/announcing-adwhirl-v311.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2011/12/announcing-adwhirl-v311.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2011/12/announcing-adwhirl-v311.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/adwhirl' rel='tag'> adwhirl </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/adwhirl_v3.1.1' rel='tag'> adwhirl_v3.1.1 </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/android' rel='tag'> android </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/iOS' rel='tag'> iOS </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile' rel='tag'> mobile </a> </span> </div> </div> </div> <div class='post' data-id='6777514177082371534' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2011/12/common-questions-on-adsense-apis.html' itemprop='url' title='Common questions on AdSense APIs'> Common questions on AdSense APIs </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Monday, December 5, 2011 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> Over the last few weeks, we’ve identified a list of common questions that some of you’ve been asking. In this post, we'd like to share the answers with all of you.<br /> <h2>AdSense Host API v3</h2><b>- How do I set the AdSense login email and the AdSense login password of <a href="http://code.google.com/apis/adsense/host/developer/index.html#adsense_api_intro_terminology">the application developer</a> for a request to the API?</b><br /> <br /> All requests sent to the AdSense Host API Web Services must include the following header elements:<br /> <ul><li><a href="http://code.google.com/apis/adsense/host/developer/index.html#adsense_api_intro_request">developer_email</a> - the developer’s AdSense login email.</li> <li><a href="http://code.google.com/apis/adsense/host/developer/index.html#adsense_api_intro_request">developer_password</a> - the developer’s AdSense login password.</li> </ul><a href="http://code.google.com/apis/adsense/host/developer/adsense_api_samples.html">Check our code examples</a> to see how to include the headers for different languages and different types of requests.<br /> <br /> <b>- How do I handle the account confirmation email when I’m developing against the API Sandbox?</b><br /> <br /> The <a href="http://code.google.com/apis/adsense/host/developer/adsense_api_sandbox.html">AdSense Host API Sandbox</a> is a replica of the production API services but with some additional support that helps developers test and debug their applications.<br /> <br /> The production web services require that when a developer creates an account for a publisher, that publisher receives an email which asks them to go to a web page to perform various actions.<br /> <br /> The Sandbox sends the email request to you, the developer (instead of the publisher), which lets you see the messages the publisher would have seen. However, the verification link in that email will not work, because the Sandbox doesn't have a replica of the <a href="//www.google.com/adsense">AdSense website</a> to which to take the publisher. <br /> <br /> When developing against the Sandbox you can use the following special request headers to include zip, phone and approval settings that are normally requested of the publisher by email:<br /> <ul><li><a href="http://code.google.com/apis/adsense/host/developer/adsense_api_sandbox.html#requestheader">debug_association_type</a> - the state of the association between the developer and publisher</li> <li><a href="http://code.google.com/apis/adsense/host/developer/adsense_api_sandbox.html#requestheader">debug_zip</a> - the publisher's zip code</li> <li><a href="http://code.google.com/apis/adsense/host/developer/adsense_api_sandbox.html#requestheader">debug_phone</a> - the publisher's phone number</li> </ul><h2>AdSense Management API</h2><b>- How do I check the API usage statistics for my project?</b><br /> <br /> You can check the usage statistics for a project in the <a href="https://code.google.com/apis/console">API console</a> under the "Reports" tab:<br /> <br /> <div class="separator" style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3xqluwfqUd6V4n0rmpXjAO8s7hyphenhyphenlQntimbqXOVXrHitSbwo0jn2iu3ihl8vgasvF4K2_JAFHC-5Ls3huNa7gNndZLJ0hbZdQ8NbD88DncInd2lk6_JLV6-K0b1fMQGlsNLxJYIdbz3M0/s1600/graph.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="160" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3xqluwfqUd6V4n0rmpXjAO8s7hyphenhyphenlQntimbqXOVXrHitSbwo0jn2iu3ihl8vgasvF4K2_JAFHC-5Ls3huNa7gNndZLJ0hbZdQ8NbD88DncInd2lk6_JLV6-K0b1fMQGlsNLxJYIdbz3M0/s400/graph.png" width="400" /></a></div><br /> <br /> If the current usage is approaching the 10k daily limit, or you estimate that future usage will exceed it, you may request additional quota via the "Quotas" tab in the API console.<br /> <br /> If you have any additional questions on these topics, please post <a href="http://groups.google.com/group/adsense-api">on our forum</a> or join one of our upcoming <a href="https://developers.google.com/events/">AdSense APIs Office Hours Hangouts</a>.<br /> <br /> <span class="post-author"> <a href="https://plus.google.com/118276561380249048216/about"><img src="https://lh5.googleusercontent.com/-RMp-hn38AZI/AAAAAAAAAAI/AAAAAAAAADE/59YQber32iU/photo.jpg?sz=20" style="border: none; vertical-align: middle;" /></a> - <a href="https://plus.google.com/118276561380249048216/about" rel="author">Silvano Luciani</a>, AdSense API Team</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> Over the last few weeks, we’ve identified a list of common questions that some of you’ve been asking. In this post, we'd like to share the answers with all of you.<br /> <h2>AdSense Host API v3</h2><b>- How do I set the AdSense login email and the AdSense login password of <a href="http://code.google.com/apis/adsense/host/developer/index.html#adsense_api_intro_terminology">the application developer</a> for a request to the API?</b><br /> <br /> All requests sent to the AdSense Host API Web Services must include the following header elements:<br /> <ul><li><a href="http://code.google.com/apis/adsense/host/developer/index.html#adsense_api_intro_request">developer_email</a> - the developer’s AdSense login email.</li> <li><a href="http://code.google.com/apis/adsense/host/developer/index.html#adsense_api_intro_request">developer_password</a> - the developer’s AdSense login password.</li> </ul><a href="http://code.google.com/apis/adsense/host/developer/adsense_api_samples.html">Check our code examples</a> to see how to include the headers for different languages and different types of requests.<br /> <br /> <b>- How do I handle the account confirmation email when I’m developing against the API Sandbox?</b><br /> <br /> The <a href="http://code.google.com/apis/adsense/host/developer/adsense_api_sandbox.html">AdSense Host API Sandbox</a> is a replica of the production API services but with some additional support that helps developers test and debug their applications.<br /> <br /> The production web services require that when a developer creates an account for a publisher, that publisher receives an email which asks them to go to a web page to perform various actions.<br /> <br /> The Sandbox sends the email request to you, the developer (instead of the publisher), which lets you see the messages the publisher would have seen. However, the verification link in that email will not work, because the Sandbox doesn't have a replica of the <a href="//www.google.com/adsense">AdSense website</a> to which to take the publisher. <br /> <br /> When developing against the Sandbox you can use the following special request headers to include zip, phone and approval settings that are normally requested of the publisher by email:<br /> <ul><li><a href="http://code.google.com/apis/adsense/host/developer/adsense_api_sandbox.html#requestheader">debug_association_type</a> - the state of the association between the developer and publisher</li> <li><a href="http://code.google.com/apis/adsense/host/developer/adsense_api_sandbox.html#requestheader">debug_zip</a> - the publisher's zip code</li> <li><a href="http://code.google.com/apis/adsense/host/developer/adsense_api_sandbox.html#requestheader">debug_phone</a> - the publisher's phone number</li> </ul><h2>AdSense Management API</h2><b>- How do I check the API usage statistics for my project?</b><br /> <br /> You can check the usage statistics for a project in the <a href="https://code.google.com/apis/console">API console</a> under the "Reports" tab:<br /> <br /> <div class="separator" style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3xqluwfqUd6V4n0rmpXjAO8s7hyphenhyphenlQntimbqXOVXrHitSbwo0jn2iu3ihl8vgasvF4K2_JAFHC-5Ls3huNa7gNndZLJ0hbZdQ8NbD88DncInd2lk6_JLV6-K0b1fMQGlsNLxJYIdbz3M0/s1600/graph.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="160" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3xqluwfqUd6V4n0rmpXjAO8s7hyphenhyphenlQntimbqXOVXrHitSbwo0jn2iu3ihl8vgasvF4K2_JAFHC-5Ls3huNa7gNndZLJ0hbZdQ8NbD88DncInd2lk6_JLV6-K0b1fMQGlsNLxJYIdbz3M0/s400/graph.png" width="400" /></a></div><br /> <br /> If the current usage is approaching the 10k daily limit, or you estimate that future usage will exceed it, you may request additional quota via the "Quotas" tab in the API console.<br /> <br /> If you have any additional questions on these topics, please post <a href="http://groups.google.com/group/adsense-api">on our forum</a> or join one of our upcoming <a href="https://developers.google.com/events/">AdSense APIs Office Hours Hangouts</a>.<br /> <br /> <span class="post-author"> <a href="https://plus.google.com/118276561380249048216/about"><img src="https://lh5.googleusercontent.com/-RMp-hn38AZI/AAAAAAAAAAI/AAAAAAAAADE/59YQber32iU/photo.jpg?sz=20" style="border: none; vertical-align: middle;" /></a> - <a href="https://plus.google.com/118276561380249048216/about" rel="author">Silvano Luciani</a>, AdSense API Team</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Common questions on AdSense APIs&url=http://ads-developers.googleblog.com/2011/12/common-questions-on-adsense-apis.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2011/12/common-questions-on-adsense-apis.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2011/12/common-questions-on-adsense-apis.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/adsense_api' rel='tag'> adsense_api </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/adsense_host_api_v3' rel='tag'> adsense_host_api_v3 </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/adsense_management_api_v1' rel='tag'> adsense_management_api_v1 </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/common_questions' rel='tag'> common_questions </a> </span> </div> </div> </div> <div class='post' data-id='7423035692527418498' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2011/12/discover-dfp-api-v201111-mobile.html' itemprop='url' title='Discover DFP API v201111: Mobile Targeting'> Discover DFP API v201111: Mobile Targeting </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Friday, December 2, 2011 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> In the <a href="http://googleadsdeveloper.blogspot.com/2011/11/announcing-version-v201111-of-dfp-api.html">v201111 release</a> of the DoubleClick for Publishers (DFP) API, we're bringing you the ability to target your ad units and line items specifically for the mobile platform. The following walk-through based on the <a href="http://code.google.com/p/google-api-dfp-java/source/browse/trunk/examples/v201111/lineitemservice/CreateMobileLineItemExample.java">CreateMobileLineItem example</a> of the <a href="http://code.google.com/apis/dfp/docs/clients.html">client libraries</a> describes how to create mobile-targeted line items.<br /> <br /> <b>Set your Target Platform</b><br /> <br /> The first step is to set the new attribute <a href="http://code.google.com/apis/dfp/docs/reference/v201111/LineItemService.LineItem.html#targetPlatform">targetPlatform</a> to MOBILE to specify that the line item is targeted towards mobile platforms rather than the default web browser platform. Please note that the target platform attribute has also been added to ad units and that <a href="http://code.google.com/apis/dfp/docs/reference/v201111/InventoryService.AdUnit.html#targetPlatform">attribute</a> needs to be set to MOBILE as well for the targeting to work.<br /> <br /> <b>Set your Targeting</b><br /> <br /> We've introduced four mobile targeting options to enable you to target the right platform: <br /> <ol start="1"><li><a href="http://code.google.com/apis/dfp/docs/reference/v201111/LineItemService.TechnologyTargeting.html#deviceManufacturerTargeting">device manufacturer</a></li> <li><a href="http://code.google.com/apis/dfp/docs/reference/v201111/LineItemService.TechnologyTargeting.html#mobileCarrierTargeting">mobile carrier</a></li> <li><a href="http://code.google.com/apis/dfp/docs/reference/v201111/LineItemService.TechnologyTargeting.html#mobileDeviceTargeting">mobile device</a></li> <li><a href="http://code.google.com/apis/dfp/docs/reference/v201111/LineItemService.TechnologyTargeting.html#mobileDeviceSubmodelTargeting">mobile device submodel</a></li> </ol><br /> Here is how you set up your targeting to target just Google devices:<br /> <pre class="prettyprint">Technology manufacturer = new Technology(); // The ID for the Google device manufacturer was fetched from the // Device_Manufacturer PQL table. manufacturer.setId(40100L); DeviceManufacturerTargeting manufacturerTargeting = new DeviceManufacturerTargeting(); manufacturerTargeting.setDeviceManufacturers( new Technology[] {manufacturer}); manufacturerTargeting.setIsTargeted(true); TechnologyTargeting technologyTargeting = new TechnologyTargeting(); technologyTargeting.setDeviceManufacturerTargeting( manufacturerTargeting); Targeting targeting = new Targeting(); targeting.setTechnologyTargeting(technologyTargeting); LineItem lineItem = new LineItem(); lineItem.setTargeting(targeting); </pre><br /> That's it! Your line item is now set to target just Google devices.<br /> <br /> For <a href="http://code.google.com/apis/dfp/docs/reference/v201111/LineItemService.MobileDeviceTargeting.html">mobile device targeting</a>, you can specify two lists of devices: one that is targeted and one that is excluded. This allows you to target a device manufacturer but exclude certain devices within that family. However, if a device is part of a device targeting inclusion list, another device from the same manufacturer cannot be in the exclusion list. For example, putting the Nexus S in the inclusion list and the Nexus One in the exclusion list will result in the following targeting error: <br /> <br /> <a href="http://code.google.com/apis/dfp/docs/reference/v201111/LineItemService.GenericTargetingError.Reason.html">GenericTargetingError.CONFLICTING_INCLUSION_OR_EXCLUSION_OF_SIBLINGS @ targeting.deviceFamilyTargeting</a><br /> <br /> Instead, we recommend targeting the Google device manufacturer and excluding the Nexus One with the device exclusion list.<br /> <br /> As always, we value your feedback, so feel free to leave your questions or comments on our <a href="http://code.google.com/apis/dfp/forum/discussions.html">forum</a> or join us at one of our upcoming developer Hangouts.<br /> <br /> <span class="post-author"><a href="https://plus.google.com/u/0/115474229489284556707"><img height="20" src="https://lh3.googleusercontent.com/-pDdv2kTjyNw/AAAAAAAAAAI/AAAAAAAAAnE/q_kK4BYy-mM/photo.jpg?sz=20" style="border: none; vertical-align: middle;" width="20" /></a> - <a href="https://plus.google.com/u/0/115474229489284556707" rel="author">Jeffrey Sham</a>, DFP API Team</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> In the <a href="http://googleadsdeveloper.blogspot.com/2011/11/announcing-version-v201111-of-dfp-api.html">v201111 release</a> of the DoubleClick for Publishers (DFP) API, we're bringing you the ability to target your ad units and line items specifically for the mobile platform. The following walk-through based on the <a href="http://code.google.com/p/google-api-dfp-java/source/browse/trunk/examples/v201111/lineitemservice/CreateMobileLineItemExample.java">CreateMobileLineItem example</a> of the <a href="http://code.google.com/apis/dfp/docs/clients.html">client libraries</a> describes how to create mobile-targeted line items.<br /> <br /> <b>Set your Target Platform</b><br /> <br /> The first step is to set the new attribute <a href="http://code.google.com/apis/dfp/docs/reference/v201111/LineItemService.LineItem.html#targetPlatform">targetPlatform</a> to MOBILE to specify that the line item is targeted towards mobile platforms rather than the default web browser platform. Please note that the target platform attribute has also been added to ad units and that <a href="http://code.google.com/apis/dfp/docs/reference/v201111/InventoryService.AdUnit.html#targetPlatform">attribute</a> needs to be set to MOBILE as well for the targeting to work.<br /> <br /> <b>Set your Targeting</b><br /> <br /> We've introduced four mobile targeting options to enable you to target the right platform: <br /> <ol start="1"><li><a href="http://code.google.com/apis/dfp/docs/reference/v201111/LineItemService.TechnologyTargeting.html#deviceManufacturerTargeting">device manufacturer</a></li> <li><a href="http://code.google.com/apis/dfp/docs/reference/v201111/LineItemService.TechnologyTargeting.html#mobileCarrierTargeting">mobile carrier</a></li> <li><a href="http://code.google.com/apis/dfp/docs/reference/v201111/LineItemService.TechnologyTargeting.html#mobileDeviceTargeting">mobile device</a></li> <li><a href="http://code.google.com/apis/dfp/docs/reference/v201111/LineItemService.TechnologyTargeting.html#mobileDeviceSubmodelTargeting">mobile device submodel</a></li> </ol><br /> Here is how you set up your targeting to target just Google devices:<br /> <pre class="prettyprint">Technology manufacturer = new Technology(); // The ID for the Google device manufacturer was fetched from the // Device_Manufacturer PQL table. manufacturer.setId(40100L); DeviceManufacturerTargeting manufacturerTargeting = new DeviceManufacturerTargeting(); manufacturerTargeting.setDeviceManufacturers( new Technology[] {manufacturer}); manufacturerTargeting.setIsTargeted(true); TechnologyTargeting technologyTargeting = new TechnologyTargeting(); technologyTargeting.setDeviceManufacturerTargeting( manufacturerTargeting); Targeting targeting = new Targeting(); targeting.setTechnologyTargeting(technologyTargeting); LineItem lineItem = new LineItem(); lineItem.setTargeting(targeting); </pre><br /> That's it! Your line item is now set to target just Google devices.<br /> <br /> For <a href="http://code.google.com/apis/dfp/docs/reference/v201111/LineItemService.MobileDeviceTargeting.html">mobile device targeting</a>, you can specify two lists of devices: one that is targeted and one that is excluded. This allows you to target a device manufacturer but exclude certain devices within that family. However, if a device is part of a device targeting inclusion list, another device from the same manufacturer cannot be in the exclusion list. For example, putting the Nexus S in the inclusion list and the Nexus One in the exclusion list will result in the following targeting error: <br /> <br /> <a href="http://code.google.com/apis/dfp/docs/reference/v201111/LineItemService.GenericTargetingError.Reason.html">GenericTargetingError.CONFLICTING_INCLUSION_OR_EXCLUSION_OF_SIBLINGS @ targeting.deviceFamilyTargeting</a><br /> <br /> Instead, we recommend targeting the Google device manufacturer and excluding the Nexus One with the device exclusion list.<br /> <br /> As always, we value your feedback, so feel free to leave your questions or comments on our <a href="http://code.google.com/apis/dfp/forum/discussions.html">forum</a> or join us at one of our upcoming developer Hangouts.<br /> <br /> <span class="post-author"><a href="https://plus.google.com/u/0/115474229489284556707"><img height="20" src="https://lh3.googleusercontent.com/-pDdv2kTjyNw/AAAAAAAAAAI/AAAAAAAAAnE/q_kK4BYy-mM/photo.jpg?sz=20" style="border: none; vertical-align: middle;" width="20" /></a> - <a href="https://plus.google.com/u/0/115474229489284556707" rel="author">Jeffrey Sham</a>, DFP API Team</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Discover DFP API v201111: Mobile Targeting&url=http://ads-developers.googleblog.com/2011/12/discover-dfp-api-v201111-mobile.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2011/12/discover-dfp-api-v201111-mobile.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2011/12/discover-dfp-api-v201111-mobile.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/dfp_api' rel='tag'> dfp_api </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/dfp_v201111' rel='tag'> dfp_v201111 </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile' rel='tag'> mobile </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile_targeting' rel='tag'> mobile_targeting </a> </span> </div> </div> </div> <div class='blog-pager' id='blog-pager'> <a class='home-link' href='http://ads-developers.googleblog.com/'> <i class='material-icons'>  </i> </a> <span id='blog-pager-newer-link'> <a class='blog-pager-newer-link' href='http://ads-developers.googleblog.com/search?updated-max=2012-01-11T14:11:00-08:00&max-results=7&reverse-paginate=true' id='Blog1_blog-pager-newer-link' title='Newer Posts'> <i class='material-icons'>  </i> </a> </span> <span id='blog-pager-older-link'> <a class='blog-pager-older-link' href='http://ads-developers.googleblog.com/search?updated-max=2011-12-02T11:45:00-08:00&max-results=7' id='Blog1_blog-pager-older-link' title='Older Posts'> <i class='material-icons'>  </i> </a> </span> </div> <div class='clear'></div> </div></div> </div> </div> <div class='col-right'> <div class='section' id='sidebar-top'><div class='widget HTML' data-version='1' id='HTML8'> <div class='widget-content'> <div class='searchBox'> <input type='text' title='Search This Blog' placeholder='Search blog ...' /> </div> </div> <div class='clear'></div> </div></div> <div id='aside'> <div class='section' id='sidebar'><div class='widget Label' data-version='1' id='Label1'> <div class='tab'> <img class='sidebar-icon' src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAYpJREFUeNrs2aFuwzAQBmAvKRkMKRjZA4QMDJaWFgyMjuzFRg37DIUlA3uFkoGQSaWzJU+tpri5O9+l/zSfdFJlpe59yTmyVedq1PjfcZMZ70NuQnaF8w8htyE/rABtpviXkLcK88c5HhLkMBfgVan43zfFBNGMjHVGT/s55KP2pAvidbGHd+nzKt1RKSLG3rKF1iPFv6UWiPke8i7kEqGdGsI1O+LYVdqJAjgirwkKYD0ytkJBUNbAMvX8V3q9PhUsYvU1sWD8SO/sQvx2ahxOiNoJCSBCoAHYCEQAC4EKICOQASQEOmAS8RcAFxFN5hiIiugpgC3wk9hQAHH/70EBHXUN7IER5EWMiBgo2+nzOKQv9SCAeEM/OQAkhE/ncccFICB87qzQMia5FsJfOui0zMnmRvipU1ormHQuxGTxUsAcCFLxJQBLBLn4UoAFglW8BkATwS5eC6CBEBWvCShBiIvXBkgQRcVbADiI4uKtABSESvGWgB9EzHt3+tNwyO0qa9SoIYtvAQYAqDJhaWWeMecAAAAASUVORK5CYII='/> <h2> Labels </h2> <i class='material-icons arrow'>  </i> </div> <div class='widget-content list-label-widget-content'> <ul> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/account_management'> account_management </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_clicks'> ad_clicks </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_customizers'> ad_customizers </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_exchange'> ad_exchange </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_exchange_buyer'> ad_exchange_buyer </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_exchange_optimization-series'> ad_exchange_optimization-series </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_exchange_rest'> ad_exchange_rest </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_exchange_rtb'> ad_exchange_rtb </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_exchange_seller'> ad_exchange_seller </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_exchange_soap'> ad_exchange_soap </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_extensions'> ad_extensions </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_inspector'> ad_inspector </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager'> ad_manager </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api'> ad_manager_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v201805'> ad_manager_api_v201805 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v201808'> ad_manager_api_v201808 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v201811'> ad_manager_api_v201811 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v201902'> ad_manager_api_v201902 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v201905'> ad_manager_api_v201905 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v201908'> ad_manager_api_v201908 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v201911'> ad_manager_api_v201911 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202002'> ad_manager_api_v202002 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202005'> ad_manager_api_v202005 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202008'> ad_manager_api_v202008 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202011'> ad_manager_api_v202011 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202102'> ad_manager_api_v202102 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202105'> ad_manager_api_v202105 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202108'> ad_manager_api_v202108 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202111'> ad_manager_api_v202111 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202202'> ad_manager_api_v202202 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202205'> ad_manager_api_v202205 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202208'> ad_manager_api_v202208 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202211'> ad_manager_api_v202211 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202302'> ad_manager_api_v202302 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202305'> ad_manager_api_v202305 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202308'> ad_manager_api_v202308 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202311'> ad_manager_api_v202311 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202402'> ad_manager_api_v202402 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202405'> ad_manager_api_v202405 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202408'> ad_manager_api_v202408 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202411'> ad_manager_api_v202411 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_param'> ad_param </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_speed'> ad_speed </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adexchangebuyer'> adexchangebuyer </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/AdGroup'> AdGroup </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/AdGroupAd'> AdGroupAd </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/admanager_api'> admanager_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/admob'> admob </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/admob_api'> admob_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/admob_api_v1'> admob_api_v1 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/admob_mediation'> admob_mediation </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/admob_sdk'> admob_sdk </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/admob_v4.3.1'> admob_v4.3.1 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/admob_v5.0.5'> admob_v5.0.5 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/admob_v6.0.1'> admob_v6.0.1 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ads'> ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adsense'> adsense </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adsense_api'> adsense_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adsense_host_api'> adsense_host_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adsense_host_api_v3'> adsense_host_api_v3 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adsense_management_api'> adsense_management_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adsense_management_api_v1'> adsense_management_api_v1 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adsense_management_api_v1.1'> adsense_management_api_v1.1 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adsense_management_api_v1.2'> adsense_management_api_v1.2 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adsense_management_api_v1.3'> adsense_management_api_v1.3 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adsense_management_api_v1.4'> adsense_management_api_v1.4 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/advanced_apis'> advanced_apis </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwhirl'> adwhirl </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwhirl_v3.1.1'> adwhirl_v3.1.1 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords'> adwords </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/AdWords%20Scripts'> AdWords Scripts </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_AdGroupCriterionService'> adwords_AdGroupCriterionService </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api'> adwords_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201302'> adwords_api_v201302 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201306'> adwords_api_v201306 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201309'> adwords_api_v201309 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201402'> adwords_api_v201402 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201406'> adwords_api_v201406 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201409'> adwords_api_v201409 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201502'> adwords_api_v201502 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201506'> adwords_api_v201506 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201509'> adwords_api_v201509 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201601'> adwords_api_v201601 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201603'> adwords_api_v201603 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201605'> adwords_api_v201605 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201607'> adwords_api_v201607 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201609'> adwords_api_v201609 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201702'> adwords_api_v201702 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201705'> adwords_api_v201705 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201708'> adwords_api_v201708 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201710'> adwords_api_v201710 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201802'> adwords_api_v201802 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201806'> adwords_api_v201806 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201809'> adwords_api_v201809 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_workshops'> adwords_api_workshops </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_BatchJobService'> adwords_BatchJobService </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_CampaignService'> adwords_CampaignService </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_CreateAccountService'> adwords_CreateAccountService </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_for_video'> adwords_for_video </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_ManagedCustomerService'> adwords_ManagedCustomerService </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_MutateJobService'> adwords_MutateJobService </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_ReportDefinitionService'> adwords_ReportDefinitionService </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_scripts'> adwords_scripts </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_v201109'> adwords_v201109 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_v201206'> adwords_v201206 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_v201209'> adwords_v201209 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_v201302'> adwords_v201302 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_v201306'> adwords_v201306 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_v201309'> adwords_v201309 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_v201601'> adwords_v201601 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_v201605'> adwords_v201605 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_v201607'> adwords_v201607 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_v201609'> adwords_v201609 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_v201702'> adwords_v201702 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_v201802'> adwords_v201802 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_v201806'> adwords_v201806 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_v201809'> adwords_v201809 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/alerting'> alerting </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/amp'> amp </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/analytics'> analytics </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/analyticsapi'> analyticsapi </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/android'> android </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/android_layout'> android_layout </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/animation'> animation </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/announcement'> announcement </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/annual%20developer%20survey'> annual developer survey </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/api'> api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/app_engine'> app_engine </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/asset_group'> asset_group </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/asset_group_listing_group_filter'> asset_group_listing_group_filter </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/asset_group_signal'> asset_group_signal </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/assets'> assets </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/attribution_reporting_api'> attribution_reporting_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/audiences'> audiences </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/authentication'> authentication </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/authorization'> authorization </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/authorized_buyer'> authorized_buyer </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/authorized_buyers'> authorized_buyers </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/aw_reporting'> aw_reporting </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/awql'> awql </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/batch_processing'> batch_processing </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/beacon_api'> beacon_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/best_practices'> best_practices </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/beta'> beta </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/bid_manager_api'> bid_manager_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/bid_modifiers'> bid_modifiers </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/bidding'> bidding </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/billing'> billing </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/brand%20guidelines'> brand guidelines </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/brand_guidelines'> brand_guidelines </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/budget_order_service'> budget_order_service </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/budgets'> budgets </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/builders'> builders </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/bulk_upload'> bulk_upload </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/c%23'> c# </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/caf_sdk'> caf_sdk </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/call_extensions'> call_extensions </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/call_metrics'> call_metrics </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/call_only'> call_only </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/call_tracking'> call_tracking </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/call-only'> call-only </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/callout_extensions'> callout_extensions </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/campaign'> campaign </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/CampaignCriterion'> CampaignCriterion </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/case_study'> case_study </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/cast'> cast </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/certificates'> certificates </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/certification'> certification </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/chart_tools'> chart_tools </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/chrome'> chrome </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/chromecast'> chromecast </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/click'> click </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/click_tracking'> click_tracking </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/click_type'> click_type </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/click-to-download'> click-to-download </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/clicks'> clicks </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/client_libraries'> client_libraries </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/client_library'> client_library </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/cm360'> cm360 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/code_examples'> code_examples </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/common_questions'> common_questions </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/conference'> conference </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/content'> content </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/content_api'> content_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/conversion'> conversion </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/conversions'> conversions </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ConversionTrackerService'> ConversionTrackerService </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/converted_clicks'> converted_clicks </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/creative_platforms'> creative_platforms </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/creatives'> creatives </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/custom_fields'> custom_fields </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/customer_match'> customer_match </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/DAI'> DAI </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dart'> dart </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dbm_api'> dbm_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/debugging'> debugging </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/decorators'> decorators </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/deprecation'> deprecation </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/developer'> developer </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfa_ad_service'> dfa_ad_service </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfa_api'> dfa_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfa_api_v118'> dfa_api_v118 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfa_creative_service'> dfa_creative_service </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfa_reporting_api'> dfa_reporting_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfa_site_service'> dfa_site_service </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfa_v1.16'> dfa_v1.16 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfa_v1.17'> dfa_v1.17 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfa_v1.18'> dfa_v1.18 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfa_v1.19'> dfa_v1.19 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfa_v1.20'> dfa_v1.20 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp'> dfp </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_api'> dfp_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_appengine'> dfp_appengine </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_creatives'> dfp_creatives </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_inventory'> dfp_inventory </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_mobile'> dfp_mobile </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_pql'> dfp_pql </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_reports'> dfp_reports </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_sales'> dfp_sales </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_teams'> dfp_teams </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_v201111'> dfp_v201111 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_v201201'> dfp_v201201 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_v201203'> dfp_v201203 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_v201204'> dfp_v201204 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_v201206'> dfp_v201206 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_v201208'> dfp_v201208 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_v201211'> dfp_v201211 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_v201302'> dfp_v201302 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_v201308'> dfp_v201308 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_v201608'> dfp_v201608 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_v201711'> dfp_v201711 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/display'> display </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/display_network'> display_network </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/display_select'> display_select </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/display_smart_campaign'> display_smart_campaign </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/docs'> docs </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dotnet'> dotnet </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/doubleclick'> doubleclick </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/DoubleClick_Rich_Media'> DoubleClick_Rich_Media </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/doubleclick_studio'> doubleclick_studio </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/drafts'> drafts </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dsa'> dsa </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dv360'> dv360 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dv360_api'> dv360_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dynamic_creative'> dynamic_creative </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/enhanced_campaigns'> enhanced_campaigns </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/entity_read_files'> entity_read_files </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/erf'> erf </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/error%20handling'> error handling </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/eta'> eta </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/examples'> examples </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/excluded_placement_lists'> excluded_placement_lists </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/exoplayer'> exoplayer </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/expanded_text_ads'> expanded_text_ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/experiment'> experiment </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/experiments'> experiments </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/faq'> faq </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/feedback'> feedback </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/feeds'> feeds </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/firebase'> firebase </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/flash'> flash </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/flash_sdk'> flash_sdk </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/floc'> floc </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/flutter'> flutter </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/forecast_service'> forecast_service </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/games'> games </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/gaql'> gaql </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/gclid'> gclid </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/gdc'> gdc </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/gdl'> gdl </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/geo_targets'> geo_targets </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/geotargeting'> geotargeting </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/gmail_ads'> gmail_ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/gmail_image_ads'> gmail_image_ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/gmail_multi_product_ads'> gmail_multi_product_ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/gmail_single_promotion_ads'> gmail_single_promotion_ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/GMF'> GMF </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/gmp'> gmp </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/golang'> golang </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads'> google_ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api'> google_ads_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_migration_workshop'> google_ads_api_migration_workshop </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v0'> google_ads_api_v0 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v0_1'> google_ads_api_v0_1 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v0_3'> google_ads_api_v0_3 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v0_4'> google_ads_api_v0_4 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v0_5'> google_ads_api_v0_5 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v0_6'> google_ads_api_v0_6 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v0_7'> google_ads_api_v0_7 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v1_0'> google_ads_api_v1_0 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v1_1'> google_ads_api_v1_1 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v1_2'> google_ads_api_v1_2 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v1_3'> google_ads_api_v1_3 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v2_1'> google_ads_api_v2_1 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v3_0'> google_ads_api_v3_0 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v3_1'> google_ads_api_v3_1 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v4'> google_ads_api_v4 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v5'> google_ads_api_v5 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v6'> google_ads_api_v6 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_scripts'> google_ads_scripts </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_solutions'> google_ads_solutions </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_apis'> google_apis </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_apps_script'> google_apps_script </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_drive'> google_drive </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_play_services'> google_play_services </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_plus'> google_plus </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/gpt'> gpt </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/guide'> guide </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/guides'> guides </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/hangout'> hangout </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/hotel_ads'> hotel_ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/hotel_campaigns'> hotel_campaigns </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/html5'> html5 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/html5_ads'> html5_ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/https'> https </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/i18n'> i18n </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ids'> ids </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ima_android'> ima_android </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ima_flash'> ima_flash </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ima_html5'> ima_html5 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ima_ios'> ima_ios </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ima_roku'> ima_roku </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ima_sdk'> ima_sdk </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/image'> image </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/image_ads'> image_ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/implementation'> implementation </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/impression_share'> impression_share </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/interstitial'> interstitial </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/interview'> interview </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/io13'> io13 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/iOS'> iOS </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/iOS9'> iOS9 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/java_app_engine'> java_app_engine </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/java_dart_api'> java_dart_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/jdbc'> jdbc </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/keyword_optimizer'> keyword_optimizer </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/keywords'> keywords </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/kotlin'> kotlin </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/labels'> labels </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/limits'> limits </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/line_item'> line_item </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/linq'> linq </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/listing_groups'> listing_groups </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/location_extensions'> location_extensions </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/location_feeds'> location_feeds </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/LocationExtensionOperand'> LocationExtensionOperand </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/LocationGroups'> LocationGroups </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/logging'> logging </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/manager_accounts'> manager_accounts </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/maps_api'> maps_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/marketplace'> marketplace </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/maximize'> maximize </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/mcc'> mcc </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/media'> media </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/media_bundle'> media_bundle </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/mediation_test_suite'> mediation_test_suite </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/merchant_api'> merchant_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/migration'> migration </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/mobile'> mobile </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/mobile_ads'> mobile_ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/mobile_ads_garage'> mobile_ads_garage </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/mobile_ads_sdk'> mobile_ads_sdk </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/mobile_sites'> mobile_sites </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/mobile_speed'> mobile_speed </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/mobile_targeting'> mobile_targeting </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/mobile_ux'> mobile_ux </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/monitoring'> monitoring </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/native'> native </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/native_ads_express'> native_ads_express </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/new_features'> new_features </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/oath2'> oath2 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/oauth'> oauth </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/oauth2'> oauth2 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/offline_conversions'> offline_conversions </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/OfflineConversionFeedService'> OfflineConversionFeedService </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/open_source'> open_source </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/openrtb'> openrtb </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/optimization'> optimization </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/Performance%20Max'> Performance Max </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/performance_max'> performance_max </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/performance_max_api_workshop'> performance_max_api_workshop </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/php'> php </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/PLA'> PLA </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/placements'> placements </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/PMax'> PMax </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/policy'> policy </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/policy_violation'> policy_violation </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/PQL'> PQL </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/price_extension'> price_extension </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/privacy'> privacy </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/privacy_sandbox'> privacy_sandbox </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/product_listing_ads'> product_listing_ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/proguard'> proguard </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/promotion_line'> promotion_line </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/publisher_ads_audits'> publisher_ads_audits </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/python'> python </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/qa'> qa </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/quality_score'> quality_score </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/query_builder_blog_series'> query_builder_blog_series </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/query_language'> query_language </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/quota'> quota </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/rate_limiter'> rate_limiter </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/rate_sheet'> rate_sheet </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/RateExceededError'> RateExceededError </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/realtime_bidding'> realtime_bidding </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/realtime_bidding_api'> realtime_bidding_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/realtime_bidding_protocol'> realtime_bidding_protocol </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/realtimebidding'> realtimebidding </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/recommendations'> recommendations </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/referer'> referer </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/release'> release </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/remarketing'> remarketing </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/reporting'> reporting </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/reports'> reports </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/responsive_ads'> responsive_ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/rewarded_video'> rewarded_video </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/rmf'> rmf </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ruby'> ruby </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/sa360'> sa360 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/sandbox'> sandbox </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/scripts'> scripts </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/sdf'> sdf </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/sdkless'> sdkless </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/search'> search </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/search%20audience'> search audience </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/search%20terms'> search terms </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/search_audience'> search_audience </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/search_network'> search_network </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/search_theme'> search_theme </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/selector'> selector </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/sendbeacon'> sendbeacon </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/service_accounts'> service_accounts </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/shared_negative_keywords'> shared_negative_keywords </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/shopping'> shopping </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/simulations'> simulations </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/sitelinks'> sitelinks </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/smart'> smart </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/snds'> snds </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/spend'> spend </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ssl'> ssl </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/StepInsideAdWords'> StepInsideAdWords </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/success_stories'> success_stories </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/suggested_ad_units'> suggested_ad_units </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/sunset'> sunset </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/survey'> survey </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/swift'> swift </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/swiftui'> swiftui </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/target'> target </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/target_cpa'> target_cpa </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/targeting'> targeting </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/template_ads'> template_ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/terms'> terms </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/test_accounts'> test_accounts </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/test_network'> test_network </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/testing'> testing </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/text_ads'> text_ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/text_asset_automation'> text_asset_automation </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/tools'> tools </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/trials'> trials </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/turtledove'> turtledove </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ui'> ui </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/unity'> unity </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/update'> update </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/updates'> updates </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/upgrade'> upgrade </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/upgraded_urls'> upgraded_urls </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/v201509'> v201509 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/vast3'> vast3 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/vcpm'> vcpm </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/video'> video </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/viewable-cpm'> viewable-cpm </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/webinar'> webinar </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/workshop'> workshop </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/workshops'> workshops </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/wp8'> wp8 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/xml'> xml </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/youtube'> youtube </a> </li> </ul> <div class='clear'></div> </div> </div><div class='widget BlogArchive' data-version='1' id='BlogArchive1'> <div class='tab'> <i class='material-icons icon'>  </i> <h2> Archive </h2> <i class='material-icons arrow'>  </i> </div> <div class='widget-content'> <div id='ArchiveList'> <div id='BlogArchive1_ArchiveList'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2025/'> 2025 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2025/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2025/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2024/'> 2024 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2024/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2024/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2024/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2024/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2024/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2024/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2024/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2024/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2024/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2024/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2024/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2024/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2023/'> 2023 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2023/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2023/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2023/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2023/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2023/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2023/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2023/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2023/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2023/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2023/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2023/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2023/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2022/'> 2022 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2022/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2022/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2022/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2022/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2022/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2022/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2022/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2022/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2022/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2022/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2022/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2022/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2021/'> 2021 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2021/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2021/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2021/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2021/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2021/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2021/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2021/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2021/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2021/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2021/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2021/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2021/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2020/'> 2020 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2020/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2020/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2020/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2020/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2020/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2020/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2020/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2020/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2020/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2020/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2020/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2020/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2019/'> 2019 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2019/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2019/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2019/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2019/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2019/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2019/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2019/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2019/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2019/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2019/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2019/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2019/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2018/'> 2018 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2018/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2018/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2018/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2018/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2018/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2018/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2018/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2018/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2018/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2018/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2018/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2018/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2017/'> 2017 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2017/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2017/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2017/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2017/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2017/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2017/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2017/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2017/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2017/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2017/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2017/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2017/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2016/'> 2016 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2016/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2016/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2016/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2016/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2016/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2016/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2016/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2016/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2016/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2016/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2016/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2016/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2015/'> 2015 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2015/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2015/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2015/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2015/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2015/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2015/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2015/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2015/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2015/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2015/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2015/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2015/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2014/'> 2014 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2014/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2014/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2014/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2014/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2014/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2014/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2014/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2014/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2014/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2014/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2014/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2014/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2013/'> 2013 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2013/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2013/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2013/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2013/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2013/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2013/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2013/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2013/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2013/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2013/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2013/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2013/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2012/'> 2012 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2012/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2012/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2012/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2012/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2012/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2012/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2012/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2012/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2012/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2012/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2012/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2012/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate expanded'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy toggle-open'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2011/'> 2011 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate expanded'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2011/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2011/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> </div> </div> <div class='clear'></div> </div> </div></div> <div class='section' id='sidebar-bottom'><div class='widget HTML' data-version='1' id='HTML5'> <div class='widget-content'> <div class='followgooglewrapper'> <script src="https://apis.google.com/js/plusone.js"></script> <div class="g-ytsubscribe" data-channel="AdsDevelopers" data-layout="full"></div> </div> </div> <div class='clear'></div> </div><div class='widget HTML' data-version='1' id='HTML7'> <div class='widget-content'> Give us feedback in our developer product forums:<br /><br /> <a href="https://groups.google.com/forum/#!forum/adwords-api">Google Ads API</a><br /> <a href="https://groups.google.com/forum/#!forum/adwords-scripts">Google Ads scripts</a><br /> <a href="https://groups.google.com/forum/#!forum/google-doubleclick-for-publishers-api">Google Ad Manager API</a><br /> <a href="https://groups.google.com/forum/#!forum/google-doubleclick-for-advertisers-api">DCM API</a><br /> <a href="https://groups.google.com/forum/#!forum/google-admob-ads-sdk">Google Mobile Ads SDK</a><br /> <a href="https://groups.google.com/g/google-admob-api-developer-forum">Google AdMob API</a><br /> <a href="https://groups.google.com/forum/#!forum/ima-sdk">Google Interactive Media Ads SDK</a><br /> <a href="https://groups.google.com/forum/#!forum/google-content-api-for-shopping">Google Content API for Shopping</a><br /> <a href="https://groups.google.com/forum/#!forum/google-doubleclick-ad-exchange-buyer-api">Authorized Buyers API</a><br /> </div> <div class='clear'></div> </div></div> </div> </div> <div style='clear:both;'></div> </div> <!-- Footer --> <div class='google-footer-outer loading'> <div id='google-footer'> <a href='//www.google.com/'> <img class='google-logo-dark' height='36' src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALgAAABICAYAAABFoT/eAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAACLVJREFUeNrsXd+L20YQ3vOprdLqiMXFXE2qB7dcwEcTSB7ykIc+9A/PQx/yEMq1TWhNuYIpJriNr7XpmZ5IxFEvmW2EKs3Ornb1w50PxIFP0kiz387OzM6uhGAwGAxGP3Ho+f7x7ri1O7LdccPqZjSNA4dEHsLfaHcEFedJom93x9Xu2OyOFTcBo6sED3fHZHeMEELrkAHJF0B8Rr+gDFsZ5n0luLTQ95AXs4W06D/tjpR50xtM4CjD0y48YGB4rnyZxNOzyA7zBHr+nLnDaJLg0mo/ALekCasg3Z4XbM0ZdTEgnDPeHY8bIne+Qz2GvwyGNwsuyT218KWvIIBMcwGpLiipcolecjMxfBDchNyS1EvxLiOSIecp31q6IJ/C3yrIrMqMm4jhg+AxkdwbIO3aUO4KjqqMjCT3uaazMBhWBJfuxH3CtRfiXf66DhSRZWbmlMnNaILgZxrXJQO/eO3wORZwvwm4JUxuhheCjzVBYAbW1ces45YDSoZrFNOEE835M8FT6oyeEnws8Fz3QnBxFKPHBMem4GU+m6fPGb0leCTwWcM5B36MPgeZI01gudyDdw3hPeXfo8L/rmCUWnuMMdqUL2WqWeRbhf+twfVsO7YagZGNC79fw7OthEVtkiJ4jJzTd3KPwf3CRqhhiTu23AP5sl0/0xiwISQXpNwLIJK87mHF+U8ddzzdmgKlGzlPYjyxGJQouIhNT4k9AqWEFkqfguIvagTWbcq3KW1WE3xS3m8NtA9WS451xofwjKT5kkDoK/b6mDk5FfXr1lWDL4BofZEv2/SRsK/EHGlGdBdu8QNRb8HMCFwt7Yy3DDI/QP7fx5z3VLhdlJEIs4rKNuXXJXdxZPdB7kfCzWqwCO4V1LHgLjInX3tQ1KzCR52Cz+vDj1dydeRuS74rcvs2Pi6fT5H8OaaUQPQPYcWwRSGXyhhscn5dpAnEFMkuEZetbfkTAnlSuH4DxisE+aMGeJAQ3lFl7C4LJE6QWCaCd583ORQ1jYAwjFctal7nOs2ZZvicwvlZx+RHGrcoAwKUVX8uwcc/9TT65INeDOr5shL9LDRB6QTeIy3zwfdh3WOi6axLCEhSjXU7F3h6LqggUtvyJxpynwu8tDkD98fXApOxRj8zoZ9MnGveYVIVZKaGrkBXCY65BCYNN9NkjpKOyQ81Q79JgdxS+Jn3SDTEXRI7SWzaiSTB32oI3nU3BvMfM0urhOVYgwKhuiAfc4tM07wXwm1ZRoQYSl2NUwiu01fEAHVcpixd745FvVz4dzUUc0o8rwoLy8ZSwU6CyFx1RP5II9+1bFPEFs9HWbNLiimDXE+vCm7u1CS47cofzD3aEhVY57mxRo5zlqdt+RFC1JUH2S7bcVXg4liTMakaBZZVxiTICRoivcn1sEUBlk24JmaC6kxUbYmWoqvyfck2xZGGnDFYa9MMzkYQ1ijkCX6qidybrgePiQ0QIQqoi6qRLeqQfIoRsEHaQJLBdHOnLGetSdm/IPcymJuS1PAnbQPH0MOw/39C1vL11DiLOqIsbDI8QcHvGiLnySi2qUXBicaqUSxN5LEB0g7Jt3ENXJLPJ5S1tnaZBoWbpRqrmjRE7qHmpSmNHdQcYrEUadoh+TbBnc9ri7iycI1kzPeNcLDIvbiqXpez9Tmdq6zGREPuzECBoxrPMiI2WtvyNwhJba2wy3JZ6ky5dD1lSvmZS3e4SPA1wcf1VTFHKX+cGwZzdUYcqpvUtvwrD/InDttVlyZeAKlNN5MKbAiurHhKIPlUuJvlTCCiDjSKSCsUmCFWbGLZwCESfK07JB8LvMYWVtw0D00JEHV8Mq2HkqPbE0oHLvvK2g0o8ETg+4cfwTlZDT9JDoWygu4uQQE/ivIvtcnfPkaCqhiupz7jWOAzqL/vjtcdkv9G4MVMt+EaylfuImiPAXEUjRF3pjjaHiPPZ6If9TGGAO4ZY0am6jOCb+DQ+ZCqLkIpOIPrdNfIjnFPY6nyFut7TS/fanrziOBOKMupKw94WaLMtuVnSFt9CPrWWdJE6PeltCX432DEBoh+5Dv8RRhdis8YAv9uyq4/JAwtlEApgBe9Cw9xDD3tdk4Jn0MDfiHwPHcRPxBePCMER3GuIx7kGlv9fkZ4V9lolx2Uv4X7hEj7qJ3LDoAMGbTRMRibu4L2xQ8bgt8AyU+Q+x7nYrvDnH4iuO5LxKsYwPVbkPMvKF9Zky9wXzRfVWizi62r9X5VHf55h+WHhDjGBZ4WRhyTr6z5SlCoLMxLSpBZFsQ9F80uQFbF/6aFWi+Ev51vzzsuX+msyzuQXXjUz8zEBy+zpq9yweXAoxJW4JbYrDS6gYDqGHxPl+TKeiBfxj9/EBIElPYeOA4y8/qRQfknjvSzgRgtq0Pw/M1eQeMdOSb2Bnrhr6Led+1vcp2x7oTFHMnedFW+Ivlty062BUt74oHgSj+vHepnhunn0JJAMtBZgDI/qmGtMujRv8DDpo47zBJ8UtPOuAR/7rKn8t9AJ0tBdmBAmJ/Fu71yxp4I3qh+DhyRqbi5Y1ShVPlSb8X7bRNcfgZFl+WRGYo7uecrWq1r8X5bhmzP5OdlDwsGRm1suSxkg5rYm7ConyGQ3Zl+DgSD8V/kPwrWBMG9YcBtyShBnTLdTiHgttw7qAW7cqh/ZnmPKr/6ignOaKsdyxbsToT5UkPsW00bJjijDXficcX/JsLs6w2BwGtherdckH3w/kNXRPVI0OqJQoHX42/66IMfMj/2huRjxIidgKV/W0JS+bsstDoTeAHcrI8E5zTh/sDkqxL5rZup55/3USlswfcHf4IrQplVDgW9XFlOqnwr6pVPMMEZTuC60EttvdzbLbaZ4PsFVa3nohhO+vW+yn/ZB2fUhpysmQrzBcTSai9EszuZMcEZ1lCFVrp9zGXhm69iLyY4oxFIa178lPe12I/P2DAYDAaDwWAwGAwGg8FgMBgMBoPBYDD2Cf8IMADDRGoQTe+E9AAAAABJRU5ErkJggg==' style='margin-top: -16px;' width='92'/> </a> <ul> <li> <a href='//www.google.com/'> Google </a> </li> <li> <a href='//www.google.com/policies/privacy/'> Privacy </a> </li> <li> <a href='//www.google.com/policies/terms/'> Terms </a> </li> </ul> </div> </div> <script type='text/javascript'> //<![CDATA[ // Social sharing popups. var postEl = document.getElementsByClassName('social-wrapper'); var postCount = postEl.length; for(i=0; i<postCount;i++){ postEl[i].addEventListener("click", function(event){ var postUrl = this.getAttribute("data-href"); window.open( postUrl,'popUpWindow','height=500,width=500,left=10,top=10,resizable=yes,scrollbars=yes,toolbar=yes,menubar=no,location=no,directories=no,status=yes'); });} //]]> </script> <script type='text/javascript'> //<![CDATA[ var BreakpointHandler = function() { this.initted = false; this.isHomePage = false; this.isMobile = false; }; BreakpointHandler.prototype.finalizeSummary = function(summaryHtml, lastNode) { // Use $.trim for IE8 compatibility summaryHtml = $.trim(summaryHtml).replace(/(<br>|\s)+$/,''); if (lastNode.nodeType == 3) { var lastChar = summaryHtml.slice(-1); if (!lastChar.match(/[.”"?]/)) { if (!lastChar.match(/[A-Za-z]/)) { summaryHtml = summaryHtml.slice(0, -1); } summaryHtml += ' ...'; } } else if (lastNode.nodeType == 1 && (lastNode.nodeName == 'I' || lastNode.nodeName == 'A')) { summaryHtml += ' ...'; } return summaryHtml; }; BreakpointHandler.prototype.generateSummaryFromContent = function(content, numWords) { var seenWords = 0; var summaryHtml = ''; for (var i=0; i < content.childNodes.length; i++) { var node = content.childNodes[i]; var nodeText; if (node.nodeType == 1) { if (node.hasAttribute('data-about-pullquote')) { continue; } nodeText = node.textContent; if (nodeText === undefined) { // innerText for IE8 nodeText = node.innerText; } if (node.nodeName == 'DIV' || node.nodeName == 'B') { // Don't end early if we haven't seen enough words. if (seenWords < 10) { continue; } if (i > 0) { summaryHtml = this.finalizeSummary(summaryHtml, content.childNodes[i-1]); } break; } summaryHtml += node.outerHTML; } else if (node.nodeType == 3) { nodeText = node.nodeValue; summaryHtml += nodeText + ' '; } var words = nodeText.match(/\S+\s*/g); if (!words) { continue; } var remain = numWords - seenWords; if (words.length >= remain) { summaryHtml = this.finalizeSummary(summaryHtml, node); break; } seenWords += words.length; } return summaryHtml; }; BreakpointHandler.prototype.detect = function() { var match, pl = /\+/g, search = /([^&=]+)=?([^&]*)/g, decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); }, query = window.location.search.substring(1); var urlParams = {}; while (match = search.exec(query)) urlParams[decode(match[1])] = decode(match[2]); this.isListPage = $('html').hasClass('list-page'); this.isMobile = urlParams['m'] === '1'; this.isHomePage = window.location.pathname == '/'; }; BreakpointHandler.prototype.initContent = function() { var self = this; $('.post').each(function(index) { var body = $(this).children('.post-body')[0]; var content = $(body).children('.post-content')[0]; $(content).addClass('post-original'); var data = $(content).children('script').html(); data = self.rewriteForSSL(data); // If exists, extract specified editor's preview. var match = data.match(/([\s\S]+?)<div data-is-preview.+?>([\s\S]+)<\/div>/m); if (match) { data = match[1]; } // Prevent big images from loading when they aren't needed. // This must be done as a pre-injection step, since image loading can't be // canceled once embedded into the DOM. if (self.isListPage && self.isMobile) { data = data.replace(/<(img|iframe) .+?>/g, ''); } // Insert template to be rendered as nodes. content.innerHTML = data; if (self.isListPage) { var summary = document.createElement('div'); $(summary).addClass('post-content'); $(summary).addClass('post-summary'); body.insertBefore(summary, content); if (match) { // Use provided summary. summary.innerHTML = match[2]; } else { // Generate a summary. // Summary generation relies on DOM, so it must occur after content is // inserted into the page. summary.innerHTML = self.generateSummaryFromContent(content, 30); } // Add read more link to summary. var titleAnchor = $(this).find('.title a')[0]; var link = titleAnchor.cloneNode(true); link.innerHTML = 'Read More'; $(link).addClass('read-more'); summary.appendChild(link); } }); // Firefox does not allow for proper styling of BR. if (navigator.userAgent.indexOf('Firefox') > -1) { $('.post-content br').replaceWith('<span class="space"></span>'); } $('.loading').removeClass('loading'); }; BreakpointHandler.prototype.process = function() { if (!this.initted) { var makeInsecureImageRegex = function(hosts) { var whitelist = hosts.join('|').replace(/\./g,'\\.'); // Normal image tags, plus input images (yes, this is possible!) return new RegExp('(<(img|input)[^>]+?src=("|\'))http:\/\/(' + whitelist +')', 'g'); }; this.sslImageRegex = makeInsecureImageRegex(BreakpointHandler.KNOWN_HTTPS_HOSTS); this.sslImageCurrentDomainRegex = makeInsecureImageRegex([window.location.hostname]); this.detect(); this.initContent(); this.initted = true; } }; BreakpointHandler.KNOWN_HTTPS_HOSTS = [ "www.google.org", "www.google.com", "services.google.com", "blogger.com", "draft.blogger.com", "www.blogger.com", "photos1.blogger.com", "photos2.blogger.com", "photos3.blogger.com", "blogblog.com", "img1.blogblog.com", "img2.blogblog.com", "www.blogblog.com", "www1.blogblog.com", "www2.blogblog.com", "0.bp.blogspot.com", "1.bp.blogspot.com", "2.bp.blogspot.com", "3.bp.blogspot.com", "4.bp.blogspot.com", "lh3.googleusercontent.com", "lh4.googleusercontent.com", "lh5.googleusercontent.com", "lh6.googleusercontent.com", "themes.googleusercontent.com", ]; BreakpointHandler.prototype.rewriteForSSL = function(html) { // Handle HTTP -> HTTPS source replacement of images, movies, and other embedded content. return html.replace(this.sslImageRegex, '$1https://$4') .replace(this.sslImageCurrentDomainRegex, '$1//$4') .replace(/(<(embed|iframe)[^>]+?src=("|'))http:\/\/([^"']*?(youtube|picasaweb\.google)\.com)/g, '$1https://$4') // Slideshow SWF takes a image host, so we need to rewrite that parameter. .replace(/(<embed[^>]+?feed=http(?=[^s]))/g, '$1s'); }; $(document).ready(function() { var handler = new BreakpointHandler(); handler.process(); // Top-level navigation. $(".BlogArchive .tab").click(function(ev) { ev.preventDefault(); $(this).parent().toggleClass('active'); $(this).siblings().slideToggle(300); }); $(".Label .tab").click(function(ev) { ev.preventDefault(); $(this).parent().toggleClass('active'); $(this).siblings().slideToggle(300); }); // Blog archive year expansion. $('.BlogArchive .intervalToggle').click(function(ev) { ev.preventDefault(); if ($(this).parent().hasClass('collapsed')) { $(this).parent().removeClass('collapsed'); $(this).parent().addClass('expanded'); } else { $(this).parent().removeClass('expanded'); $(this).parent().addClass('collapsed'); } }); // Reverse order of months. $('.BlogArchive .intervalToggle + div').each(function(_, items) { var year = $(this); year.children().each(function(_, month) { year.prepend(month); }); }); // Set anchors to open in new tab. $('.post-content img').parent().each(function(_, node) { if (node.nodeName == 'A') { $(this).attr('target', '_blank'); } }); // Process search requests. $('.searchBox input').on("keypress", function(ev) { if (ev.which == 13) { window.location.href = 'https://www.google.com/search?q=site%3A' + window.location.hostname + '%20' + encodeURIComponent ($(this).val()); } }); }); //]]> </script> <script type="text/javascript" src="https://www.blogger.com/static/v1/widgets/1704033933-widgets.js"></script> <script type='text/javascript'> window['__wavt'] = 'AOuZoY4GSwCWSNbUndk5ppVXUl5FaXq48A:1740272826356';_WidgetManager._Init('//www.blogger.com/rearrange?blogID\x3d7815614485808579332','//ads-developers.googleblog.com/2011/','7815614485808579332'); _WidgetManager._SetDataContext([{'name': 'blog', 'data': {'blogId': '7815614485808579332', 'title': 'Google Ads Developer Blog', 'url': 'http://ads-developers.googleblog.com/2011/', 'canonicalUrl': 'http://ads-developers.googleblog.com/2011/', 'homepageUrl': 'http://ads-developers.googleblog.com/', 'searchUrl': 'http://ads-developers.googleblog.com/search', 'canonicalHomepageUrl': 'http://ads-developers.googleblog.com/', 'blogspotFaviconUrl': 'http://ads-developers.googleblog.com/favicon.ico', 'bloggerUrl': 'https://www.blogger.com', 'hasCustomDomain': true, 'httpsEnabled': false, 'enabledCommentProfileImages': true, 'gPlusViewType': 'FILTERED_POSTMOD', 'adultContent': false, 'analyticsAccountNumber': 'G-E4MSGF2SF9', 'analytics4': true, 'encoding': 'UTF-8', 'locale': 'en', 'localeUnderscoreDelimited': 'en', 'languageDirection': 'ltr', 'isPrivate': false, 'isMobile': false, 'isMobileRequest': false, 'mobileClass': '', 'isPrivateBlog': false, 'isDynamicViewsAvailable': true, 'feedLinks': '\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22Google Ads Developer Blog - Atom\x22 href\x3d\x22http://ads-developers.googleblog.com/feeds/posts/default\x22 /\x3e\n\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/rss+xml\x22 title\x3d\x22Google Ads Developer Blog - RSS\x22 href\x3d\x22http://ads-developers.googleblog.com/feeds/posts/default?alt\x3drss\x22 /\x3e\n\x3clink rel\x3d\x22service.post\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22Google Ads Developer Blog - Atom\x22 href\x3d\x22https://www.blogger.com/feeds/7815614485808579332/posts/default\x22 /\x3e\n', 'meTag': '', 'adsenseHostId': 'ca-host-pub-1556223355139109', 'adsenseHasAds': false, 'adsenseAutoAds': false, 'boqCommentIframeForm': true, 'loginRedirectParam': '', 'view': '', 'dynamicViewsCommentsSrc': '//www.blogblog.com/dynamicviews/4224c15c4e7c9321/js/comments.js', 'dynamicViewsScriptSrc': '//www.blogblog.com/dynamicviews/c320e3f9c6626331', 'plusOneApiSrc': 'https://apis.google.com/js/platform.js', 'disableGComments': true, 'interstitialAccepted': false, 'sharing': {'platforms': [{'name': 'Get link', 'key': 'link', 'shareMessage': 'Get link', 'target': ''}, {'name': 'Facebook', 'key': 'facebook', 'shareMessage': 'Share to Facebook', 'target': 'facebook'}, {'name': 'BlogThis!', 'key': 'blogThis', 'shareMessage': 'BlogThis!', 'target': 'blog'}, {'name': 'X', 'key': 'twitter', 'shareMessage': 'Share to X', 'target': 'twitter'}, {'name': 'Pinterest', 'key': 'pinterest', 'shareMessage': 'Share to Pinterest', 'target': 'pinterest'}, {'name': 'Email', 'key': 'email', 'shareMessage': 'Email', 'target': 'email'}], 'disableGooglePlus': true, 'googlePlusShareButtonWidth': 0, 'googlePlusBootstrap': '\x3cscript type\x3d\x22text/javascript\x22\x3ewindow.___gcfg \x3d {\x27lang\x27: \x27en\x27};\x3c/script\x3e'}, 'hasCustomJumpLinkMessage': false, 'jumpLinkMessage': 'Read more', 'pageType': 'archive', 'pageName': '2011', 'pageTitle': 'Google Ads Developer Blog: 2011'}}, {'name': 'features', 'data': {}}, {'name': 'messages', 'data': {'edit': 'Edit', 'linkCopiedToClipboard': 'Link copied to clipboard!', 'ok': 'Ok', 'postLink': 'Post Link'}}, {'name': 'template', 'data': {'name': 'custom', 'localizedName': 'Custom', 'isResponsive': false, 'isAlternateRendering': false, 'isCustom': true}}, {'name': 'view', 'data': {'classic': {'name': 'classic', 'url': '?view\x3dclassic'}, 'flipcard': {'name': 'flipcard', 'url': '?view\x3dflipcard'}, 'magazine': {'name': 'magazine', 'url': '?view\x3dmagazine'}, 'mosaic': {'name': 'mosaic', 'url': '?view\x3dmosaic'}, 'sidebar': {'name': 'sidebar', 'url': '?view\x3dsidebar'}, 'snapshot': {'name': 'snapshot', 'url': '?view\x3dsnapshot'}, 'timeslide': {'name': 'timeslide', 'url': '?view\x3dtimeslide'}, 'isMobile': false, 'title': 'Google Ads Developer Blog', 'description': 'The official blog for information about the Google Ads, Google Ad Manager, Google Mobile Ads SDKs for AdMob and IMA SDKs, and other Google Advertising Platform developer tools.', 'url': 'http://ads-developers.googleblog.com/2011/', 'type': 'feed', 'isSingleItem': false, 'isMultipleItems': true, 'isError': false, 'isPage': false, 'isPost': false, 'isHomepage': false, 'isArchive': true, 'isLabelSearch': false, 'archive': {'year': 2011, 'rangeMessage': 'Showing posts from 2011'}}}]); _WidgetManager._RegisterWidget('_HeaderView', new _WidgetInfo('Header1', 'header', document.getElementById('Header1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_BlogView', new _WidgetInfo('Blog1', 'main', document.getElementById('Blog1'), {'cmtInteractionsEnabled': false, 'lightboxEnabled': true, 'lightboxModuleUrl': 'https://www.blogger.com/static/v1/jsbin/2332438401-lbx.js', 'lightboxCssUrl': 'https://www.blogger.com/static/v1/v-css/1964470060-lightbox_bundle.css'}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML8', 'sidebar-top', document.getElementById('HTML8'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_LabelView', new _WidgetInfo('Label1', 'sidebar', document.getElementById('Label1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_BlogArchiveView', new _WidgetInfo('BlogArchive1', 'sidebar', document.getElementById('BlogArchive1'), {'languageDirection': 'ltr', 'loadingMessage': 'Loading\x26hellip;'}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML5', 'sidebar-bottom', document.getElementById('HTML5'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML7', 'sidebar-bottom', document.getElementById('HTML7'), {}, 'displayModeFull')); </script> </body> </html>