قرارداد محدودیت نرخ API

سقف فراخوانی هر نقطه پایانی عمومی مکس‌پوینت، پنجره زمانی و هدرهای استاندارد پاسخ 429 Too Many Requests — برای توسعه‌دهندگان و یکپارچه‌سازان.

فعال بدون نیاز به تنظیمات به‌روزرسانی: ۲۰۲۶-۱۱-۰۱
سقف‌های اعمال‌شده

محدودیت‌ها بر پایه IP + مسیر اعمال می‌شوند (کلید کلاینت از REMOTE_ADDR یا اولین هاپ X-Forwarded-For). با رسیدن به سقف، پاسخ 429 بازگردانده می‌شود و کد کنترلر هرگز اجرا نمی‌شود.

نقطه پایانی سقف پنجره دامنه توضیح
POST /api/auth/register ۱۰ بار هر ۱ دقیقه هر IP ثبت‌نام
POST /api/auth/login ۱۰ بار هر ۱ دقیقه هر IP ورود با رمز
POST /api/auth/send-code ۶ بار هر ۱ دقیقه هر IP ارسال کد یک‌بارمصرف — پرتکرارترین سطح سوءاستفاده
POST /api/auth/callback/credentials ۱۰ بار هر ۱ دقیقه هر IP ورود با اعتبارنامه
POST /api/auth/signin ۱۰ بار هر ۱ دقیقه هر IP ورود
POST /api/admin/settings/unlock ۵ بار هر ۱۰ دقیقه هر حساب قفل تنظیمات — علاوه بر محدودیت مسیر (۱۰ در دقیقه)، پنجره ضدحمله رایو برای هر حساب
POST /api/admin/ai/process-exam/{attemptId} ۳۰ بار هر ۱ ساعت هر IP تحلیل هوش مصنوعی آزمون — سقف روزانه بودجه AI نیز جداگانه اعمال می‌شود
POST /api/admin/ai/recommendations/{userId} ۳۰ بار هر ۱ ساعت هر IP توصیه‌های هوش مصنوعی — همان بودجه
POST OTP verify ۱۰ بار هر ۱۰ دقیقه حساب + IP بررسی کد یک‌بارمصرف — ۲۰ تلاش از هر IP نیز سقف دارد
هدرهای پاسخ 429

هر پاسخ 429 این هدرهای استاندارد را حمل می‌کند؛ کتابخانه کلاینت باید پیش از تلاش مجدد، Retry-After را رعایت کند.

HTTP/1.1 429 Too Many Requests
Retry-After: 56
X-RateLimit-Limit: 10
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1789362697
  • Retry-After — ثانیه تا پذیرش درخواست بعدی (همیشه ≥ ۱).
  • X-RateLimit-Limit — سقف پیکربندی‌شده پنجره.
  • X-RateLimit-Remaining — روی درخواست رد‌شده همیشه صفر.
  • X-RateLimit-Reset — زمان انقضای کل پنجره (یونیکس).
نکات فنی
  • درخواست‌های مجاز هیچ هدر اضافه‌ای حمل نمی‌کنند — تزئین 429 فقط روی پاسخ رد‌شده است.
  • محاسبه هدرها best-effort است؛ خرابی فایل شمارشگر هرگز یک 429 را به خطای 500 تبدیل نمی‌کند.
  • شمارشگرها بیرون از ریشه وب ذخیره می‌شوند و سطل‌های منقضی به‌طور احتمالاتی پاک‌سازی می‌شوند.
  • سقف‌ها مقادیر پیش‌فرض کد هستند؛ برای تغییر یک مسیر، ->throttle(N, M) همان مسیر تغییر می‌کند.