تخطّ إلى المحتوى الرئيسي

E-Commerce API

أدر كتالوج المنتجات وتتبّع الطلبات وراقب نشاط السلات وحلل شرائح عملاء RFM.

كل نقاط النهاية في هذه الصفحة نسبية إلى عنوان الأساس https://api-eu1.joryio.com. راجع نظرة عامة على API.

اصطلاح تسمية المعرّفات

يستخدم Joryio اصطلاحاً واضحاً للمعرّفات.

معرّفاتك، استخدمها عند إنشاء البيانات أو تتبعها

الحقلالوصفالمثال
productIdمعرّف منتجك، SKU أو معرّف منصة التجارة الإلكترونية"SKU-12345"
orderIdمعرّف طلبك، رقم الطلب من منصتك"ORD-2024-001"
userIdمعرّف المستخدم لديك"user-123"

معرّفات Joryio، تعاد في استجابات API

الحقلالوصفمتى تستخدمه
idمعرّف Joryio الداخلي للمنتجات أو الطلباتيُعاد في استجابات API؛ استخدمه للتحديث أو الحذف
joryioUserIdمعرّف المستخدم الداخلي في Joryio، id سداسي من 24 حرفاً في استجابات Users APIبديل لـ userId عندما تريد الإشارة بمعرّف Joryio

تعريف مرن للمستخدم

عند إنشاء الطلبات أو تتبع الأحداث، يمكنك تعريف المستخدمين بـ:

  • userId - معرّف المستخدم لديك، وهو الأكثر شيوعاً.
  • joryioUserId - معرّف المستخدم الداخلي في Joryio.
// Using your user ID (recommended)
{ "orderId": "ORD-001", "userId": "user-123", ... }

// Using Joryio's internal user ID
{ "orderId": "ORD-001", "joryioUserId": "66a1f2c3d4e5f6a7b8c9d0e1", ... }

المصادقة

تتطلب كل الطلبات مصادقة JWT:

Authorization: Bearer your_jwt_token
Content-Type: application/json
X-Workspace-Id: your_workspace_id

كتالوج المنتجات

إنشاء منتج

أنشئ منتجاً جديداً في كتالوجك.

POST /catalog/products

نص الطلب:

الحقلالنوعمطلوبالوصف
productIdstringنعممعرّف منتجك الفريد، SKU أو معرّف المنتج
namestringنعماسم المنتج
pricenumberنعمسعر المنتج
descriptionstringلاوصف المنتج
compareAtPricenumberلاالسعر الأصلي للخصومات
currencystringلارمز العملة، الافتراضي USD
categoriesstring[]لافئات المنتج
tagsstring[]لاوسوم المنتج
brandstringلااسم العلامة التجارية
imageUrlstringلاURL لصورة المنتج الرئيسية
urlstringلاURL لصفحة المنتج
inStockbooleanلاتوافر المخزون، الافتراضي true
skustringلاوحدة حفظ المخزون
variantsobject[]لامتغيرات المنتج
customFieldsobjectلاسمات مخصصة

مثال لطلب:

curl -X POST https://api-eu1.joryio.com/catalog/products \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"productId": "SKU-12345",
"name": "Classic Blue T-Shirt",
"price": 29.99,
"compareAtPrice": 39.99,
"currency": "USD",
"categories": ["Clothing", "T-Shirts"],
"tags": ["sale", "bestseller"],
"brand": "Acme Apparel",
"imageUrl": "https://example.com/images/blue-tshirt.jpg",
"url": "https://example.com/products/blue-tshirt",
"inStock": true,
"sku": "BTS-001-BL",
"variants": [
{
"id": "var-s",
"name": "Small",
"sku": "BTS-001-BL-S",
"price": 29.99,
"inStock": true,
"options": { "size": "S", "color": "Blue" }
}
]
}'

الاستجابة:

{
"id": "prod_abc123",
"productId": "SKU-12345",
"name": "Classic Blue T-Shirt",
"price": 29.99,
"createdAt": "2024-01-20T10:00:00.000Z"
}

Upsert جماعي للمنتجات، نص مصفوفة

لا توجد نقطة نهاية جماعية منفصلة: يقبل POST /catalog/products كائن منتج واحداً أو مصفوفة JSON مجردة من المنتجات، بلا كائن غلاف. ينشئ شكل المصفوفة أو يحدّث حتى 500 منتج في الطلب الواحد، وفق productId.

POST /catalog/products

المصفوفة بحد أقصى 500 عنصر؛ تعيد المصفوفة الفارغة أو ما يزيد على 500 رمز 400. يتبع كل عنصر تنسيق كائن المنتج الواحد، بما فيه الحقل الاختياري source لكل منتج.

يتحقق النظام من كل عنصر بالكامل. يُبلغ عن العنصر غير الصالح في failed بفهرسه ولا يُقبل بصمت، بينما تستمر عملية upsert للعناصر الصالحة.

[
{ "productId": "SKU-001", "name": "Product 1", "price": 19.99 },
{ "productId": "SKU-002", "name": "Product 2", "price": 29.99, "source": "shopify" }
]

الاستجابة:

