الانتقال إلى المحتوى
عرض توضيحي — بيانات خياليةمن تصميم Algeria Agency

الربط البرمجي

اربط متجرك بالشبكة

واجهة برمجية بنمط REST وصيغة JSON لإنشاء الشحنات وتتبّع كلّ طرد وطلب الالتقاط والاطّلاع على التحويلات، وإشعارات آلية موقَّعة تُعلمك بكلّ جديد، ووحدات للمتاجر الإلكترونية، ونموذج استيراد لكلّ ما تبقّى.

ابدأ بثلاث طلبات

تمرّ كلّ الطلبات عبر عنوان الاختبار أدناه، بصيغة JSON وترميز UTF-8. المبالغ بالدينار دون كسور، والتواريخ بتوقيت الجزائر.

العنوان الأساسي
https://algeriaagency.com/api/demos/logistique/v1
المصادقة
يحمل كلّ طلب مفتاحك في الترويسة X-Api-Key. يُنشأ المفتاح في فضاء البائع، قسم الواجهة البرمجية، ويبدأ بـ kh_test_ ولا يُعرض إلّا مرّة واحدة.X-Api-Key: kh_test_••••••••••••••••••••7Q2m
طلبات قابلة للإعادة
أضف الترويسة Idempotency-Key إلى كلّ طلب POST: المفتاح نفسه خلال 24 ساعة يعيد الجواب نفسه دون إنشاء طرد ثانٍ. والترويسة نفسها بمحتوى مختلف تُرفض بالرمز 409.
ما تفعله بيئة الاختبار
في العرض التوضيحي يُستبدل كلّ مستلم عند الاستلام بمستلم تجريبي برقم مخفي، ولا يُحفظ سوى بصمة الرقم. وتُسجَّل الإشعارات الآلية في سجلّ فضائك ولا تُرسل أبدًا إلى الخارج. ويُمحى كلّ شيء بعد 24 ساعة.
  1. أنشئ مفتاح اختبار في فضاء البائع.
  2. اطلب السعر عبر GET /tariffs/quote لعرض كلفة التوصيل في سلّة الشراء.
  3. أنشئ الشحنة عبر POST /shipments حين تُؤكَّد الطلبية، ثمّ اطبع الملصق.
  4. استمع إلى الحدث shipment.status_changed لتحديث الطلبية دون استجواب الواجهة.

نقاط الربط

ستّ نقاط ربط تغطّي مسار الطلبية، من السعر المعروض في السلّة إلى المال المحوَّل.

POST/api/demos/logistique/v1/shipments

إنشاء شحنة

تسجّل طردًا وتحسب سعره ونافذة توصيله وخطر رفضه، وتعيد رقم التتبّع والملصق.

يقبل Idempotency-Keyالأخطاء الممكنة :400 · 401 · 409 · 422 · 429

