CINXE.COM
Yahoo Developer Network
<!DOCTYPE html> <html lang=en-US> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="google-site-verification" content="MOnPMZKo_gmKqZgcnzortlWhXu0qUWvmbNAeWx84v9I" /> <link rel="apple-touch-icon-precomposed" href="../static/images/apple-touch-icon-precomposed.png"> <title>Yahoo Developer Network</title> <meta name="description" content="Measure, monetize, advertise and improve your apps with Yahoo tools. Join the 200,000 developers using Yahoo tools to build their app businesses."> <meta property="og:title" content="Yahoo Developer Network" /> <meta property="og:type" content='website' /> <meta property="og:url" content="https://developer.yahoo.com/" /> <meta property="og:description" content="Measure, monetize, advertise and improve your apps with Yahoo tools. Join the 200,000 developers using Yahoo tools to build their app businesses."/> <meta property="og:image" content="https://s.yimg.com/oo/cms/products/site/assets/ydn200.png"/> <meta property="og:site_name" content="Yahoo Developer Network" /> <link rel="shortcut icon" href="https://s.yimg.com/rz/l/favicon.ico"/> <link rel="stylesheet" href="/static/css/font-awesome.min.css"> <link rel="stylesheet" href="/static/css/denali-icons-v0.4.1.css"> <link rel="stylesheet" href="/static/css/hoverbox.css"> <link rel="stylesheet" href="/static/css/rebranding_footer.css"> <!--[if lte IE 8]> <link rel="stylesheet" href="/static/css/codemirror.css"> <link rel="stylesheet" href="/static/css/pure.css"> <link rel="stylesheet" href="/static/css/main.css"> <link rel="stylesheet" href="/static/css/side-menu.css"> <link rel="stylesheet" href="/static/css/featherlight.min.css"> <link rel="stylesheet" href="/static/css/denali-style.css"> <link rel="stylesheet" href="/static/css/less-styles.css"> <![endif]--> <!--[if gt IE 8]><!--> <link rel="stylesheet" href="https://s.yimg.com/zz/combo?oo/fe/css/codemirror-min_681d3e3e0.css&oo/fe/css/pure-min_5ef171c51.css&oo/fe/css/main-min_248761b64.css&oo/fe/css/side-menu-min_d1ff8ca9b.css&oo/fe/css/featherlight.min_2802ef65c.css&oo/fe/css/denali-style-min_e0ef5615c.css&oo/fe/css/less-styles-min_1527735e8.css"> <!--<![endif]--> <script nonce="p8iNv46HLI0we7p/OXc9DA==" src="https://s.yimg.com/zz/combo?oo/fe/js/vendor/jquery331_min-min_fb71483ea.js&oo/fe/js/vendor/jquery-easytabs_min-min_5ed1e3e24.js&oo/fe/js/vendor/jquery-hashchange-min_acc519bb2.js&oo/fe/js/vendor/js-cookie-min_bff73c132.js"></script> <script nonce="p8iNv46HLI0we7p/OXc9DA==" src="/static/js/vendor/jquery.cookie.js"></script> <script nonce="p8iNv46HLI0we7p/OXc9DA==" src="https://s.yimg.com/zz/combo?oo/fe/js/vendor/featherlight_min-min_8697a441b.js&oo/fe/js/vendor/slick_min-min_0d13b88ac.js&oo/fe/js/vendor/scrollReveal_min-min_118b7ecf1.js&oo/fe/js/vendor/codemirror-compressed-min_3217a68df.js"></script> <script nonce="p8iNv46HLI0we7p/OXc9DA==" src="/static/js/vendor/bootstrap.bundle.min.js"></script> <!-- Google tag (gtag.js) --> <script nonce="p8iNv46HLI0we7p/OXc9DA==" async src="https://www.googletagmanager.com/gtag/js?id=G-BFY40XXE01"></script> <script nonce="p8iNv46HLI0we7p/OXc9DA=="> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-BFY40XXE01'); </script> </head> <body class=" "><header class="notificationBannerGroup"></header> <!-- Check if there is custom header data --> <div class="header-container"> <div class="page-head-search container"> <a href="/" aria-label="YDN Logo"><div class="logo-container"></div><div class="devtxt">developer</div></a> <div class="header-links"> <ul> <li> <a id="nav-opensource" href="/opensource/"><span>Open Source</span></a> </li> <li> <a id="nav-api" href="/api/"><span>APIs</span></a> </li> <li> <a id="nav-advertising" href="/advertising/" target="_blank" rel="noopener"><span>Advertising</span> <span><i class="d-icon d-external is-small" aria-hidden="true"></i></span></a> </li> <li> <a id="nav-blogs" href="/blogs/"><span>Blogs</span></a> </li> <li> <a id="nav-events" href="/events/"><span>Events</span></a> </li> <li> <a id="nav-podcasts" href="/podcasts/"><span>Podcasts</span></a> </li> <li> <a id="nav-apps" href="/apps/"><span>Apps</span></a> </li> </ul> </div> <div class="head-controls hidden"> <form id="search-form" action="/find/" method="GET" autocomplete="off"> <label for="search-input" class="sr-only">Input to search</label> <input title="" id="search-input" name="q" placeholder=""> <button type="submit" class="pure-button search-ydn" aria-label="search button"><i class="d-icon d-search is-smal" aria-hidden="true"></i></button> </form> </div> <div class="head-right-controls"> <div class="header-search-container" id="search-nav-bar"> <form action="/find/" method="GET" autocomplete="off" class="search-form"> <input title="search" aria-label="search scope" id="scope-search" name="q" placeholder="Search" > <button type="submit" class="search-ydn" aria-label="search button"><i class="d-icon d-search is-small" aria-hidden="true"></i></button> </form> </div> <!-- <a id="myapps-dropdown" class="hidden"> <img src="/assets/images/app-icon.png" alt="App Icons" class="header-icon"> </a> --> <a id="language-dropdown" aria-label="Language Dropdown"><span class="flag-icon flag-icon-us" aria-hidden="true"></span> <span class="caret" aria-hidden="true"></span></a> <div class="user-account"> <!-- <img class="pic-id my-id hidden" src="https://s.yimg.com/dh/ap/social/profile/profile_b64.png"> --> <a href="https://login.yahoo.com?done=https://developer.yahoo.com/&src=devnet&specId=usernameReg">Sign In</a> <!-- <a href="https://login.yahoo.com/config/login?.done=https://developer.yahoo.com/" class="login"><i class="d-icon d-user-profile-circle is-medium pic-id my-id hover"></i></a> --> </div> </div> <div id="language-overlay" class="overlay" sign-in "> <div class="pointer"></div> <ul> <li><a class='rapidnofollow' data-lang="en-US" href="#" aria-label="Translate to English"><span class="flag-icon flag-icon-us" aria-hidden="true"></span> English (U.S.)</a></li> <li><a class='rapidnofollow' data-lang="zh-Hant-HK" href="#" aria-label="Translate to Chinese (Hong Kong)"><span class="flag-icon flag-icon-hk" aria-hidden="true"></span> 中文(香港)</a></li> <li><a class='rapidnofollow' data-lang="zh-Hant-TW" href="#" aria-label="Translate to Chinese (Taiwan)"><span class="flag-icon flag-icon-tw" aria-hidden="true"></span> 中文(台灣)</a></li> </ul> </div> <div id="apps-overlay" class="overlay"> <div class="pointer"></div> <div> </div> <ul> <li><a href="/apps">YDN Apps</a></li> <li><a href="https://dev.flurry.com">Flurry Apps</a></li> <li><a href="/search-sdk/apps">Search SDK Apps</a></li> </ul> </div> </div> <div class="mobile-header"> <a href="#menu" id="menuLink" class="menu-link" aria-label="Menu Link"> <!-- Hamburger icon --> <span aria-hidden="true"></span> </a> <a href="/" class="yahoo-phone" role="presentation" aria-label="Logo"><div class="logo-container" style="position:static"></div><div class="devtxt">developer</div></a> <a href="/find/" class="mobile-search-icon" role="presentation" aria-label="Search Logo"></a> </div> </div> <script nonce="p8iNv46HLI0we7p/OXc9DA=="> var BACKSPACE_KEY = 8; var DELETE_KEY = 46; var searchForm = document.querySelector('#search-form'); var searchScopeName = document.querySelector('#search-scope-name'); var searchScopeUrl = document.querySelector('#search-scope-url'); var searchInput = document.querySelector('#search-input'); var searchScope = document.querySelector('.search-scope'); if (searchScope) { var paddingOffset = searchScope.offsetWidth + 40; searchInput.style.paddingLeft = paddingOffset + 'px'; } searchInput.addEventListener('keydown', handleSearchKeyDown); searchInput.addEventListener('blur', handleSearchLoseFocus); searchInput.addEventListener('focus', handleSearchFocus); searchInput.addEventListener('blur', handleLoseFocus); var pageName = window.location.pathname.split("/")[1]; var navElement = document.getElementById("nav-"+pageName); if(navElement){ navElement.classList.add("selected"); } function handleSearchFocus(event) { searchForm.style.width = "375px"; } function handleLoseFocus(event) { searchForm.style.width = "250px"; } window.addEventListener('resize', function(event){ searchForm.style.width = "250px"; }); function handleSearchKeyDown(event) { var searchText = document.querySelector('#search-input').value; searchScope = document.querySelector('.search-scope'); // When search bar is empty and Backspace or Delete keys are pressed, then // remove contextual scope from the search bar. // Note: Brightroll DSP is locked into contextual search. // Note: A.I. Studio is locked into contextual search. if (!searchText.length && searchScopeName.value !== 'DSP' && searchScopeName.value !== 'A.I. Studio' && (event.keyCode === BACKSPACE_KEY || event.keyCode === DELETE_KEY)) { searchScope.style.display = 'none'; searchInput.style.paddingLeft = 10 + 'px'; searchScopeName.disabled = true; searchScopeUrl.disabled = true; } } // Reset contextual search when the search bar loses focus and it's empty. function handleSearchLoseFocus(event) { var searchText = document.querySelector('#search-input').value; // Restore contextual label if it has been removed via the backspace key // but the text field is still empty. if (searchScope && !searchText.length) { searchScope.style.display = 'block'; searchInput.style.paddingLeft = paddingOffset + 'px'; searchScopeName.disabled = false; searchScopeUrl.disabled = false; } } // Update locale setting from language dropdown $('a[data-lang]').click(function(e) { e.preventDefault(); // Load PH cookie and convert it to object. // If PH cookie is not available, create an empty object. var locale = $(this).data('lang'); var phCookie = $.cookie('PH'); var phCookieObject = phCookie ? queryStringToObject(phCookie) : {}; // Update locale. phCookieObject.l = locale; // Set new PH cookie. $.cookie.raw = true; $.cookie('PH', $.param(phCookieObject), { path: '/', domain: 'yahoo.com' }); location.reload(); }); function queryStringToObject(query) { var qs = {}; var vars = query.split('&'); for (var i = 0; i < vars.length; i++) { var pair = vars[i].split('='); pair[0] = decodeURIComponent(pair[0]); pair[1] = decodeURIComponent(pair[1]); if (typeof qs[pair[0]] === 'undefined') { qs[pair[0]] = pair[1]; } else if (typeof qs[pair[0]] === 'string') { qs[pair[0]] = [qs[pair[0]], pair[1]]; } else { qs[pair[0]].push(pair[1]); } } return qs; } </script> <div> <div id="layout" class=" " > <div id="menu"> <div class="pure-menu pure-menu-open"> <ul> <li class="light-bkg mobile-menu-only"><a class="d" href="/opensource/">Open Source</a></li> <li class="light-bkg mobile-menu-only"><a class="d" href="/api/">APIs</a></li> <li class="light-bkg mobile-menu-only"><a class="d" href="/advertising/">Advertising</a></li> <li class="light-bkg mobile-menu-only"><a class="d" href="/blogs/">Blog</a></li> <li class="light-bkg mobile-menu-only"><a class="d" href="/events/">Events</a></li> <li class="light-bkg mobile-menu-only"><a class="d" href="/podcasts/">Podcasts</a></li> <li class="light-bkg mobile-menu-only"><a class="d" href="/apps/">Apps</a></li> <!-- <li class="pure-menu-heading"><a href="/everything.html">Products</a></li> --> <li class="light-bkg mobile-menu-only"> <a class="d" href="https://login.yahoo.com?done=&src=devnet&specId=usernameReg">Sign In</a> </li> <li class="light-bkg mobile-menu-only"> <a href="#" aria-label="Language Menu">Language:</a> <ul> <li><a class="d" data-lang="en-US" href="#" aria-label="Translates to English"><span class="flag-icon flag-icon-us" aria-hidden="true"></span> English (U.S.)</a></li> <li><a class="d" data-lang="zh-Hant-HK" href="#" aria-label="Translates to Chinese (Hong Kong)"><span class="flag-icon flag-icon-hk" aria-hidden="true"></span> 中文(香港)</a></li> <li><a class="d" data-lang="zh-Hant-TW" href="#" aria-label="Translates to Chinese (Taiwan)"><span class="flag-icon flag-icon-tw" aria-hidden="true"></span> 中文(台灣)</a></li> </ul> </li> </ul> </div> <script nonce="p8iNv46HLI0we7p/OXc9DA=="> // Update locale setting from language dropdown $('a[data-lang]').click(function(e) { e.preventDefault(); // Load PH cookie and convert it to object. // If PH cookie is not available, create an empty object. var locale = $(this).data('lang'); var phCookie = $.cookie('PH'); var phCookieObject = phCookie ? queryStringToObject(phCookie) : {}; // Update locale. phCookieObject.l = locale; // Set new PH cookie. $.cookie.raw = true; $.cookie('PH', $.param(phCookieObject), { path: '/', domain: 'yahoo.com' }); location.reload(); }); function queryStringToObject(query) { var qs = {}; var vars = query.split('&'); for (var i = 0; i < vars.length; i++) { var pair = vars[i].split('='); pair[0] = decodeURIComponent(pair[0]); pair[1] = decodeURIComponent(pair[1]); if (typeof qs[pair[0]] === 'undefined') { qs[pair[0]] = pair[1]; } else if (typeof qs[pair[0]] === 'string') { qs[pair[0]] = [qs[pair[0]], pair[1]]; } else { qs[pair[0]].push(pair[1]); } } return qs; } </script> </div> <div id="main"> <link rel="stylesheet" href="https://s.yimg.com/oo/cms/products/site/assets/css/slick_7321dcc70.css"> <link rel="stylesheet" href="https://s.yimg.com/oo/cms/products/site/assets/css/r-homepage_58af42713.css"> <link rel="stylesheet" href="https://s.yimg.com/oo/cms/products/site/assets/css/r-translucent-header_964b4c879.css"> <link rel="stylesheet" href="https://s.yimg.com/oo/cms/products/site/assets/css/r-translucent-header_964b4c879.css"> <style nonce="p8iNv46HLI0we7p/OXc9DA=="> span i{ padding-right:0.5em; } .podcast-timeline span:nth-child(1){ margin-right:1em; } .blog p.regular a{ font-weight:bold; color:rgba(48,48,48,1); font-size:16px; line-height:26px; } .blog p.regular a{ transition:all 1s; } .blog p.regular a:hover, .blog p.regular a:focus{ color:rgba(74,144,226,1); } .img-wrapper figure,.img-wrapper>a img{ position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%); width: 100%; vertical-align: middle; } .img-wrapper p{ position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%); width: 100%; vertical-align: middle; text-align:center; } .img-wrapper > :not(iframe):not(.r-blog):not(img):not(.noImg):not(figure){ display:none; } .podcast-container{ overflow-x: hidden; overflow-y: scroll; width:100%; } .pure-g-r.flex-container{ margin-top:0em; margin-bottom:0em; } h2.feed-header span{ display: inline-block; margin-top: -25px; } h2.feed-header span iframe{ height: 26px !important; padding-left: 10px; } </style> <div id="carousel"> <div class="purple-bg siwy carousel-content"> <div class="container top-50"> <div class="pure-u-1"> <div class="carousel-container"> <h2>New</h2> <h1>Sign In With <span>Yahoo</span></h1> <h3>An easy and convenient way for your users to create an account and sign into your web or mobile app</h3> <a href="/sign-in-with-yahoo" class="pure-button pure-button-primary">View guide</a> </div> <br/> </div> </div> </div> <div class="carousel-content home"> <div class="container"> <div class="carousel-container container"> <h1 data-sr="enter left move 150px over 1s" >Technology you can use to build products they'll love</h1> <a href="/opensource/" class="pure-button pure-button-primary" data-rapid_p="15">Learn More</a> </div> </div> </div> <div class="purple-bg vespa carousel-content"> <div class="container top-50"> <div class="pure-u-1"> <div class="carousel-container"> <img src="/static/images/vespa-logo-mark-full.svg" alt="Mobile" class="carosal-images"> <h1 data-sr="enter left move 150px over 1s" style="line-height: 5px;">Vespa</h1> <h3 data-sr="wait 0.5s enter left move 150px over 1s" >Big Data. Real Time.</h3> <a href="http://vespa.ai/" class="pure-button pure-button-primary">Project Overview</a> </div> <br/> </div> </div> </div> <div class="purple-bg screwdriver carousel-content"> <div class="container top-50"> <div class="pure-u-1"> <div class="carousel-container"> <img src="/static/images/screwdriver-logo-mark-white.svg" alt="Mobile" class="carosal-images"> <h1 data-sr="enter left move 150px over 1s" style="line-height: 5px;">Screwdriver</h1> <h3 data-sr="wait 0.5s enter left move 150px over 1s">Build. Test. Deploy.</h3> <a href="http://screwdriver.cd/" class="pure-button pure-button-primary">Project Overview</a> </div> <br/> </div> </div> </div> <div class="purple-bg athenz carousel-content"> <div class="container top-50"> <div class="pure-u-1"> <div class="carousel-container"> <img src="/static/images/athenz-logo-mark-white.svg" alt="Mobile" class="carosal-images"> <h1 data-sr="enter left move 150px over 1s" style="line-height: 5px;">Athenz</h1> <h3 class="athenz" data-sr="wait 0.5s enter left move 150px over 1s">Open source platform for X.509 certificate based service authentication and fine grained access control in dynamic infrastructures</h3> <a href="http://www.athenz.io/" class="pure-button pure-button-primary">Project Overview</a> </div> <br/> </div> </div> </div> </div> <div class=""> <div class="container padding-sides"> <h2 class="header pure-u-1-1 blog-header">Latest Blog Posts <a href="/blogs/">View All</a></h2> <div class="pure-g-r flex-container" id="blogs"> <div class="pure-u-1-3 flex-item blog blog-20231026"> <a href='/blogs/20231026/' class="d"> <div class="image-container"> <img src="/static/images/img-placeholders/ydn-placeholder-10.jpg" alt="Deep Dive into Yahoo's Semantic Search Suggestions: From Challenges to Effective Implementation"/> </div> <div class="regular"> <p class="overflow-3">Deep Dive into Yahoo's Semantic Search Suggestions: From Challenges to Effective Implementation</p> <i class="d-icon d-calendar is-visible-mobile"></i><span class="is-visible-mobile"></span> <script nonce="p8iNv46HLI0we7p/OXc9DA=="> var d = new Date('October 26, 2023'); $('.blog-20231026 .regular span').text(d.toDateString()); </script> </div> </a> </div> <div class="pure-u-1-3 flex-item blog blog-713067803453816832"> <a href='/blogs/713067803453816832/' class="d"> <div class="image-container"> <img src="/static/images/img-placeholders/ydn-placeholder-12.jpg" alt="Latest updates - March 2023"/> </div> <div class="regular"> <p class="overflow-3">Latest updates - March 2023</p> <i class="d-icon d-calendar is-visible-mobile"></i><span class="is-visible-mobile"></span> <script nonce="p8iNv46HLI0we7p/OXc9DA=="> var d = new Date('March 28, 2023'); $('.blog-713067803453816832 .regular span').text(d.toDateString()); </script> </div> </a> </div> <div class="pure-u-1-3 flex-item blog blog-705087322584170496"> <a href='/blogs/705087322584170496/' class="d"> <div class="image-container"> <img src="/static/images/img-placeholders/ydn-placeholder-11.jpg" alt="Latest updates - December 2022"/> </div> <div class="regular"> <p class="overflow-3">Latest updates - December 2022</p> <i class="d-icon d-calendar is-visible-mobile"></i><span class="is-visible-mobile"></span> <script nonce="p8iNv46HLI0we7p/OXc9DA=="> var d = new Date('December 30, 2022'); $('.blog-705087322584170496 .regular span').text(d.toDateString()); </script> </div> </a> </div> </div> <hr class="spacing"/> <div class="flex-container pure-g-r social-wrapper"> <div class="flex-item pure-u-1-2 gutter-right"> <div class="card-content"> <h2 class="header feed-header">Podcasts <span><iframe title="Podcasts" allowtransparency="true" scrolling="no" frameborder="no" src="https://w.soundcloud.com/icon/?url=http%3A%2F%2Fsoundcloud.com%2Fydn&color=orange_transparent&size=40" style="width: 40px; height: 40px;"></iframe></span> </h2> <div class="podcast-container home"> <iframe title="Podcasts" width="100%" height="500" scrolling="no" frameborder="no" allow="autoplay" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/playlists/661124433&color=%237915ab&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true"></iframe> </div> </div> </div> <div class="flex-item pure-u-1-2 gutter-left"> <div class="card-content" > <h2 class="header feed-header">Follow us on Twitter <a href="https://twitter.com/ydn" style="font-size: 24px;padding-left: 10px;" aria-label="Follow us on Twitter"><i class="fa fa-twitter" aria-hidden="true"></i></a></h2> <div class="border timeline-ydn" id="timeline-wrapper"> <a data-widget-id="ydn-timeline" class="twitter-timeline" data-height="497" data-chrome="nofooter transparent noheader transparent" href="https://twitter.com/ydn?ref_src=twsrc%5Etfw">Tweets by ydn</a> <script nonce="p8iNv46HLI0we7p/OXc9DA==" async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </div> </div> </div> </div> <hr class="spacing"/> <div class="pure-g-r flex-container is-hidden-mobile"> <div class="flex-item pure-u-1-2 gutter-right"> <div class="card-content"> <div class="flex-container-2 border"> <div class="pure-u-1-4 image-wrapper"> <img src="https://s.yimg.com/oo/cms/products/site/assets/images/svg/Artboard 3100_2585f1d77.svg" alt="APIs Logo"/ dataAlternate="https://s.yimg.com/oo/cms/products/site/assets/images/Artboard 3100_1f3ac0f6a.png"> </div> <div class="pure-u-3-4 content-wrapper"> <h2 class="header">APIs</h2> <p class="content-info">Let us help you make your apps better by leveraging our APIs.</p> <a class="d browse" href="/api/">Browse APIs</a> </div> </div> </div> </div> <div class="flex-item pure-u-1-2 gutter-left"> <div class="card-content"> <div class="flex-container-2 border"> <div class="pure-u-1-4 image-wrapper"><img src="https://s.yimg.com/oo/cms/products/site/assets/images/svg/os-icon_a0ce27e3b.svg" alt="Open Source Logo"/></div> <div class="pure-u-3-4 content-wrapper"> <h2 class="header">Open Source</h2> <p class="content-info">Join a community of people who are passionate about the technologies you care about. Or just use our free open source code. </p> <a class="d browse" href="/opensource/">Browse code</a> </div> </div> </div> </div> </div> <div class="pure-g-r flex-container is-visible-mobile"> <a href="/api/" class="d button is-primary">Browse APIs</a> <a href="/opensource/" class="d button is-primary">Browse Open Source Projects</a> </div> <div class="border" style="text-align: center; margin:2em 0 6em;"> <p class="ads">Looking for Advertising Development Tools? <a href="/advertising/">Browse Advertising Docs</a> </p> </div> </div> </div> <script nonce="p8iNv46HLI0we7p/OXc9DA=="> $(window).on('load', function () { $('iframe[id^=twitter-widget-]').each(function () { var head = $(this).contents().find('head'); if (head.length) { head.append('<style nonce="p8iNv46HLI0we7p/OXc9DA==">.timeline { max-width: 100% !important; width: 100% !important; } .timeline .stream { max-width: none !important; width: 100% !important; }</style>'); } $('#twitter-widget-0').append($('<div class=timeline>')); }); }); function customTwitterStyles() { var intervalTwitter = setInterval( function() { if (document.querySelector('[id*=twitter-widget]') && document.querySelector('[id*=twitter-widget]').contentDocument) { var ibody = $(document.querySelector('[id*=twitter-widget]').contentDocument).find( 'body' ); if(ibody.find('.TweetAuthor-screenName').length){ ibody.find('.timeline-Tweet-text').css({'font-size':'14px','line-height':'20px','font-family':'helvetica neue','font-weight':'normal','color':'rgba(48,48,48,1)'}); ibody.find('.timeline-Tweet-text a').css({'color':'rgba(74,144,226,1)'}); ibody.find('.timeline-Body').css({'border-top':0,'border-bottom':0}); ibody.find('.TweetAuthor-screenName').css({'color':'rgba(127,127,127,1)'}); $('#timeline-wrapper').removeClass('timeline-ydn'); if((/android|webos|iphone|ipod|blackberry|iemobile|opera mini/i.test(navigator.userAgent.toLowerCase()))){ ibody.find('.timeline-Tweet-media').css({'margin-left':'0px'}); ibody.find('.timeline-Tweet-text').css({'margin-left':'0px'}); } clearInterval(intervalTwitter); } } }, 300) } customTwitterStyles(); var homeCarousel = $('#carousel').slick({ dots: true, infinite: true, speed: 300, slidesToShow: 1, adaptiveHeight: true, autoplay: true, autoplaySpeed: 3000, cssEase: 'linear', mobileFirst: true, prevArrow: '', nextArrow: '', pauseOnHover:false, onAfterChange: function(){ if( 0 == homeCarousel.slickCurrentSlide() ){ homeCarousel.slickPause(); }; } }); $("#mktoForm").submit(function(event) { event.preventDefault(); var $form = $( this ), email = $form.find( "input[name='Email']" ).val(), formid = $form.find( "input[name='formid']" ).val(), munchkinid = $form.find( "input[name='munchkinId']" ).val(), url = $form.attr( "action" ); if (email) { var getting = $.get(url, { Email: email, formid: formid, munchkinId: munchkinid, _mktoReferrer: location.href, _mkt_trk: "", formVid: 43 }); getting.done(function( data ) { $("#mktoForm").hide(); $("#thanks").show(); }); } }); window.sr = new scrollReveal(); </script> </div> </div> </div> <!-- FOOTER --> <footer class="footer yahoo" style="background-color: #f0f3f5;background-image: none;"> <section class="section"> <div class="container"> <div class="columns is-variable is-multiline is-5"> <div class="column foot-link-block"> <span class="featured-header is-block is-bold"> Support <i class="toggle-icon fa fa-angle-down" aria-hidden="true"></i> </span> <div class="clickDisplay hideClick"> <a href="https://guce.yahoo.com/terms?locale=en-US" target="_blank" rel="noopener">Terms</a> <a style="cursor: default; pointer-events: none"> and </a> <a href="https://guce.yahoo.com/privacy-policy?locale=en-US" target="_blank" rel="noopener">Privacy Policy</a> </div> <a class="is-block clickDisplay hideClick" href="https://guce.yahoo.com/privacy-dashboard?locale=en-US" target="_blank" rel="noopener">Privacy Dashboard</a> <a class="is-block clickDisplay hideClick" href="https://developer.yahoo.com/opensource/" target="_blank" rel="noopener">About Us</a> <a class="is-block clickDisplay hideClick" href="https://www.linkedin.com/company/yahoo/jobs/" target="_blank" rel="noopener">Jobs</a> <a class="is-block clickDisplay hideClick" href="https://legal.yahoo.com/us/en/yahoo/privacy/products/developer/index.html" target="_blank" rel="noopener">Developer Privacy</a> <a class="is-block clickDisplay hideClick" href="https://policies.yahoo.com/us/en/yahoo/terms/product-atos/apiforydn/index.htm" target="_blank" rel="noopener">Developer Terms</a> <a class="is-block clickDisplay hideClick" href="https://developer.yahoo.com/policies/" target="_blank" rel="noopener">Developer Policies</a> <a class="is-block clickDisplay hideClick" href="https://yahoo.uservoice.com/forums/182455-yahoo-developer-network" target="_blank" rel="noopener">Site Feedback</a> </div> <div class="column foot-link-block"> <span class="featured-header is-block is-bold">Brands <i class="toggle-icon fa fa-angle-down" aria-hidden="true"></i> </span> <a class="is-block clickDisplay hideClick" href="https://developer.yahoo.com" target="_blank" rel="noopener">Yahoo Developer</a> <a class="is-block clickDisplay hideClick" href="https://developer.edgecast.com/" target="_blank" rel="noopener">Yahoo Edgecast Developer</a> <a class="is-block clickDisplay hideClick" href="https://help.yahoo.com/kb/account" target="_blank" rel="noopener">Ad Platform Help Center</a> </div> <div class="column logo foot-link-block"> <div> <a class="nav-brand is-block" href="https://www.yahoo.com/" target="_blank" rel="noopener"> <img class="nav-brand is-block" src="/static/images/yahoo-logo-purple.svg" alt="Yahoo Logo"/> </a> <span id="copyright" class="is-block is-size-7 copy-right"></span> </div> </div> </div> </div> </section> </footer> <script nonce="p8iNv46HLI0we7p/OXc9DA=="> $('.featured-header').click(function(){ $(this).find("i").toggleClass('fa-angle-down fa-angle-up') $(this).nextAll('.clickDisplay').toggleClass('hideClick showClick') }); $('#copyright').html("© " + new Date().getFullYear() + " Yahoo. All rights reserved."); </script> <script nonce="p8iNv46HLI0we7p/OXc9DA==" src="https://s.yimg.com/zz/combo?oo/fe/js/polyfills/assign-min_6f975308e.js&oo/fe/js/navigation-min_3c753d938.js&oo/fe/js/utils-min_65ef3b583.js&oo/fe/js/admin-min_4f54d799e.js"></script> <script nonce="p8iNv46HLI0we7p/OXc9DA=="> var head = $('.page-head-search'), url = document.URL, fragment = url.substring(url.indexOf('#')), pathAndFragment = '/' + url.split('/').splice(3).join('/'), // i.e., /gemini/guide/gsg.html#integrating-oauth path = (pathAndFragment.indexOf('#') > -1) ? pathAndFragment.substring(0, pathAndFragment.indexOf('#')) : pathAndFragment, // i.e., /gemini/guide/gsg.html // the menu li container that matches the scope of menu items on the current page menuPageRoot, languageLeaveWait, userLeaveWait, // a timeout for mouseleave from header's user id and pic elements menuIsExpanded = false, overMenu = false, // is cursor over the user id or pic userOverlay, // menu overlay that pops up from user id or pic languageOverlay, // menu overlay that pops up from language dropdown link dialpadOverlay, dialpadLeaveWait, headToMenuArr = [], $headings, menuList = $('.pure-menu a'), menuLiList = $('.pure-menu li'), pageMenuList, // only the menu items that have heads on this page (used for scrolling highlight) isThrottled = false, throttleDuration = 100; // ms if ($('.feedback_close')) { $('.feedback_close').click(function (e) { $('.feedback').remove(); }); } // allows the menu to slide in/out on mobile size screens function slideMobileMenu() { $('#layout').toggleClass('active'); // the menu and page contents $('.pure-menu').toggleClass('active'); // the menu $('#menuLink').toggleClass('active'); // hamburger icon $('.footer').toggleClass('active'); // footer needs to slide too $('.mobile-header').toggleClass('active'); // top bar needs to slide too } $('#menuLink').click(function (e) { e.preventDefault(); // without this, the first menu item can get triggered on a mobile device when the hamburger icon is clicked setTimeout(function () { slideMobileMenu(); }, 200); }); // set/remove box-shadow on head if scrolled $(document).scroll(function () { if (window.scrollY > 5) { head.addClass('head-shadow'); } else { head.removeClass('head-shadow'); } }); // Begin language overlay languageOverlay = $('#language-overlay'); languageOverlay.css('z-index', 10); $('.head-right-controls').delegate('#language-dropdown', 'mouseover', function (e) { let top; let left; left = $(".head-right-controls").position().left + $(".head-right-controls").width()-275; top = $(".head-right-controls").position().top + $(".head-right-controls").height() + 5; dialpadOverlay.css('display','none'); languageOverlay.css({ top: top+"px", left: left + "px" }); languageOverlay.css('display','table'); }); $('#language-overlay').mouseover(function () { clearTimeout(languageLeaveWait); overMenu = true; }); // when cursor leaves My Apps, // if it doesn't move over the menu within 1sec, // hide the menu $('#language-dropdown').mouseleave(function (e) { languageLeaveWait = setTimeout(function () { if (overMenu === false) { removeLanguageOverlay(e); } }, 1000); }); function removeLanguageOverlay() { languageOverlay.css('display','none'); overMenu = false; } $('#language-overlay').click(removeLanguageOverlay); $('#language-overlay').mouseleave(removeLanguageOverlay); // Begin dialpad overlay dialpadOverlay = $('#dialpad-overlay'); dialpadOverlay.css('z-index', 10); $('.head-right-controls').delegate('#dialpad-dropdown', 'mouseover', function (e) { let top; let left; left = $(".head-right-controls").position().left + $(".head-right-controls").width()-545; top = $(".head-right-controls").position().top + $(".head-right-controls").height() - 5; languageOverlay.css('display','none'); dialpadOverlay.css({ top: top+"px", left: left + "px" }); dialpadOverlay.css({ 'display':'block', 'background-color': '#fff', 'border-radius': '4px', 'box-shadow': '0 2px 8px 2px rgba(0, 0, 0, 0.36)', 'width': '410px', 'height': '265px', 'padding':'25px 25px 0px', 'min-width': '20rem'}); }); var overDialMenu = false; $('#dialpad-overlay').mouseover(function () { clearTimeout(dialpadLeaveWait); overDialMenu = true; }); // when cursor leaves My Apps, // if it doesn't move over the menu within 1sec, // hide the menu $('#dialpad-dropdown').mouseleave(function (e) { dialpadLeaveWait = setTimeout(function () { if (overDialMenu === false) { removeDialpadOverlay(e); } }, 1000); }); function removeDialpadOverlay() { dialpadOverlay.css('display','none'); overDialMenu = false; } $('#dialpad-overlay').click(removeDialpadOverlay); $('#dialpad-overlay').mouseleave(removeDialpadOverlay); $('#dialpad-dropdown').click(function(){ $('#dialpad-overlay').css('display','block'); }); function supportsSVG() { return !!document.createElementNS && !!document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect; } if (!supportsSVG()) { var imgs = document.getElementsByTagName('img'); var dotSVG = /\.svg$/; for (var i = 0; i !== imgs.length; ++i) { if (imgs[i].src.match(dotSVG) && imgs[i].dataAlternate) { imgs[i].src = imgs[i].dataAlternate; } } } </script> <!-- Use default JavaScript --> <script nonce="p8iNv46HLI0we7p/OXc9DA==" src="https://s.yimg.com/ss/rapid-3.41.3.js"></script> <script nonce="p8iNv46HLI0we7p/OXc9DA=="> var rapid = new YAHOO.i13n.Rapid({webworker_file: 'http://l.yimg.com/oo/fe/js/vendor/rapidworker-1-min_b8fccc270.js' ,spaceid:1197800063, tracked_mods:['layout']}); </script> <script nonce="p8iNv46HLI0we7p/OXc9DA=="> $(document).ready(function() { $('.dropdown-trigger button').click(function(){ var element = $('.dropdown'); $('.dropdown').toggleClass('is-active'); $('.dropdown button').attr( 'aria-expanded', $(element).hasClass('is-active') ); event.stopPropagation(); }); $('body').click(function(){ var element = $('.dropdown'); var menuOpen = $(element).hasClass('is-active'); if (menuOpen) { $(element).removeClass('is-active'); $('.dropdown button').attr('aria-expanded', !menuOpen); } }); }); (function(){ var test = document.createElement('div'); test.innerHTML = ' '; test.className = 'adsbox'; document.body.appendChild(test); window.setTimeout(function() { if (test.offsetHeight === 0) { if ($(':header').length > 0 && $(':header').is(':visible') === false) { var callout = $('div.g-content'); callout.first().prepend("<div class='admonition important' style='margin-top: 20px'><p class='first admonition-title'>Ad Blocker Detected</p><p class='last'>We've detected the use of an ad blocker. For the best viewing experience, we recommend that you disable your ad blocker.</p>"); } } test.remove(); }, 100); })(); </script> <script nonce="p8iNv46HLI0we7p/OXc9DA=="> (function() { // Check if we're in gemini domain if (window.location.href.indexOf('gemini-publishers-synd/docs/') > -1) { console.log(window.location.href); var callout = $('div.g-content'); callout.first().prepend("<div class='admonition important' style='margin-top: 20px'><p class='first admonition-title'>Deprication Warning</p><p class='last'>These docs have been deprecated. Please use <a href='https://developer.yahoo.com/flurry/docs/publisher/web/'>the documentation here</a>.</p>"); } })(); $("div.section table").parent().css("overflow-x", "auto"); </script> <!-- renders each hoverbox--> <script nonce="p8iNv46HLI0we7p/OXc9DA=="> function enableTooltip(){ $('.reference.internal').each(function() { var reference = $(this).find('.std-term'); var definition = $(this.hash + ' + dd'); if (reference.length !== 0 && definition.length !== 0) { $(this).removeAttr("href"); // remove link to glossary page $(this).on("click", function(e) { // make it not clickable e.preventDefault(); return false; }); $(reference) // set tooltip .tooltip({ html: true, trigger: 'manual', placement: 'top', title: definition.html() }).on("mouseenter", function() { var _this = this; $('.reference.internal .std-term').tooltip('hide'); $(this).tooltip('show'); $('.tooltip').on('mouseleave', function() { $(_this).tooltip('hide'); }); }).on("mouseleave", function() { var _this = this; setTimeout(function() { if ($('.tooltip:hover').length === 0) { $(_this).tooltip('hide'); } }, 200); }); } }); } enableTooltip(); </script> <script nonce="p8iNv46HLI0we7p/OXc9DA==" type="text/javascript" src="/static/js/vmdn.js"></script> <script nonce="p8iNv46HLI0we7p/OXc9DA==" type="text/javascript" src="/static/js/rebranding_documentation.js"></script> </body> </html>