ترقيم الصفحات
تُقسَّم قوائم واجهة Sursa API إلى صفحات باستخدام مؤشر: تطلب ما يصل إلى limit من العناصر، وتخبرك الاستجابة
بكيفية الحصول على الصفحة التالية. لا تحسب الإزاحات أبدًا، ولا تتكرر العناصر ولا تضيع بين الصفحات إذا تغيّرت البيانات
في أثناء ذلك.
| المعامل | القيمة |
|---|---|
limit | عدد العناصر في الصفحة، عادةً من 1 إلى 200. القيمة الافتراضية في القوائم الجديدة 50؛ ويعرض المرجع المدى والقيمة الافتراضية لكل قائمة. |
cursor | المؤشر من الصفحة السابقة. لا ترسله للصفحة الأولى. |
تعيد القائمة مؤشرها التالي بإحدى طريقتين، بحسب شكل استجابتها. وتبيّن صفحة كل نقطة نهاية في مرجع API أيهما تستخدم.
القوائم ذات غلاف data
تعيد القوائم المضافة لواجهة API العامة، مثل سجل الأحداث، كائنًا فيه العناصر داخل data:
curl "https://api.sursa.com/v1/webhook-events?limit=2" \
-H "Authorization: Bearer $SURSA_API_KEY"{
"data": [
{"id": "evt_8a1f…", "type": "card.published", "created_at": "2026-10-24T10:00:00Z"},
{"id": "evt_8a20…", "type": "card.updated", "created_at": "2026-10-24T10:00:03Z"}
],
"next_cursor": "eyJ2IjoxLCJrIjpbMTA0Ml19",
"has_more": true
}
حين تكون قيمة has_more هي true، اطلب الصفحة التالية مع cursor بقيمة next_cursor وعوامل التصفية نفسها:
curl "https://api.sursa.com/v1/webhook-events?limit=2&cursor=eyJ2IjoxLCJrIjpbMTA0Ml19" \
-H "Authorization: Bearer $SURSA_API_KEY"القوائم التي وُجدت قبل المؤشرات وتعيد كائنًا تحتفظ بغلافها الخاص (مثل {"items": […], "total": 120}). ويُضاف
إليها next_cursor وhas_more في الكائن نفسه، وتبقى العناصر في مكانها.
القوائم التي تعيد مصفوفة
قلة من القوائم تعيد مصفوفة JSON مجردة، مثل GET /v1/collections. ولا
يمكن تغيير شكل استجابتها، لذا تأتي الصفحة التالية في الترويسات بدلًا من ذلك:
curl -i "https://api.sursa.com/v1/collections?limit=50" \
-H "Authorization: Bearer $SURSA_API_KEY"HTTP/1.1 200 OK
Link: <https://api.example.com/v1/collections?limit=50&cursor=eyJ2IjoxLCJrIjpbNTBdfQ>; rel="next"
X-Next-Cursor: eyJ2IjoxLCJrIjpbNTBdfQ
[{"id": 1, "name": "support", …}, …]
- الترويسة
Linkمعrel="next"هي العنوان الكامل للصفحة التالية؛ وX-Next-Cursorهي المؤشر نفسه وحده. - غياب
Linkمعrel="next"وغيابX-Next-Cursorيعنيان أن هذه هي الصفحة الأخيرة. - بلا
limit، تعيد هذه القوائم كل العناصر في استجابة واحدة، كما كانت تفعل دائمًا. مرّرlimitلتقسيمها إلى صفحات؛ فالمؤشر يتذكر حجم الصفحة، ويمكن للطلب التالي ألا يرسلlimit. - العملية
GET /v1/cardsاستثناء: فهي تعيد صفحات دائمًا، 200 بطاقة افتراضيًا وحتى 1000 معlimit، لذا اتبعX-Next-Cursorحتى بلاlimit.
// Every item of a list that returns an array.
async function* listArray(path) {
let next = `https://api.sursa.com${path}?limit=200`;
while (next) {
const response = await fetch(next, { headers: { Authorization: `Bearer ${process.env.SURSA_API_KEY}` } });
if (!response.ok) throw new Error(`HTTP ${response.status}`);
yield* await response.json();
const cursor = response.headers.get("X-Next-Cursor");
next = cursor ? `https://api.sursa.com${path}?cursor=${encodeURIComponent(cursor)}` : null;
}
}سجل الأحداث
سجل الأحداث GET /v1/webhook-events قائمة متتابعة زمنيًا، لذا يُقسَّم
إلى صفحات بطريقة مختلفة قليلًا:
- الأحداث بترتيب تصاعدي، الأقدم أولًا.
- يُعاد
next_cursorفي كل صفحة، حتى حين تكون قيمةhas_moreهيfalse. احفظه، واطلب لاحقًا بالمؤشر نفسه لتحصل على الأحداث التي وقعت منذ ذلك الحين. فالسجل قائمة انتظار تقرؤها بالوتيرة التي تناسبك. - يظهر الحدث في السجل خلال ثانية تقريبًا من التغيير الذي يصفه، ولا يظهر أبدًا قبل حدث سبقت قراءته.
- يضم السجل أحداث المؤسسة كلها، لذا تتطلب قراءته مفتاحًا بالدور
adminوالنطاقwebhooks:manage.
يعرض دليل التصدير إلى مستودع البيانات حلقة استطلاع كاملة.
قواعد المؤشرات
- المؤشر سلسلة نصية غير شفافة حتى 512 حرفًا. لا تحلّله ولا تبنِه بنفسك: فصيغته قد تتغيّر.
- يخص المؤشر قائمة واحدة وعوامل تصفية محددة. والمؤشر التالف، أو الآتي من قائمة أخرى، أو المرسَل مع عوامل تصفية
مختلفة يعيد الحالة
400مع الرمزapi.cursor_invalid. - لكل قائمة ترتيب فرز ثابت ينتهي بمفتاح فريد، فيظهر كل عنصر في صفحة واحدة بالضبط.
- القوائم المضافة بالمؤشرات لا تعيد العدد الإجمالي؛ أما القوائم التي كان لها الحقل
totalمن قبل فتحتفظ به. عُدّ العناصر أثناء القراءة إن احتجت إلى الإجمالي.
ترقيم الصفحات بالإزاحة
بعض القوائم كانت تقبل offset قبل إدخال المؤشرات، ولا تزال تقبله، كي تبقى التكاملات القائمة عاملة. فضّل cursor في
الشيفرة الجديدة. ولا يمكن الجمع بين offset وcursor: إرسالهما معًا يعيد الحالة 422 مع الرمز
validation.failed.