واجهة برمجة تطبيقات التعبئة

أرسل قائمة البضائع واحصل على خطة تحميل محسّنة ومدقق صحتها فيزيائياً — مواقع التحميل، الأمتار الخطية، الأقدام الخطية، ومواقع البليت المدفوعة. نفس المحرك المستخدم في التطبيق، والذي يتم التحقق منه باستمرار مقابل خطط التحميل الحقيقية لمشرفي التحميل. يتوفر الوصول إلى وضع الاختبار في كل باقة؛ بينما يتوفر الوصول الإنتاجي في باقة المؤسسة.

بدء سريع

  1. سجل الدخول → انقر على اسمك → واجهة برمجة التطبيقات → أنشئ مفتاحًا.
  2. أرسل طلب تعبئة (هذا الطلب يعمل في وضع الاختبار — مجاني في كل باقة):
curl -X POST https://hansatic.com/api/v1/pack \
  -H "Authorization: Bearer hk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "vehicle": "CURTAINSIDER_136",
    "objective": "ldm",
    "sandbox": true,
    "items": [{
      "name": "Machine crate",
      "length": 2300, "width": 750, "height": 1400,
      "weight": 300, "quantity": 7,
      "stackable": false, "tiltable": false
    }]
  }'
{
  "job_id": "5e3617d1-abe4-4549-b7e6-d18c6baf814f",
  "status": "queued",
  "sandbox": true,
  "status_url": "https://hansatic.com/api/v1/jobs/5e3617d1-..."
}

استعلم عن status_url (بنفس رأس المصادقة) حتى تصبح status "done":

{
  "job_id": "5e3617d1-...",
  "status": "done",
  "result": {
    "placed_count": 7,
    "unplaced_count": 0,
    "units": "metric",
    "metrics": {
      "ldm_m": 5.25,
      "span_mm": 5250,
      "linear_ft": 17.2,
      "pallet_positions_eur": 14,
      "total_weight_kg": 2100,
      "overlaps": 0
    },
    "items": [
      { "id": "...", "name": "Machine crate", "placed": true,
        "x": 8370, "y": 0, "z": 0,
        "rotation_deg": 90, "tilt_deg": 0, "...": "..." }
    ],
    "plan_url": "https://hansatic.com/en/app/plans/..."
  }
}

نقاط النهاية

POST /api/v1/pack

يتحقق من صحة طلب التعبئة ويضعه في قائمة الانتظار. يعيد 202 مع job_id. يدعم رأس Idempotency-Key — إعادة المحاولة بنفس المفتاح تعيد الطلب الأصلي بدلاً من إعادة التعبئة.

GET /api/v1/jobs/{id}

حالة الطلب وعند الانتهاء، النتيجة الكاملة. يتم الاحتفاظ بالنتائج لمدة 30 يومًا؛ وتبقى الخطط الإنتاجية في مساحة العمل الخاصة بك بشكل دائم.

GET /api/v1/openapi.json

العقد القابل للقراءة آليًا بتنسيق OpenAPI 3.1 — يمكنك استيراده في Postman أو مولدات الأكواد أو توجيه أداة الترميز بالذكاء الاصطناعي إليه. يتم حقن رموز المركبات من المحرك المباشر، لذا فهو دائمًا محدث. افتح المواصفات ↗

حقول الاستجابة

كائن result في طلب مكتمل:

الحقلالنوعالوصف
placed_count / unplaced_countintegerعدد العناصر التي تم تحميلها / التي لم يتم تحميلها.
units"metric" | "imperial"الوحدات التي يتم التعبير عن كل رقم أدناه بها (تكرار للطلب).
metrics.ldm_mnumberالأمتار الخطية — امتداد كتلة البضائع (الحد الأقصى للنهاية − الحد الأدنى للبداية).
metrics.linear_ftnumberنفس الامتداد بالأقدام الخطية (النقل بالشاحنات في الولايات المتحدة).
metrics.span_mmintegerالامتداد بالمليمترات، دائمًا متري.
metrics.pallet_positions_eurinteger | nullمواقع البليت الأوروبية المدفوعة. القيمة null عندما يكون التخطيط كبيرًا جدًا بحيث لا يمكن قياسه.
metrics.total_weight_kgnumberالوزن المحمل، دائمًا بالكيلوغرام.
metrics.overlapsintegerالأزواج المتداخلة — دائمًا 0 للتخطيط الصحيح.
items[].placedbooleanما إذا كان العنصر قد تم تحميله في التخطيط.
items[].x / y / znumber | nullالموقع بوحدات الطلب: x من نهاية الباب، y من الجدار الأيسر، z من الأرضية. جميع القيم الثلاثة تكون null عندما تكون placed هي false.
items[].rotation_deg / tilt_deg0 | 90الاتجاه: الدوران حول المحور العمودي؛ tilt = وضعه على جانبه.
items[].length / width / height / weightnumberالعنصر كما تم إرساله، مكررًا بوحدات الطلب.
plan_urlstring | nullالخطة المنشأة في التطبيق. القيمة null لطلبات وضع الاختبار.

