مرجع المطوّرون

مرجع واجهة شركة التوصيل API v1

كل نقاط واجهة الشركة (الإصدار v1): التجّار والمناديب والطرود وإنشاء الطرد وتعيين المندوب وتحديث الحالة، مع المعاملات والردود وأمثلة curl وJavaScript وPHP وPython.

آخر تحديث 22 أكتوبر 2026 · آخر تحقق 22 أكتوبر 2026

الأساسيات#

تتيح واجهة الشركة لنظام شركة التوصيل قراءة تجّارها ومناديبها وطرودها، وإنشاء طرود لتجّارها، وتعيين المناديب، وتحديث حالات الطرود.

  • عنوان Base URL: نطاق المنصة مع /api/company/v1. وتعرضه صفحة «الربط والـ API» باسم Base URL في أسفل بطاقة «مفتاح الـ API».
  • المصادقة: Authorization: Bearer YOUR_COMPANY_API_KEY، وهو مفتاح ck_ الخاص بشركتك (راجع «المصادقة ومفاتيح الـ API»). تحتاج الشركة إلى اشتراك فعّال وباقة تتضمن ميزة الـ API، وتُستثنى من الشرطين الشركات التابعة للمنصة والمملوكة لتاجر.
  • نطاق البيانات: كل شيء مقيّد بشركتك. تُطابَق الطرود بحسب الشركة المسجّلة على الطرد، والتجّار بحسب شركة التاجر.
  • الصيغة: JSON في الطلب والرد. أرسل Content-Type: application/json مع الطلبات التي تحمل جسماً، وأرسل دائماً Accept: application/json، وأضف Accept-Language: en لتصلك الرسائل بالإنجليزية. الغلاف هو {"success": true, "data": ...} (وmeta فقط في GET /merchants وGET /parcels) و{"success": false, "error": {"code", "message"}}.

نقاط النهاية في لمحة#

الطريقة المسار الغرض حدّ المسار في الدقيقة
GET /me الشركة والباقة والاستهلاك 300
GET /merchants تجّارك مع أماكن استلامهم 300
GET /deliverymen مناديبك مع حمولة كل منهم 300
GET /parcels عرض طرودك 300
GET /parcels/{tracking} طرد واحد مع أحداثه 300
POST /parcels إنشاء طرد لأحد تجّارك 120
POST /parcels/{tracking}/assign تعيين مندوب 300
POST /parcels/{tracking}/status تحديث الحالة 300

تُحتسب حدود المسارات لكل عنوان IP على عدّاد واحد مشترك: فطلب POST /parcels يُحسب على حدّ المجموعة (300) وعلى حدّه الخاص (120) معاً، فليست هذه الأرقام حصصاً منفصلة. ويُطبَّق أيضاً حدّ عام قدره 60 طلباً في الدقيقة لكل عنوان IP (راجع «نظرة عامة على واجهات الـ API»). ولأن طلب POST /parcels يُحسب مرتين، لا يستطيع عنوان IP واحد عملياً إنشاء أكثر من نحو 60 طرداً في الدقيقة، وأقل من ذلك إن أرسل طلبات أخرى في الدقيقة نفسها.

الحساب والقوائم#

GET /me#

json
{
  "success": true,
  "data": {
    "company": { "id": 13, "name": "Example Delivery", "phone": "0944000000" },
    "plan": {
      "name": "Pro",
      "expires_at": "2026-12-01 00:00:00",
      "features": [ { "feature": "Company API — 120 per minute / 20,000 per day", "enabled": true } ]
    },
    "usage": [ { "name": "API requests today", "used": 1240, "limit": 20000 } ]
  }
}

يكون plan قيمة null عندما لا يوجد اشتراك فعّال. وfeatures[].feature تسمية معروضة بلغة الطلب. وصفوف usage فيها name وused وlimit (القيمة null تعني بلا حد)، مثل طلبات الـ API اليوم وروابط الويب هوك والتجّار.

GET /merchants#

تجّارك. معاملات الاستعلام: q (جزء من الاسم التجاري أو رقم الجوال) وper_page (من 1 إلى 100، الافتراضي 50) وpage. ويأتي الرد مع meta. وفي كل مكان استلام id وname وaddress وphone وdefault_shop (علامة 0 أو 1) وdefault (true أو false).

