Pakolási API

Küldjön rakományt, és kapjon vissza egy optimalizált, fizikailag érvényes rakodási tervet — elhelyezések, rakodási méter, lineáris láb és számlázott raklaphelyek. Ugyanaz a motor, amely a webalkalmazást működteti, folyamatosan validálva valódi diszpécseri elrendezésekkel. Sandbox-hozzáférés minden csomagban; éles üzemmód az Enterprise előfizetéssel.

Gyors kezdés

  1. Jelentkezzen be → kattintson a nevére → API → generáljon kulcsot.
  2. Küldjön el egy pakolási feladatot (ez sandbox módban fut — ingyenes minden csomagban):
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-..."
}

Kérdezze le a status_url címet (ugyanazzal a hitelesítési fejléccel), amíg a status értéke "done" nem lesz:

{
  "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/..."
  }
}

Végpontok

POST /api/v1/pack

Érvényesíti és sorba állítja a pakolási feladatot. 202 kóddal és job_id azonosítóval tér vissza. Támogatja az Idempotency-Key fejlécet — azonos kulccsal ismételt kérések az eredeti feladatot adják vissza, ahelyett, hogy kétszer pakolnának.

GET /api/v1/jobs/{id}

A feladat állapota és — befejezés után — a teljes eredmény. Az eredmények 30 napig tárolódnak; az éles üzemmódban létrehozott tervek véglegesen a munkaterületén maradnak.

GET /api/v1/openapi.json

Gép által olvasható OpenAPI 3.1 szerződés — importálható Postmanbe, kódgenerátorokba, vagy irányíthatja hozzá az AI kódolási eszközét. A járműkódok a valós motorból kerülnek beillesztésre, így mindig naprakész. A specifikáció megnyitása ↗

Válaszmezők

A result objektum egy befejezett feladat esetén:

MezőTípusLeírás
placed_count / unplaced_countintegerHány tétel fért el / nem fért el.
units"metric" | "imperial"A mértékegységek, amelyekben az alábbi számértékek szerepelnek (a kérésben megadottakat visszhangozza).
metrics.ldm_mnumberRakodási méter — a rakományblokk kiterjedése (max végpont − min kezdőpont).
metrics.linear_ftnumberUgyanaz a kiterjedés lineáris lábbal (US LTL).
metrics.span_mmintegerA kiterjedés milliméterben, mindig metrikus.
metrics.pallet_positions_eurinteger | nullSzámlázott EUR raklaphelyek. null, ha a terv túl nagy a méréshez.
metrics.total_weight_kgnumberElhelyezett súly, mindig kg.
metrics.overlapsintegerÁthatoló párok — mindig 0 érvényes elrendezés esetén.
items[].placedbooleanBekerült-e a tétel az elrendezésbe.
items[].x / y / znumber | nullPozíció a kérésben megadott mértékegységekben: x a rakodóajtótól, y a bal faltól, z a padlótól. Mindhárom null, ha placed értéke false.
items[].rotation_deg / tilt_deg0 | 90Tájolás: forgatás a függőleges tengely körül; tilt = oldalára fektetve.
items[].length / width / height / weightnumberA tétel méretei a kérésben megadottaknak megfelelően, a kérés mértékegységeiben.
plan_urlstring | nullA létrehozott terv az alkalmazásban. null sandbox feladatok esetén.

Verziókezelés és stabilitás

A szerződés verziószáma az elérési útban szerepel (/api/v1/). A v1-en belül a változtatások csak bővítések lehetnek — új, opcionális kérési mezők, új válaszmezők, új járműkódok és hibakódok jelenhetnek meg, amelyeket a klienseknek figyelmen kívül kell hagyniuk, ha nem ismerik fel őket. A meglévő mezők jelentése és típusa soha nem változik, és semmi nem kerül törlésre. A törő változtatás új verzióelérési utat jelent, a v1-es változatot pedig legalább 12 hónapon át párhuzamosan fenntartják, és minden olyan munkaterületnek e-mailben küldenek értesítést a leállásról, amelynek aktív kulcsa van.

Kérési mezők

MezőTípusLeírás
vehiclestringA lent található táblázatokból származó járműkód. Vagy adja meg a {customVehicleId} értéket (a munkaterület flottákészletéből származó jármű).
objective"ldm" | "pallets"A rakodási méterek vagy a számlázott raklaphelyek minimalizálása. Alapértelmezett: "ldm".
units"metric" | "imperial"A tételméretek és -súlyok értelmezési és visszaadási módja: mm/kg (alapértelmezett) vagy in/lb. A válaszban szereplő pozíciók ugyanazokat a mértékegységeket követik.
itemsarray, requiredA rakománylista (lásd alább a mezőket).
sandboxbooleanTesztmód: teljes eredmény, semmi nem tárolódik. Minden csomagban elérhető.
namestringTerv neve (éles üzemmódban).
ldm_limit_mnumberA rakomány korlátozása az első N rakodási méterre (teherautók).
budget_msnumberOptimalizálási időkeret (éles üzemmód; alapértelmezett: 30000, maximum: 300000).
callback_urlhttps URLA feladat befejezésekor POST kéréssel elküldött eredmény, aláírással (lásd Webhookok).