متن الطلب
الحقلالنوعإلزاميالوصف
referencestring≤ 40لارقم طلبيتك، يعود كما هو.
recipientobjectنعمالمستلم.
recipient.namestring2–80نعماسمه. يُستبدل باسم تجريبي في بيئة الاختبار.
recipient.phonestringنعمهاتف نقّال جزائري. يُخفى ويُستبدل في بيئة الاختبار، ولا تُحفظ سوى بصمته.
destinationobjectنعممكان التوصيل.
destination.wilayainteger1–69نعمرمز الولاية، من 1 إلى 69.
destination.communestring2–60نعمبلدية من هذه الولاية: معرّفها أو اسمها بالعربية أو بالفرنسية أو بالحروف اللاتينية.
destination.landmarkstring≤ 160لامعلم بدل العنوان: «مقابل المسجد»، «خلف مكتب البريد».
modestringhomestop-deskنعمhome (إلى المنزل) أو stop-desk (الاستلام من الوكالة).
agencystringلاوكالة الاستلام في حالة نقطة الاستلام، وهي افتراضيًا وكالة الولاية.
weight_kgnumber0.05–70نعمالوزن بالكيلوغرام.
dimensions_cmobjectلاالأبعاد بالسنتيمتر، لحساب الوزن الحجمي.
dimensions_cm.lengthinteger1–300نعمالطول.
dimensions_cm.widthinteger1–300نعمالعرض.
dimensions_cm.heightinteger1–300نعمالارتفاع.
cod_amountinteger0–1000000نعمالمبلغ المحصَّل عند الباب بالدينار، و0 لطرد مدفوع مسبقًا.
declared_valueinteger0–5000000لاالقيمة المصرَّح بها للتأمين، وهي افتراضيًا المبلغ المحصَّل.
productstring2–120نعممحتوى الطرد في كلمات قليلة.
quantityinteger1–99لاعدد القطع.
optionsarray≤ 6insurancefragileexchangeconfirmationopen-on-deliveryexpressلاالخيارات: التأمين، قابل للكسر، الاستبدال، التأكيد، الفتح قبل الدفع، السريع.
notestring≤ 200لاتعليمة لعامل التوصيل.
الجواب 201
الحقلالنوعإلزاميالوصف
tracking_numberstringنعمرقم التتبّع: KH وعشرة أرقام، آخرها رقم تحقّق.
referencestringلارقم طلبيتك، يعود كما هو.
statestring
القيم (19)pending-confirmationconfirmedawaiting-pickuppicked-upat-origin-hubin-line-haulat-destination-hubout-for-deliverydeliveredattempt-failedrescheduledat-stop-deskcollected-from-stop-deskrefusedreturn-in-transitreturnedexchangelostcancelled
نعموضع الطرد.
priceobjectنعمسعر الإرسال.
price.htintegerنعمدون رسوم.
price.tvaintegerنعمالرسم على القيمة المضافة.
price.ttcintegerنعمبكلّ الرسوم.
price.lines[]arrayنعمالتفصيل سطرًا بسطر.
price.lines[].keystringنعمطبيعة السطر: نقل، رسوم تحصيل، خيار…
price.lines[].amountintegerنعممبلغه بكلّ الرسوم.
price.indicativebooleanنعمصحيح دائمًا: التعريفة إرشادية.
slaobjectنعمنافذة التوصيل الموعودة، بالساعات بعد الالتقاط.
sla.min_hoursintegerنعمفي أقرب تقدير.
sla.max_hoursintegerنعمفي أبعد تقدير.
riskobjectنعمخطر الرفض المقدَّر، مع أسبابه في فضاء البائع.
risk.scoreinteger0–100نعممن 0 إلى 100.
risk.bandstringlowmediumhighنعممنخفض أو متوسّط أو مرتفع.
label_urlstringنعمالملصق بمقاس 10 × 15 بصيغة PDF (نموذج في العرض التوضيحي).
tracking_urlstringنعمصفحة التتبّع التي تُرسل إلى الزبون.
created_atdatetimeنعمتاريخ الإنشاء.
الطلب — curl
curl -X POST 'https://algeriaagency.com/api/demos/logistique/v1/shipments' \
  -H 'X-Api-Key: kh_test_••••••••••••••••••••7Q2m' \
  -H 'Idempotency-Key: 6f1c2d0e-commande-0412' \
  -H 'Content-Type: application/json' \
  -d '{
    "reference": "CMD-2026-0412",
    "recipient": {
      "name": "Destinataire démo n° 42",
      "phone": "06 •• •• 48 17"
    },
    "destination": {
      "wilaya": 16,
      "commune": "Bab Ezzouar",
      "landmark": "en face de la mosquée El Feth"
    },
    "mode": "home",
    "weight_kg": 0.8,
    "cod_amount": 2500,
    "product": "Coffret soins visage",
    "options": [
      "confirmation"
    ]
  }'
الجواب 201
{
  "tracking_number": "KH4831200573",
  "reference": "CMD-2026-0412",
  "state": "pending-confirmation",
  "price": {
    "ht": 437,
    "tva": 83,
    "ttc": 520,
    "lines": [
      {
        "key": "transport",
        "amount": 400
      },
      {
        "key": "cod-fee",
        "amount": 50
      },
      {
        "key": "confirmation",
        "amount": 70
      }
    ],
    "indicative": true
  },
  "sla": {
    "min_hours": 12,
    "max_hours": 24
  },
  "risk": {
    "score": 21,
    "band": "low"
  },
  "label_url": "/api/demos/logistique/v1/shipments/KH4831200573/label.pdf",
  "tracking_url": "/demos/logistique/suivi/KH4831200573",
  "created_at": "2026-10-19T10:42:00+01:00"
}

