استخدم عنوان API الخاص بمؤسستك وبيانات اعتماد محددة النطاقات. ابدأ بطلب قراءة، وافحص الاستجابة، واحفظ الأسرار خارج التحكم بالمصدر وأمثلة الوثائق.
لدى Quire واجهة API عامة واحدة: REST عبر HTTPS موصوفة بمستند OpenAPI 3.1، وخطافات ويب موقعة للأحداث، وخادم MCP لمساعدات الذكاء الاصطناعي. يسرد مرجع API كل نقطة نهاية وحدث.
العناوين
لكل مؤسسة عنوانها، وتوجد API ضمنه:
https://acme.quirelms.com/api/v1/coursesتحدد بيانات الاعتماد المؤسسة. ويُرفض استخدام مفتاح مؤسسة على عنوان مؤسسة أخرى.
يُقدم مستند OpenAPI على /api/v1/openapi.json في عنوان أي مؤسسة، لذا ترى مولدات العملاء دائمًا الإصدار الذي تستدعيه.
المصادقة
تُستخدم مفاتيح API للبرامج النصية والتكاملات بين الخوادم. ينشئ المسؤول مفتاحًا في /admin/integrations/api-keys ويختار نطاقاته ولا يراه إلا مرة واحدة. أرسله كرمز حامل:
curl -H "Authorization: Bearer qk_live_..." https://acme.quirelms.com/api/v1/users?limit=50تبدأ المفاتيح بـqk_live_ أو qk_test_. خصص مفتاحًا لكل تكامل.
يُستخدم OAuth 2.1 للتطبيقات التي تعمل بصفتها شخصًا مسجل الدخول. سجّل عميلًا في /admin/integrations/oauth-clients، ثم استخدم تدفق رمز التفويض مع PKCE (/oauth/authorize و/oauth/token) أو بيانات اعتماد العميل لعميل آلي. يتوفر الاكتشاف في /.well-known/oauth-authorization-server. يضيّق النطاق ما يمكن للرمز فعله، ولا يمنحه صلاحيات أكثر مما لدى الشخص.
النطاقات هي resource:read وresource:write وresource:delete، مثل courses:read أو enrolments:write. أربعة نطاقات ذات امتيازات خاصة وتظهر معها علامة تحذير في شاشة الموافقة: audit:read وroles:write وtenants:write وusers:delete.

