API v1 · WEBHOOKS

واجهة Mystoq للمطوّرين

اربط متجرك بأيّ نظام خارجيّ — أنظمة المخزون، لوحات البيانات، أو تطبيقاتك الخاصّة. اقرأ منتجاتك وطلباتك، أنشئ طلبات برمجيًّا، واستقبل الأحداث لحظة وقوعها عبر Webhooks موقَّعة.

بدء سريع

ثلاث خطوات من الصفر إلى أوّل طلب برمجيّ:

  1. أنشئ مفتاح API من لوحة التحكّم ← المطوّرون (اختَر صلاحية read أو write).
  2. مرّر المفتاح في ترويسة Authorization: Bearer مع كلّ طلب.
  3. استدعِ GET /v1/products ثمّ سجّل رابط Webhook لاستقبال الأحداث.

مقدّمة

واجهة Mystoq البرمجيّة تتبع نمط REST، تُرجع JSON، وتُؤمَّن عبر مفاتيح API. كلّ طلب يُنفَّذ في نطاق متجرك وحده (عزل تامّ بين المتاجر). أنشئ مفتاحك من لوحة التحكّم ← المطوّرون.

المصادقة

مرّر مفتاحك في ترويسة Authorization بصيغة Bearer. المفتاح بالشكل msq_<prefix>_<secret> ويُعرَض الجزء السرّي مرّة واحدة فقط عند إنشائه.

# كلّ الطلبات تحتاج هذه الترويسة
Authorization: Bearer msq_ab12cd34_your_secret_here
احفظ المفتاح في مكان آمن. صلاحية read للقراءة فقط، وصلاحية write مطلوبة لإنشاء الطلبات.

الأساس والحدود

العنوان الأساسhttps://mystoq.com/api/v1
الصيغةJSON (Accept: application/json)
حدّ المعدّل120 طلبًا في الدقيقة لكلّ مفتاح
الترقيممعامل per_page (1–100، الافتراضي 25). كلّ ردّ قائمة يحوي meta.current_page، per_page، total، last_page.

المنتجات

GET/v1/products

قائمة منتجات متجرك المنشورة (status = active)، مرقّمة.

المعاملات (اختياريّة)

per_pageعدد العناصر في الصفحة (1–100، الافتراضي 25).
searchبحث في اسم المنتج.
category_idتصفية حسب مُعرّف الفئة.
# مثال
curl "https://mystoq.com/api/v1/products?per_page=2&search=jacket" \
  -H "Authorization: Bearer msq_ab12cd34_secret" \
  -H "Accept: application/json"
// الاستجابة
{
  "data": [
    { "id": 1027, "name": "Women's jacket", "slug": "womens-jacket",
      "price": 2000, "compare_price": 2800, "sku": "JCK-01",
      "stock": 100, "status": "active", "category_id": 4,
      "images": ["https://…/p1.jpg"] }
  ],
  "meta": { "current_page": 1, "per_page": 2, "total": 57, "last_page": 29 }
}
GET/v1/products/{id}

تفاصيل منتج واحد. يُرجع 404 إن لم يوجد أو لم يكن منشورًا.

الطلبات

GET/v1/orders

قائمة طلبات متجرك (مرقّمة، الأحدث أوّلًا).

المعاملات (اختياريّة)

per_pageعدد العناصر في الصفحة (1–100، الافتراضي 25).
statusتصفية حسب الحالة (مثال: pending، confirmed، shipped، delivered، cancelled).
fromمن تاريخ (شامل) بصيغة YYYY-MM-DD.
toإلى تاريخ (شامل) بصيغة YYYY-MM-DD.
GET/v1/orders/{id}

تفاصيل طلب واحد مع عناصره وبيانات الزبون.

// استجابة الطلب
{
  "data": {
    "id": 5821, "reference": "ORD-5821", "status": "pending",
    "payment_method": "cod", "payment_status": "unpaid",
    "subtotal": 2000, "shipping_cost": 500, "discount": 0, "total": 2500,
    "delivery_type": "home", "wilaya_id": 16, "commune": "Bab Ezzouar",
    "customer": { "name": "Ahmed Ben Ali", "phone": "0555123456" },
    "items": [ { "product_id": 1027, "name": "Women's jacket", "price": 2000, "qty": 1, "total": 2000 } ],
    "created_at": "2026-07-18T20:00:00Z"
  }
}

إنشاء طلب

POST/v1/orders

إنشاء طلب برمجيًّا. يتطلّب مفتاحًا بصلاحية write. يمرّ الطلب بكامل قواعد المتجر: إعادة حساب السعر من الخادم، حجز المخزون، ورسوم التوصيل حسب الولاية.

حقول الجسم

customer.name اختياريّاسم الزبون الكامل (أو استخدم first_name وlast_name).
customer.phone مطلوبرقم هاتف جزائريّ من 10 أرقام يبدأ بـ 05 أو 06 أو 07 — مثال: 0555123456.
customer.wilaya_id مطلوبمُعرّف الولاية (1–69).
customer.commune اختياريّالبلديّة.
items[] مطلوبعناصر الطلب: كلّ عنصر يحمل product_id (أو bundle_id) وqty.
payment_method اختياريّطريقة الدفع: cod (الافتراضي)، chargily، ccp، baridimob
delivery_type اختياريّنوع التوصيل: home (للمنزل، الافتراضي) أو desk (لمكتب التوصيل).
curl -X POST "https://mystoq.com/api/v1/orders" \
  -H "Authorization: Bearer msq_ab12cd34_secret" \
  -H "Content-Type: application/json" \
  -d '{
    "customer": { "name": "Ahmed Ben Ali", "phone": "0555123456", "wilaya_id": 16, "commune": "Bab Ezzouar" },
    "items": [ { "product_id": 1027, "qty": 1 } ],
    "payment_method": "cod",
    "delivery_type": "home"
  }'
النجاح يُرجع كائن الطلب مع id وreference والإجماليّ. وتُطلَق أحداث Webhooks تلقائيًّا.

Webhooks

سجّل رابطًا (https) من لوحة التحكّم لتصلك إشعارات POST فوريّة عند وقوع الأحداث.

الحدثيقع عند
order.createdإنشاء طلب جديد في متجرك.
order.updatedتغيّر حالة طلب (يتضمّن old_status وnew_status).
// جسم الطلب المُرسَل إلى رابطك
{
  "event": "order.created",
  "created_at": "2026-07-11T20:00:00Z",
  "data": {
    "id": 5821, "reference": "ORD-5821", "status": "pending",
    "total": 2500, "customer": { "name": "Ahmed", "phone": "0555…" }
  }
}

التحقّق من التوقيع

كلّ طلب Webhook يحمل ترويسة X-Mystoq-Signature = sha256=HMAC(secret, rawBody). تحقّق منها لتضمن أنّ الطلب من Mystoq وأنّ الجسم لم يُعدَّل.

// Node.js — مثال التحقّق
const crypto = require("crypto");
const expected = "sha256=" +
  crypto.createHmac("sha256", SECRET).update(rawBody).digest("hex");
if (expected === req.headers["x-mystoq-signature"]) { /* موثوق */ }
أعِد بحالة 2xx خلال 8 ثوانٍ. عند الفشل نعيد المحاولة حتّى 4 مرّات بفواصل متزايدة.

الأخطاء

الرمزالمعنى
200 / 201نجاح
401مفتاح غير صالح أو مفقود
403المفتاح لا يملك الصلاحية المطلوبة (write)
404المورد غير موجود
422بيانات غير صالحة (تفاصيل في errors)
429تجاوز حدّ المعدّل