GET/api/demos/logistique/v1/shipments/{tracking}

قراءة شحنة

حالة الطرد ومراحله وتحصيله، ونافذة وصوله حين يكون في طريق التوصيل.

الأخطاء الممكنة :401 · 404 · 429

معامل في المسار
الحقلالنوعإلزاميالوصف
trackingstringنعمرقم التتبّع: KH وعشرة أرقام، آخرها رقم تحقّق.
الجواب 200
الحقلالنوعإلزاميالوصف
tracking_numberstringنعمرقم التتبّع: KH وعشرة أرقام، آخرها رقم تحقّق.
statestring
القيم (19)pending-confirmationconfirmedawaiting-pickuppicked-upat-origin-hubin-line-haulat-destination-hubout-for-deliverydeliveredattempt-failedrescheduledat-stop-deskcollected-from-stop-deskrefusedreturn-in-transitreturnedexchangelostcancelled
نعموضع الطرد.
modestringhomestop-deskنعمhome (إلى المنزل) أو stop-desk (الاستلام من الوكالة).
destinationobjectنعممكان التوصيل.
destination.wilayainteger1–69نعمرمز الولاية، من 1 إلى 69.
destination.communestring2–60نعمبلدية من هذه الولاية: معرّفها أو اسمها بالعربية أو بالفرنسية أو بالحروف اللاتينية.
cod_amountintegerنعمالمبلغ المحصَّل عند الباب بالدينار، و0 لطرد مدفوع مسبقًا.
cod_statestring
القيم (8)pendingcollectedin-transit-to-hubreconciledpaid-outpartialdisputedrefunded
نعمأين وصل المال المحصَّل.
attemptsinteger0–3نعممحاولات التوصيل، ثلاث على الأكثر.
etaobjectلانافذة الوصول، حين يكون الطرد في طريق التوصيل.
eta.earliestdatetimeنعمبداية النافذة.
eta.latestdatetimeنعمنهاية النافذة.
events[]arrayنعمالمراحل، من الأقدم إلى الأحدث.
events[].statestring
القيم (19)pending-confirmationconfirmedawaiting-pickuppicked-upat-origin-hubin-line-haulat-destination-hubout-for-deliverydeliveredattempt-failedrescheduledat-stop-deskcollected-from-stop-deskrefusedreturn-in-transitreturnedexchangelostcancelled
نعموضع الطرد.
events[].atdatetimeنعموقت المرحلة.
events[].placestringنعمالمكان: البلدية أو رمز مركز الفرز أو الوكالة.
events[].reasonstringabsentrefusedwrong-addressunreachablerescheduledلافي حال الإخفاق، السبب.
الطلب — curl
curl -X GET 'https://algeriaagency.com/api/demos/logistique/v1/shipments/KH4831200573' \
  -H 'X-Api-Key: kh_test_••••••••••••••••••••7Q2m' \
  --compressed
الجواب 200
{
  "tracking_number": "KH4831200573",
  "state": "out-for-delivery",
  "mode": "home",
  "destination": {
    "wilaya": 16,
    "commune": "Bab Ezzouar"
  },
  "cod_amount": 2500,
  "cod_state": "pending",
  "attempts": 0,
  "eta": {
    "earliest": "2026-10-20T10:30:00+01:00",
    "latest": "2026-10-20T12:30:00+01:00"
  },
  "events": [
    {
      "state": "picked-up",
      "at": "2026-10-19T15:10:00+01:00",
      "place": "Bab Ezzouar"
    },
    {
      "state": "at-origin-hub",
      "at": "2026-10-19T19:45:00+01:00",
      "place": "RBA"
    },
    {
      "state": "out-for-delivery",
      "at": "2026-10-20T08:20:00+01:00",
      "place": "Bab Ezzouar"
    }
  ]
}

POST/api/demos/logistique/v1/shipments/bulk