{
"processed": 2,
"upserted": 2,
"failed": []
}
الحقلالوصف
processedعدد العناصر التي استقبلتها مصفوفة الطلب
upsertedالمنتجات التي أُنشئت أو حُدثت فعلياً
failedفشل لكل عنصر: index وproductId أو sku إن وُجد وreason

عرض المنتجات

استعلم عن المنتجات بالتصفية والترقيم.

GET /catalog/products
المعاملالنوعالوصف
searchstringبحث بالاسم أو الوصف أو SKU
categoriesstring[]تصفية بالفئات
tagsstring[]تصفية بالوسوم
brandstringتصفية بالعلامة
inStockbooleanتصفية بحالة المخزون
minPricenumberأقل سعر
maxPricenumberأعلى سعر
limitnumberنتائج الصفحة، الافتراضي 50
offsetnumberإزاحة الترقيم
sortBystringحقل الترتيب: name أو price أو createdAt أو updatedAt
sortOrderstringasc أو desc
curl "https://api-eu1.joryio.com/catalog/products?categories=T-Shirts&inStock=true&limit=20" \
-H "Authorization: Bearer $TOKEN"

الحصول على الفئات

اعرض جميع فئات المنتجات.

GET /catalog/categories

الحصول على العلامات

اعرض جميع علامات المنتجات.

GET /catalog/brands

الطلبات

إنشاء طلب

تتبّع طلباً جديداً.

POST /orders

نص الطلب:

الحقلالنوعمطلوبالوصف
orderIdstringنعممعرّف طلبك أو رقمه في منصتك
userIdstringأحدهمامعرّف مستخدم العميل لديك
joryioUserIdstringأحدهمامعرّف المستخدم الداخلي في Joryio، بديل لـ userId
totalnumberنعمإجمالي الطلب
itemsobject[]نعمبنود الطلب
statusstringلاحالة الطلب، الافتراضي pending
currencystringلارمز العملة
subtotalnumberلاالمجموع قبل الخصومات
discountnumberلامقدار الخصم
shippingnumberلاتكلفة الشحن
taxnumberلامقدار الضريبة
totalRefundednumberلاالمبلغ المسترد حتى الآن بعملة الطلب، الافتراضي 0. في الاسترداد الجزئي أرسل المبلغ الجزئي مع status: partiallyRefunded؛ وللكامل عيّنه إلى total مع status: refunded. تُخصم الاستردادات من الإيراد المنسوب.
couponCodestringلاالقسيمة المطبقة
shippingAddressobjectلاعنوان الشحن
campaignIdstringلاCampaign الإسناد
canvasIdstringلاCanvas الإسناد
sourcestringلامصدر الطلب، مثل email أو sms أو direct
utmSourcestringلامصدر UTM
utmMediumstringلاوسيط UTM
utmCampaignstringلاCampaign UTM
تعريف المستخدم

يلزم تقديم userId أو joryioUserId. استخدم userId مع معرّفات مستخدميك، وهو الأكثر شيوعاً. واستخدم joryioUserId عندما تملك id الداخلي لـ Joryio من استجابات Users API.

بنية بند الطلب:

{
"productId": "prod_abc123",
"name": "Blue T-Shirt",
"sku": "BTS-001",
"quantity": 2,
"price": 29.99,
"total": 59.98,
"imageUrl": "https://example.com/image.jpg"
}

مثال لطلب:

curl -X POST https://api-eu1.joryio.com/orders \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"orderId": "ORD-2024-001",
"userId": "user-123",
"total": 89.97,
"subtotal": 99.97,
"discount": 10.00,
"shipping": 5.99,
"tax": 4.99,
"currency": "USD",
"couponCode": "SAVE10",
"items": [
{ "productId": "prod_abc123", "name": "Blue T-Shirt", "quantity": 2, "price": 29.99, "total": 59.98 }
],
"source": "email",
"campaignId": "camp_xyz789"
}'

تنفيذ الطلب

علِّم الطلب بأنه شُحن.

POST /orders/:id/fulfill
{
"trackingNumber": "1Z999AA10123456784",
"carrier": "UPS"
}

إلغاء الطلب

POST /orders/:id/cancel
{
"reason": "Customer requested cancellation"
}

استرداد الطلب

POST /orders/:id/refund
{
"refundAmount": 29.99,
"reason": "Product defective",
"partial": true
}

إحصاءات الطلبات

احصل على إحصاءات الطلبات لنطاق تاريخ.

GET /orders/stats?startDate=2024-01-01&endDate=2024-01-31
{
"totalOrders": 156,
"totalRevenue": 12450.50,
"averageOrderValue": 79.81,
"ordersByStatus": {
"pending": 5,
"processing": 12,
"shipped": 45,
"delivered": 90,
"cancelled": 4
}
}

تتبع السلة

تحديث سلة

تتبّع سلة مستخدم أو حدّثها.

PUT /carts
{
"userId": "user_123",
"items": [
{
"productId": "prod_abc123",
"name": "Blue T-Shirt",
"price": 29.99,
"quantity": 2,
"total": 59.98,
"imageUrl": "https://example.com/image.jpg"
}
],
"value": 59.98,
"currency": "USD",
"checkoutUrl": "https://store.example.com/checkout?cart=abc123"
}

