LinkHarbor API فی منٹ کتنی ریکویسٹس کی اجازت دیتا ہے، ریکویسٹ کتنی بڑی ہو سکتی ہے، ہیڈرز کیسے پڑھیں اور 429 کو درست طریقے سے کیسے سنبھالیں۔
API کو سب کے لیے تیز رکھنے کے لیے LinkHarbor فی منٹ ریکویسٹس کی تعداد محدود کرتا ہے۔ یہ حدیں آپ کے پلان پر منحصر نہیں – API کالز کا کوئی ماہانہ کوٹہ نہیں ہے۔ یہ مضمون ہر حد کی فہرست دیتا ہے اور دکھاتا ہے کہ آپ کا کوڈ انہیں صاف طریقے سے کیسے سنبھال سکتا ہے۔
ریکویسٹس کیسے گنی جاتی ہیں
- ہر ریکویسٹ بالکل ایک بکٹ میں آتی ہے، مثلاً تصدیق شدہ ریکویسٹس کے لیے user یا ٹوکن کے تبادلے کے لیے token
- گنتی پورے منٹ (UTC) کے حساب سے ہوتی ہے؛ ہر نئے منٹ کے ساتھ کاؤنٹر پھر صفر سے شروع ہوتا ہے
- بکٹ کے لحاظ سے API فی ورک اسپیس، فی شخص، فی کنکشن یا فی IP پتہ گنتا ہے
- جو ریکویسٹس ٹوکن، اسکوپ یا اسکیما پر ہی ناکام ہو جائیں (401، 403 insufficient_scope، 400، اسکیما چیک سے 422 validation_failed) وہ نہیں گنی جاتیں؛ بعد کی خرابیاں جیسے 403 feature_not_available گنی جاتی ہیں
تمام حدیں
| بکٹ (X-RateLimit-Bucket) | حد | گنتی فی | لاگو ہوتی ہے |
|---|---|---|---|
| user | 600 فی منٹ | API کلیدوں کے ٹوکنز کے لیے ورک اسپیس (ورک اسپیس کی تمام کلیدیں اور AI ٹولز مل کر)؛ ڈیش بورڈ سائن اِن کے لیے شخص | /v1 کی وہ تمام تصدیق شدہ ریکویسٹس جن کا اپنا کوئی بکٹ نہیں |
| token | 30 فی منٹ | IP پتہ | POST /v1/token |
| public | 120 فی منٹ | IP پتہ | بغیر تصدیق کے API کی ریکویسٹس، جیسے GET /v1/plans اور GET /v1/pages/available |
| callback | 120 فی منٹ | IP پتہ | POST /v1/callbacks/sale |
| internal | 120 فی منٹ | IP پتہ | “Custom (API)” انٹیگریشن کا انجیسٹ URL (POST /v1/ingest/{id}) |
| mcp | 120 فی منٹ | AI کنکشن (ایکسیس ٹوکن) | /mcp پر MCP سرور |
| oauth | 300 فی منٹ | IP پتہ | AI اسسٹنٹس کے لیے OAuth سائن اِن اور ڈسکوری |
| auth | 30 فی منٹ | IP پتہ | لاگ اِن، رجسٹریشن، پاس ورڈ ری سیٹ (ڈیش بورڈ اور ایپ) |
| refresh | 120 فی منٹ | IP پتہ | ڈیش بورڈ سیشن کی توسیع |
| discover | 60 فی منٹ | شخص، سائن اِن نہ ہونے پر IP پتہ | ایپ کا Discover حصہ |
| subs_read | 120 فی منٹ | شخص، سائن اِن نہ ہونے پر IP پتہ | آپ کے فالو کیے ہوئے صفحات پڑھنا (ایپ) |
| subs_write | 20 فی منٹ | شخص، سائن اِن نہ ہونے پر IP پتہ | آپ کے فالو کیے ہوئے صفحات تبدیل کرنا (ایپ) |
ہر ورک اسپیس کا ایک بجٹ
ایک ہی ورک اسپیس کی API کلیدوں کے تمام ٹوکنز فی منٹ 600 ریکویسٹس مل کر استعمال کرتے ہیں – چاہے آپ کتنی ہی کلیدیں بنائیں۔ منسلک AI اسسٹنٹس کے ٹولز بھی یہاں گنے جاتے ہیں، کیونکہ وہ اندرونی طور پر API کو کال کرتے ہیں۔ اس لیے زیادہ کلیدیں حد نہیں بڑھاتیں۔ اگر بہت سا بوجھ کئی پروگراموں میں بٹا ہو تو مشترکہ بجٹ کو مدنظر رکھ کر منصوبہ بنائیں۔
ہیڈرز
- X-RateLimit-Limit
- بکٹ کی فی منٹ حد، مثلاً 600۔
- X-RateLimit-Remaining
- موجودہ منٹ میں کتنی ریکویسٹس باقی ہیں۔
- X-RateLimit-Bucket
- وہ بکٹ جس میں ریکویسٹ آئی، مثلاً user۔
- Retry-After
- صرف 429 rate_limited کے ساتھ: اگلا منٹ شروع ہونے تک سیکنڈز۔ api_key_locked کے ساتھ انتظار کا وقت details.retry_after_sec میں ہوتا ہے۔
جب حد پوری ہو جائے
حد پوری ہونے پر API، HTTP 429 اور اس باڈی کے ساتھ جواب دیتا ہے۔ message میں متن اکاؤنٹ کی زبان میں ہوتا ہے (دیکھیں API خرابی کا فارمیٹ)، یہاں انگریزی میں۔ rate_limited کوڈ پر انحصار کریں:
HTTP/1.1 429 Too Many Requests
Retry-After: 37
X-RateLimit-Limit: 600
X-RateLimit-Remaining: 0
X-RateLimit-Bucket: user
{ "error": "rate_limited", "message": "Too many requests. Please try again in a moment.", "retry_after_sec": 37 } - Retry-After یا retry_after_sec پڑھیں
- کم از کم اتنے سیکنڈ انتظار کریں، اور تھوڑا سا بے ترتیب وقت ملائیں تاکہ تمام پروسیس ایک ہی لمحے دوبارہ شروع نہ ہوں
- ریکویسٹ زیادہ سے زیادہ چند بار دوبارہ آزمائیں
- اگر بار بار 429 ملے تو کام کو زیادہ وقت پر پھیلائیں
const BASE = 'https://dock.at-harbor.com';
let cached = null; // { token, expiresAt }
async function getToken() {
if (cached && Date.now() < cached.expiresAt - 60_000) return cached.token;
const res = await fetch(BASE + '/v1/token', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
key_id: process.env.LH_KEY_ID,
key_secret: process.env.LH_KEY_SECRET,
}),
});
if (!res.ok) throw new Error('Token exchange failed: HTTP ' + res.status);
const data = await res.json();
cached = { token: data.token, expiresAt: Date.now() + data.expires_in * 1000 };
return cached.token;
}
async function lh(method, path, body, attempt = 0) {
const headers = { Authorization: 'Bearer ' + (await getToken()) };
if (body !== undefined) headers['Content-Type'] = 'application/json';
const res = await fetch(BASE + path, {
method,
headers,
body: body === undefined ? undefined : JSON.stringify(body),
});
if (res.status === 429 && attempt < 3) {
const wait = Number(res.headers.get('Retry-After') ?? 5);
await new Promise((r) => setTimeout(r, (wait + Math.random() * 2) * 1000));
return lh(method, path, body, attempt + 1);
}
if (res.status === 401 && attempt === 0) {
cached = null; // token expired – try once more with a new token
return lh(method, path, body, attempt + 1);
}
const data = await res.json().catch(() => null);
if (!res.ok) throw new Error((data && data.error) + ' (HTTP ' + res.status + ')');
return data;
}
// Example: const { items } = await lh('GET', '/v1/pages'); بڑی مقدار میں ڈیٹا کے لیے مشورے
- ٹوکن کیش کریں اور اسے 15 منٹ میں مدت ختم ہونے سے کچھ پہلے ہی نیا کریں
- X-RateLimit-Remaining پر نظر رکھیں اور کم ہونے پر رفتار کم کریں
- درجنوں متوازی کنکشنز کے بجائے ریکویسٹس ایک کے بعد ایک بھیجیں
- ہر صفحے کو الگ سے پوچھنے کے بجائے فہرستیں ایک بار لوڈ کر کے مقامی طور پر فلٹر کریں
- بڑے سنک کئی منٹوں پر پھیلائیں
- 5xx خرابیوں کو بڑھتے وقفوں کے ساتھ دوبارہ آزمائیں، لیکن 4xx خرابیوں کو نہیں
دیگر حدیں
| کیا | حد | جواب |
|---|---|---|
| ناکام لاگ اِن | فی ای میل ایڈریس اور IP، 5، 10 اور 20 ناکام کوششوں کے بعد لاک: 60 سیکنڈ، 5 منٹ، 30 منٹ | 429 account_locked |
| فارم جمع کرانا | فی گھنٹہ اور فی IP پتہ 10، تمام فارمز میں مل کر | 429 form_rate_limited |
ٹوکن کے تبادلے میں ناکام کوششیں کلید اور IP کو عارضی طور پر لاک کر دیتی ہیں، دیکھیں API کلیدیں اور ٹوکنز۔ پش نوٹیفکیشنز آپ صرف ڈیش بورڈ میں بھیجتے ہیں؛ ان کی حدیں فالوورز اور پش نوٹیفکیشنز میں بیان کی گئی ہیں۔
آپ کے پلان کی مواد کی حدیں – صفحات، لنکس، بلاکس، مختصر لنکس وغیرہ – ریٹ لمٹس نہیں بلکہ مقررہ حدیں ہیں۔ ان کی فہرست پلانز کا موازنہ میں ہے۔
ریکویسٹ کا سائز
ہر باڈی کو API کے پڑھنے سے پہلے ناپا جاتا ہے۔ یہ کتنی بڑی ہو سکتی ہے، یہ اینڈپوائنٹ پر منحصر ہے:
| اینڈپوائنٹس | سب سے بڑی باڈی |
|---|---|
| لاگ اِن، رجسٹریشن اور /v1/auth کے تحت باقی بغیر تصدیق کالز، POST /v1/token، POST /v1/oauth/exchange، /oauth کے تحت AI اسسٹنٹس کے OAuth اینڈپوائنٹس اور ان کی رضامندی، POST /v1/ingest/{id}، “سپورٹ کریں” بلاک کا چیک آؤٹ، ایپ کی سبسکرپشن کالز (فالو کرنا، کلیکشنز، پش ڈیوائسز)، ورک اسپیس بدلنا، POST /v1/auth/logout-all، اکاؤنٹ حذف کرنا، دو مرحلہ تصدیق کا سیٹ اپ، دعوت قبول کرنا، ریفرل پروگرام فعال کرنا اور انٹیگریشن جوڑتے وقت واپسی کا مرحلہ | 64 KB |
| باقی تمام JSON اینڈپوائنٹس، بشمول کسی صفحے پر فارم جمع کرانا | 1 MB |
| POST /v1/webhooks/{id}/verify-signature اور /mcp پر MCP سرور | 2 MB |
| فائل اپ لوڈز (POST /v1/assets اور POST /v1/pages/{id}/uploads، multipart/form-data) | پوری ریکویسٹ کے لیے 11 MB، خود فائل زیادہ سے زیادہ 10 MB |
اگر باڈی بڑی ہو تو API، 413 request_too_large سے جواب دیتا ہے؛ details.max_bytes اور details.max_kb حد بتاتے ہیں۔ اپ لوڈ میں بہت بڑی فائل 413 payload_too_large کا سبب بنتی ہے۔ بغیر باڈی والے اینڈپوائنٹس، جیسے DELETE کالز، کوئی باڈی یا صرف {} قبول کرتے ہیں۔
HTTP/1.1 413 Payload Too Large
{ "error": "request_too_large", "message": "…", "details": { "max_bytes": 65536, "max_kb": 64 }, "request_id": "…" } باڈی کے اندر بھی حدیں ہیں: ہر متن کی زیادہ سے زیادہ لمبائی، ہر فہرست میں اندراجات کی زیادہ سے زیادہ تعداد، اور نامعلوم فیلڈز مسترد کر دی جاتی ہیں۔ قدریں API ریفرنس میں ہر اینڈپوائنٹ کے لیے درج ہیں۔ خلاف ورزی 422 validation_failed کا سبب بنتی ہے، اور details میں فیلڈ، قاعدہ اور حد کا نام ہوتا ہے۔ کسی ریکویسٹ کا پاتھ اور کوئری اسٹرنگ مل کر زیادہ سے زیادہ 16 KB لمبے ہو سکتے ہیں۔
یہ بھی آپ کے کام آ سکتا ہے
کچھ نہیں ملا؟
ہمیں بتائیں کہ آپ کو کیا چاہیے، ہماری سپورٹ ٹیم ذاتی طور پر آپ کی مدد کرے گی۔