ادمج نظامك مع شيبر لإنشاء وتتبع الطلبات برمجياً.
شيبر Open API هي واجهة برمجة REST تتيح لك:
https://server.shipper.network/api/v1للبدء، أنشئ مفتاح API من لوحة تحكم شيبرفي التكاملات > API.
جميع طلبات API تتطلب رمز Bearer في رأس Authorization.
Authorization: Bearer YOUR_API_KEY
Accept: application/json
Content-Type: application/jsonالطلبات محدودة المعدل لكل مفتاح API. تجاوز الحد يعيد HTTP 429 (طلبات كثيرة جداً).
| نوع النقطة | الحد | النقاط |
|---|---|---|
| قراءة | 120طلب/دقيقة | GET /products, /orders, /orders/:id, /webhooks |
| لوحة التحكم | 12طلب/دقيقة | GET /dashboard/* |
| مرجع | 60طلب/دقيقة | GET /countries, /countries/:code/divisions |
| كتابة | 30طلب/دقيقة | POST /orders, /webhooks |
| تدميري | 20طلب/دقيقة | POST /orders/:id/cancel, DELETE /webhooks/:id |
رؤوس حد المعدل (X-RateLimit-Limit، X-RateLimit-Remaining) مضمنة في كل استجابة.
لكل نوع من نقاط النهاية حد مستقل خاص به — عمليات الكتابة لا تستهلك حصة القراءة لديك. أما نقاط نهاية لوحة التحكم الخمس فتتشارك حدًا واحدًا فيما بينها، لأنها جميعًا تنفّذ عمليات تجميع ثقيلة على معاملاتك وشحناتك؛ راجع قسم لوحة التحكم لمعرفة كيف يجعل التخزين المؤقت القراءات المتكررة لنفس الفترة غير مكلفة.
GET /countriesيعيد جميع البلدان المدعومة مع هيكلها الجغرافي. استخدمه لفهم مستويات التقسيم الإداري المطلوبة (ولاية، معتمدية، إلخ) لكل بلد.
curl https://server.shipper.network/api/v1/countries \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"200
[
{
"code": "TN",
"name": "Tunisia",
"geo_structure": {
"fields": [
{ "id": "division_1_id", "label": "Governorate", "level": 1, "required": true, "depends_on": null },
{ "id": "division_2_id", "label": "Delegation", "level": 2, "required": true, "depends_on": "division_1_id" }
]
}
}
]مصفوفة geo_structure.fields تخبرك بعدد مستويات التقسيم وتسمياتها والتبعيات. استخدم depends_on لبناء قوائم متتالية.
GET /countries/{code}/divisionsيعيد أسماء التقسيمات لبلد معين. استخدمه للحصول على القيم الصحيحة لـ address.division_1 و address.division_2 عند إنشاء الطلبات.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
level | integer | - | مستوى التقسيم (افتراضي: 1 = المستوى الأعلى) |
parent_id | integer | - | تصفية حسب معرف التقسيم الأب للحصول على الأبناء |
curl https://server.shipper.network/api/v1/countries/TN/divisions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"{
"country": "TN",
"geo_structure": { ... },
"divisions": [
{ "id": 1, "name": "Tunis", "level": 1, "parent_id": null },
{ "id": 2, "name": "Sfax", "level": 1, "parent_id": null },
{ "id": 3, "name": "Sousse", "level": 1, "parent_id": null }
]
}curl "https://server.shipper.network/api/v1/countries/TN/divisions?level=2&parent_id=1" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"{
"country": "TN",
"geo_structure": { ... },
"divisions": [
{ "id": 10, "name": "Bab El Bhar", "level": 2, "parent_id": 1 },
{ "id": 11, "name": "Bab Souika", "level": 2, "parent_id": 1 },
{ "id": 12, "name": "Carthage", "level": 2, "parent_id": 1 }
]
}GET /productsيعيد كتالوج منتجاتك مع معرفات UUID. تحتاج UUID المنتج لإنشاء الطلبات عبر API.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
page | integer | - | رقم الصفحة (افتراضي: 1) |
per_page | integer | - | عناصر في الصفحة (افتراضي: 20، أقصى: 100) |
search | string | - | بحث باسم المنتج أو SKU |
curl "https://server.shipper.network/api/v1/products?per_page=10&search=shirt" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"200
{
"data": [
{
"uuid": "2e97b37a-3118-4905-842c-19706bcf1455",
"name": "Blue T-Shirt",
"sku": "SKU-001",
"price": 190,
"cost": 75,
"status": "active",
"link": "https://app.shipper.market/products/2e97b37a-3118-4905-842c-19706bcf1455",
"supplier_identifier": "RU836",
"available_qte": 42,
"variants": [
{
"uuid": "a1b2c3d4-5678-9012-abcd-ef0123456789",
"name": "Size L",
"sku": "SKU-001-L",
"price": 190,
"cost": 75,
"available_qte": 15
}
]
}
],
"pagination": { "total": 50, "current_page": 1, "per_page": 10, "last_page": 5 }
}price — سعر البيع الخاص بك (الذي يدفعه العميل)، بعملة منظمتك.cost — تكلفة المورد (المبلغ الذي تدفعه للمورد لكل وحدة). متاح على المنتج وعلى كل متغير.link — رابط Shipper Market قابل للمشاركة لهذا المنتج (مفيد لفريقك أو للتسويق).supplier_identifier — اسم المستخدم في شيبر للمورد (مثل RU836). يحدد المورد الذي ينفذ المنتج.available_qte — إجمالي وحدات المخزون المتاحة عبر المستودعات النشطة (مجموع public_stocks.qte).GET /products/{uuid}يعيد منتجاً واحداً بمعرف UUID، بما في ذلك المتغيرات والكميات المتوفرة.
curl https://server.shipper.network/api/v1/products/2e97b37a-3118-4905-842c-19706bcf1455 \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"200
{
"uuid": "2e97b37a-3118-4905-842c-19706bcf1455",
"name": "Blue T-Shirt",
"sku": "SKU-001",
"price": 190,
"cost": 75,
"status": "active",
"link": "https://app.shipper.market/products/2e97b37a-3118-4905-842c-19706bcf1455",
"supplier_identifier": "RU836",
"available_qte": 42,
"variants": [
{ "uuid": "a1b2c3d4-...", "name": "Size L", "sku": "SKU-001-L", "price": 190, "cost": 75, "available_qte": 15 },
{ "uuid": "e5f6a7b8-...", "name": "Size M", "sku": "SKU-001-M", "price": 190, "cost": 75, "available_qte": 27 }
]
}GET /ordersيعيد قائمة مرقمة من طلباتك. استخدم الفلاتر للتصفية حسب الحالة أو نطاق التاريخ أو مصطلحات البحث.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
page | integer | - | رقم الصفحة (افتراضي: 1) |
per_page | integer | - | عناصر في الصفحة (افتراضي: 20، أقصى: 100) |
status | string | - | تصفية حسب حالة الشحنة (مثل delivered، awaitingpackaging، canceled) |
start_date | string | - | تصفية الطلبات المنشأة في أو بعد هذا التاريخ/الوقت. يقبل YYYY-MM-DD (يُفسَّر كـ 00:00:00) أو YYYY-MM-DD HH:MM[:SS] للدقة بالدقيقة. |
end_date | string | - | تصفية الطلبات المنشأة في أو قبل هذا التاريخ/الوقت. مدخلات التاري خ فقط (YYYY-MM-DD) تشمل اليوم بأكمله؛ YYYY-MM-DD HH:MM[:SS] للدقة بالدقيقة. |
search | string | - | البحث برقم الطلب أو اسم العميل أو رقم الهاتف |
ترميز URL لقيم التاريخ/الوقت:يجب ترميز المسافة بين التاريخ والوقت كـ %20 (المسافة المُرمَّزة بـ URL القياسية). الخطأ الشائع هو استخدام %10 أو %15 — هذه أحرف تحكم ASCII وسيتم رفضها.
يتم تفسير المدخلات الزمنية بدون منطقة زمنية صريحة بتوقيت UTC (المنطقة الزمنية للخادم). يتم أيضاً تخزين أوقات الطلبات بتوقيت UTC، لذا YYYY-MM-DD يصفي يوماً تقويمياً بتوقيت UTC. استخدم ISO 8601 مع الإزاحة للحدود المحلية الإقليمية (مثل 2026-05-14T00:00:00+01:00).
قيم start_date أو end_date غير القابلة للتحليل تُرجِع HTTP 422 مع تلميح يشير إلى خطأ الترميز — لا يتم تجاهلها بصمت. مثال:
# WRONG — %10 is not a space
https://server.shipper.network/api/v1/orders?start_date=2026-03-29%1009:00
# → 422
{
"error": "Invalid start_date format.",
"value": "2026-03-29\u001009:00",
"expected_formats": [
"YYYY-MM-DD",
"YYYY-MM-DD HH:MM",
"YYYY-MM-DD HH:MM:SS",
"ISO 8601 (e.g. 2026-05-14T10:30:00Z)"
],
"hint": "A space in the URL must be encoded as %20, not %10 or +."
}
# RIGHT — %20 is the space
https://server.shipper.network/api/v1/orders?start_date=2026-03-29%2009:00curl "https://server.shipper.network/api/v1/orders?status=delivered&start_date=2026-05-01%2009:00&per_page=10" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"200
{
"data": [
{
"id": 555,
"status": "Paid",
"store_name": "My Store",
"is_cod": true,
"is_paid": true,
"created_at": "2026-05-10T10:00:00.000000Z",
"address": { "first_name": "Omar", "last_name": "Ben Ali", "phone1": "+21628177188" },
"items_count": 3,
"shipments_count": 1,
"products": [
{ "id": 442, "name": "Smart Sensor Light Toilet Lid" }
],
"revenue": "59",
"external_order_id": "ORD-123",
"external_order_url": "https://mystore.com/orders/123"
}
],
"pagination": { "total": 150, "current_page": 1, "per_page": 10, "last_page": 15 }
}status — محسوب من شحنات الطلب. القيم الممكنة: Pending، Fulfilled، In Transit، Delivered، Partial Delivery، Returned، Partial Return، Canceled، Paid. قد يكون أيضاً null للطلبات التي لا تحتوي على شحنات بعد.items_count — إجمالي الوحدات المطلوبة (مجموع الكميات عبر عناصر السلة).products — منتجات بائع متميزة مُشار إليها في الطلب. فارغ للطلبات التي لم يتم تنفيذها بعد.revenue — مجموع معاملات إيرادات شحنات البائع بحالة Successful أو Under Review (أي المُحقَّقة + المُكتسَبة-قيد-التسوية). يُبلَّغ عنها بعملة منظمتك، كسلسلة عشرية بسيطة. صفر حتى يتم تسليم شحنة واحدة على الأقل.POST /ordersينشئ طلباً جديداً في شيبر. يعيد معرف الطلب الذي يمكنك استخدامه لتتبع الطلب.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
address | object | * | كائن عنوان المستلم (انظر الحقول أدناه) |
address.name | string | * | الاسم الكامل - يقسم تلقائياً إلى الاسم الأول واللقب |
address.phone1 | string | * | رقم الهاتف الرئيسي |
address.phone2 | string | - | رقم الهاتف الثانوي |
address.address1 | string | * | العنوان السطر 1 |
address.address2 | string | - | العنوان السطر 2 |
address.division_1 | string | - | الولاية - استخدم الاسم الدقيق من GET /countries/{code}/divisions |
address.division_2 | string | - | المعتمدية - استخدم الاسم الدقيق من GET /countries/{code}/divisions?level=2&parent_id=... |
address.country | string | * | رمز البلد من حرفين (مثل TN، DZ، MA) |
items | array | * |