مرجع واجهة شركة التوصيل 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#
{
"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).
{
"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#
كل مناديبك؛ وهذه القائمة بلا ترقيم صفحات.
{
"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#
تعيّن مندوباً من مناديب شركتك.
{ "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#
تحدّث حالة الطرد.
{ "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.
{
"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" }
}
}
أمثلة برمجية#
إنشاء طرد لأحد تجّارك#
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
}'
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
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";
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"])
عرض الطرود وتعيين المندوب وتسليم الطرد#
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" }'
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
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";
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/meGET /api/company/v1/merchantsGET /api/company/v1/deliverymenGET /api/company/v1/parcelsGET /api/company/v1/parcels/{tracking}POST /api/company/v1/parcelsPOST /api/company/v1/parcels/{tracking}/assignPOST /api/company/v1/parcels/{tracking}/status