Kayroo Connect
كل ما يحتاجه مطوّر خارجي لقراءة بيانات متجر والتفاعل مع أحداثه Kayroo أو قاعدة بياناتها أو خوادمها.
في هذه الصفحة
Kayroo هي منصّة تجارة إلكترونية (تشبه في بنيتها Shopify) تتيح للتجّار في الجزائر تشغيل متجر إلكتروني — منتجات، طلبات، توصيل، دفع — دون كتابة أي سطر برمجي. "Kayroo Connect" هو اسم طبقة التكامل العامة للمنصّة: واجهة برمجة تطبيقات (API) REST ونظام webhooks يتيحان لتطبيق خارجي التواصل مع متجر تاجر واحد من الخارج.
هذا هو نفس نموذج الثقة المعتمَد في "تطبيقات" Shopify أو إضافات WooCommerce التي تعمل على خادمها الخاص: تطبيقك يعيش بالكامل على بنيتك التحتية الخاصة، في مستودع الكود الخاص بك. لن يحصل إطلاقاً على نسخة من الكود المصدري لـ Kayroo، ولا على بيانات اعتماد قاعدة البيانات، ولا على وصول SSH أو إلى لوحة الإدارة. يمرّ كل تفاعل عبر القناتين الموضّحتين في هذه الصفحة:
لا يوجد اليوم متجر تطبيقات، ولا زر تثبيت عبر OAuth، ولا حساب مطوّر يُنشأ لدى Kayroo. بدلاً من ذلك، صاحب المتجر (التاجر) هو من يمنح تطبيقك الوصول، مباشرة من لوحة إدارته الخاصة. تسير العملية كما يلي:
بمجرد حصولك على رمز من تاجر، يعمل كل طلب بنفس الطريقة: طلب HTTPS من نوع GET يحمل الرمز في ترويسة Authorization، موجَّه إلى نطاق متجر ذلك التاجر، تحت المسار /api/v1.
curl "https://example-store.kayroo.app/api/v1/store" \
-H "Authorization: Bearer kt_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
-H "Accept: application/json"
تبدو الاستجابة الناجحة كما يلي:
{
"data": {
"id": "9f2c1a...",
"name": "Example Store",
"subdomain": "example-store",
"custom_domain": null,
"currency": "DZD",
"language": "fr",
"delivery_fee": 400,
"api_version": "v1"
}
}
يجب أن يتضمّن كل طلب الرمز كـ Bearer token في ترويسة Authorization:
Authorization: Bearer kt_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXX
يمكن أن يكون للرمز تاريخ انتهاء اختياري، يحدّده التاجر عند إنشائه. بمجرد انتهاء صلاحيته أو إلغائه أو حذفه، يتوقّف الرمز عن العمل فوراً في كل طلب لاحق — لا توجد فترة سماح.
يحصل أي رمز مفقود أو غير صحيح الصياغة أو منتهي الصلاحية أو ملغى على نفس الاستجابة:
HTTP/1.1 401 Unauthorized
{ "error": "Invalid or expired token." }
قوة الرمز محدودة دائماً بالصلاحيات التي حدّدها التاجر عند إنشائه. يتطلّب كل مسار (endpoint) في الواجهة صلاحية واحدة بالتحديد — اطلب فقط ما يحتاجه تكاملك فعلياً؛ التاجر أكثر ميلاً للثقة بتكامل لا يطلب كل شيء والموافقة عليه.
| الصلاحية | تمنح الوصول إلى |
|---|---|
store.read |
معلومات أساسية عن المتجر (الاسم، العملة، اللغة، رسوم التوصيل) |
products.read |
كتالوج المنتجات، بما في ذلك المتغيّرات والمخزون |
orders.read |
الطلبات وبنودها وإجماليها ووجهة التوصيل |
customers.read |
أعداد شرائح العملاء والسلال المتروكة |
إذا استُخدم رمز لاستدعاء مسار لا يملك صلاحيته، تستجيب الواجهة بما يلي:
HTTP/1.1 403 Forbidden
{
"error": "insufficient_scope",
"message": "This token is not authorized for the \"products.read\" scope.",
"required_ability": "products.read"
}
جميع المسارات للقراءة فقط (GET) وتقع تحت /api/v1. جميع الاستجابات بصيغة JSON. جميع المبالغ أرقام بالدينار الجزائري (DZD)، دون أي تحويل عملة.
معلومات أساسية عن المتجر: الاسم، النطاق الفرعي، النطاق المخصّص (إن وُجد)، العملة، لغة واجهة المتجر، ورسوم التوصيل الثابتة.
curl "https://example-store.kayroo.app/api/v1/store" \
-H "Authorization: Bearer kt_live_XXXX"
قائمة مقسّمة إلى صفحات لمنتجات المتجر. معاملات الطلب (كلّها اختيارية):
| المعامل | المعنى |
|---|---|
visible_only=1 |
فقط المنتجات التي يعرضها المتجر حالياً |
featured=1 |
فقط المنتجات المميَّزة |
search=term |
مطابقة اسم المنتج أو رمز SKU |
per_page=25 |
عدد العناصر في الصفحة (25 افتراضياً، 100 كحد أقصى) |
{
"data": [
{
"id": 41,
"name": "Classic Leather Wallet",
"slug": "classic-leather-wallet",
"sku": "WAL-041",
"description": "Full-grain leather, hand-stitched.",
"price": 3500,
"compare_price": 4200,
"current_price": 3500,
"on_sale": false,
"currency": "DZD",
"stock": 18,
"in_stock": true,
"is_visible": true,
"is_featured": true,
"category": "Accessories",
"image_url": "https://example-store.kayroo.app/storage/products/41.jpg",
"variants": [
{ "id": 101, "options": { "Color": "Brown" }, "price": null, "stock": 10 },
{ "id": 102, "options": { "Color": "Black" }, "price": null, "stock": 8 }
],
"created_at": "2026-02-11T09:12:00+00:00",
"updated_at": "2026-05-03T14:40:00+00:00"
}
],
"links": { "first": "...", "last": "...", "prev": null, "next": "..." },
"meta": { "current_page": 1, "last_page": 4, "per_page": 25, "total": 87 }
}
يعيد GET /api/v1/products/{id} نفس الشكل لمنتج واحد (كائن بسيط تحت "data")، أو محتوى JSON بحالة 404 إذا لم يكن المعرّف موجوداً في هذا المتجر.
قائمة مقسّمة إلى صفحات للطلبات. معاملات الطلب (كلّها اختيارية):
| المعامل | المعنى |
|---|---|
status=confirmed |
إحدى القيم: pending، confirmed، delivered، cancelled |
since=2026-06-01 |
فقط الطلبات المُنشأة ابتداءً من هذا التاريخ |
per_page=25 |
عدد العناصر في الصفحة (25 افتراضياً، 100 كحد أقصى) |
{
"data": [
{
"id": 1032,
"status": "confirmed",
"customer": {
"name": "Amine K.",
"phone": "0555xxxxxx",
"email": null,
"address": "Cité 100 logements, Bt 4"
},
"items": [
{ "product_id": 41, "variant_id": 101, "name": "Classic Leather Wallet", "qty": 2, "line_total": 7000 }
],
"subtotal": 7000,
"discount_amount": 0,
"coupon_code": null,
"delivery_price": 400,
"total": 7400,
"currency": "DZD",
"wilaya": "Alger",
"commune": "Bab Ezzouar",
"tracking_number": "YAL-88213",
"landing_page_id": null,
"created_at": "2026-06-30T10:02:00+00:00",
"updated_at": "2026-07-01T08:15:00+00:00"
}
],
"links": { "...": "..." },
"meta": { "...": "..." }
}
أعداد إجمالية للعملاء مقسَّمة إلى شرائح سلوكية — جدد، متكرّرون، أبطال (متكرّرون وذوو قيمة عالية)، ومعرَّضون للخطر (كانوا يشترون ولم يفعلوا مؤخراً). معامل طلب اختياري: lookback_days (90 افتراضياً، بين 7 و365).
{
"data": {
"new": 128,
"repeat": 54,
"champions": 12,
"at_risk": 31
},
"meta": { "lookback_days": 90 }
}
قائمة مقسّمة إلى صفحات لعمليات الدفع التي بدأها عملاء دون إتمامها — مفيدة لحملات استرجاع السلة. معاملات الطلب (كلّها اختيارية):
| المعامل | المعنى |
|---|---|
days=30 |
فقط عمليات الدفع التي بدأت خلال آخر N يوم (30 افتراضياً، 365 كحد أقصى) |
include_recovered=1 |
تضمين تلك التي تحوّلت لاحقاً إلى طلب (مستبعَدة افتراضياً) |
{
"data": [
{
"id": 77,
"customer_name": "Yasmine B.",
"customer_phone": "0661xxxxxx",
"customer_email": null,
"cart": { "items": [ { "product_id": 41, "qty": 1 } ] },
"recovered": false,
"created_at": "2026-07-02T19:40:00+00:00"
}
]
}
مسارات القوائم (المنتجات، الطلبات، السلال المتروكة) مقسَّمة إلى صفحات. تحتوي كل استجابة قائمة على ثلاثة مفاتيح رئيسية: data (مصفوفة السجلّات لهذه الصفحة)، links (روابط first/last/prev/next)، و meta (current_page، last_page، per_page، total). أرسل ?page=2 للانتقال إلى الصفحة التالية، أو ?per_page=100 لطلب أقصى حجم للصفحة.
يقتصر كل رمز افتراضياً على 120 طلباً في الدقيقة. عند تجاوز هذا الحد، ستحصل على استجابة HTTP 429 — تمهّل وأعد المحاولة بعد فترة قصيرة. اعتمد منطق إعادة المحاولة مع تأخير تدريجي (backoff) بدلاً من قصف الواجهة في حلقة ضيقة؛ هذا يحمي تكاملك أيضاً من أن يُعتبر حركة مرور مسيئة.
الأخطاء دائماً بصيغة JSON بسيطة تحتوي مفتاح "error"، وأحياناً "message" مقروء. رموز الحالة التي قد تواجهها:
| الحالة | المعنى | السبب النموذجي |
|---|---|---|
401 |
Unauthenticated | رمز مفقود أو غير صالح أو منتهي الصلاحية أو ملغى |
403 |
insufficient_scope | الرمز لا يملك الصلاحية التي يتطلّبها المسار |
404 |
not_found | معرّف السجلّ غير موجود في هذا المتجر |
422 |
خطأ تحقّق | قيمة معامل طلب غير صالحة |
429 |
طلبات كثيرة جداً | تجاوز حدّ معدّل الطلبات — تمهّل وأعد المحاولة |
بدلاً من استطلاع الواجهة باستمرار للتحقّق "هل تغيّر شيء؟"، يمكنك أن تطلب من Kayroo إشعار خادمك فور وقوع الحدث. يسجّل التاجر عنوان URL الخاص بمسارك من الإعدادات ← Webhooks في لوحة إدارته، ويختار أياً من الأحداث التالية يريد إرسالها إليك:
| الحدث | يُطلَق عندما… |
|---|---|
order.created |
يتم إنشاء طلب جديد (من صفحة الدفع أو يدوياً من طرف التاجر) |
order.updated |
تتغيّر حالة طلب (مثلاً pending ← confirmed ← delivered) |
order.cancelled |
يُلغى طلب |
product.created |
يُضاف منتج جديد إلى الكتالوج |
product.updated |
يُعدَّل منتج (السعر، المخزون، التفاصيل، …) |
product.deleted |
يُحذف منتج من الكتالوج |
lead.created |
يرسل زائر نموذج الاتصال الخاص بالمتجر |
review.created |
يرسل مشترٍ موثَّق تقييماً لمنتج |
كل webhook هو طلب HTTP من نوع POST موجَّه إلى العنوان الذي سجّله التاجر، بالشكل التالي من JSON:
{
"event": "order.created",
"data": {
"id": 1032,
"status": "pending",
"total": 7400,
"customer_name": "Amine K.",
"customer_phone": "0555xxxxxx",
"created_at": "2026-06-30T10:02:00+00:00"
},
"timestamp": "2026-06-30T10:02:01+00:00"
}
يحمل الطلب أيضاً ترويستين يمكنك الاعتماد عليهما:
| الترويسة | الغرض |
|---|---|
X-Webhook-Event |
اسم الحدث، مطابق لحقل "event" في المحتوى (مثل order.created) |
X-Webhook-Signature |
توقيع HMAC-SHA256 لمحتوى الطلب الخام — انظر التحقّق أدناه |
قبل الوثوق بأي محتوى webhook، تحقّق من توقيعه. لكل اشتراك webhook سرّ خاص به، تولّده Kayroo عند تسجيل التاجر لمسارك، ويُعرض للتاجر مرّة واحدة ليُرسله إليك بأمان. للتحقّق من طلب:
مثال تحقّق بلغة PHP:
$rawBody = file_get_contents('php://input');
$expected = hash_hmac('sha256', $rawBody, $sharedSecret);
$received = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';
if (! hash_equals($expected, $received)) {
http_response_code(401);
exit;
}
// تم التحقّق من التوقيع — يمكن الآن معالجة $rawBody بأمان.
مثال تحقّق بلغة Node.js:
const crypto = require('crypto');
function isValidSignature(rawBody, signatureHeader, sharedSecret) {
const expected = crypto
.createHmac('sha256', sharedSecret)
.update(rawBody)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(signatureHeader || '')
);
}
الوصول إلى الواجهة و webhooks متاحان للتجّار على باقة Scale من Kayroo وباقة الدفع حسب الاستخدام (Pay-As-You-Go). إذا لم يجد التاجر الذي تتكامل معه الإعدادات ← رموز API في لوحة إدارته، فهذا عادة هو السبب — اطلب منه التحقّق من باقته الحالية.
ستستمر هذه الواجهة في التطوّر. إذا احتاج تكاملك إلى بيانات أو حدث غير مغطّى هنا، لا تبحث عن حلّ بديل عبر وصول مباشر — اطلب من التاجر إبلاغ فريق Kayroo بطلبك، أو تواصل معنا مباشرة عبر [email protected].