json
{
  "success": true,
  "data": [
    {
      "id": 41, "business_name": "Flower Shop", "contact_name": "Ahmad", "phone": "0933000000", "email": "shop@example.com", "active": true,
      "pickup_locations": [ { "id": 7, "name": "Main branch", "address": "Damascus, Mazzeh", "phone": "0933000000", "default_shop": 1, "default": true } ]
    }
  ],
  "meta": { "page": 1, "per_page": 50, "total": 12, "last_page": 1 }
}

GET /deliverymen#

كل مناديبك؛ وهذه القائمة بلا ترقيم صفحات.

json
{
  "success": true,
  "data": [
    { "id": 5, "name": "Samer", "phone": "0944000001", "active": true, "open_parcels": 12, "parcel_limit": 50, "online": true, "available": true }
  ]
}
  • open_parcels عدد الطرود التي حالتها «مع مندوب التوصيل» أو «إعادة جدولة التوصيل» ويوجد لها حدث مسجّل لهذا المندوب، وهو تقدير لما يحمله المندوب فعلاً (وتعدّ نافذة «تعيين مندوب» في اللوحة بالطريقة نفسها)؛ وparcel_limit حدّ المندوب، وقيمته 5 عند عدم تحديده.
  • online علامة دوام المندوب. وavailable تكون false عندما لا يكون المندوب فعّالاً، أو عندما تشترط شركتك أن يكون المندوب «متصلاً» وهو غير متصل.

الطرود#

GET /parcels#

تعرض طرود شركتك من الأحدث إلى الأقدم دون events. معاملات الاستعلام:

المعامل المعنى
merchant_id، deliveryman_id هذا التاجر أو هذا المندوب فقط
reference تطابق تام مع مرجع التاجر
from، to نطاق تاريخ الإنشاء بصيغة YYYY-MM-DD
updated_since الطرود المحدَّثة في هذا الوقت أو بعده، مثل 2026-10-13 10:00:00؛ مفيد للمزامنة
stage pending أو processing أو out_for_delivery أو delivered أو partially_delivered أو returning أو returned. وأي قيمة أخرى تعطي 422 والكود validation_failed
per_page، page من 1 إلى 100 في الصفحة (الافتراضي 20)

يطابق stage=processing رموز الحالة 2 و3 و4 و5 و6 و19 فقط (تعيين الاستلام أو إعادة جدولته، واستلام مندوب الاستلام، والاستلام بالمستودع، والنقل إلى فرع، والوصول إلى الفرع). أما كائن الطرد فمرحلته processing لكل حالة غير مذكورة ضمن المراحل الأخرى، فبعض الطرود التي مرحلتها processing لا يُرجعها هذا الفلتر. ومن بين الطرود التي مرحلتها processing لا يقبل تعيين مندوب إلا الطرد الموجود في المستودع أو الفرع (5 و19).

GET /parcels/{tracking}‎#

تقبل رقم التتبع أو reference (وتُعتمد أحدث نتيجة مطابقة بين طرود كل تجّارك). والرد هو كائن الطرد مع events. والطرد غير الموجود يعطي 404 والكود not_found.

POST /parcels#

تنشئ طرداً باسم أحد تجّارك. تُحسب الأجرة بحسب تسعير شركتك، ولا يُخصم شيء من محافظ المنصة: تُخصم من رصيد التاجر لدى شركتك فقط إذا كان إعداد دفع أجرة التوصيل لدى التاجر «من رصيده مسبقاً» (وضع الفوترة wallet)؛ أما مع «من التحصيل» فلا يُخصم شيء عند الإنشاء. الحقول هي نفسها في «مرجع واجهة التاجر» (recipient.name وrecipient.phone وrecipient.address وrecipient.governorate وrecipient.lat وrecipient.lng وreference وcod_amount وcurrency وweight وpickup_location_id وnote وshipping_paid_by) مع قواعد التحقق نفسها، باستثناء ما يلي:

  • merchant_id مطلوب ويجب أن يكون أحد تجّارك (GET /merchants)؛ وإلا 422 والكود validation_failed مع الحقل merchant_id.
  • لا يوجد company_id: الطرد يتبع شركتك. ولا تُدعم use_own_account وwarehouse_items وwait_for_balance.
  • يُطلب الحقل المتعلق بالمحافظة أو الإحداثيات بحسب آلية تسعير شركتك، كما في «مرجع واجهة التاجر».
  • إذا سبق للتاجر استخدام reference نفسه تحصل على 409 والكود duplicate_reference؛ ولا تُرجع الواجهة الطرد القديم. اجلبه عبر GET /parcels?merchant_id=<id>&reference=<reference> (أو برقم تتبعه). أما GET /parcels/{reference} وحده فيطابق طرود كل تجّارك ويُرجع أحدث نتيجة، فقد يُرجع طرد تاجر آخر إذا استخدم تاجران reference نفسه.
  • الرد 201 مع كائن الطرد.