الإضافة إلى السلة

أضف عنصراً إلى سلة مستخدم.

POST /carts/add
{
"userId": "user_123",
"item": {
"productId": "prod_abc123",
"name": "Blue T-Shirt",
"price": 29.99,
"quantity": 1,
"total": 29.99
}
}

الحصول على السلات المتروكة

اعرض السلات المتروكة لحملات الاستعادة.

GET /carts/abandoned
المعاملالنوعالوصف
minValuenumberأقل قيمة للسلة
abandonedMinutesAgonumberأقصى دقائق منذ التخلي
limitnumberالنتائج في الصفحة
offsetnumberإزاحة الترقيم
{
"data": [
{
"id": "cart_123",
"userId": "user_456",
"items": [...],
"value": 149.99,
"abandonedAt": "2024-01-20T15:30:00.000Z",
"checkoutUrl": "https://store.example.com/checkout?cart=abc"
}
],
"total": 42,
"hasMore": true
}

إحصاءات السلات

GET /carts/stats
{
"totalCarts": 1250,
"abandonedCarts": 312,
"recoveredCarts": 87,
"totalAbandonedValue": 45670.50,
"recoveryRate": 27.88
}

تحليل RFM

يقسم تحليل RFM، الحداثة والتكرار والقيمة النقدية، العملاء بحسب سلوك الشراء.

الحصول على بيانات RFM لمستخدم

احصل على درجات RFM والشريحة لمستخدم محدد.

GET /rfm/user/:userId
{
"totalOrders": 12,
"totalSpent": 849.50,
"averageOrderValue": 70.79,
"firstOrderDate": "2023-06-15T10:00:00.000Z",
"lastOrderDate": "2024-01-18T14:30:00.000Z",
"daysSinceLastOrder": 2,
"hasActiveCart": false,
"rfmRecency": 5,
"rfmFrequency": 4,
"rfmMonetary": 4,
"rfmScore": "544",
"rfmSegment": "champions"
}

الحصول على توزيع RFM

احصل على توزيع العملاء في شرائح RFM.

GET /rfm/distribution
{
"champions": { "count": 150, "totalValue": 125000 },
"loyal": { "count": 320, "totalValue": 89000 },
"potential_loyalists": { "count": 180, "totalValue": 32000 },
"new_customers": { "count": 450, "totalValue": 28000 },
"at_risk": { "count": 95, "totalValue": 42000 },
"lost": { "count": 280, "totalValue": 15000 }
}

شرائح RFM

الشريحةالوصفدرجات RFM المعتادة
Championsأفضل العملاء، يشترون كثيراً وينفقون أكثر555، 554، 545
Loyalعملاء متسقون444، 443، 434
Potential Loyalistsحديثو العهد بتكرار متوسط433، 343، 333
New Customersأجروا أول شراء للتو511، 512، 411
Promisingحديثو العهد لكن بتكرار منخفض422، 322، 312
Needs Attentionتفاعل متوسط آخذ في الانخفاض332، 322، 233
About to Sleepدون المتوسط ومعرّضون للخطر211، 212، 221
At Riskكانوا أوفياء ولم يشتروا حديثاً144، 143، 244
Can't Loseكانوا أفضل العملاء وهم الآن غير نشطين155، 154، 255
Hibernatingتفاعل منخفض وعدم نشاط طويل122، 121، 112
Lostأدنى الدرجات ومن المرجح فقدانهم111

Webhooks

تطلق أحداث التجارة الإلكترونية webhooks يمكن أن تشغّل مسارات Canvas:

الحدثالوصف
ecommerce.order.createdإنشاء طلب جديد
ecommerce.order.fulfilledشحن الطلب
ecommerce.order.cancelledإلغاء الطلب
ecommerce.order.refundedاسترداد الطلب
ecommerce.order.status_changedتغير حالة الطلب
ecommerce.cart.abandonedتعليم السلة كمتروكة
ecommerce.cart.recoveredاستعادة سلة متروكة
ecommerce.cart.updatedتغير محتويات السلة

البحث بمعرّفاتك

الحصول على منتج بمعرّف منتجك

استرجع منتجاً باستخدام معرّفك:

GET /catalog/products/by-product-id/:productId
curl "https://api-eu1.joryio.com/catalog/products/by-product-id/SKU-12345" \
-H "Authorization: Bearer $TOKEN"

الحصول على طلب بمعرّف طلبك

استرجع طلباً باستخدام معرّفك:

GET /orders/by-order-id/:orderId
curl "https://api-eu1.joryio.com/orders/by-order-id/ORD-2024-001" \
-H "Authorization: Bearer $TOKEN"

استجابات الأخطاء

{
"statusCode": 404,
"message": "Product SKU-12345 not found",
"error": "Not Found"
}
رمز الحالةالوصف
400نص طلب غير صالح
401المصادقة مطلوبة
403صلاحيات غير كافية
404المورد غير موجود
409تعارض، مثل معرّف خارجي مكرر
500خطأ داخلي في الخادم