إنشاء شحنات دفعة واحدة

حتّى 500 طرد في الطلب الواحد. تُنشأ الأسطر الصحيحة، وتعود الأخرى مع السبب، ومع اقتراحات حين يتعلّق الأمر بمكان.

يقبل Idempotency-Keyالأخطاء الممكنة :400 · 401 · 409 · 413 · 429

متن الطلب
الحقلالنوعإلزاميالوصف
shipments[]array1–500نعمالطرود، بالصيغة نفسها لشحنة واحدة.
shipments[].referencestring≤ 40لارقم طلبيتك، يعود كما هو.
shipments[].recipientobjectنعمالمستلم.
shipments[].recipient.namestring2–80نعماسمه. يُستبدل باسم تجريبي في بيئة الاختبار.
shipments[].recipient.phonestringنعمهاتف نقّال جزائري. يُخفى ويُستبدل في بيئة الاختبار، ولا تُحفظ سوى بصمته.
shipments[].destinationobjectنعممكان التوصيل.
shipments[].destination.wilayainteger1–69نعمرمز الولاية، من 1 إلى 69.
shipments[].destination.communestring2–60نعمبلدية من هذه الولاية: معرّفها أو اسمها بالعربية أو بالفرنسية أو بالحروف اللاتينية.
shipments[].destination.landmarkstring≤ 160لامعلم بدل العنوان: «مقابل المسجد»، «خلف مكتب البريد».
shipments[].modestringhomestop-deskنعمhome (إلى المنزل) أو stop-desk (الاستلام من الوكالة).
shipments[].agencystringلاوكالة الاستلام في حالة نقطة الاستلام، وهي افتراضيًا وكالة الولاية.
shipments[].weight_kgnumber0.05–70نعمالوزن بالكيلوغرام.
shipments[].dimensions_cmobjectلاالأبعاد بالسنتيمتر، لحساب الوزن الحجمي.
shipments[].dimensions_cm.lengthinteger1–300نعمالطول.
shipments[].dimensions_cm.widthinteger1–300نعمالعرض.
shipments[].dimensions_cm.heightinteger1–300نعمالارتفاع.
shipments[].cod_amountinteger0–1000000نعمالمبلغ المحصَّل عند الباب بالدينار، و0 لطرد مدفوع مسبقًا.
shipments[].declared_valueinteger0–5000000لاالقيمة المصرَّح بها للتأمين، وهي افتراضيًا المبلغ المحصَّل.
shipments[].productstring2–120نعممحتوى الطرد في كلمات قليلة.
shipments[].quantityinteger1–99لاعدد القطع.
shipments[].optionsarray≤ 6insurancefragileexchangeconfirmationopen-on-deliveryexpressلاالخيارات: التأمين، قابل للكسر، الاستبدال، التأكيد، الفتح قبل الدفع، السريع.
shipments[].notestring≤ 200لاتعليمة لعامل التوصيل.
الجواب 200
الحقلالنوعإلزاميالوصف
accepted[]arrayنعمالأسطر التي أُنشئت.
accepted[].indexintegerنعمموضع السطر في الدفعة، بدءًا من 0.
accepted[].tracking_numberstringنعمرقم التتبّع: KH وعشرة أرقام، آخرها رقم تحقّق.
rejected[]arrayنعمالأسطر المرفوضة.
rejected[].indexintegerنعمموضع السطر في الدفعة، بدءًا من 0.
rejected[].errors[]arrayنعمما ليس على ما يرام.
rejected[].errors[].pathstringنعمالحقل المعني.
rejected[].errors[].codestringنعمرمز ثابت.
rejected[].errors[].suggestionsarrayلافي حالة المكان، أقرب الأسماء.
الطلب — curl
curl -X POST 'https://algeriaagency.com/api/demos/logistique/v1/shipments/bulk' \
  -H 'X-Api-Key: kh_test_••••••••••••••••••••7Q2m' \
  -H 'Idempotency-Key: 6f1c2d0e-commande-0412' \
  -H 'Content-Type: application/json' \
  -d '{
    "shipments": [
      {
        "reference": "CMD-2026-0412",
        "recipient": {
          "name": "Destinataire démo n° 42",
          "phone": "06 •• •• 48 17"
        },
        "destination": {
          "wilaya": 16,
          "commune": "Bab Ezzouar",
          "landmark": "en face de la mosquée El Feth"
        },
        "mode": "home",
        "weight_kg": 0.8,
        "cod_amount": 2500,
        "product": "Coffret soins visage",
        "options": [
          "confirmation"
        ]
      },
      {
        "reference": "CMD-2026-0413",
        "recipient": {
          "name": "Destinataire démo n° 42",
          "phone": "06 •• •• 48 17"
        },
        "destination": {
          "wilaya": 31,
          "commune": "Bir Djir"
        },
        "mode": "home",
        "weight_kg": 0.8,
        "cod_amount": 2500,
        "product": "Coffret soins visage",
        "options": [
          "confirmation"
        ]
      }
    ]
  }'