POST /parcels/{tracking}/assign#

تعيّن مندوباً من مناديب شركتك.

json
{ "deliveryman_id": 5, "note": "Call before arriving", "force": false }
  • deliveryman_id مطلوب ويجب أن يكون أحد مناديبك (وإلا 422 والكود validation_failed).
  • عندما يحمل المندوب أصلاً عدد parcel_limit من الطرود المفتوحة تحصل على 409 والكود deliveryman_full؛ أرسل "force": true لتجاوز الحد.
  • إذا كانت شركتك تشترط أن يكون المندوب «متصلاً» وهو غير متصل فتحصل على 422 على الحقل delivery_man_id.
  • الطرد الموجود أصلاً مع هذا المندوب يُرجَع دون تغيير.
  • عيّن مندوباً للطرود الموجودة في المستودع أو الفرع (الحالة «بالمستودع — جاهز للتوزيع» أو «وصل الفرع») أو المعيَّنة أصلاً (مع مندوب التوصيل أو إعادة جدولة التوصيل). والطرد الذي لا تسمح حالته بالانتقال إلى «مع مندوب التوصيل»، كطرد بانتظار الاستلام أو ما زال في مرحلة الاستلام، يُرفض (راجع «أخطاء شائعة»).

POST /parcels/{tracking}/status#

تحدّث حالة الطرد.

json
{ "action": "partial", "collected": 15, "note": "One item returned" }
action النتيجة تنجح عندما يكون الطرد
received بالمستودع بانتظار الاستلام، أو في مرحلة الاستلام، أو مع مندوب (إعادة للمستودع)
deliver تم التسليم مع مندوب (مع مندوب التوصيل أو إعادة جدولة التوصيل)
partial تسليم جزئي؛ collected مطلوب ولا يتجاوز مبلغ التحصيل مع مندوب
fail فشل التوصيل — راجع للشركة (المرحلة returning) في المستودع أو الفرع، أو مع مندوب
reschedule يعود إلى المستودع لتوزيع جديد؛ ويُحتسب محاولة واحدة مع مندوب
returned استلام التاجر للمرتجع (نهائي) بعد fail
  • لا يمكن تغيير حالة طرد أُرسل إلى شركة شحن خارجية: 409 والكود not_allowed.
  • action غير معروف يعطي 422 والكود validation_failed؛ وpartial بدون collected رقمي يعطي 422 على collected.
  • التغيير الذي لا يسمح به مسار العمل، أو collected أكبر من مبلغ التحصيل، يعطي 409 والكود invalid_transition مع السبب في الرسالة.

كائن الطرد#

الطرود التي تُرجعها هذه الواجهة فيها كل حقول كائن الطرد في واجهة التاجر (id وtracking_number وreference وstage وstatus_code وstatus_label وcompany_id وcompany_name وexternal_tracking_number وrecipient وcod_amount وcod_collected وweight_kg وcharges وdelivery_attempts وnote وtracking_url وcreated_at وupdated_at) إضافة إلى:

  • merchant: {"id", "name"} والاسم هو الاسم التجاري للتاجر.
  • deliveryman: {"id", "name"}، أو null عندما لا يكون للطرد مندوب معيَّن.
  • events: عند جلب طرد واحد فقط؛ وفي كل حدث status_code وstage وstatus_label وnote وat.

stage واحدة من pending (الحالة 1) وprocessing (أي حالة غير مذكورة أدناه) وout_for_delivery (7 و8) وdelivered (9) وpartially_delivered (32) وreturning (11 و12 و24 و26 و27) وreturned (13 و30). وcod_amount بالدولار الأمريكي. وهذا الكائن نفسه هو ما يحمله ويب هوك الشركة في data.

