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
- Jelentkezzen be → kattintson a nevére → API → generáljon kulcsot.
- 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ípus | Leírás |
|---|---|---|
| placed_count / unplaced_count | integer | Há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_m | number | Rakodási méter — a rakományblokk kiterjedése (max végpont − min kezdőpont). |
| metrics.linear_ft | number | Ugyanaz a kiterjedés lineáris lábbal (US LTL). |
| metrics.span_mm | integer | A kiterjedés milliméterben, mindig metrikus. |
| metrics.pallet_positions_eur | integer | null | Számlázott EUR raklaphelyek. null, ha a terv túl nagy a méréshez. |
| metrics.total_weight_kg | number | Elhelyezett súly, mindig kg. |
| metrics.overlaps | integer | Áthatoló párok — mindig 0 érvényes elrendezés esetén. |
| items[].placed | boolean | Bekerült-e a tétel az elrendezésbe. |
| items[].x / y / z | number | null | Pozí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_deg | 0 | 90 | Tájolás: forgatás a függőleges tengely körül; tilt = oldalára fektetve. |
| items[].length / width / height / weight | number | A tétel méretei a kérésben megadottaknak megfelelően, a kérés mértékegységeiben. |
| plan_url | string | null | A 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ípus | Leírás |
|---|---|---|
| vehicle | string | A 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. |
| items | array, required | A rakománylista (lásd alább a mezőket). |
| sandbox | boolean | Tesztmód: teljes eredmény, semmi nem tárolódik. Minden csomagban elérhető. |
| name | string | Terv neve (éles üzemmódban). |
| ldm_limit_m | number | A rakomány korlátozása az első N rakodási méterre (teherautók). |
| budget_ms | number | Optimalizálási időkeret (éles üzemmód; alapértelmezett: 30000, maximum: 300000). |
| callback_url | https URL | A feladat befejezésekor POST kéréssel elküldött eredmény, aláírással (lásd Webhookok). |
Tételek mezői
| Mező | Típus | Leírás |
|---|---|---|
| length / width / height | number, required | A tétel méretei a kérésben megadott mértékegységekben (alapértelmezés szerint mm, hüvelykben, ha "units": "imperial"). |
| weight | number, required | A tétel súlya (alapértelmezés szerint kg, fontban, ha "units": "imperial"). |
| quantity | integer, default 1 | Egyedi egységekre bontás. |
| name | string, optional | Megjelenik a tervben és a válaszban. |
| stackable | boolean, default true | Más rakomány helyezhető rá. |
| max_stack | number, optional | A tételre helyezhető maximális súly (ugyanabban a mértékegységben, mint a súly). |
| fragile | boolean, default false | Törékeny tételek csak a felső rétegeken helyezhetők el. |
| tiltable | boolean, default true | Oldalára fektethető-e a tétel. |
| destination_stop | integer, default 1 | Kiszá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ód | Jármű | Belső méretek (H×Sz×M) | Teherbírás |
|---|---|---|---|
| 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 |
Konténerek
| Kód | Konténer | Belső méretek (H×Sz×M) | Teherbírás |
|---|---|---|---|
| 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 |
Hozzáférési szintek és korlátok
| Sandbox (minden csomagban) | Éles üzemmód (Enterprise) | |
|---|---|---|
| Hívások | 25 sikeres / hónap | 5 000 sikeres / hónap |
| Tételek a listában | 20 | 5,000 |
| Egyidejű feladatok | 1 | 10 |
| Optimalizálási időkeret | 10 s | 30 s alapértelmezett, legfeljebb 300 s |
| Tárolás | Semmi nem tárolódik | Minden 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ód | HTTP | Jelentés |
|---|---|---|
| invalid_key | 401 | Hiányzó, hibás formátumú vagy visszavont API-kulcs. |
| invalid_json | 400 | A törzs nem érvényes JSON. |
| invalid_vehicle | 400 | Ismeretlen járműkód / {customVehicleId}. |
| invalid_items | 400 | Egy tételmező hiányzik, nem numerikus vagy érvénytelen tartományú. |
| suspicious_dimensions | 400 | Minden méret 100 mm alatt — valószínűleg hüvelykben küldött mm. Adja meg a "units": "imperial" értéket. |
| invalid_units | 400 | A units értéke "metric" vagy "imperial" lehet. |
| invalid_objective | 400 | Az objective értéke "ldm" vagy "pallets" lehet. |
| invalid_callback | 400 | A callback_url értéke https kell legyen. |
| too_many_items | 400 | A lista meghaladja a hozzáférési szinthez tartozó tételszám-korlátot. |
| upgrade_required | 402 | Az éles üzemmódhoz Enterprise előfizetés szükséges. Használja a sandbox módot, vagy frissítsen. |
| sandbox_limit_reached | 402 | A havi sandbox keret felhasználásra került — visszaáll az 1-jén. |
| quota_exceeded | 402 | A 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_jobs | 429 | Elérte az egyidejű feladatok korlátját. Kérdezze le a futó feladatokat, majd próbálja újra. |
| not_found | 404 | Nincs ilyen feladat ehhez a munkaterülethez. |
Kérdések, magasabb korlátok vagy szükséges csatlakozó (Zapier, Excel, MCP)? hello@hansatic.com