الجواب 200
{
  "accepted": [
    {
      "index": 0,
      "tracking_number": "KH4831200573"
    }
  ],
  "rejected": [
    {
      "index": 1,
      "errors": [
        {
          "path": "destination.commune",
          "code": "commune-unknown",
          "suggestions": [
            "Bir el-Djir"
          ]
        }
      ]
    }
  ]
}

GET/api/demos/logistique/v1/tariffs/quote

حساب تعريفة

السعر بكلّ الرسوم ونافذة التوصيل بين ولايتين، مع الخيارات. التعريفة إرشادية وتتبع جدول الإدارة.

الأخطاء الممكنة :400 · 401 · 422 · 429

معاملات الطلب
الحقلالنوعإلزاميالوصف
from_wilayainteger1–69نعمولاية الانطلاق.
to_wilayainteger1–69نعمولاية الوصول.
to_communestringلابلدية الوصول، للتمييز داخل المدينة نفسها.
weight_kgnumber0.05–70نعمالوزن بالكيلوغرام.
modestringhomestop-deskنعمhome (إلى المنزل) أو stop-desk (الاستلام من الوكالة).
cod_amountinteger0≥ لاالمبلغ المحصَّل عند الباب بالدينار، و0 لطرد مدفوع مسبقًا.
optionsstringلاالخيارات نفسها، تفصل بينها فواصل.
الجواب 200
الحقلالنوعإلزاميالوصف
bandstringنعمشريحة التعريفة: المدينة نفسها أو الولاية نفسها أو زوج من المناطق.
priceobjectنعمسعر الإرسال.
price.htintegerنعمدون رسوم.
price.tvaintegerنعمالرسم على القيمة المضافة.
price.ttcintegerنعمبكلّ الرسوم.
price.lines[]arrayنعمالتفصيل سطرًا بسطر.
price.lines[].keystringنعمطبيعة السطر: نقل، رسوم تحصيل، خيار…
price.lines[].amountintegerنعممبلغه بكلّ الرسوم.
price.indicativebooleanنعمصحيح دائمًا: التعريفة إرشادية.
slaobjectنعمنافذة التوصيل الموعودة، بالساعات بعد الالتقاط.
sla.min_hoursintegerنعمفي أقرب تقدير.
sla.max_hoursintegerنعمفي أبعد تقدير.
unavailablearrayنعمالخيارات المطلوبة غير المتاحة على هذا المسار.
الطلب — curl
curl -X GET 'https://algeriaagency.com/api/demos/logistique/v1/tariffs/quote?from_wilaya=16&to_wilaya=31&weight_kg=1.2&mode=home&cod_amount=3500&options=insurance,fragile' \
  -H 'X-Api-Key: kh_test_••••••••••••••••••••7Q2m' \
  --compressed
الجواب 200
{
  "band": "north>north",
  "price": {
    "ht": 882,
    "tva": 168,
    "ttc": 1050,
    "lines": [
      {
        "key": "transport",
        "amount": 750
      },
      {
        "key": "cod-fee",
        "amount": 50
      },
      {
        "key": "insurance",
        "amount": 100
      },
      {
        "key": "fragile",
        "amount": 150
      }
    ],
    "indicative": true
  },
  "sla": {
    "min_hours": 24,
    "max_hours": 48
  },
  "unavailable": []
}