json
{
  "success": true,
  "data": {
    "id": 5521,
    "tracking_number": "DS261013AB12CD",
    "reference": "ORD-1001",
    "stage": "out_for_delivery",
    "status_code": 7,
    "status_label": "Delivery Man Assign",
    "company_id": 13,
    "company_name": "Example Delivery",
    "external_tracking_number": null,
    "recipient": { "name": "Sara", "phone": "0944123456", "governorate": "Damascus", "address": "Mazzeh, building 4", "lat": null, "lng": null },
    "cod_amount": 25,
    "cod_collected": 0,
    "weight_kg": 1,
    "charges": { "delivery_fee": 6, "platform_fee": 0 },
    "delivery_attempts": 0,
    "note": null,
    "tracking_url": "https://YOUR_DOMAIN/t/DS261013AB12CD",
    "created_at": "2026-10-13T10:00:00+03:00",
    "updated_at": "2026-10-13T12:10:00+03:00",
    "merchant": { "id": 41, "name": "Flower Shop" },
    "deliveryman": { "id": 5, "name": "Samer" }
  }
}

أمثلة برمجية#

إنشاء طرد لأحد تجّارك#

bash
curl -X POST https://YOUR_DOMAIN/api/company/v1/parcels \
  -H "Authorization: Bearer YOUR_COMPANY_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "merchant_id": 41,
    "reference": "ORD-1001",
    "recipient": {
      "name": "Sara",
      "phone": "0944123456",
      "governorate": "Damascus",
      "address": "Mazzeh, building 4"
    },
    "cod_amount": 25,
    "weight": 1
  }'
javascript
const BASE = "https://YOUR_DOMAIN/api/company/v1";

async function call(method, path, body) {
  const res = await fetch(BASE + path, {
    method,
    headers: {
      "Authorization": `Bearer ${process.env.DS_COMPANY_KEY}`,
      "Content-Type": "application/json",
      "Accept": "application/json",
    },
    body: body ? JSON.stringify(body) : undefined,
  });
  const json = await res.json();
  if (!json.success) {
    throw new Error(`${res.status} ${json.error.code}: ${json.error.message}`);
  }
  return json.data;
}

async function createParcel() {
  const parcel = await call("POST", "/parcels", {
    merchant_id: 41,
    reference: "ORD-1001",
    recipient: { name: "Sara", phone: "0944123456", governorate: "Damascus", address: "Mazzeh, building 4" },
    cod_amount: 25,
    weight: 1,
  });
  console.log(parcel.tracking_number, parcel.stage, parcel.merchant.name);
}

createParcel();
php
<?php
function ds_call(string $method, string $path, ?array $body = null): array
{
    $options = [
        CURLOPT_CUSTOMREQUEST  => $method,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT        => 30,
        CURLOPT_HTTPHEADER     => [
            'Authorization: Bearer ' . getenv('DS_COMPANY_KEY'),
            'Content-Type: application/json',
            'Accept: application/json',
        ],
    ];
    if ($body !== null) {
        $options[CURLOPT_POSTFIELDS] = json_encode($body);
    }
    $ch = curl_init('https://YOUR_DOMAIN/api/company/v1' . $path);
    curl_setopt_array($ch, $options);
    $res    = json_decode(curl_exec($ch), true);
    $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if (!($res['success'] ?? false)) {
        throw new RuntimeException("$status {$res['error']['code']}: {$res['error']['message']}");
    }

    return $res['data'];
}

$parcel = ds_call('POST', '/parcels', [
    'merchant_id' => 41,
    'reference'   => 'ORD-1001',
    'recipient'   => ['name' => 'Sara', 'phone' => '0944123456', 'governorate' => 'Damascus', 'address' => 'Mazzeh, building 4'],
    'cod_amount'  => 25,
    'weight'      => 1,
]);
echo $parcel['tracking_number'], "\n";
python
import os
import requests

BASE = "https://YOUR_DOMAIN/api/company/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['DS_COMPANY_KEY']}", "Accept": "application/json"}


def call(method, path, body=None):
    r = requests.request(method, BASE + path, json=body, headers=HEADERS, timeout=30)
    data = r.json()
    if not data["success"]:
        raise RuntimeError(f"{r.status_code} {data['error']['code']}: {data['error']['message']}")
    return data["data"]