الإصدارات والاستقرار

يتم إصدار العقد بالإصدار في المسار (/api/v1/). داخل الإصدار v1، تكون التغييرات إضافية فقط — حقول طلب جديدة اختيارية، حقول استجابة جديدة، رموز مركبات جديدة ورموز أخطاء جديدة قد تظهر، ويجب على العملاء تجاهل الحقول التي لا يتعرفون عليها. لا يتغير معنى أو نوع الحقول الحالية أبدًا، ولا يتم إزالة أي شيء. التغيير الجوهري يعني مسار إصدار جديد، مع الحفاظ على الإصدار v1 بشكل متوازٍ لمدة 12 شهرًا على الأقل وإشعار بالإيقاف عبر البريد الإلكتروني لكل مساحة عمل تحتوي على مفتاح نشط.

حقول الطلب

الحقلالنوعالوصف
vehiclestringرمز مركبة من الجداول أدناه. أو قم بتمرير {customVehicleId} (مركبة من أسطول مساحة العمل الخاصة بك).
objective"ldm" | "pallets"تقليل الأمتار الخطية، أو تقليل مواقع البليت المدفوعة. الافتراضي هو "ldm".
units"metric" | "imperial"كيفية قراءة أبعاد ووزن العناصر وإعادتها: ملم/كجم (افتراضي) أو بوصة/رطل. تتبع المواقع في الاستجابة نفس الوحدات.
itemsarray, requiredبيان البضائع (الحقول أدناه).
sandboxbooleanوضع الاختبار: النتيجة كاملة ولا يتم الاحتفاظ بأي شيء. متاح في كل باقة.
namestringاسم الخطة (وضع الإنتاج).
ldm_limit_mnumberتقييد الحمولة على أول N متر خطي (الشاحنات).
budget_msnumberميزانية وقت التحسين (الإنتاج؛ الافتراضي 30000، الحد الأقصى 300000).
callback_urlhttps URLيتم إرسال النتيجة عبر POST عند انتهاء الطلب، موقعة (انظر Webhooks).

حقول العنصر

الحقلالنوعالوصف
length / width / heightnumber, requiredأبعاد العنصر، تُقرأ بوحدات الطلب (ملم افتراضيًا، بوصة مع "units": "imperial").
weightnumber, requiredوزن العنصر (كجم افتراضيًا، رطل مع "units": "imperial").
quantityinteger, default 1يتم توسيعها إلى وحدات فردية.
namestring, optionalيظهر في الخطة والاستجابة.
stackableboolean, default trueيمكن وضع بضائع أخرى فوق هذا العنصر.
max_stacknumber, optionalالحد الأقصى للوزن الذي يمكن لهذا العنصر تحمله من الأعلى (بنفس وحدات الوزن).
fragileboolean, default falseيتم وضع العناصر الهشة في الطبقات العلوية فقط.
tiltableboolean, default trueهل يمكن وضع العنصر على جانبه.
destination_stopinteger, default 1نقطة التوصيل للتحميل متعدد المحطات بنظام LIFO.

رموز المركبات

تم إنشاؤها من مواصفات المحرك المباشر. تعمل المركبات المخصصة من أسطول مساحة العمل الخاصة بك عبر custom_vehicle_id.

الشاحنات والمقطورات

الرمزالمركبةالأبعاد الداخلية (الطول×العرض×الارتفاع)الحمولة
CURTAINSIDER_13613.6m Curtainsider13.62 × 2.48 × 2.70 m24 t
BOX_13613.6m Box Trailer13.62 × 2.46 × 2.68 m24 t
MEGA_13613.6m Mega Trailer13.62 × 2.48 × 3.00 m22.5 t
MEGA_CURTAIN_13613.6m Mega Curtainsider13.62 × 2.48 × 3.00 m22 t
FLATBED_13613.6m Flatbed13.62 × 2.48 × 3.00 m25 t
REEFER_13613.6m Reefer13.32 × 2.44 × 2.54 m22 t
CURTAINSIDER_757.5m City Curtainsider7.50 × 2.48 × 2.70 m12 t
SWAPBODY_7157.15m Swap Body7.15 × 2.48 × 2.70 m12 t
SWAPBODY_7457.45m Swap Body7.45 × 2.48 × 2.70 m12 t
DRY_VAN_5353ft Dry Van16.15 × 2.59 × 2.74 m20 t
FLATBED_5353ft Flatbed16.15 × 2.59 × 3.66 m22 t
REEFER_5353ft Reefer15.85 × 2.46 × 2.59 m18.5 t
CURTAINSIDER_125_CN12.5m Curtainsider (CN)12.50 × 2.50 × 2.80 m27 t
FLATBED_40_IN40ft Flatbed (IN)12.19 × 2.50 × 3.50 m26 t
BOX_138_BR13.8m Box Van (BR)13.80 × 2.50 × 2.90 m28 t
CURTAINSIDER_12_ZA12m Curtainsider (ZA)12.00 × 2.48 × 2.70 m28 t