POST/api/demos/logistique/v1/pickups

طلب التقاط

يمرّ عامل توصيل عندك في يوم العمل الذي تختاره، صباحًا أو بعد الظهر. بعد الساعة 14:00 لا يُضمن الالتقاط في اليوم نفسه.

يقبل Idempotency-Keyالأخطاء الممكنة :400 · 401 · 409 · 422 · 429

متن الطلب
الحقلالنوعإلزاميالوصف
datedateنعميوم عمل: لا جمعة ولا عطلة رسمية.
slotstringmorningafternoonنعمصباحًا أو بعد الظهر.
parcelsinteger1–500نعمعدد الطرود المنتظرة.
tracking_numbersarray≤ 500لاالأرقام المعنية، إن كانت لديك.
locationobjectنعممكان المرور، مع معلم.
location.wilayainteger1–69نعمرمز الولاية، من 1 إلى 69.
location.communestring2–60نعمبلدية من هذه الولاية: معرّفها أو اسمها بالعربية أو بالفرنسية أو بالحروف اللاتينية.
location.landmarkstring≤ 160لامعلم بدل العنوان: «مقابل المسجد»، «خلف مكتب البريد».
الجواب 201
الحقلالنوعإلزاميالوصف
pickup_refstringنعممرجع الالتقاط.
datedateنعميوم عمل: لا جمعة ولا عطلة رسمية.
slotstringmorningafternoonنعمصباحًا أو بعد الظهر.
statestringscheduledcollectedmissedcancelledنعممبرمج أو منفَّذ أو فائت أو ملغى.
الطلب — curl
curl -X POST 'https://algeriaagency.com/api/demos/logistique/v1/pickups' \
  -H 'X-Api-Key: kh_test_••••••••••••••••••••7Q2m' \
  -H 'Idempotency-Key: 6f1c2d0e-commande-0412' \
  -H 'Content-Type: application/json' \
  -d '{
    "date": "2026-10-20",
    "slot": "morning",
    "parcels": 14,
    "location": {
      "wilaya": 16,
      "commune": "Bab Ezzouar",
      "landmark": "à côté de la pharmacie de nuit"
    }
  }'
الجواب 201
{
  "pickup_ref": "KH-DEMO-RAM-01877",
  "date": "2026-10-20",
  "slot": "morning",
  "state": "scheduled"
}

GET/api/demos/logistique/v1/payouts

قائمة التحويلات

تحويلات المبالغ المحصَّلة، بتحويل مصرفي أو بريدي، مع تفصيل الرسوم المقتطعة وموعد التحويل القادم.

الأخطاء الممكنة :400 · 401 · 429

معاملات الطلب
الحقلالنوعإلزاميالوصف
fromdateلاابتداءً من هذا التاريخ.
todateلاإلى هذا التاريخ.
statestringscheduledsentلامبرمج أو مُرسَل.
pageinteger1≥ لارقم الصفحة.
per_pageinteger1–100لاعدد الأسطر في الصفحة.
الجواب 200
الحقلالنوعإلزاميالوصف
payouts[]arrayنعمالتحويلات، من الأحدث إلى الأقدم.
payouts[].refstringنعمكشف التحويل.
payouts[].scheduled_fordateنعماليوم المبرمج.
payouts[].sent_atdatetimeلاوقت الإرسال.
payouts[].methodstringbankccpنعمتحويل مصرفي أو بريدي.
payouts[].parcelsintegerنعمالطرود المشمولة بالتحويل.
payouts[].collectedintegerنعممجموع المحصَّل.
payouts[].feesintegerنعمالرسوم المقتطعة: التوصيل والتحصيل والخيارات والمرتجعات.
payouts[].netintegerنعمالمبلغ المحوَّل.
payouts[].statestringscheduledsentنعممبرمج أو مُرسَل.
next_payout_daydateنعميوم التحويل القادم.
next_pageintegerلاالصفحة التالية، أو لا شيء.
الطلب — curl
curl -X GET 'https://algeriaagency.com/api/demos/logistique/v1/payouts?from=2026-10-01&state=sent' \
  -H 'X-Api-Key: kh_test_••••••••••••••••••••7Q2m' \
  --compressed