parcel = call("POST", "/parcels", {
    "merchant_id": 41,
    "reference": "ORD-1001",
    "recipient": {"name": "Sara", "phone": "0944123456", "governorate": "Damascus", "address": "Mazzeh, building 4"},
    "cod_amount": 25,
    "weight": 1,
})
print(parcel["tracking_number"], parcel["stage"])

عرض الطرود وتعيين المندوب وتسليم الطرد#

bash
curl "https://YOUR_DOMAIN/api/company/v1/parcels?stage=processing&per_page=100" \
  -H "Authorization: Bearer YOUR_COMPANY_API_KEY" -H "Accept: application/json"

curl -X POST https://YOUR_DOMAIN/api/company/v1/parcels/DS261013AB12CD/assign \
  -H "Authorization: Bearer YOUR_COMPANY_API_KEY" \
  -H "Content-Type: application/json" -H "Accept: application/json" \
  -d '{ "deliveryman_id": 5, "note": "Call before arriving" }'

curl -X POST https://YOUR_DOMAIN/api/company/v1/parcels/DS261013AB12CD/status \
  -H "Authorization: Bearer YOUR_COMPANY_API_KEY" \
  -H "Content-Type: application/json" -H "Accept: application/json" \
  -d '{ "action": "deliver", "note": "Received by the family" }'
javascript
const BASE = "https://YOUR_DOMAIN/api/company/v1";
const HEADERS = {
  "Authorization": `Bearer ${process.env.DS_COMPANY_KEY}`,
  "Content-Type": "application/json",
  "Accept": "application/json",
};

async function call(method, path, body) {
  const res = await fetch(BASE + path, { method, headers: HEADERS, body: body ? JSON.stringify(body) : undefined });
  const json = await res.json();
  if (!json.success) {
    throw new Error(`${res.status} ${json.error.code}: ${json.error.message}`);
  }
  return json;
}

async function dispatchAndDeliver() {
  const list = await call("GET", "/parcels?stage=processing&per_page=100");
  // assign only parcels at the warehouse (5) or hub (19)
  for (const p of list.data.filter((x) => [5, 19].includes(x.status_code))) {
    try {
      await call("POST", `/parcels/${p.tracking_number}/assign`, { deliveryman_id: 5 });
    } catch (e) {
      console.error(p.tracking_number, e.message); // for example 409 deliveryman_full
    }
  }
  const done = await call("POST", "/parcels/DS261013AB12CD/status", { action: "deliver", note: "Received by the family" });
  console.log(done.data.stage, done.data.deliveryman);
}

dispatchAndDeliver();
php
<?php
function ds_call(string $method, string $path, ?array $body = null): array
{
    $options = [
        CURLOPT_CUSTOMREQUEST  => $method,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT        => 30,
        CURLOPT_HTTPHEADER     => [
            'Authorization: Bearer ' . getenv('DS_COMPANY_KEY'),
            'Content-Type: application/json',
            'Accept: application/json',
        ],
    ];
    if ($body !== null) {
        $options[CURLOPT_POSTFIELDS] = json_encode($body);
    }
    $ch = curl_init('https://YOUR_DOMAIN/api/company/v1' . $path);
    curl_setopt_array($ch, $options);
    $res    = json_decode(curl_exec($ch), true);
    $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if (!($res['success'] ?? false)) {
        throw new RuntimeException("$status {$res['error']['code']}: {$res['error']['message']}");
    }

    return $res;
}

$list = ds_call('GET', '/parcels?stage=processing&per_page=100');
foreach ($list['data'] as $p) {
    if (!in_array($p['status_code'], [5, 19], true)) {
        continue; // assign only parcels at the warehouse (5) or hub (19)
    }
    try {
        ds_call('POST', "/parcels/{$p['tracking_number']}/assign", ['deliveryman_id' => 5]);
    } catch (RuntimeException $e) {
        echo $e->getMessage(), "\n"; // for example 409 deliveryman_full
    }
}
$done = ds_call('POST', '/parcels/DS261013AB12CD/status', ['action' => 'deliver', 'note' => 'Received by the family']);
echo $done['data']['stage'], "\n";
python
import os
import requests