الطلبات
- تقسيم الصفحات: تستخدم كل قائمة تقسيمًا بمؤشر. أرسل
limitثم مررnext_cursorمنpageكقيمةcursorما دامتhas_moreتساوي true (انظر المثال أدناه). لا يوجد ترقيم بالإزاحة. - التغييرات منذ وقت معين: تعيد
updated_sinceما تغير بعد وقت معين. اقرنها بـinclude_deleted=trueأو اقرأ/<resource>/deletionsلمعرفة ما أُزيل. - معرّفات خارجية: تقبل معظم الموارد
external_idخاصًا بك، ويقرأ/<resource>/ext:{external_id}السجل أو ينشئه ويحدّثه بحسب هذا المعرف، فلا تحتاج عملية المزامنة إلى تخزين معرّفات Quire. - مفتاح عدم التكرار: أرسل رأس
Idempotency-KeyمعPOSTوPATCHوDELETE. تعيد المحاولة بالمفتاح نفسه الاستجابة الأولى بدل تنفيذ العمل مرتين. وتتطلب نقاط النهاية المجمعة هذا الرأس. - الإصدارات: يوجد الإصدار الرئيسي في المسار (
/v1). ويحدد رأسQuire-Versionمراجعة مؤرخة لكل تغيير غير متوافق، مثلQuire-Version: 2026-09-20. ودون الرأس تحصل على المراجعة الحالية عند إصدار بيانات اعتمادك.
صفحة من قائمة:
{"data": [...], "page": {"next_cursor": "eyJ2Ijox...", "has_more": true, "limit": 100}}الأخطاء
يأتي كل خطأ في مستند مشكلة وفق RFC 9457:
{"type": "https://quire.com/errors/enrolment.seat_limit_reached",
"title": "Seat limit reached", "status": 409,
"code": "enrolment.seat_limit_reached", "category": "conflict",
"detail": "The course has no seats left, so this enrolment was not created. ...",
"request_id": "01JB7XQK4Z..."}استخدم code لاتخاذ القرار، فهو ثابت؛ أما detail فمكتوب للأشخاص ويمكن عرضه لهم وقد يتغير. وإذا لم تتعرف إلى الرمز، فصنّف حسب category:
| الفئة | الحالة | إعادة المحاولة |
|---|---|---|
validation |
422، مع تفاصيل الحقول في errors |
لا |
authentication |
401 | لا |
authorization |
403 | لا |
not_found |
404 | لا |
conflict |
409 | أحيانًا |
precondition |
412 | لا |
quota |
402 للخطة، 413 للحجم | لا |
rate_limit |
429، مع Retry-After |
نعم |
upstream |
502 أو 504 | نعم |
internal |
500 | نعم |
اذكر request_id عند التواصل مع الدعم.
خطافات الويب
اشترك في /admin/webhooks أو عبر API من خلال /webhook_subscriptions. اختر الأحداث بالاسم (enrolment.created) أو المجال (enrolment.*) أو كلها (*). يرسل Quire أولًا webhook.ping؛ ويبدأ الاشتراك بعد أن ترد عليه نقطة النهاية.
تتبع عمليات التسليم مواصفة Standard Webhooks:
POST /hooks/quire
webhook-id: 01JB7XQK4Z8FQ2M3N4P5R6S7T8
webhook-timestamp: 1790000000
webhook-signature: v1,g0hM9SsE+OTPJTGt/tmIKtSyZlE3uFJELVlNIOLJ1OE=للتحقق من عملية التسليم:
- كوّن النص
{webhook-id}.{webhook-timestamp}.{raw body}من البايتات المستلمة نفسها قبل تحليل JSON. - احسب HMAC-SHA256 عليه بسر الاشتراك ثم حوّله إلى base64.
- قارن بقيم
v1,فيwebhook-signatureفي وقت ثابت. قد توجد قيمتان أثناء تدوير السر؛ ويكفي تطابق إحداهما. - ارفض طابعًا زمنيًا يبعد أكثر من خمس دقائق عن ساعتك.
import { createHmac, timingSafeEqual } from 'node:crypto';
function verify(secret, id, timestamp, rawBody, header) {
if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false;
const expected = createHmac('sha256', Buffer.from(secret.replace(/^whsec_/, ''), 'base64'))
.update(`${id}.${timestamp}.${rawBody}`).digest();
return header.split(' ').some((part) => {
const [version, value] = part.split(',');
const given = Buffer.from(value ?? '', 'base64');
return version === 'v1' && given.length === expected.length && timingSafeEqual(given, expected);
});
}أزل تكرار الأحداث باستخدام webhook-id فقد تصل عملية التسليم أكثر من مرة. يحمل المحتوى المعرّفات وملخصًا قصيرًا؛ استرجع المورد لمعرفة حالته الحالية. يُعاد إرسال عمليات التسليم الفاشلة بمحاولات متباعدة لمدة تصل إلى 72 ساعة، ويمكن تشغيلها مجددًا من سجل التسليم.
MCP
يوجد خادم MCP في Quire على /mcp ضمن عنوان المؤسسة عبر HTTP القابل للبث. ويكتشف عميل MCP خادم OAuth من /.well-known/oauth-protected-resource، ثم يسجل الشخص الدخول ويوافق كما يفعل مع أي عميل OAuth. وتعمل الأدوات بصلاحيات ذلك الشخص، وتطلب الأدوات المدمرة تأكيدًا. ويختار المسؤولون الأدوات المتاحة في /admin/integrations/mcp.

الخطط وAPI
تندرج مفاتيح API وعملاء OAuth وخطافات الويب وخادم MCP ضمن استحقاق API في الخطة، وكل الخطط القياسية تتضمنه. وفي خطة لا تتضمنه، يُرفض إنشاء مفتاح أو عميل أو اشتراك، كما تُرفض كتابات REST واتصالات MCP؛ أما قراءات REST فتظل متاحة لإبقاء البيانات قابلة للتصدير. ويأتي الرفض كمستند مشكلة بالرمز commerce.plan_entitlement ضمن فئة precondition.
الإضافات
تُعرّف أنواع الأنشطة والكتل وطرق التسجيل وتسجيل الدخول وأنواع الأسئلة والتقارير والسمات وعمليات التكامل في Quire عبر سجل الإضافات نفسه الذي يمكن للتثبيت المستضاف ذاتيًا توسيعه. تُضمّن الإضافات عند البناء؛ فلا يوجد محمل إضافات أثناء التشغيل ولا يمكن للمؤسسة المستضافة إضافة واحدة. ويمكن للمسؤولين تفعيل كل إضافة لمؤسستهم أو إيقافها في /admin/extensions (راجع دليل المسؤول).
لبناء إضافة، ابدأ بالكتلة والسمة النموذجيتين في packages/integration/extensions/src/sample.ts. اختر نقطة الإضافة واقرأ عقدها في points.ts، ثم عرّف الإضافة بمعرف وإصدار وترخيص وما توفره وما تحتاج إليه، وما إذا كان يمكن للمؤسسة إيقافها. سجّلها عند تركيب تطبيق الويب والعامل كي يتفقا. يفحص السجل قواعد كل نقطة عند بنائه وكلما استدعيت register، ويرفض مجموعة غير صالحة مع ذكر كل المشكلات، ويبقي السجل كما هو عند الرفض. وينبغي لاختبارات الإضافة أن تؤكد أن extensionContractProblems فارغة لها وأن إيقافها يغير ما تؤثر فيه.