"; $('.right-nav').replaceWith(toc); if (headerList.length > 15) { // Apply style to always show scrollbar when there is overflow $('.right-nav').addClass('scrollbar'); $('.right-nav').css('height', '450px'); } } else { $('.right-nav').replaceWith("
"); } // Scrollspy var lastId, topMenu = $('.right-nav'), topMenuHeight = topMenu.outerHeight()+15, // All list items menuItems = topMenu.find("a"), // Anchors corresponding to menu items scrollItems = menuItems.map(function(){ var item = $($(this).attr("href")); if (item.length) { return item; } }); menuItems.click(function(e){ var href = $(this).attr("href"), offsetTop = href === "#" ? 0 : $(href).offset().top-topMenuHeight+1; $('html, body').stop().animate({ scrollTop: offsetTop }, 300); e.preventDefault(); }); $(window).scroll(function() { // Get container scroll position var fromTop = $(this).scrollTop()+topMenuHeight; // Get id of current scroll item var cur = scrollItems.map(function(){ if ($(this).offset().top < fromTop) return this; }); // Get the id of the current element cur = cur[cur.length-1]; var id = cur && cur.length ? cur[0].id : ""; if (lastId !== id) { lastId = id; // Set/remove active class menuItems .parent().removeClass("active") .end().filter("[href='#"+id+"']").parent().addClass("active"); } }); const tabholders = document.getElementsByClassName('tabview'); for (var x = 0, len = tabholders.length; x < len; x++) { $("#" + $(tabholders[x]).attr("id")).easytabs({animationSpeed:'fast'}); } $(".tabview-tab a").click(function () { for (var x = 0, len = tabholders.length; x < len; x++) { $("#" + $(tabholders[x]).attr("id")).easytabs({'select':$(this).attr('href')}); } }); // Load gists asynchronously (if present) loadGists(); history.pushState({ title: title, myState: true }, title, url); // Update page title if (title.length > 0) { document.title = title + ' - Yahoo Developer Network'; } else { document.title = 'Yahoo Developer Network'; } // Returns true if at least one (or more) dropdowns are expanded if ($navLevel3.hasClass('active')) { $navLevel3.removeClass('active'); $navSection.find('.expanded').removeClass('expanded'); } // Remove previous "active" class $pureMenu.find('.active').removeClass('active'); $pureMenu.find('.selected').removeClass('selected'); $navSection.find('.active').removeClass('active'); $navSection.find('.selected').removeClass('selected'); // Add new "active" class to the link and its container $this.closest('li').addClass('active'); $this.closest('ul').addClass('active'); $this.closest($navSection).addClass('active'); $this.closest($navSection).addClass('selected'); $this.closest('ul').closest('li').addClass('expanded'); // Scroll page to the top window.scrollTo(0, 0); enableTooltip(); }).fail(function() { // TODO: Failed fetching document $(location).attr('href', url); }).always(function() { $this.find('#docs-loading-indicator').remove(); }); }); /** * Handle "back" button navigation. */ window.onpopstate = function(event) { // Skip initial load if (!event.state || !event.state.myState) { return; } // Ignore hashtag updates to the URL if (document.location.pathname === currentPath) { return; } currentPath = document.location.pathname; // Load previous page via AJAX on browser's Back button $('#docs-page').load(window.location.href, function() { const tabholders = document.getElementsByClassName('tabview'); for (var x = 0, len = tabholders.length; x < len; x++) { $("#" + $(tabholders[x]).attr("id")).easytabs({animationSpeed:'fast'}); } $(".tabview-tab a").click(function () { for (var x = 0, len = tabholders.length; x < len; x++) { $("#" + $(tabholders[x]).attr("id")).easytabs({'select':$(this).attr('href')}); } }); loadGists(); 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("
Ad Blocker Detected
We've detected the use of an ad blocker. For the best viewing experience, we recommend that you disable your ad blocker.
"); } } test.remove(); }, 100); }); // Update page title when going back to the previous page if (event.state) { if (title.length > 0) { document.title = event.state.title + ' - Yahoo Developer Network'; } else { document.title = 'Yahoo Developer Network'; } } // Remove previous "active" class $navSection.find('.active').removeClass('active'); $navSection.find('.selected').removeClass('selected'); // Add "active" class to the previous link in the left nav var $navLink = $('a[href="' + window.location.pathname + '"]'); $navLink.closest('li').addClass('active'); $navLink.closest('ul').addClass('active'); }; function getElementsByTagNames(list,obj) { if (!obj) var obj = document; var tagNames = list.split(','); var resultArray = new Array(); for (var i = 0; i < tagNames.length; i++) { var tags = obj.getElementsByTagName(tagNames[i]); for (var j = 0; j < tags.length;j++) { resultArray.push(tags[j]); } } var testNode = resultArray[0]; if (!testNode) return []; if (testNode.sourceIndex) { resultArray.sort(function (a,b) { return a.sourceIndex - b.sourceIndex; }); } else if (testNode.compareDocumentPosition) { resultArray.sort(function (a,b) { return 3 - (a.compareDocumentPosition(b) & 6); }); } return resultArray; } function loadGists() { var els = $('section').find('script'); var gists = {}; var code = []; var stylesheets = []; // Get elements referencing a gist and build a gist hash referencing the elements that use it els.each(function(idx, rawEl) { var el = $(rawEl); // Check if script element has src attribute if (el.attr('src')) { var gist = el.attr('src'); gist = gist.replace('.js', '.json'); rawEl.gist = gist; rawEl.file = el.attr('file'); gists[gist] = gists[gist] || { targets: [] }; gists[gist].targets.push(el); } }); // // Load the gists $.each(gists, function(name, data) { $.getJSON(name + '?callback=?', function(data) { var gist = gists[name]; gist.data = data; // Only insert the stylesheets once if (stylesheets.indexOf(gist.data.stylesheet) < 0) { stylesheets.push(gist.data.stylesheet); $('head').append('
'); } gist.files = $(gist.data.div).find('.gist-file'); gist.outer = $(gist.data.div).first().html(''); // Iterate elements refering to this gist $(gist.targets).each(function(idx, target) { var file = target.get(0).file; if (file) { var o = gist.outer.clone(); var c = '
' + $(gist.files.get(gist.data.files.indexOf(file))).html() + '
'; o.html(c); target.replaceWith(o); } else { target.replaceWith(gist.data.div); } }); }); }); } }); function isEllipsisActive(element) { return element && element[0] && (element.outerWidth() < element[0].scrollWidth); }
DSP Traffic API rate limits are adjustable on an account-by-account basis. As a baseline, all accounts are allotted a fixed number of requests per minute, per hour and per day.
Adjustments to the rate limits can be requested by the account team.
Rate Limits¶
The DSP Traffic API rate is rate-limited per the following default quota limits based on the number of calls in a rolling window of time.
Type | Limit | Description |
---|---|---|
GET Requests Per Minute | 60 | Number of GET requests allowed in a minute per user account. |
PUT Requests Per Minute | 30 | Number of PUT requests allowed in a minute per user account. |
POST Requests Per Minute | 30 | Number of POST requests allowed in a minute per user account. |
GET Requests Per Hour | 360 | Number of GET requests allowed in an hour per user account |
PUT Requests Per Hour | 100 | Number of PUT requests allowed in an hour per user account. |
POST Requests Per Hour | 75 | Number of POST requests allowed in an hour per user account. |
GET Requests Per Day | 8000 | Number of GET requests allowed in a day per user account. |
PUT Requests Per Day | 2000 | Number of PUT requests allowed in a day per user account. |
POST Requests Per Day | 1000 | Number of POST requests allowed in a day per user account |
Read Current Rate Limits¶
Retrieves the current rate limits and what remains of the specific rate limit for your user account.
GET /traffic/ratelimit
The request takes no parameters.
Sample Request¶
GET https://dspapi.admanagerplus.yahoo.com/traffic/ratelimit
Sample Response¶
The response contains the rate limits with legacy minute, hour and day and with new set and remaining by call type minute, hour and day for your user account.
{ "trafficApiRateLimit": { "userId": 1963, "getLimitPerMin": 60, "getLimitPerHr": 360, "getLimitPerDay": 8000, "postLimitPerMin": 30, "postLimitPerHr": 75, "postLimitPerDay": 1000, "putLimitPerMin": 30, "putLimitPerHr": 100, "putLimitPerDay": 2000, "getLimitPerMinRemaining": 7, "getLimitPerHrRemaining": 19, "getLimitPerDayRemaining": 6999, "postLimitPerMinRemaining": 20, "postLimitPerHrRemaining": 55, "postLimitPerDayRemaining": 789, "putLimitPerMinRemaining": 13, "putLimitPerHrRemaining": 56, "putLimitPerDayRemaining": 1340, "limitPerMin": 32, "limitPerHour": 94, "limitPerDay": 2332 }}
The legacy rate limit values will be deprecated at a future date.
Error Messages¶
When any of the rate limits are exceeded, a response similar to the one below will be returned.
{ "response": null, "errors": { "httpStatusCode": 422, "message": null, "validationErrors": [ { "message": "Rate Limit Exceeded (GET Per Minute)", "propertyName": "TRAFFIC_LIMIT_GET_PER_MIN" } ] }, "timeStamp": "2017-04-25T18:00:37Z"}