الجواب 200
{
  "payouts": [
    {
      "ref": "KH-DEMO-REL-00318",
      "scheduled_for": "2026-10-18",
      "sent_at": "2026-10-18T10:05:00+01:00",
      "method": "ccp",
      "parcels": 37,
      "collected": 112400,
      "fees": 18620,
      "net": 93780,
      "state": "sent"
    }
  ],
  "next_payout_day": "2026-10-21",
  "next_page": null
}

إشعارات آلية موقَّعة

صرّح بعنوان في فضاء البائع واختر الأحداث. يحمل كلّ إرسال توقيعًا تتحقّق منه قبل أن تثق في محتواه.

الأحداث

shipment.status_changed

يتغيّر وضع الطرد: التُقط، في مركز الفرز، قيد التوصيل، سُلّم، المستلم غائب، رُفض، أُرجع.

محتوى الحدث
{
  "id": "evt_7Hc2Qm8LxP0aR4tN9kDz",
  "type": "shipment.status_changed",
  "created_at": "2026-10-20T11:02:13+01:00",
  "data": {
    "tracking_number": "KH4831200573",
    "reference": "CMD-2026-0412",
    "from": "out-for-delivery",
    "to": "delivered",
    "at": "2026-10-20T11:02:10+01:00",
    "place": "Bab Ezzouar"
  }
}

cod.collected

حصّل عامل التوصيل المبلغ عند الباب، كاملًا أو جزئيًا.

محتوى الحدث
{
  "id": "evt_7Hc2Qm8LxP0aR4tN9kDz",
  "type": "cod.collected",
  "created_at": "2026-10-20T11:02:13+01:00",
  "data": {
    "tracking_number": "KH4831200573",
    "amount": 2500,
    "collected_at": "2026-10-20T11:02:10+01:00",
    "partial": false
  }
}

payout.sent

انطلق تحويل نحو حسابك المصرفي أو البريدي.

محتوى الحدث
{
  "id": "evt_7Hc2Qm8LxP0aR4tN9kDz",
  "type": "payout.sent",
  "created_at": "2026-10-20T11:02:13+01:00",
  "data": {
    "ref": "KH-DEMO-REL-00318",
    "net": 93780,
    "method": "ccp",
    "parcels": 37,
    "sent_at": "2026-10-18T10:05:00+01:00"
  }
}

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

تحمل الترويسة X-Khatt-Signature القيمة t= (وقت الإرسال بالثواني) والقيمة v1= (بصمة HMAC-SHA256 بالنظام الست عشري لـ t ونقطة والمتن الخام، محسوبة بسرّ العنوان). أعد حسابها، وقارن في زمن ثابت، وارفض كلّ إرسال مضى عليه أكثر من خمس دقائق.

X-Khatt-Signature: t=1760954533,v1=5f0c…e21a
التحقّق بلغة JavaScript
import { createHmac, timingSafeEqual } from 'node:crypto'

export function verify(rawBody, header, secret) {
  const parts = Object.fromEntries(header.split(',').map((p) => p.split('=')))
  const age = Math.abs(Date.now() / 1000 - Number(parts.t))
  if (!parts.t || !parts.v1 || age > 300) return false
  const expected = createHmac('sha256', secret).update(`${parts.t}.${rawBody}`).digest('hex')
  return timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1))
}
  • أجب برمز من فئة 2xx في أقلّ من عشر ثوانٍ. وإلّا يُعاد الإرسال بعد دقيقة، ثمّ 5 دقائق، ثمّ 30 دقيقة، ثمّ ساعتين، ثمّ 6 ساعات، ثمّ يُسجَّل فاشلًا.
  • يُنتج زرّ «إرسال تجربة» في فضاء البائع (أو الطلب POST /webhooks/test) مثالًا عن كلّ حدث.

