واجهة برمجة تطبيقات التعبئة
أرسل قائمة البضائع واحصل على خطة تحميل محسّنة ومدقق صحتها فيزيائياً — مواقع التحميل، الأمتار الخطية، الأقدام الخطية، ومواقع البليت المدفوعة. نفس المحرك المستخدم في التطبيق، والذي يتم التحقق منه باستمرار مقابل خطط التحميل الحقيقية لمشرفي التحميل. يتوفر الوصول إلى وضع الاختبار في كل باقة؛ بينما يتوفر الوصول الإنتاجي في باقة المؤسسة.
بدء سريع
- سجل الدخول → انقر على اسمك → واجهة برمجة التطبيقات → أنشئ مفتاحًا.
- أرسل طلب تعبئة (هذا الطلب يعمل في وضع الاختبار — مجاني في كل باقة):
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_count | integer | عدد العناصر التي تم تحميلها / التي لم يتم تحميلها. |
| units | "metric" | "imperial" | الوحدات التي يتم التعبير عن كل رقم أدناه بها (تكرار للطلب). |
| metrics.ldm_m | number | الأمتار الخطية — امتداد كتلة البضائع (الحد الأقصى للنهاية − الحد الأدنى للبداية). |
| metrics.linear_ft | number | نفس الامتداد بالأقدام الخطية (النقل بالشاحنات في الولايات المتحدة). |
| metrics.span_mm | integer | الامتداد بالمليمترات، دائمًا متري. |
| metrics.pallet_positions_eur | integer | null | مواقع البليت الأوروبية المدفوعة. القيمة null عندما يكون التخطيط كبيرًا جدًا بحيث لا يمكن قياسه. |
| metrics.total_weight_kg | number | الوزن المحمل، دائمًا بالكيلوغرام. |
| metrics.overlaps | integer | الأزواج المتداخلة — دائمًا 0 للتخطيط الصحيح. |
| items[].placed | boolean | ما إذا كان العنصر قد تم تحميله في التخطيط. |
| items[].x / y / z | number | null | الموقع بوحدات الطلب: x من نهاية الباب، y من الجدار الأيسر، z من الأرضية. جميع القيم الثلاثة تكون null عندما تكون placed هي false. |
| items[].rotation_deg / tilt_deg | 0 | 90 | الاتجاه: الدوران حول المحور العمودي؛ tilt = وضعه على جانبه. |
| items[].length / width / height / weight | number | العنصر كما تم إرساله، مكررًا بوحدات الطلب. |
| plan_url | string | null | الخطة المنشأة في التطبيق. القيمة null لطلبات وضع الاختبار. |
الإصدارات والاستقرار
يتم إصدار العقد بالإصدار في المسار (/api/v1/). داخل الإصدار v1، تكون التغييرات إضافية فقط — حقول طلب جديدة اختيارية، حقول استجابة جديدة، رموز مركبات جديدة ورموز أخطاء جديدة قد تظهر، ويجب على العملاء تجاهل الحقول التي لا يتعرفون عليها. لا يتغير معنى أو نوع الحقول الحالية أبدًا، ولا يتم إزالة أي شيء. التغيير الجوهري يعني مسار إصدار جديد، مع الحفاظ على الإصدار v1 بشكل متوازٍ لمدة 12 شهرًا على الأقل وإشعار بالإيقاف عبر البريد الإلكتروني لكل مساحة عمل تحتوي على مفتاح نشط.
حقول الطلب
| الحقل | النوع | الوصف |
|---|---|---|
| vehicle | string | رمز مركبة من الجداول أدناه. أو قم بتمرير {customVehicleId} (مركبة من أسطول مساحة العمل الخاصة بك). |
| objective | "ldm" | "pallets" | تقليل الأمتار الخطية، أو تقليل مواقع البليت المدفوعة. الافتراضي هو "ldm". |
| units | "metric" | "imperial" | كيفية قراءة أبعاد ووزن العناصر وإعادتها: ملم/كجم (افتراضي) أو بوصة/رطل. تتبع المواقع في الاستجابة نفس الوحدات. |
| items | array, required | بيان البضائع (الحقول أدناه). |
| sandbox | boolean | وضع الاختبار: النتيجة كاملة ولا يتم الاحتفاظ بأي شيء. متاح في كل باقة. |
| name | string | اسم الخطة (وضع الإنتاج). |
| ldm_limit_m | number | تقييد الحمولة على أول N متر خطي (الشاحنات). |
| budget_ms | number | ميزانية وقت التحسين (الإنتاج؛ الافتراضي 30000، الحد الأقصى 300000). |
| callback_url | https URL | يتم إرسال النتيجة عبر POST عند انتهاء الطلب، موقعة (انظر Webhooks). |
حقول العنصر
| الحقل | النوع | الوصف |
|---|---|---|
| length / width / height | number, required | أبعاد العنصر، تُقرأ بوحدات الطلب (ملم افتراضيًا، بوصة مع "units": "imperial"). |
| weight | number, required | وزن العنصر (كجم افتراضيًا، رطل مع "units": "imperial"). |
| quantity | integer, default 1 | يتم توسيعها إلى وحدات فردية. |
| name | string, optional | يظهر في الخطة والاستجابة. |
| stackable | boolean, default true | يمكن وضع بضائع أخرى فوق هذا العنصر. |
| max_stack | number, optional | الحد الأقصى للوزن الذي يمكن لهذا العنصر تحمله من الأعلى (بنفس وحدات الوزن). |
| fragile | boolean, default false | يتم وضع العناصر الهشة في الطبقات العلوية فقط. |
| tiltable | boolean, default true | هل يمكن وضع العنصر على جانبه. |
| destination_stop | integer, default 1 | نقطة التوصيل للتحميل متعدد المحطات بنظام LIFO. |
رموز المركبات
تم إنشاؤها من مواصفات المحرك المباشر. تعمل المركبات المخصصة من أسطول مساحة العمل الخاصة بك عبر custom_vehicle_id.
الشاحنات والمقطورات
| الرمز | المركبة | الأبعاد الداخلية (الطول×العرض×الارتفاع) | الحمولة |
|---|---|---|---|
| CURTAINSIDER_136 | 13.6m Curtainsider | 13.62 × 2.48 × 2.70 m | 24 t |
| BOX_136 | 13.6m Box Trailer | 13.62 × 2.46 × 2.68 m | 24 t |
| MEGA_136 | 13.6m Mega Trailer | 13.62 × 2.48 × 3.00 m | 22.5 t |
| MEGA_CURTAIN_136 | 13.6m Mega Curtainsider | 13.62 × 2.48 × 3.00 m | 22 t |
| FLATBED_136 | 13.6m Flatbed | 13.62 × 2.48 × 3.00 m | 25 t |
| REEFER_136 | 13.6m Reefer | 13.32 × 2.44 × 2.54 m | 22 t |
| CURTAINSIDER_75 | 7.5m City Curtainsider | 7.50 × 2.48 × 2.70 m | 12 t |
| SWAPBODY_715 | 7.15m Swap Body | 7.15 × 2.48 × 2.70 m | 12 t |
| SWAPBODY_745 | 7.45m Swap Body | 7.45 × 2.48 × 2.70 m | 12 t |
| DRY_VAN_53 | 53ft Dry Van | 16.15 × 2.59 × 2.74 m | 20 t |
| FLATBED_53 | 53ft Flatbed | 16.15 × 2.59 × 3.66 m | 22 t |
| REEFER_53 | 53ft Reefer | 15.85 × 2.46 × 2.59 m | 18.5 t |
| CURTAINSIDER_125_CN | 12.5m Curtainsider (CN) | 12.50 × 2.50 × 2.80 m | 27 t |
| FLATBED_40_IN | 40ft Flatbed (IN) | 12.19 × 2.50 × 3.50 m | 26 t |
| BOX_138_BR | 13.8m Box Van (BR) | 13.80 × 2.50 × 2.90 m | 28 t |
| CURTAINSIDER_12_ZA | 12m Curtainsider (ZA) | 12.00 × 2.48 × 2.70 m | 28 t |
الحاويات
| الرمز | الحاوية | الأبعاد الداخلية (الطول×العرض×الارتفاع) | الحمولة |
|---|---|---|---|
| 20DC | 20' Dry Container | 5.89 × 2.35 × 2.39 m | 21.727 t |
| 20HC | 20' High Cube | 5.89 × 2.35 × 2.70 m | 21.58 t |
| 40DC | 40' Dry Container | 12.03 × 2.35 × 2.39 m | 26.63 t |
| 40HC | 40' High Cube | 12.03 × 2.35 × 2.70 m | 26.58 t |
| 45HC | 45' High Cube | 13.56 × 2.35 × 2.70 m | 25.68 t |
| 20OT | 20' Open Top | 5.89 × 2.35 × 2.39 m | 21.64 t |
| 40OT | 40' Open Top | 12.03 × 2.35 × 2.39 m | 26.58 t |
| 20RF | 20' Reefer | 5.44 × 2.29 × 2.27 m | 21 t |
| 40RF | 40' Reefer | 11.58 × 2.29 × 2.21 m | 25.6 t |
| 40RFHC | 40' Reefer High Cube | 11.58 × 2.29 × 2.54 m | 25.88 t |
| 53DC | 53' Domestic | 16.15 × 2.59 × 2.90 m | 26 t |
مستويات الوصول والحدود
| وضع الاختبار (كل باقة) | الإنتاج (المؤسسة) | |
|---|---|---|
| الطلبات | 25 طلب ناجح / شهر | ٥,٠٠٠ عملية تعبئة ناجحة / شهر |
| العناصر لكل بيان | 20 | 5,000 |
| الطلبات المتزامنة | 1 | 10 |
| ميزانية التحسين | 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_key | 401 | مفتاح واجهة برمجة التطبيقات مفقود أو غير صحيح أو تم إلغاؤه. |
| invalid_json | 400 | الجسم ليس بتنسيق JSON صالح. |
| invalid_vehicle | 400 | رمز المركبة / {customVehicleId} غير معروف. |
| invalid_items | 400 | حقل العنصر مفقود أو غير رقمي أو خارج النطاق. |
| suspicious_dimensions | 400 | جميع الأبعاد أقل من 100 ملم — من المحتمل أن تكون بوصات أُرسلت كملم. استخدم "units": "imperial". |
| invalid_units | 400 | يجب أن تكون units إما "metric" أو "imperial". |
| invalid_objective | 400 | يجب أن يكون objective إما "ldm" أو "pallets". |
| invalid_callback | 400 | يجب أن يكون callback_url بروتوكول https. |
| too_many_items | 400 | يتجاوز البيان حد العناصر لمستوى الوصول الخاص بك. |
| upgrade_required | 402 | يتطلب وضع الإنتاج باقة المؤسسة. استخدم وضع الاختبار أو قم بالترقية. |
| sandbox_limit_reached | 402 | تم استخدام الحد الشهري لوضع الاختبار — يعاد الضبط في الأول من الشهر. |
| quota_exceeded | 402 | تم استخدام الحصة الشهرية البالغة ٥,٠٠٠ عملية تعبئة — يعاد ضبطها في اليوم الأول من الشهر. للحجم الأكبر: تواصل معنا. |
| too_many_jobs | 429 | تم الوصول إلى حد الطلبات المتزامنة. استعلم عن الطلبات الجارية وحاول مرة أخرى. |
| not_found | 404 | لا يوجد طلب كهذا في مساحة العمل هذه. |
أسئلة، حدود أعلى، أو موصل تحتاج إليه (Zapier، Excel، MCP)؟ hello@hansatic.com