Packing API
Pošaljite teret, dobijte optimizovan i fizički validan plan utovara — pozicije, utovarni metri, linearne stope i obračunate pozicije paleta. Isti algoritam kao u aplikaciji, kontinuirano proveravan prema stvarnim dispečerskim rasporedima. Pristup sandbox-u na svakom paketu; produkcioni pristup na Enterprise paketu.
Brzi početak
- Prijavite se → kliknite na svoje ime → API → generišite ključ.
- Pošaljite zahtev za pakovanje (ovaj se izvršava u sandbox-u — 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-..."
}Pitajte status_url (sa istim zaglavljem za autentifikaciju) sve 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/..."
}
}Endpoint-i
POST /api/v1/pack
Validira i stavlja u red zahtev za pakovanje. Vraća 202 sa job_id. Podržava zaglavlje Idempotency-Key — ponovni zahtevi sa istim ključem vraćaju originalni posao umesto ponovnog pakovanja.
GET /api/v1/jobs/{id}
Status posla i, kada je završen, kompletan rezultat. Rezultati se čuvaju 30 dana; produkcioni planovi trajno ostaju u vašem radnom prostoru.
GET /api/v1/openapi.json
Mašinski čitljiv OpenAPI 3.1 ugovor — uvezite ga u Postman, generatore koda ili ga prosledite alatu za AI kodiranje. Kodovi vozila se ubacuju iz aktivnog sistema, tako da je uvek ažuran. Otvorite specifikaciju ↗
Polja odgovora
Objekat result na završenom poslu:
| Polje | Tip | Opis |
|---|---|---|
| placed_count / unplaced_count | integer | Koliko predmeta staje / ne staje. |
| units | "metric" | "imperial" | Jedinice u kojima su izražene sve vrednosti ispod (ponavlja zahtev). |
| metrics.ldm_m | number | Utovarni metri — dužina teretnog bloka (maksimalni kraj − minimalni početak). |
| metrics.linear_ft | number | Ista dužina u linearnim stopama (američki LTL). |
| metrics.span_mm | integer | Dužina u mm, uvek metrički. |
| metrics.pallet_positions_eur | integer | null | Obračunate EUR pozicije paleta. null ako je raspored prevelik za merenje. |
| metrics.total_weight_kg | number | Ukupna težina utovarenih predmeta, uvek u kg. |
| metrics.overlaps | integer | Parovi koji se preklapaju — uvek 0 za validan raspored. |
| items[].placed | boolean | Da li je predmet smešten u raspored. |
| items[].x / y / z | number | null | Pozicija u jedinicama zahteva: x od vrata, y od leve strane, z od poda. Sve tri vrednosti su null ako je placed false. |
| items[].rotation_deg / tilt_deg | 0 | 90 | Orijentacija: rotacija oko vertikalne ose; tilt = položeno na bok. |
| items[].length / width / height / weight | number | Predmet kako je poslat, ponovljen u jedinicama zahteva. |
| plan_url | string | null | Kreirani plan u aplikaciji. null za poslove u sandbox-u. |
Verzioniranje i stabilnost
Ugovor je verzionisan u putanji (/api/v1/). Unutar v1, promene su samo dodatne — novi opcioni polja zahteva, nova polja odgovora, novi kodovi vozila i kodovi grešaka mogu se pojaviti, a klijenti treba da ignorišu polja koja ne prepoznaju. Postojeća polja nikada ne menjaju značenje ili tip, i ništa se ne uklanja. Breaking change znači novu verziju putanje, pri čemu se v1 održava paralelno najmanje 12 meseci uz obaveštenje o zastarelosti putem mejla svakom radnom prostoru sa aktivnim ključem.
Polja zahteva
| Polje | Tip | Opis |
|---|---|---|
| vehicle | string | Kod vozila iz tabela ispod. Ili prosledite {customVehicleId} (vozilo iz vaše flote radnog prostora). |
| objective | "ldm" | "pallets" | Minimiziraj utovarnih metara ili obračunate pozicije paleta. Podrazumevana vrednost je "ldm". |
| units | "metric" | "imperial" | Kako se tumače i vraćaju dimenzije i težine predmeta: mm/kg (podrazumevano) ili in/lb. Pozicije u odgovoru prate iste jedinice. |
| items | array, required | Manifest tereta (polja ispod). |
| sandbox | boolean | Test režim: kompletan rezultat, ništa se ne čuva. Dostupno na svakom paketu. |
| name | string | Naziv plana (produkcioni režim). |
| ldm_limit_m | number | Ograniči utovar na prvih N utovarnih metara (kamioni). |
| budget_ms | number | Budžet vremena za optimizaciju (produkcija; podrazumevano 30000, maksimalno 300000). |
| callback_url | https URL | POST-uje se rezultat kada posao završi, potpisan (vidi Webhook-ove). |
Polja predmeta
| Polje | Tip | Opis |
|---|---|---|
| length / width / height | number, required | Dimenzije predmeta, tumačene u jedinicama zahteva (mm podrazumevano, inči sa "units": "imperial"). |
| weight | number, required | Težina predmeta (kg podrazumevano, lb sa "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 | Da li drugi teret može biti postavljen na ovaj predmet. |
| max_stack | number, optional | Maksimalna težina koja može biti postavljena na ovaj predmet (iste jedinice kao težina). |
| fragile | boolean, default false | Krhki predmeti se postavljaju samo u gornje slojeve. |
| tiltable | boolean, default true | Da li se predmet može položiti na bok. |
| destination_stop | integer, default 1 | Odredišna stanica za utovar sa više stanica (LIFO). |
Kodovi vozila
Generisani iz specifikacija aktivnog sistema. Prilagođena vozila iz vaše flote radnog prostora rade preko custom_vehicle_id.
Kamioni i prikolice
| Kod | Vozilo | Unutrašnjost (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šnjost (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 |
Nivoi pristupa i ograničenja
| Sandbox (svaki paket) | Produkcija (Enterprise) | |
|---|---|---|
| Pozivi | 25 uspešnih / mesečno | 5.000 uspešnih pakovanja / mesec |
| Predmeta po manifestu | 20 | 5,000 |
| Istovremeni poslovi | 1 | 10 |
| Budžet optimizacije | 10 s | 30 s podrazumevano, do 300 s |
| Čuvanje | Ništa se ne čuva | Svaki paket kreira stvarni plan u vašem radnom prostoru |
Broje se samo uspešna pakovanja — neuspešne validacije i neuspešni poslovi nikada se ne obračunavaju prema kvoti. Oba brojača se resetuju 1. u mesecu (UTC). Rezultati u sandbox okruženju su potpuni i neograničeni — granice su filter, a ne izlaz. Potrebno vam je više od 5.000 pakovanja mesečno? Razgovarajte sa nama o cenama za veće količine i OEM licencama.
Webhook-ovi
Prosledite callback_url da biste primili rezultat PUT zahtevom kada posao bude završen. Svaki poziv sadrži X-Hansatic-Signature: HMAC-SHA256 potpisa sirovog tela sa tajnim ključem za webhook-ove vašeg ključa (prikazan jednom prilikom kreiranja ključa). Verifikujte 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));
}Isporuka je jedan pokušaj sa vremenskim ograničenjem od 5s — status_url uvek ostaje izvor istine.
Greške
Sve greške su { "error": { "code", "message", ... } } — mašinski čitljiv kod, čitljiva poruka za čoveka i field kada je određeni ulazni podatak neispravan.
| Kod | HTTP | Značenje |
|---|---|---|
| invalid_key | 401 | Nedostaje, neispravan ili opozvan API ključ. |
| invalid_json | 400 | Telo nije validan JSON. |
| invalid_vehicle | 400 | Nepoznat kod vozila / {customVehicleId}. |
| invalid_items | 400 | Polje predmeta nedostaje, nije brojčano ili je van opsega. |
| suspicious_dimensions | 400 | Sve dimenzije ispod 100mm — verovatno inči poslati kao mm. Prosledite "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 | Manifest prelazi ograničenje broja predmeta za vaš nivo pristupa. |
| upgrade_required | 402 | Produkcioni režim zahteva Enterprise paket. Koristite sandbox ili nadogradite paket. |
| sandbox_limit_reached | 402 | Mesečni limit sandbox-a iskorišćen — resetuje se prvog u mesecu. |
| quota_exceeded | 402 | Mesečna kvota od 5.000 pakovanja iskorišćena — resetuje se 1. u mesecu. Za veće količine: kontaktirajte nas. |
| too_many_jobs | 429 | Dostignut limit istovremenih poslova. Pitajte status tekućih poslova i pokušajte ponovo. |
| not_found | 404 | Ne postoji takav posao za ovaj radni prostor. |
Pitanja, veći limiti ili konektor koji vam treba (Zapier, Excel, MCP)? hello@hansatic.com