BASE = "https://YOUR_DOMAIN/api/company/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['DS_COMPANY_KEY']}", "Accept": "application/json"}


def call(method, path, body=None, params=None):
    r = requests.request(method, BASE + path, json=body, params=params, headers=HEADERS, timeout=30)
    data = r.json()
    if not data["success"]:
        raise RuntimeError(f"{r.status_code} {data['error']['code']}: {data['error']['message']}")
    return data


parcels = call("GET", "/parcels", params={"stage": "processing", "per_page": 100})["data"]
for p in parcels:
    if p["status_code"] not in (5, 19):
        continue  # assign only parcels at the warehouse (5) or hub (19)
    try:
        call("POST", f"/parcels/{p['tracking_number']}/assign", {"deliveryman_id": 5})
    except RuntimeError as e:
        print(e)  # for example 409 deliveryman_full

done = call("POST", "/parcels/DS261013AB12CD/status", {"action": "deliver", "note": "Received by the family"})
print(done["data"]["stage"], done["data"]["deliveryman"])

أخطاء خاصة بهذه الواجهة#

HTTP error.code متى
402 subscription_expired انتهى اشتراك شركتك
402 insufficient_balance الرصيد لا يكفي لأجرة الطرد
403 plan_feature باقتك لا تتضمن الـ API
409 duplicate_reference للتاجر طرد بالـ reference نفسه
409 deliveryman_full بلغ المندوب حدّ الطرود
409 not_allowed الطرد عند شركة شحن خارجية
409 invalid_transition الإجراء لا يناسب الحالة الحالية، أو collected أكبر من اللازم
422 validation_failed حقل ناقص أو خاطئ؛ ويعدّدها fields (أما stage غير معروف، أو deliveryman_id ناقص أو لمندوب من شركة أخرى، أو action غير معروف فتحمل الرسالة فقط)

وبقية الرموز في «الأخطاء ورموز الحالة».

أخطاء شائعة#

  • إنشاء طرد لتاجر ليس من تجّارك. 422 على merchant_id؛ خذ المعرّفات من GET /merchants.
  • تكرار reference. 409 والكود duplicate_reference، وليس الطرد القديم كما في واجهة التاجر.
  • تسجيل التسليم قبل تعيين مندوب. 409 والكود invalid_transition؛ عيّن المندوب أولاً.
  • تعيين مندوب لطرد لا تسمح حالته بالانتقال إلى «مع مندوب التوصيل»، كطرد بانتظار الاستلام أو ما زال في مرحلة الاستلام. يرفضه مسار العمل ويردّ الـ API بـ 500 والكود server_error مع reference؛ افحص status_code أولاً.
  • تغيير حالة طرد شركة شحن. 409 والكود not_allowed؛ فحالته تتبع شركة الشحن.
  • الفلترة بـ stage غير معروف. 422، بخلاف واجهة التاجر التي تُهمله.
  • قراءة cod_amount بالعملة التي أدخلها التاجر. هو بالدولار الأمريكي.

الحدود والصلاحيات#

  • يعمل هنا مفتاح الشركة وحده، وفقط ما دام اشتراك الشركة فعّالاً وتتضمن الباقة ميزة الـ API (وتُستثنى من الشرطين الشركات التابعة للمنصة والمملوكة لتاجر).
  • حدود المسارات في الجدول أعلاه (عدّاد واحد مشترك لكل عنوان IP، وليست حصصاً منفصلة). وحدود الباقة في الدقيقة وفي اليوم تعطي 429 والكود rate_limited مع retry_after، أما الحد العام وحدود المسارات فتعطي 429 مع {"message": "Too Many Attempts."}.
  • ليس في واجهة الشركة نقاط ويب هوك؛ أدِر ويب هوك الشركة من اللوحة («الربط والـ API» ثم «الويب هوك»)؛ وهو لا يحمل إلا أحداث الطرود، ولطرود شركتك وحدها.

API

  • GET /api/company/v1/me
  • GET /api/company/v1/merchants
  • GET /api/company/v1/deliverymen
  • GET /api/company/v1/parcels
  • GET /api/company/v1/parcels/{tracking}
  • POST /api/company/v1/parcels
  • POST /api/company/v1/parcels/{tracking}/assign
  • POST /api/company/v1/parcels/{tracking}/status