Packing API

שלחו מטען וקיבלו חזרה תוכנית טעינה מותאמת ופיזית תקפה — מיקומים, מטרים טעינה, רגליים ליניאריות ומיקומי משטחים לחיוב. אותו מנוע שמאחורי האפליקציה, מאומת באופן רציף מול תוכניות טעינה אמיתיות של משלחים. גישה לסנדבוקס בכל תוכנית; גישה לייצור בתוכנית Enterprise.

התחלה מהירה

  1. התחברו → לחצו על השם שלכם → API → צרו מפתח.
  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אותו היקף ברגליים ליניאריות (LTL אמריקאי).
metrics.span_mmintegerההיקף במילימטרים, תמיד מטרית.
metrics.pallet_positions_eurinteger | nullמיקומי משטחים לחיוב מסוג EUR. 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"כיצד יש לקרוא ולהחזיר מידות ומשקלים של פריטים: mm/kg (ברירת מחדל) או in/lb. המיקומים בתגובה יהיו באותן יחידות.
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

רמות גישה ומגבלות

סנדבוקס (בכל תוכנית)ייצור (Enterprise)
קריאות25 מוצלחות / חודש5,000 אריזות מוצלחות / חודש
פריטים במניפסט205,000
משימות בו-זמניות110
תקציב אופטימיזציה10 שניות30 שניות כברירת מחדל, עד 300 שניות
שמירהלא נשמר דברכל אריזה יוצרת תוכנית אמיתית במרחב העבודה שלכם

רק אריזות מוצלחות נספרות — ניסיונות כושלים בוולידציה או עבודות שנכשלו אינם מחויבים כנגד המכסה. שני המונים מתאפסים ב-1 לחודש (UTC). תוצאות הסנדבוקס מלאות וללא הגבלות — המגבלה היא השער, לא התוצאה. צריכים יותר מ-5,000 אריזות בחודש? פנו אלינו לשיחה על תמחור לכמויות גדולות ושותפויות OEM.

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מפתח API חסר, פגום או מבוטל.
invalid_json400הגוף אינו JSON תקף.
invalid_vehicle400קוד רכב לא ידוע / {customVehicleId}.
invalid_items400שדה פריט חסר, אינו מספרי או מחוץ לטווח.
suspicious_dimensions400כל המידות מתחת ל-100 מ״מ — כנראה אינצ׳ים שנשלחו כמ״מ. העבירו "units": "imperial".
invalid_units400units חייב להיות "metric" או "imperial".
invalid_objective400objective חייב להיות "ldm" או "pallets".
invalid_callback400callback_url חייב להיות https.
too_many_items400המניפסט חורג ממגבלת הפריטים לרמת הגישה שלכם.
upgrade_required402מצב ייצור דורש את תוכנית Enterprise. השתמשו בסנדבוקס או שדרגו.
sandbox_limit_reached402מכסת הסנדבוקס החודשית נוצלה — מתאפסת ב-1 לחודש.
quota_exceeded402מכסת הייצור החודשית של 5,000 אריזות מוצתה — תתאפס ב-1 לחודש. לכמויות גדולות יותר: פנו אלינו.
too_many_jobs429הגעתם למגבלת משימות בו-זמניות. בדקו משימות פעילות ונסו שוב.
not_found404אין משימה כזו במרחב העבודה שלכם.

שאלות, מגבלות גבוהות יותר או מחבר שאתם צריכים (Zapier, Excel, MCP)? hello@hansatic.com