Packing API
Oddajte tovor in pridobite nazaj optimiziran, fizično veljaven načrt nakladanja — položaje, nakladalne metre, linearne čevlje in obračunane položaje palet. Enak motor kot v aplikaciji, nenehno preverjan glede na dejanske dispečerske razporeditve. Dostop do peskovnika na vsakem paketu; produkcijski dostop na Enterprise.
Hitri začetek
- Prijavite se → kliknite na svoje ime → API → ustvarite ključ.
- Oddajte nalogo za pakiranje (ta se izvaja v peskovniku — brezplačno na vsakem paketu):
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-..."
}Ponavljajte poizvedbe na status_url (enaka avtentikacijska glava) dokler status ni "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/..."
}
}Končne točke
POST /api/v1/pack
Preveri in uvrsti nalogo za pakiranje v čakalno vrsto. Vrne 202 s job_id. Podpira glavo Idempotency-Key — ponovitve z istim ključem vrnejo izvirno nalogo namesto ponovnega pakiranja.
GET /api/v1/jobs/{id}
Stanje naloge in, ko je končana, celoten rezultat. Rezultati se hranijo 30 dni; produkcijski načrti ostanejo v vašem delovnem prostoru trajno.
GET /api/v1/openapi.json
Strojno berljiva OpenAPI 3.1 pogodba — uvozite jo v Postman, generatorje kode ali jo prikažite svojemu orodju za kodiranje z umetno inteligenco. Kode vozil so vnesene iz aktivnega motorja, zato je vedno aktualna. Odprite specifikacijo ↗
Polja odgovora
Objekt result končane naloge:
| Polje | Tip | Opis |
|---|---|---|
| placed_count / unplaced_count | integer | Koliko izdelkov se je prileglo / se ni prileglo. |
| units | "metric" | "imperial" | Enote, v katerih so izražena vsa spodnja števila (ponovitev zahteve). |
| metrics.ldm_m | number | Nakladalni metri — razpon tovornega bloka (maks. konec − min. začetek). |
| metrics.linear_ft | number | Enak razpon v linearnih čevljih (ameriški LTL). |
| metrics.span_mm | integer | Razpon v mm, vedno metrično. |
| metrics.pallet_positions_eur | integer | null | Obračunani položaji EUR palet. null, če je razporeditev prevelika za merjenje. |
| metrics.total_weight_kg | number | Teža nameščenih izdelkov, vedno v kg. |
| metrics.overlaps | integer | Prekrivajoči se pari — vedno 0 za veljavno razporeditev. |
| items[].placed | boolean | Ali je izdelek prišel v razporeditev. |
| items[].x / y / z | number | null | Položaj v enotah zahteve: x od konca z vrati, y od leve stene, z od tal. Vsi trije so null, če je placed false. |
| items[].rotation_deg / tilt_deg | 0 | 90 | Orientacija: rotacija okoli navpične osi; tilt = položen na stran. |
| items[].length / width / height / weight | number | Izdelek, kot je bil oddan, ponovljen v enotah zahteve. |
| plan_url | string | null | Ustvarjen načrt v aplikaciji. null za naloge v peskovniku. |
Verzioniranje in stabilnost
Pogodba je verzionirana v poti (/api/v1/). Znotraj v1 so spremembe izključno aditivne — novi neobvezni polji zahteve, nova polja odgovora, nove kode vozil in napake se lahko pojavijo, stranke pa naj prezrejo polja, ki jih ne prepoznajo. Obstoječa polja nikoli ne spremenijo pomena ali tipa, ničesar pa se ne odstrani. Prekinitev združljivosti pomeni novo verzijo poti, pri čemer se v1 vzdržuje vzporedno vsaj 12 mesecev in obvestilo o opuščanju pošlje na e-pošto vsakega delovnega prostora z aktivnim ključem.
Polja zahteve
| Polje | Tip | Opis |
|---|---|---|
| vehicle | string | Koda vozila iz spodnjih tabel. Lahko podate tudi {customVehicleId} (vozilo iz vaše flote delovnega prostora). |
| objective | "ldm" | "pallets" | Minimizirajte nakladalne metre ali obračunane položaje palet. Privzeto "ldm". |
| units | "metric" | "imperial" | Kako se berejo in vračajo dimenzije in teže izdelkov: mm/kg (privzeto) ali in/lb. Položaji v odgovoru sledijo enakim enotam. |
| items | array, required | Manifest tovora (polja spodaj). |
| sandbox | boolean | Način preizkusa: poln rezultat, ničesar se ne shrani. Na voljo na vsakem paketu. |
| name | string | Ime načrta (način produkcije). |
| ldm_limit_m | number | Omejite nakladanje na prvih N nakladalnih metrov (tovornjaki). |
| budget_ms | number | Časovni proračun za optimizacijo (produkcija; privzeto 30000, največ 300000). |
| callback_url | https URL | Po končani nalogi se rezultat pošlje na {callbackUrl}, podpisan (glej Spletni klici). |
Polja izdelkov
| Polje | Tip | Opis |
|---|---|---|
| length / width / height | number, required | Dimenzije izdelka, prebranega v enotah zahteve (privzeto mm, palci z "units": "imperial"). |
| weight | number, required | Teža izdelka (privzeto kg, lb z "units": "imperial"). |
| quantity | integer, default 1 | Razširi se v posamezne enote. |
| name | string, optional | Prikazano v načrtu in odgovoru. |
| stackable | boolean, default true | Na ta izdelek se lahko namesti drug tovor. |
| max_stack | number, optional | Maksimalna teža, ki jo lahko izdelek nosi na sebi (enake enote kot teža). |
| fragile | boolean, default false | Krhki izdelki se namestijo samo v zgornje plasti. |
| tiltable | boolean, default true | Ali se lahko izdelek položi na stran. |
| destination_stop | integer, default 1 | Prevozna postaja za večpostajno LIFO nakladanje. |
Kode vozil
Ustvarjene iz specifikacij aktivnega motorja. Prilagojena vozila iz vaše flote delovnega prostora delujejo prek custom_vehicle_id.
Tovornjaki in prikolice
| Koda | Vozilo | Notranjost (D׊×V) | Nosilnost |
|---|---|---|---|
| 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 |
Kontejnerji
| Koda | Kontejner | Notranjost (D׊×V) | Nosilnost |
|---|---|---|---|
| 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 |
Razredi dostopa in omejitve
| Peskovnik (vsak paket) | Produkcija (Enterprise) | |
|---|---|---|
| Klici | 25 uspešnih / mesec | 5.000 uspešnih pakiranj / mesec |
| Izdelkov na manifest | 20 | 5,000 |
| Vzporedne naloge | 1 | 10 |
| Proračun optimizacije | 10 s | 30 s privzeto, do 300 s |
| Shranjevanje | Ničesar se ne shrani | Vsako pakiranje ustvari pravi načrt v vašem delovnem prostoru |
Štejejo se le uspešno zaključena pakiranja — neuspešne validacije in neuspešne naloge nikoli ne zaračunavamo v kvoto. Oba števca se ponastavita 1. dne (UTC). Rezultati v peskovniku so popolni in neokrnjeni — omejitve so le meja, ne pa tudi izhoda. Potrebujete več kot 5.000 pakiranj na mesec? Oglejte si možnosti za večje količine in cene OEM.
Spletni klici
Podajte callback_url, da prejmete rezultat prek POST, ko se naloga zaključi. Vsak klic vsebuje X-Hansatic-Signature: HMAC-SHA256 izvornega telesa s spletno skrivnostjo vašega ključa (prikazano enkrat ob ustvarjanju ključa). Preverite ga:
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));
}Dostava je en poskus s časovno omejitvijo 5 s — status_url vedno ostane vir resnice.
Napake
Vse napake so { "error": { "code", "message", ... } } — strojno berljiva koda, razumljivo sporočilo za človeka in field, če je vzrok določeno vhodno polje.
| Koda | HTTP | Pomen |
|---|---|---|
| invalid_key | 401 | Manjkajoč, napačno oblikovan ali preklican API ključ. |
| invalid_json | 400 | Telo ni veljaven JSON. |
| invalid_vehicle | 400 | Neznana koda vozila / {customVehicleId}. |
| invalid_items | 400 | Polje izdelka manjka, ni številsko ali je izven obsega. |
| suspicious_dimensions | 400 | Vse dimenzije pod 100 mm — verjetno palci poslani kot mm. Podajte "units": "imperial". |
| invalid_units | 400 | units mora biti "metric" ali "imperial". |
| invalid_objective | 400 | objective mora biti "ldm" ali "pallets". |
| invalid_callback | 400 | callback_url mora biti https. |
| too_many_items | 400 | Manifest presega omejitev števila izdelkov za vaš razred dostopa. |
| upgrade_required | 402 | Način produkcije zahteva paket Enterprise. Uporabite peskovnik ali nadgradite. |
| sandbox_limit_reached | 402 | Mesečna kvota peskovnika je porabljena — ponastavi se 1. v mesecu. |
| quota_exceeded | 402 | Mesečna proizvodna kvota 5.000 pakiranj je izkoriščena — ponastavitev 1. dne. Za večje količine: stopite v stik z nami. |
| too_many_jobs | 429 | Dosežena omejitev vzporednih nalog. Poizvedujte o tekočih nalogah in poskusite znova. |
| not_found | 404 | Nobena taka naloga za ta delovni prostor. |
Vprašanja, višje omejitve ali povezovalnik, ki ga potrebujete (Zapier, Excel, MCP)? hello@hansatic.com