YouTube Transcript API Rate Limit: What It Is and How to Handle 429s

Why APIs return 429 Too Many Requests, what RFC 6585 and the Retry-After header actually specify, how rate limits differ from daily quota, and how to implement correct retry and backoff logic.

00:08:00 · SEP 13, 2026

त्वरित उत्तर

एक 429 का मतलब है कि आप अपने प्लान की requests-per-minute सीमा से तेज़ रिक्वेस्ट भेज रहे हैं - इसका क्रेडिट्स या डेली कोटा से कोई संबंध नहीं है। अगर रिस्पॉन्स में एक Retry-After हेडर है, तो ठीक उतनी देर इंतजार करें। अगर नहीं है, तो jitter के साथ एक्सपोनेंशियल backoff इस्तेमाल करें, और अलग से यह सीमित करें कि एक समय में आपकी कितनी रिक्वेस्ट इन-फ्लाइट हैं।

रेट लिमिट बनाम कोटा

ये दो अलग-अलग सीमाएं हैं जिन्हें अक्सर आपस में मिला दिया जाता है:

  • कोटा - एक लंबी विंडो (जैसे एक दिन) में अनुमत कुल रिक्वेस्ट। खत्म होने का मतलब है एक रीसेट का इंतजार, जो कभी-कभी कई घंटे दूर होता है।
  • रेट लिमिट - एक छोटी विंडो (जैसे एक मिनट) में अनुमत रिक्वेस्ट। इसे टकराने का मतलब है कुछ सेकंड से एक मिनट तक धीमा होना, घंटों नहीं।

इसके पीछे, ज्यादातर APIs रेट लिमिटिंग को या तो एक token bucket (आप एक स्थिर दर पर रिक्वेस्ट "टोकन" जमा करते हैं और प्रति रिक्वेस्ट एक खर्च करते हैं, जिससे छोटे बर्स्ट की अनुमति मिलती है) या एक fixed/sliding window counter (हर कैलेंडर मिनट पर एक सख्त सीमा, बाउंड्री पर रीसेट होती हुई) से लागू करते हैं। कौन सा इस्तेमाल होता है यह बदल देता है कि आपका ट्रैफिक कितना बर्स्टी सुरक्षित रूप से हो सकता है - एक token bucket एक fixed window से बेहतर एक छोटे स्पाइक को सह लेता है।

HTTP मानक: RFC 6585 और Retry-After

429 Too Many Requests कोई प्रोवाइडर-स्पेसिफिक कहानी नहीं है - इसे औपचारिक रूप से RFC 6585 (अप्रैल 2012) में एक मानक HTTP स्टेटस कोड के रूप में परिभाषित किया गया था। RFC 9110 के अनुसार, एक कंप्लायंट सर्वर 429 (या 503) रिस्पॉन्स पर एक Retry-After हेडर जोड़ सकता है, दो रूपों में से किसी एक में:

  • Delay-seconds रूप - एक इंटीजर, जैसे Retry-After: 120, यानी 120 सेकंड इंतजार करें।
  • HTTP-date रूप - एक एब्सोल्यूट टाइमस्टैम्प, जैसे Retry-After: Wed, 21 Oct 2026 07:28:00 GMT

जब मौजूद हो, यह हेडर निर्णायक है - सर्वर आपको ठीक-ठीक बता रहा है कि वह फिर से कब रिक्वेस्ट स्वीकार करेगा। इसके ऊपर अपना खुद का एक्सपोनेंशियल backoff न लगाएं; इससे आपकी रिकवरी और देरी से होगी। केवल तभी backoff पर वापस जाएं जब हेडर मौजूद न हो।

GetYouTubeTranscript की रेट लिमिट्स

प्लानरेट लिमिट
Free60 req/min
Monthly ($5/माह)200 req/min
Annual ($4.50/माह)300 req/min

यह असल में कैसे लागू होता है

