Packing API
Pošaljite teret, a dobijete optimiziran i fizički valjan plan utovara — pozicije, utovarni metri, linearne stope i obračunate pozicije paleta. Isti mehanizam koji stoji iza aplikacije, kontinuirano provjeren prema stvarnim dispečerskim rasporedima. Pristup pješčaniku uključen na svakom paketu; produkcijski pristup na Enterprise planu.
Brzi početak
- Prijavite se → kliknite na svoje ime → API → generirajte ključ.
- Pošaljite zahtjev za pakiranje (ovaj se izvodi u pješčaniku — besplatan na svakom 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-..."
}Provjeravajte status_url (isti zaglavlje za autentifikaciju) dok status ne bude "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/..."
}
}Endpointi
POST /api/v1/pack
Provjerava i stavlja u red zahtjev za pakiranje. Vraća 202 s job_id. Podržava zaglavlje Idempotency-Key — ponovljeni zahtjevi s istim ključem vraćaju izvorni posao umjesto ponovnog pakiranja.
GET /api/v1/jobs/{id}
Status posla i, kada je završen, cijeli rezultat. Rezultati se čuvaju 30 dana; produkcijski planovi trajno su pohranjeni u vašem radnom prostoru.
GET /api/v1/openapi.json
Strojno čitljivi OpenAPI 3.1 ugovor — uvezite ga u Postman, generatore koda ili ga proslijedite alatu za kodiranje s AI-om. Kodovi vozila preuzimaju se iz aktivnog mehanizma, pa je uvijek ažuran. Otvori specifikaciju ↗
Polja odgovora
Objekt result za završen posao:
| Polje | Tip | Opis |
|---|---|---|
| placed_count / unplaced_count | integer | Koliko je predmeta stalo / nije stalo. |
| units | "metric" | "imperial" | Jedinice u kojima su izražene sve navedene vrijednosti (ponavlja zahtjev). |
| metrics.ldm_m | number | Utovarni metri — duljina teretnog bloka (maksimalni kraj − minimalni početak). |
| metrics.linear_ft | number | Ista duljina u linearnih stopa (američki LTL). |
| metrics.span_mm | integer | Duljina u mm, uvijek metrički. |
| metrics.pallet_positions_eur | integer | null | Obračunate EUR pozicije paleta. null ako je raspored prevelik za mjerenje. |
| metrics.total_weight_kg | number | Ukupna masa utovarenih predmeta, uvijek u kg. |
| metrics.overlaps | integer | Preklapajući parovi — uvijek 0 za valjan raspored. |
| items[].placed | boolean | Je li predmet ušao u raspored. |
| items[].x / y / z | number | null | Pozicija u jedinicama zahtjeva: x od vrata, y od lijevog zida, z od poda. Sve tri vrijednosti su null ako je placed false. |
| items[].rotation_deg / tilt_deg | 0 | 90 | Orijentacija: rotacija oko okomite osi; tilt = položeno na bok. |
| items[].length / width / height / weight | number | Dimenzije predmeta kako su navedene u zahtjevu, u jedinicama zahtjeva. |
| plan_url | string | null | Stvoreni plan u aplikaciji. null za poslove u pješčaniku. |
Verzioniranje i stabilnost
Ugovor je verzioniran u putanji (/api/v1/). Unutar v1, promjene su isključivo dodatne — novi neobavezni polja zahtjeva, nova polja odgovora, novi kodovi vozila i kodovi grešaka mogu se pojaviti, a klijenti trebaju zanemariti polja koja ne prepoznaju. Postojeća polja nikada ne mijenjaju značenje ili tip, a ništa se ne uklanja. Promjena koja narušava kompatibilnost znači novu verziju putanje, pri čemu se v1 održava paralelno najmanje 12 mjeseci, uz obavijest o zastariivanju e-poštom svakom radnom prostoru s aktivnim ključem.
Polja zahtjeva
| Polje | Tip | Opis |
|---|---|---|
| vehicle | string | Kod vozila iz donjih tablica. Ili proslijedite {customVehicleId} (vozilo iz vaše radne flote). |
| objective | "ldm" | "pallets" | Minimizirajte utovarnih metara ili obračunate pozicije paleta. Zadano "ldm". |
| units | "metric" | "imperial" | Kako se tumače i vraćaju dimenzije i mase predmeta: mm/kg (zadano) ili in/lb. Pozicije u odgovoru slijede iste jedinice. |
| items | array, required | Popis tereta (polja u nastavku). |
| sandbox | boolean | Testni način: puni rezultat, ništa se ne pohranjuje. Dostupan na svakom paketu. |
| name | string | Naziv plana (proizvodni način). |
| ldm_limit_m | number | Ograničite utovar na prvih N utovarnih metara (kamioni). |
| budget_ms | number | Vremenski budžet optimizacije (proizvodnja; zadano 30000, maksimalno 300000). |
| callback_url | https URL | Rezultat se šalje POST zahtjevom na ovu adresu kada posao završi, potpisan (vidi Webhookove). |
Polja predmeta
| Polje | Tip | Opis |
|---|---|---|
| length / width / height | number, required | Dimenzije predmeta, tumače se u jedinicama zahtjeva (zadano mm, inči s "units": "imperial"). |
| weight | number, required | Masa predmeta (zadano kg, lb s "units": "imperial"). |
| quantity | integer, default 1 | Razvija se u pojedinačne jedinice. |
| name | string, optional | Prikazuje se u planu i odgovoru. |
| stackable | boolean, default true | Može li drugi teret biti smješten iznad ovog predmeta. |
| max_stack | number, optional | Maksimalna masa koja može biti smještena iznad (iste jedinice kao i masa). |
| fragile | boolean, default false | Krhki predmeti smještaju se samo u gornje slojeve. |
| tiltable | boolean, default true | Može li se predmet položiti na bok. |
| destination_stop | integer, default 1 | Odredišna stanica za utovar s više stanica (LIFO). |
Kodovi vozila
Generirani iz specifikacija aktivnog mehanizma. Prilagođena vozila iz vaše radne flote rade preko custom_vehicle_id.
Kamioni i prikolice
| Kod | Vozilo | Unutrašnje dimenzije (D׊×V) | Nosivost |
|---|---|---|---|
| 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 |
Kontejneri
| Kod | Kontejner | Unutrašnje dimenzije (D׊×V) | Nosivost |
|---|---|---|---|
| 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 |
Razine pristupa i ograničenja
| Pješčanik (svaki paket) | Proizvodnja (Enterprise) | |
|---|---|---|
| Pozivi | 25 uspješnih / mjesec | 5.000 uspješnih pakiranja / mjesec |
| Predmeta po popisu | 20 | 5,000 |
| Istovremeni poslovi | 1 | 10 |
| Budžet optimizacije | 10 s | 30 s zadano, do 300 s |
| Trajnost | Ništa se ne pohranjuje | Svaki paket stvara stvarni plan u vašem radnom prostoru |
Broj se odnosi samo na uspješno izvršena pakiranja — neuspješne provjere valjanosti i neuspješni poslovi ne utječu na kvotu. Oba brojača se resetiraju 1. u mjesecu (UTC). Rezultati u sandbox okruženju su potpuni i neograničeni — ograničenja se odnose na broj zahtjeva, a ne na izlazne podatke. Trebate više od 5.000 pakiranja mjesečno? Kontaktirajte nas za rješenja većih volumena i OEM cijene.
Webhookovi
Proslijedite callback_url kako biste primili rezultat PUT zahtjevom kada posao završi. Svaki poziv sadrži X-Hansatic-Signature: HMAC-SHA256 potpisa sirovog tijela s webhook tajnim ključem vašeg ključa (prikazan jednom prilikom stvaranja ključa). Provjerite 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 jedan pokušaj s vremenskim ograničenjem od 5 s — status_url uvijek ostaje izvor istine.
Greške
Sve greške su { "error": { "code", "message", ... } } — strojno čitljiv kod, ljudski čitljiva poruka i field ako je određeni ulazni podatak kriv.
| Kod | HTTP | Značenje |
|---|---|---|
| invalid_key | 401 | Nedostaje, neispravan ili opozvan API ključ. |
| invalid_json | 400 | Tijelo nije valjani JSON. |
| invalid_vehicle | 400 | Nepoznat kod vozila / {customVehicleId}. |
| invalid_items | 400 | Polje predmeta nedostaje, nije brojčano ili je izvan raspona. |
| suspicious_dimensions | 400 | Sve dimenzije ispod 100 mm — vjerojatno su inči poslani kao mm. Proslijedite "units": "imperial". |
| invalid_units | 400 | units mora biti "metric" ili "imperial". |
| invalid_objective | 400 | objective mora biti "ldm" ili "pallets". |
| invalid_callback | 400 | callback_url mora biti https. |
| too_many_items | 400 | Popis tereta premašuje ograničenje predmeta za vašu razinu pristupa. |
| upgrade_required | 402 | Proizvodni način zahtijeva Enterprise paket. Koristite pješčanik ili nadogradite paket. |
| sandbox_limit_reached | 402 | Mjesečni limit pješčanika iskorišten — obnavlja se 1. u mjesecu. |
| quota_exceeded | 402 | Mjesečna kvota od 5.000 pakiranja iskorištena — resetira se 1. u mjesecu. Za veće volumene: kontaktirajte nas. |
| too_many_jobs | 429 | Dosegnut limit istovremenih poslova. Provjerite tekuće poslove i pokušajte ponovno. |
| not_found | 404 | Nema takvog posla za ovaj radni prostor. |
Pitanja, veća ograničenja ili konektor koji vam treba (Zapier, Excel, MCP)? hello@hansatic.com