الحاويات

الرمزالحاويةالأبعاد الداخلية (الطول×العرض×الارتفاع)الحمولة
20DC20' Dry Container5.89 × 2.35 × 2.39 m21.727 t
20HC20' High Cube5.89 × 2.35 × 2.70 m21.58 t
40DC40' Dry Container12.03 × 2.35 × 2.39 m26.63 t
40HC40' High Cube12.03 × 2.35 × 2.70 m26.58 t
45HC45' High Cube13.56 × 2.35 × 2.70 m25.68 t
20OT20' Open Top5.89 × 2.35 × 2.39 m21.64 t
40OT40' Open Top12.03 × 2.35 × 2.39 m26.58 t
20RF20' Reefer5.44 × 2.29 × 2.27 m21 t
40RF40' Reefer11.58 × 2.29 × 2.21 m25.6 t
40RFHC40' Reefer High Cube11.58 × 2.29 × 2.54 m25.88 t
53DC53' Domestic16.15 × 2.59 × 2.90 m26 t

مستويات الوصول والحدود

وضع الاختبار (كل باقة)الإنتاج (المؤسسة)
الطلبات25 طلب ناجح / شهر٥,٠٠٠ عملية تعبئة ناجحة / شهر
العناصر لكل بيان205,000
الطلبات المتزامنة110
ميزانية التحسين10 ثوانٍ30 ثانية افتراضيًا، حتى 300 ثانية
الاحتفاظ بالبياناتلا يتم تخزين أي شيءكل تعبئة تنشئ خطة حقيقية في مساحة العمل الخاصة بك

تُحتسب عمليات التعبئة الناجحة فقط — عمليات التحقق الفاشلة والوظائف الفاشلة لا تُحتسب ضمن الحصة. يعاد ضبط العدادين في اليوم الأول من كل شهر (UTC). نتائج بيئة الاختبار كاملة وغير مقيدة — الحدود هي الحاجز، وليس المخرجات. هل تحتاج إلى أكثر من ٥,٠٠٠ عملية تعبئة شهريًا؟ تواصل معنا لمناقشة تسعير الحجم والشراكات الأصلية.

Webhooks

أرسل callback_url لاستلام النتيجة عبر POST عند اكتمال الطلب. يحمل كل رد X-Hansatic-Signature: توقيع HMAC-SHA256 للجسم الخام باستخدام سر Webhook الخاص بمفتاحك (يظهر مرة واحدة عند إنشاء المفتاح). تحقق منه:

const crypto = require('crypto');

function verify(rawBody, signatureHeader, webhookSecret) {
  const expected = crypto.createHmac('sha256', webhookSecret)
    .update(rawBody).digest('hex');
  return crypto.timingSafeEqual(
    Buffer.from(expected), Buffer.from(signatureHeader));
}

يتم محاولة التسليم مرة واحدة مع مهلة 5 ثوانٍ — يظل status_url دائمًا مصدر الحقيقة.

الأخطاء

جميع الأخطاء تأتي بالشكل { "error": { "code", "message", ... } } — رمز قابل للقراءة آليًا، رسالة قابلة للقراءة البشرية، وحقل field عندما يكون خطأ معين في الإدخال.

الرمزبروتوكول HTTPالمعنى
invalid_key401مفتاح واجهة برمجة التطبيقات مفقود أو غير صحيح أو تم إلغاؤه.
invalid_json400الجسم ليس بتنسيق JSON صالح.
invalid_vehicle400رمز المركبة / {customVehicleId} غير معروف.
invalid_items400حقل العنصر مفقود أو غير رقمي أو خارج النطاق.
suspicious_dimensions400جميع الأبعاد أقل من 100 ملم — من المحتمل أن تكون بوصات أُرسلت كملم. استخدم "units": "imperial".
invalid_units400يجب أن تكون units إما "metric" أو "imperial".
invalid_objective400يجب أن يكون objective إما "ldm" أو "pallets".
invalid_callback400يجب أن يكون callback_url بروتوكول https.
too_many_items400يتجاوز البيان حد العناصر لمستوى الوصول الخاص بك.
upgrade_required402يتطلب وضع الإنتاج باقة المؤسسة. استخدم وضع الاختبار أو قم بالترقية.
sandbox_limit_reached402تم استخدام الحد الشهري لوضع الاختبار — يعاد الضبط في الأول من الشهر.
quota_exceeded402تم استخدام الحصة الشهرية البالغة ٥,٠٠٠ عملية تعبئة — يعاد ضبطها في اليوم الأول من الشهر. للحجم الأكبر: تواصل معنا.
too_many_jobs429تم الوصول إلى حد الطلبات المتزامنة. استعلم عن الطلبات الجارية وحاول مرة أخرى.
not_found404لا يوجد طلب كهذا في مساحة العمل هذه.

أسئلة، حدود أعلى، أو موصل تحتاج إليه (Zapier، Excel، MCP)؟ hello@hansatic.com