Tételek mezői

MezőTípusLeírás
length / width / heightnumber, requiredA tétel méretei a kérésben megadott mértékegységekben (alapértelmezés szerint mm, hüvelykben, ha "units": "imperial").
weightnumber, requiredA tétel súlya (alapértelmezés szerint kg, fontban, ha "units": "imperial").
quantityinteger, default 1Egyedi egységekre bontás.
namestring, optionalMegjelenik a tervben és a válaszban.
stackableboolean, default trueMás rakomány helyezhető rá.
max_stacknumber, optionalA tételre helyezhető maximális súly (ugyanabban a mértékegységben, mint a súly).
fragileboolean, default falseTörékeny tételek csak a felső rétegeken helyezhetők el.
tiltableboolean, default trueOldalára fektethető-e a tétel.
destination_stopinteger, default 1Kiszállítási megálló többállomásos LIFO rakodáshoz.

Járműkódok

A valós motor specifikációiból generálva. A munkaterület flottákészletéből származó egyedi járművek a custom_vehicle_id segítségével működnek.

Teherautók és pótkocsik

KódJárműBelső méretek (H×Sz×M)Teherbírás
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

Konténerek

KódKonténerBelső méretek (H×Sz×M)Teherbírás
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

Hozzáférési szintek és korlátok

Sandbox (minden csomagban)Éles üzemmód (Enterprise)
Hívások25 sikeres / hónap5 000 sikeres / hónap
Tételek a listában205,000
Egyidejű feladatok110
Optimalizálási időkeret10 s30 s alapértelmezett, legfeljebb 300 s
TárolásSemmi nem tárolódikMinden pakolás valódi tervet hoz létre a munkaterületen

Csak a sikeres pakolások számítanak – a validálási és végrehajtási hibák nem terhelik a kvótát. Mindkét számláló az hónap 1. napján (UTC) nullázódik. A tesztkörnyezet eredményei teljes értékűek és korlátozások nélkül állnak rendelkezésre – a limit csak a belépési küszöb, nem a kimenet. Több mint 5 000 pakolásra van szüksége havonta? Beszéljen velünk a nagyvolumenű és OEM árazási lehetőségekről.

Webhookok

Adja meg a callback_url címet, hogy a feladat befejezésekor POST kéréssel megkapja az eredményt. Minden visszahívás tartalmazza a X-Hansatic-Signature aláírást: a nyers törzs HMAC-SHA256 kódolású aláírását a kulcs webhook titkos kulcsával (amelyet a kulcs létrehozásakor egyszer mutatnak meg). Ellenőrizze ezt:

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));
}

Az elküldés egy próbálkozásból áll, 5s időtúllépéssel — a status_url mindig a forrásigazság marad.

Hibák

Minden hiba { "error": { "code", "message", ... } } formátumú — gép által olvasható kód, ember által olvasható üzenet, és field, ha egy konkrét bemenet a hibás.

KódHTTPJelentés
invalid_key401Hiányzó, hibás formátumú vagy visszavont API-kulcs.
invalid_json400A törzs nem érvényes JSON.
invalid_vehicle400Ismeretlen járműkód / {customVehicleId}.
invalid_items400Egy tételmező hiányzik, nem numerikus vagy érvénytelen tartományú.
suspicious_dimensions400Minden méret 100 mm alatt — valószínűleg hüvelykben küldött mm. Adja meg a "units": "imperial" értéket.
invalid_units400A units értéke "metric" vagy "imperial" lehet.
invalid_objective400Az objective értéke "ldm" vagy "pallets" lehet.
invalid_callback400A callback_url értéke https kell legyen.
too_many_items400A lista meghaladja a hozzáférési szinthez tartozó tételszám-korlátot.
upgrade_required402Az éles üzemmódhoz Enterprise előfizetés szükséges. Használja a sandbox módot, vagy frissítsen.
sandbox_limit_reached402A havi sandbox keret felhasználásra került — visszaáll az 1-jén.
quota_exceeded402A havi 5 000 pakolásból álló termelési kvóta elérte a limitet – az újrakezdés az hónap 1. napján történik. Nagyobb volumen esetén: lépjen kapcsolatba velünk.
too_many_jobs429Elérte az egyidejű feladatok korlátját. Kérdezze le a futó feladatokat, majd próbálja újra.
not_found404Nincs ilyen feladat ehhez a munkaterülethez.

Kérdések, magasabb korlátok vagy szükséges csatlakozó (Zapier, Excel, MCP)? hello@hansatic.com