यह प्रति API key एक फिक्स्ड 1-मिनट विंडो है, न कि कोई रोलिंग विंडो या token bucket - काउंटर क्लॉक मिनट बाउंड्री पर रीसेट होता है। यह फिलहाल Retry-After हेडर नहीं भेजता, इसलिए इस API से किसी भी 429 को "लगभग 60 सेकंड तक इंतजार करें और backoff के साथ रिट्राई करें" मानें, नीचे दिए गए कोड पैटर्न का उपयोग करते हुए, बजाय एक ऐसा हेडर पार्स करने के जो वहां नहीं होगा।

429s को सही ढंग से संभालना

सही क्रम है: पहले Retry-After जांचें, और अगर वह मौजूद न हो तभी jitter के साथ एक्सपोनेंशियल backoff पर वापस जाएं। Jitter (इंतजार को थोड़ा रैंडम करना) मायने रखता है क्योंकि जब कई क्लाइंट एक साथ किसी सीमा से टकराते हैं और सभी एक जैसे शेड्यूल पर रिट्राई करते हैं, तो वे सिंक्रोनाइज़ हो जाते हैं और एक "थंडरिंग हर्ड" बना देते हैं जो तुरंत उसी सीमा को फिर से टकरा देता है।

Node.js:

async function getTranscriptWithRetry(videoId, apiKey, maxRetries = 4) {
  for (let attempt = 0; attempt <= maxRetries; attempt++) {
    const res = await fetch(
      `https://getyoutubetranscript.com/api/v1/transcript?v=${videoId}`,
      { headers: { Authorization: `Bearer ${apiKey}` } }
    );
    if (res.status !== 429) return res.json();

    const retryAfter = res.headers.get('retry-after');
    const waitMs = retryAfter
      ? Number(retryAfter) * 1000
      : 500 * 2 ** attempt + Math.random() * 250; // exponential backoff + jitter
    await new Promise((r) => setTimeout(r, waitMs));
  }
  throw new Error('Rate limited after retries');
}

Python:

import os, time, random, requests

def get_transcript_with_retry(video_id, api_key, max_retries=4):
    url = "https://getyoutubetranscript.com/api/v1/transcript"
    for attempt in range(max_retries + 1):
        res = requests.get(url, params={"v": video_id}, headers={"Authorization": f"Bearer {api_key}"})
        if res.status_code != 429:
            return res.json()

        retry_after = res.headers.get("Retry-After")
        wait = float(retry_after) if retry_after else (0.5 * 2 ** attempt + random.uniform(0, 0.25))
        time.sleep(wait)
    raise RuntimeError("Rate limited after retries")

रेट बनाम कॉन्करेंसी - एक अलग समस्या

एक requests-per-minute सीमा और एक इन-फ्लाइट कॉन्करेंसी सीमा एक जैसी चीज़ नहीं हैं। Promise.all के साथ एक साथ 50 रिक्वेस्ट फायर करना एक 429 ट्रिगर कर सकता है भले ही आपका मिनट का टोटल बजट के अंदर हो, क्योंकि सर्वर (या उसके सामने कोई प्रॉक्सी) एक साथ चल रहे कनेक्शन भी सीमित कर सकता है। कई वीडियो बैच-प्रोसेस करते समय, अपनी रेट-लिमिट backoff से अलग, कॉन्करेंसी को स्वतंत्र रूप से सीमित करें:

import pLimit from 'p-limit';

const limit = pLimit(5); // at most 5 requests in flight at once
const results = await Promise.all(
  videoIds.map((id) => limit(() => getTranscriptWithRetry(id, apiKey)))
);

सस्टेन्ड हाई-वॉल्यूम बैचों के लिए, प्लान टियर अपग्रेड करने से req/min सीमा सीधे बढ़ती है - API docs में प्राइसिंग देखें, या dashboard से 100 फ्री क्रेडिट्स से शुरू करें।

रेट लिमिट FAQs

Q01

रेट लिमिट और कोटा में क्या अंतर है?

एक कोटा एक अवधि (जैसे प्रति दिन) में कुल उपयोग सीमित करता है। एक रेट लिमिट यह सीमित करता है कि आप प्रति यूनिट समय (जैसे प्रति मिनट) में कितनी रिक्वेस्ट कर सकते हैं, आपके डेली टोटल उपयोग से स्वतंत्र - आप अपने डेली कोटा के अंदर रहते हुए भी एक रेट लिमिट टकरा सकते हैं। कोटा वाले हिस्से के लिए हमारी YouTube API कोटा गाइड देखें।

