Pakavimo API
Pateikite krovinius, gaukite optimizuotą, fiziškai pagrįstą krovos planą — pozicijas, krovinio metrus, tiesinius pėdas ir apmokestinamas palečių vietas. Tas pats variklis, kuris naudojamas programėlėje, nuolat tikrinamas pagal realių dispečerių sudarytus planus. Sandbox prieiga prieinama kiekviename plane; produkcijos prieiga — Enterprise plane.
Greitas pradžiamokslis
- Prisijunkite → spustelėkite savo vardą → API → sugeneruokite raktą.
- Pateikite pakavimo užduotį (ši veikia sandbox režime — nemokamai kiekviename plane):
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-..."
}Periodiškai tikrinkite status_url (su tuo pačiu autentifikacijos antraštės raktu), kol status bus "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/..."
}
}Galutiniai taškai
POST /api/v1/pack
Patvirtina ir įkelia pakavimo užduotį. Grąžina 202 su job_id. Palaiko Idempotency-Key antraštę — pakartotiniai užklausimai su tuo pačiu raktu grąžina originalią užduotį, užuot pakavę dar kartą.
GET /api/v1/jobs/{id}
Užduoties būsena ir, kai baigta, pilnas rezultatas. Rezultatai saugomi 30 dienų; produkcijos planai jūsų darbo erdvėje išlieka nuolat.
GET /api/v1/openapi.json
Mašininiu būdu skaitoma OpenAPI 3.1 specifikacija — importuokite ją į Postman, kodų generatorius ar nukreipkite savo AI kūrimo įrankį. Transporto priemonių kodai įterpiami iš veikiančio variklio, todėl ji visada atnaujinta. Atidaryti specifikaciją ↗
Atsakymo laukai
result objektas baigtoje užduotyje:
| Laukas | Tipas | Aprašymas |
|---|---|---|
| placed_count / unplaced_count | integer | Kiek daiktų tilpo / netilpo. |
| units | "metric" | "imperial" | Vienetai, kuriais išreikšti visi žemiau pateikti skaičiai (atkartoja užklausą). |
| metrics.ldm_m | number | Krovinio metrai — krovinio bloko ilgis (maksimalus galas − minimalus pradžios taškas). |
| metrics.linear_ft | number | Tas pats ilgis tiesiniais pėdais (JAV LTL). |
| metrics.span_mm | integer | Ilgis milimetrais, visada metrinis. |
| metrics.pallet_positions_eur | integer | null | Apmokestinamos EUR palečių vietos. null, jei išdėstymas per didelis matavimui. |
| metrics.total_weight_kg | number | Sveriamas krovinys, visada kg. |
| metrics.overlaps | integer | Susikertančių porų skaičius — visada 0, jei išdėstymas tinkamas. |
| items[].placed | boolean | Ar daiktas pateko į išdėstymą. |
| items[].x / y / z | number | null | Pozicija užklausos vienetais: x nuo durų pusės, y nuo kairės sienos, z nuo grindų. Visi trys laukai yra null, jei placed yra false. |
| items[].rotation_deg / tilt_deg | 0 | 90 | Orientacija: pasukimas apie vertikalią ašį; tilt = padėtas ant šono. |
| items[].length / width / height / weight | number | Daiktas, kaip pateiktas, atkartotas užklausos vienetais. |
| plan_url | string | null | Sukurtas planas programėlėje. null sandbox užduotims. |
Versijavimas ir stabilumas
Sutartis versijuojama kelio (/api/v1/) lygmeniu. v1 versijoje pakeitimai yra tik papildomi — nauji neprivalomi užklausos laukai, nauji atsakymo laukai, nauji transporto priemonių kodai ir klaidų kodai gali pasirodyti, o klientai turėtų ignoruoti jiems nežinomus laukus. Esami laukai niekada nekeičia reikšmės ar tipo, ir niekas nėra pašalinama. Esminis pakeitimas reiškia naują versijos kelią, o v1 versija palaikoma lygiagrečiai bent 12 mėnesių ir apie išėjimą iš naudojimo pranešama el. paštu kiekvienai darbo erdveii, turinčiai aktyvų raktą.
Užklausos laukai
| Laukas | Tipas | Aprašymas |
|---|---|---|
| vehicle | string | Transporto priemonės kodas iš žemiau pateiktų lentelių. Arba perduokite custom_vehicle_id (transporto priemonė iš jūsų darbo erdvės flotilės). |
| objective | "ldm" | "pallets" | Minimizuoti krovinio metrus arba apmokestinamas palečių vietas. Numatyta reikšmė „ldm“. |
| units | "metric" | "imperial" | Kaip suprasti ir grąžinti daiktų matmenis bei svorius: mm/kg (numatyta) arba coliai/svarai. Atsakymo pozicijos naudojamos tos pačios vienetų sistemos. |
| items | array, required | Krovinio manifestas (žemiau pateikti laukai). |
| sandbox | boolean | Bandomasis režimas: pilnas rezultatas, niekas nėra išsaugoma. Prieinama kiekviename plane. |
| name | string | Plano pavadinimas (produkcijos režime). |
| ldm_limit_m | number | Apriboti krovinį iki pirmųjų N krovinio metrų (sunkvežimiai). |
| budget_ms | number | Optimizavimo laiko biudžetas (produkcijoje; numatyta 30000, maksimaliai 300000). |
| callback_url | https URL | Rezultatas bus POST metodas į {callbackUrl}, kai užduotis bus baigta, pasirašytas (žr. Webhook'ai). |
Daiktų laukai
| Laukas | Tipas | Aprašymas |
|---|---|---|
| length / width / height | number, required | Daikto matmenys, suprantami pagal užklausos vienetus (numatytas mm, coliai su „units“: „imperial“). |
| weight | number, required | Daikto svoris (numatytas kg, svarai su „units“: „imperial“). |
| quantity | integer, default 1 | Išplečiamas į atskirus vienetus. |
| name | string, optional | Rodomas plane ir atsakyme. |
| stackable | boolean, default true | Ar ant šio daikto gali būti kraunami kiti kroviniai. |
| max_stack | number, optional | Maksimalus svoris, kurį šis daiktas gali išlaikyti viršuje (tos pačios vienetų sistemos kaip svoris). |
| fragile | boolean, default false | Trapius daiktus reikia dėti tik į viršutinius sluoksnius. |
| tiltable | boolean, default true | Ar daiktą galima padėti ant šono. |
| destination_stop | integer, default 1 | Pristatymo stotelė daugiaetapio LIFO pakrovimo atveju. |
Transporto priemonių kodai
Sugeneruota iš veikiančio variklio specifikacijų. Jūsų darbo erdvės flotilės transporto priemonės veikia per custom_vehicle_id.
Sunkvežimiai ir priekabos
| Kodas | Transporto priemonė | Vidaus matmenys (L×P×A) | Krovumas |
|---|---|---|---|
| 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 |
Konteineriai
| Kodas | Konteineris | Vidaus matmenys (L×P×A) | Krovumas |
|---|---|---|---|
| 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 |
Prieigos lygiai ir apribojimai
| Sandbox (kiekviename plane) | Produkcija (Enterprise) | |
|---|---|---|
| Užklausos | 25 sėkmingos / mėnesį | 5 000 sėkmingų pakuočių / mėnesį |
| Daiktų skaičius manifeste | 20 | 5,000 |
| Vykdomos užduotys tuo pačiu metu | 1 | 10 |
| Optimizavimo biudžetas | 10 s | 30 s numatyta, iki 300 s |
| Išsaugojimas | Nieko neišsaugoma | Kiekvienas pakavimas sukuria realų planą jūsų darbo erdvėje |
Skaičiuojamos tik sėkmingai suformuotos pakuotės — netinkami užklausos duomenys ir nepavykę darbai į kvotą neįskaičiuojami. Abu skaitikliai atnaujinami kiekvieno mėnesio 1-ąją (UTC). Bandomojoje aplinkoje rezultatai yra pilni ir neapriboti — ribojamas tik kvotos dydis, o ne funkcionalumas. Reikia daugiau nei 5 000 pakuočių per mėnesį? Susisiekite su mumis dėl didesnių apimčių ir OEM kainodaros.
Webhook'ai
Nurodykite callback_url, kad gautumėte rezultatą POST metodu, kai užduotis bus baigta. Kiekvienas atgalinis iškvietimas turi X-Hansatic-Signature: HMAC-SHA256 parašą iš žinutės kūno su jūsų rakto webhook paslaptimi (rodoma tik kartą, kai raktas sukuriamas). Patvirtinkite ją:
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));
}Pristatymas vykdomas vieną kartą su 5 s laukimo laiku — status_url visada lieka pagrindiniu tiesos šaltiniu.
Klaidos
Visos klaidos yra { "error": { "code", "message", ... } } formato — mašininiu būdu skaitomas kodas, žmogui suprantama žinutė ir field, jei klaida susijusi su konkrečiu įvesties lauku.
| Kodas | HTTP | Reikšmė |
|---|---|---|
| invalid_key | 401 | Trūksta, netinkamai suformuotas arba atšauktas API raktas. |
| invalid_json | 400 | Pranešimo turinys nėra tinkamas JSON. |
| invalid_vehicle | 400 | Nežinomas transporto priemonės kodas arba custom_vehicle_id. |
| invalid_items | 400 | Trūksta daikto lauko, jis nėra skaitinis arba yra už leidžiamų ribų. |
| suspicious_dimensions | 400 | Visi matmenys mažesni nei 100 mm — greičiausiai coliai perduoti kaip milimetrai. Nurodykite „units“: „imperial“. |
| invalid_units | 400 | units turi būti „metric“ arba „imperial“. |
| invalid_objective | 400 | objective turi būti „ldm“ arba „pallets“. |
| invalid_callback | 400 | callback_url turi būti https. |
| too_many_items | 400 | Manifestas viršija daiktų skaičiaus limitą jūsų prieigos lygyje. |
| upgrade_required | 402 | Produkcijos režimui reikalingas Enterprise planas. Naudokite sandbox arba atnaujinkite planą. |
| sandbox_limit_reached | 402 | Mėnesinė sandbox kvota išnaudota — atnaujinama kiekvieno mėnesio 1-ąją. |
| quota_exceeded | 402 | Mėnesinė 5 000 pakuočių kvota išnaudota — atnaujinama kiekvieno mėnesio 1-ąją. Didesnėms apimtims: susisiekite su mumis. |
| too_many_jobs | 429 | Pasiektas lygiagrečių užduočių limitas. Patikrinkite vykdomų užduočių būseną ir bandykite dar kartą. |
| not_found | 404 | Tokios užduoties šioje darbo erdvėje nėra. |
Klausimų, didesnių apribojimų ar reikalingas sujungimas (Zapier, Excel, MCP)? hello@hansatic.com