الحدود والأخطاء

  • 300 طلبًا في الساعة كحدّ أقصى لكلّ مفتاح. تبيّن الترويستان X-RateLimit-Remaining وX-RateLimit-Reset موقعك من الحدّ، وما زاد عليه يُجاب بالرمز 429 مع Retry-After.
  • تُحسب الدفعة طلبًا واحدًا وتضمّ 500 طرد على الأكثر. وتُقسَّم القوائم إلى صفحات من 100 سطر على الأكثر.
  • للخطأ دائمًا الشكل نفسه: رمز ثابت، ورسالة مقروءة، ولكلّ حقل مساره وسببه.
422
{
  "error": {
    "code": "unprocessable",
    "message": "…",
    "fields": [
      {
        "path": "destination.commune",
        "code": "commune-other-wilaya"
      }
    ]
  }
}
HTTPcodeالوصف
400invalid_requestطلب غير مقروء: صيغة غير صالحة أو معامل ناقص.
401unauthorizedمفتاح غائب أو مجهول أو ملغى.
403forbiddenلا يملك المفتاح حقّ الوصول إلى هذا المورد.
404not_foundلا طرد ولا تحويل بهذا الرقم لهذا الحساب.
409conflictسبق استعمال Idempotency-Key بمحتوى مختلف.
413too_largeدفعة تتجاوز 500 طرد.
422unprocessableمحتوى صالح لكنّه مرفوض: ولاية مجهولة، أو بلدية من ولاية أخرى، أو وزن خارج الحدود.
429rate_limitedطلبات كثيرة: انتظر المدّة المبيَّنة.
500internalخطأ من جهتنا: أعد المحاولة بالمفتاح Idempotency-Key نفسه.

للمتاجر الإلكترونية

لا حاجة إلى كتابة أيّ سطر: وحدة جاهزة تضع التعريفة في السلّة، وتنشئ الشحنة عند تأكيد الطلبية، وتحدّث الطلبية في كلّ مرحلة.

  • متاجر على أنظمة إدارة محتوى مفتوحة المصدر

    وحدة تُثبَّت من لوحة إدارة المتجر: التعريفة حسب الولاية في السلّة، والاختيار بين المنزل ونقطة الاستلام، والملصق من الطلبية مباشرة.

    عرض توضيحي
  • متاجر مستضافة

    تطبيق يُربط بنقرتين بمفتاحك: تصل الطلبيات إلى فضاء البائع جاهزة للتأكيد ووضع الملصقات.

    عرض توضيحي
  • الأسواق الإلكترونية

    موصل يقرأ طلبيات الأسواق الإلكترونية التي تبيع فيها، ويعيد رقم التتبّع إلى الزبون.

    عرض توضيحي
  • البيع عبر الرسائل

    تبيع عبر الرسائل الخاصّة؟ الصق الطلبية في فضاء البائع: يُتعرَّف على العنوان والمبلغ، وتؤكّد أنت كلّ حقل.

    عرض توضيحي

الاستيراد من ملف جدول

لإرسال طلبيات يوم كامل دفعة واحدة دون واجهة برمجية: ملف واحد، وسطر لكلّ طرد، حتّى 500 سطر.

الأعمدة المعروفة

لا يهمّ الترتيب، وتُعرف العناوين بالعربية والإنجليزية أيضًا. الاسم والهاتف والولاية والبلدية والمبلغ حقول إلزامية.

يُفحص كلّ سطر عند الاستيراد: البلدية التي لا تنتمي إلى ولايتها يُنبَّه إليها مع البلديات القريبة، والوزن الفارغ يُحسب كيلوغرامًا واحدًا.

في العرض التوضيحي تُستبدل الأسماء والأرقام الواردة في الملف بقيم تجريبية منذ الاستيراد. أرقام النموذج مخفية.

العمودإلزامي
Nomنعم
Téléphoneنعم
Wilayaنعم
Communeنعم
Adresseلا
Poidsلا
Montantنعم
Produitلا
Remarqueلا
Quantitéلا
Modeلا

نقيس استعمال هذا الموقع عبر Google Analytics، لنعرف أيّ الصفحات تنفع القارئ فعلًا. ويمكنك إيقاف هذا القياس متى شئت من أسفل الصفحة.نقيس عدد زوّار الموقع. سياسة ملفات تعريف الارتباطالكوكيز