ناونیشانی APIی دامەزراوەکەت و زانیاریی نهێنیی سنووردار بەکاربهێنە. بە داواکارییەکی خوێندنەوە دەست پێ بکە، وەڵامەکە بپشکنە و نهێنییەکان لە سەرچاوەکۆد و نموونەکانی بەڵگەنامە دوور بهێڵەوە.
Quire یەک APIی گشتی هەیە: REST لەسەر HTTPS، کە بە بەڵگەنامەی OpenAPI 3.1 وەسف کراوە؛ لەگەڵ webhookی واژۆکراو بۆ ڕووداوەکان و ڕاژەکاری MCP بۆ یاریدەدەرانی AI. سەرچاوەی API هەموو خاڵەکانی کۆتایی و ڕووداوەکان لیست دەکات.
ناونیشانەکان
هەر دامەزراوەیەک ناونیشانی تایبەتی خۆی هەیە، و API لە ژێری کار دەکات:
https://acme.quirelms.com/api/v1/coursesزانیاریی نهێنی دامەزراوەکە دیاری دەکات. کلیلێک بۆ دامەزراوەیەک لە ناونیشانی دامەزراوەیەکی تر بەکاربهێنرێت ڕەت دەکرێتەوە.
بەڵگەنامەی OpenAPI لە هەر ناونیشانی دامەزراوەیەکدا لە /api/v1/openapi.json پێشکەش دەکرێت، بۆیە دروستکەرەکانی کڕیار هەمیشە وەشانی ئەو APIیە دەبینن کە پەیوەندییان پێوە کردووە.
پشتڕاستکردنەوە
کلیلەکانی API بۆ سکریپت و یەکخستنی ڕاژە بۆ ڕاژەن. بەڕێوەبەر لە /admin/integrations/api-keys یەکێک دروست دەکات، سنوورەکانی هەڵدەبژێرێت و تەنها یەک جار دەیبینێت. وەک tokenی bearer بینێرە:
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ە. سنوورێک دەسەڵاتی token کەم دەکاتەوە؛ هەرگیز نایگەیەنێت بەوەی کەسەکە خۆی نەتوانێت بیکات.
سنوورەکان resource:read، resource:write و resource:deleteن، بۆ نموونە courses:read یان enrolments:write. چوار سنوور تایبەتن و لە شاشەی ڕەزامەندیدا لەگەڵ ئاگادارکردنەوە نیشان دەدرێن: audit:read، roles:write، tenants:write و users:delete.

