מדריך

Rate Limits: לטפל ב-429.

429 Too Many Requests - למה, מתי, ואיך לכתוב קוד שלא ייתקע בייצור.

מה תוציאו מזה?
  • למה האפליקציה שלכם תיתקע יום אחד עם 429
  • איך מזהים את הסיבה - בקשות, טוקנים, או בו-זמנית
  • איך כותבים קוד עמיד שלא נופל כשמגיעים לתקרה

אם אתם בונים אפליקציה על ה-API של קלוד, יום אחד תפגשו את 429 Too Many Requests. אנתרופיק מטילה מגבלות על כמה בקשות מותר לשלוח בדקה, כמה טוקנים מותר לשלוח בדקה, וכמה טוקנים מותר לקבל בדקה - כל אחת בנפרד.

המדריך הזה עובר על מה גורם ל-429, איך לזהות איזו מגבלה נפגעה, ואיך לכתוב קוד שלא ייתקע בייצור כשהתעבורה תעלה.

שישה צעדים

≈ 8 דקות
01שלושה

שלושה סוגי מגבלות

אנתרופיק מודדת שלושה דברים שונים בכל דקה:

  • RPM (Requests Per Minute) - כמה קריאות ל-API מותר לבצע בדקה.
  • ITPM (Input Tokens Per Minute) - סך טוקני הקלט שעוברים בדקה אחת.
  • OTPM (Output Tokens Per Minute) - סך טוקני הפלט שחוזרים בדקה אחת.

כל אחת מהמגבלות נמדדת בנפרד. אפשר להיתקע על RPM גם אם הטוקנים בכמות סבירה - או להיתקע על ITPM גם אם מספר הבקשות נמוך.

02קריאת השגיאה

להבין את התשובה של 429

כשהשרת חוזר עם 429, התשובה כוללת כותרות שעוזרות להבין מה קרה ומתי אפשר לנסות שוב:

HTTP/1.1 429 Too Many Requests
retry-after: 12
anthropic-ratelimit-requests-limit: 50
anthropic-ratelimit-requests-remaining: 0
anthropic-ratelimit-requests-reset: 2026-05-24T13:45:00Z
anthropic-ratelimit-input-tokens-limit: 50000
anthropic-ratelimit-input-tokens-remaining: 15000
anthropic-ratelimit-output-tokens-limit: 10000
anthropic-ratelimit-output-tokens-remaining: 0

בדוגמה הזו, output tokens הם המגבלה שנפגעה - remaining: 0. הכותרת retry-after אומרת כמה שניות להמתין.

03retry

לממש exponential backoff

הפתרון הסטנדרטי: אם קיבלתם 429, חכו, ונסו שוב. במקום להמתין זמן קבוע, השתמשו ב-exponential backoff - הזמן בין ניסיונות גדל בהדרגה.

async function callWithRetry(payload, maxRetries = 5) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    const res = await fetch(API_URL, payload);

    if (res.status !== 429) return res;

    const retryAfter = res.headers.get("retry-after");
    const wait = retryAfter
      ? parseInt(retryAfter, 10) * 1000
      : Math.min(1000 * Math.pow(2, attempt), 30000);

    await new Promise(r => setTimeout(r, wait));
  }
  throw new Error("Rate limit exceeded after retries");
}

הקוד נשען על retry-after כשהוא קיים, ונופל אחורה ל-backoff מעריכי (1, 2, 4, 8, 16 שניות, מקסימום 30) אם אין.

04מניעה

לכוון את הקצב מראש

Retry זה תיקון, לא מניעה. אם האפליקציה מנסה לשלוח 100 בקשות בדקה כשהמגבלה היא 50 - חצי מהבקשות יתחילו עם retry. הפתרון: להגביל את הקצב מצד הלקוח.

טיפ

ספריות כמו bottleneck ל-Node או aiolimiter ל-Python נותנות לכם להגדיר מקסימום בקשות לשנייה, והן מפיקות תור פנימי שמכבד את המגבלה. עדיף להמתין 200 מילישניות מאשר לקבל 429 ולחכות 60 שניות.

05שדרוג

להעלות את הדרגה

המגבלות תלויות בדרגת השימוש שלכם בקונסולה של אנתרופיק. כל חשבון מתחיל בדרגה 1 ועולה אוטומטית ככל שמשתמשים. אפשר גם לבקש העלאה ידנית.

  • Tier 1 - 50 בקשות לדקה, 50K טוקני קלט, 10K פלט.
  • Tier 2 - 1,000 בקשות לדקה, 100K קלט, 20K פלט.
  • Tier 3-4 - הרבה יותר, ועולה ידנית.

המספרים מעודכנים בקונסולה. בקשת העלאה ידנית בדרך כלל מאושרת תוך 1-2 ימי עסקים אם יש לכם היסטוריית שימוש סבירה.

06פיזור

לפזר עומס על פני זמן

לא כל משימה דורשת תשובה מיידית. אם יש לכם פעולה רקעית - תיוג של 10,000 מסמכים, סיכום של ארכיון - אל תשלחו את הכל בבת אחת.

  • Batch API - לעיבוד אצוות, מחיר חצי, תשובה תוך 24 שעות.
  • תור פנימי - לשמור משימות במסד נתונים ולעבד אותן בקצב קבוע ברקע.
  • שעות שפל - אם הביקוש שלכם מתרכז בשעות מסוימות, שמרו עבודות לא דחופות לשעות אחרות.

שלוש מלכודות נפוצות

דברים שמייצרים 429 מיותר
מלכודת 01

retry בלי גבול

לולאה אינסופית של retry על 429 לא תפתור כלום - היא רק תבזבז זמן. הציבו תקרה (5-10 ניסיונות) ואז תכשלו במפורש.

מלכודת 02

קריאות מקבילות בלי מגבלה

10 משתמשים שמשגרים בקשות במקביל = 10 בקשות בו-זמנית. ללא ניהול תור, התקרה תיפגע מהר מאוד. מגבילי קצב הם חובה.

מלכודת 03

retry על כל שגיאה

לא כל שגיאה צריכה retry. 400 (בקשה לא תקינה) ו-401 (אימות נכשל) יחזרו תמיד. רק 429 ו-5xx מצדיקים retry.