حدود المعدّل
واجهة API مقيّدة المعدّل لكلّ مفتاح API (مع الرجوع إلى عنوان IP للعميل في حالة الطلب غير المُصادَق عليه). يضبط Suede الحدّ والنافذة وقد يغيّرهما، لذا اقرأهما من ترويسات الاستجابة بدلًا من تثبيت رقم في الكود.
الترويسات
تتضمّن كلّ استجابة /v1:
| الترويسة | المعنى |
|---|---|
X-RateLimit-Limit |
الحدّ الأقصى للطلبات المسموح بها في النافذة الحالية. |
X-RateLimit-Remaining |
الطلبات المتبقّية في النافذة الحالية. |
X-RateLimit-Reset |
ثانية حقبة يونكس التي تُعاد عندها النافذة. |
عندما تتجاوز الحدّ، تستجيب واجهة API بـHTTP 429 وترويسة Retry-After (عدد الثواني التي يجب الانتظار):
{ "error": { "type": "rate_limited", "message": "Rate limit exceeded. Slow down and retry after the reset.", "request_id": "…" } }
معالجة 429
تراجَع وأعِد المحاولة بعد Retry-After ثانية. نمط بسيط وموثوق:
# Inspect your current budget from the headers of any response. curl -sD - -o /dev/null "https://api.suede.io/v1/search?q=test" \ -H "Authorization: Bearer $SUEDE_API_KEY" | grep -i '^x-ratelimit'
async Task<HttpResponseMessage> GetWithRetryAsync(HttpClient http, string url) { while (true) { var res = await http.GetAsync(url); if (res.StatusCode != System.Net.HttpStatusCode.TooManyRequests) return res; var wait = res.Headers.RetryAfter?.Delta ?? TimeSpan.FromSeconds(1); await Task.Delay(wait); } }
async function getWithRetry(url, init) { for (;;) { const res = await fetch(url, init); if (res.status !== 429) return res; const wait = Number(res.headers.get("retry-after") ?? "1") * 1000; await new Promise((r) => setTimeout(r, wait)); } }
تقييد المعدّل مستقلّ عن الفوترة. راجع الأخطاء لاستجابات 402 التي تُعاد عندما تكون عضويّتك
غير نشطة أو رصيد ائتمانك فارغًا.