داواکارییەکان
- لاپەڕەبەندی: هەموو لیستێک بە cursor لاپەڕەبەندی دەکرێت.
limitبنێرە، پاشانnext_cursorیpageوەکcursorبنێرە تاhas_moreڕاستە (نموونەی خوارەوە). offset نییە. - گۆڕانکارییەکانی دوای کاتێک:
updated_sinceئەو شتانە دەگەڕێنێتەوە کە دوای کاتێک گۆڕاون. لەگەڵinclude_deleted=trueبەکاری بهێنە یان/<resource>/deletionsبخوێنەوە بۆ زانینی ئەوەی چی لابراوە. - ناسێنەری دەرەکی: زۆربەی سەرچاوەکان
external_idی خۆت قبووڵ دەکەن، و/<resource>/ext:{external_id}بەو ناسێنەرەوە دەیخوێنێتەوە یان نوێی دەکاتەوە، بۆیە هاوکاتکردن پێویستی بە هەڵگرتنی ناسێنەرەکانی Quire نییە. - Idempotency: لە سەرچێی
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 بڵێ.
Webhookەکان
لە /admin/webhooks یان لە ڕێگەی API لە /webhook_subscriptions خۆتۆمار بکە. ڕووداوەکان بە ناو هەڵبژێرە (enrolment.created)، بە ناوچە (enrolment.*) یان هەموویان (*). سەرەتا Quire، webhook.ping دەنێرێت؛ subscription تەنها کاتێک دەست پێ دەکات کە خاڵی کۆتاییی تۆ وەڵامی بداتەوە.
گواستنەوەکان بەپێی پێوەری Standard Webhooksن:
POST /hooks/quire
webhook-id: 01JB7XQK4Z8FQ2M3N4P5R6S7T8
webhook-timestamp: 1790000000
webhook-signature: v1,g0hM9SsE+OTPJTGt/tmIKtSyZlE3uFJELVlNIOLJ1OE=بۆ پشتڕاستکردنەوەی گەیاندنێک:
- پێش هەر شیکردنەوەیەکی JSON، لە بایتە وردە وەرگیراوەکان
{webhook-id}.{webhook-timestamp}.{raw body}دروست بکە. - بە نهێنیی subscription لەسەری HMAC-SHA256 حیساب بکە و base64ی بکە.
- بە شێوەی کاتی یەکسان بە هەر نرخێکی
v1,لەwebhook-signatureبەراوردی بکە. لەوانەیە لە کاتی گۆڕینی نهێنیدا دوو دانە هەبێت؛ گونجانی هەر یەکێکیان دروستە. - ئەگەر timestamp لە کاتی سیستەمەکەت زیاتر لە پێنج خولەک دوور بێت ڕەتی بکەرەوە.
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، webhookەکان و ڕاژەکاری MCP سەر بە مافی APIی پلانن، و هەر پلانی ئاسایی ئەو مافەی تێدایە. لە پلانێک کە ئەو مافەی نییە، دروستکردنی کلیل، کڕیار یان subscription ڕەت دەکرێتەوە، نووسینەکانی REST و پەیوەندی MCP ڕەت دەکرێنەوە، بەڵام خوێندنەوەکانی REST بەردەوام دەبن بۆ ئەوەی داتا هەناردە بکرێت. ڕەتکردنەوەکە بەڵگەنامەی کێشەیە لەگەڵ کۆدی commerce.plan_entitlement لە پۆلی precondition.
زیادکراوەکان
جۆرە ناوخۆییەکانی چالاکیی Quire، بلۆک، شێوازی تۆمارکردن، شێوازی چوونەژوورەوە، جۆری پرسیار، ڕاپۆرت، ڕووکار و یەکخستن لە ڕێگەی هەمان تۆماری زیادکراوەکان ڕادەگەیەنرێن کە دامەزراندنی خۆبەڕێوەبەر دەتوانێت بە زیادکراوەی خۆی فراوانی بکات. زیادکراوەکان لە ناو بەرنامەکە کۆمپایل دەکرێن: بارکەری زیادکراوەی کاتی کارکردن نییە و دامەزراوەی میوانداریکراو ناتوانێت یەکێک زیاد بکات. بەڕێوەبەران هەر زیادکراوەیەک بۆ دامەزراوەکەیان لە /admin/extensions چالاک یان ناچالاک دەکەن (بڕوانە ڕێنمایی بەڕێوەبەر).
بۆ نووسینی زیادکراوەیەک، لە بلۆکی نموونە و ڕووکاری packages/integration/extensions/src/sample.ts دەست پێ بکە. خاڵی زیادکراوەکە هەڵبژێرە و گرێبەستەکەی لە points.ts بخوێنەوە، پاشان زیادکراوەکە بە ناسێنەر، وەشان، مۆڵەت، ئەوەی پێشکەشی دەکات و ئەوەی پێویستی پێیەتی، و ئایا دامەزراوەیەک دەتوانێت ناچالاکی بکات ڕابگەیەنە. لە شوێنی پێکهێنانی بەرنامەی وێب و worker تۆماری بکە بۆ ئەوەی هەردووکیان هاوڕا بن. تۆمارەکە ڕێساکانی هەر خاڵێک کاتی دروستکردن و هەرکات register بانگ دەکەیت دەپشکنێت، کۆمەڵەیەک کە نادروست دەبێت ڕەت دەکاتەوە و هەموو کێشەکان ناو دەبات، و ئەگەر ئەوە ڕوو بدات تۆمارەکە بەبێ گۆڕانکاری دەمێنێتەوە. تاقیکردنەوەکانی زیادکراوەکە دەبێت پشتڕاست بکەنەوە extensionContractProblems بۆی بەتاڵە و ناچالاککردنی کاریگەرییەکەی دەگۆڕێت.