Q02

429 रिस्पॉन्स का क्या मतलब है?

429 Too Many Requests को औपचारिक रूप से 2012 में RFC 6585 में परिभाषित किया गया था। इसका मतलब है कि आपने अपने प्लान की requests-per-window सीमा पार कर ली है - यह धीमा करने और रिट्राई करने का संकेत है, इसका मतलब यह नहीं कि आपकी रिक्वेस्ट अमान्य थी या आपके क्रेडिट्स खत्म हो गए।

Q03

Retry-After हेडर क्या है, और क्या मुझे इस पर हमेशा भरोसा करना चाहिए?

RFC 9110 के अनुसार, एक सर्वर 429 या 503 रिस्पॉन्स पर एक Retry-After हेडर शामिल कर सकता है, दो रूपों में से किसी एक में: सेकंड्स की एक इंटीजर संख्या (Retry-After: 120) या एक एब्सोल्यूट HTTP-date। अगर यह मौजूद है, तो अपना खुद का backoff इसके ऊपर लगाने के बजाय इसका ठीक-ठीक पालन करें - सर्वर ने आपको यह बताने के लिए एक निर्णायक जवाब दिया है कि कब रिट्राई करना है।

Q04

GetYouTubeTranscript की रेट लिमिट क्या है, और क्या यह Retry-After हेडर भेजता है?

फ्री प्लान पर 60 रिक्वेस्ट/मिनट, मासिक प्लान पर 200 req/min, और वार्षिक प्लान पर 300 req/min, प्रति API key एक फिक्स्ड 1-मिनट विंडो (रोलिंग विंडो नहीं) के रूप में लागू। यह फिलहाल 429s पर Retry-After हेडर नहीं भेजता, इसलिए एक की उम्मीद करने के बजाय अपना खुद का backoff लागू करें (नीचे दिया गया कोड देखें) - क्योंकि विंडो फिक्स्ड है न कि रोलिंग, इंतजार अधिकतम मौजूदा मिनट के बचे हुए हिस्से जितना है।

Q05

क्या एक 429 कोई क्रेडिट खर्च करता है?

नहीं - एक रेट-लिमिटेड रिक्वेस्ट के लिए कभी चार्ज नहीं किया जाता। केवल सफल रिक्वेस्ट ही क्रेडिट्स खर्च करती हैं।

Q06

क्या मुझे ज्यादा थ्रूपुट पाने के लिए कई API keys खोलनी चाहिए?

नहीं - यह आमतौर पर किसी प्रोवाइडर की fair-use शर्तों का उल्लंघन करता है, और खास तौर पर GetYouTubeTranscript पर, रेट लिमिटिंग पहले से ही प्रति API key लागू होती है, लेकिन क्रेडिट्स और अकाउंट स्टैंडिंग अकाउंट लेवल पर ट्रैक होते हैं, चाहे आप कितनी भी keys बनाएं। अगर आपको ज्यादा थ्रूपुट चाहिए, तो इसके बजाय प्लान टियर अपग्रेड करें, जो सीधे req/min सीमा बढ़ाता है।

Q07

requests-per-minute सीमा के अंदर होने के बावजूद मेरी रिक्वेस्ट फेल क्यों होती हैं?

यह आमतौर पर एक कॉन्करेंसी समस्या है, रेट की समस्या नहीं - 50 रिक्वेस्ट पैरेलल में फायर करना एक सर्वर को ओवरव्हेल्म कर सकता है भले ही आपका मिनट का टोटल बजट के भीतर हो। एक समय में कितनी रिक्वेस्ट इन-फ्लाइट हैं, इसे अपनी प्रति-मिनट रेट से अलग सीमित करने के लिए एक कॉन्करेंसी लिमिटर (जैसे Node में p-limit या Python में एक सेमाफोर) इस्तेमाल करें।

संबंधित