Packing API
Zadejte náklad a získejte zpět optimalizovaný, fyzicky validní plán nakládky — pozice, nakládací metry, lineární stopy a fakturované pozice palet. Stejný engine, který pohání aplikaci, průběžně ověřovaný proti reálným dispečerským rozložení. Přístup k pískovišti na každém tarifu; produkční přístup na Enterprise.
Rychlý start
- Přihlaste se → klikněte na své jméno → API → vygenerujte klíč.
- Odešlete požadavek na zabalení (tento běží v pískovišti — zdarma na každém tarifu):
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-..."
}Dotazujte se na status_url (se stejným autentizačním záhlavím), dokud není status "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/..."
}
}Endpointy
POST /api/v1/pack
Ověří a zařadí požadavek na zabalení do fronty. Vrátí 202 s job_id. Podporuje záhlaví Idempotency-Key — opakované požadavky se stejným klíčem vrátí původní úlohu místo opakovaného balení.
GET /api/v1/jobs/{id}
Stav úlohy a po dokončení kompletní výsledek. Výsledky jsou uchovávány po dobu 30 dnů; u produkčních tarifů zůstávají ve vašem pracovním prostoru trvale.
GET /api/v1/openapi.json
Strojově čitelná specifikace OpenAPI 3.1 — naimportujte ji do Postmanu, generátorů kódu nebo ji použijte ve svém AI nástroji pro programování. Kódy vozidel jsou načítány z aktuálního enginu, takže je vždy aktuální. Otevřít specifikaci ↗
Pole odpovědi
Objekt result u dokončené úlohy:
| Pole | Typ | Popis |
|---|---|---|
| placed_count / unplaced_count | integer | Kolik položek se vešlo / nevešlo. |
| units | "metric" | "imperial" | Jednotky, ve kterých jsou vyjádřena všechna níže uvedená čísla (odpovídá požadavku). |
| metrics.ldm_m | number | Nakládací metry — rozsah nákladového bloku (max. konec − min. začátek). |
| metrics.linear_ft | number | Stejný rozsah v lineárních stopách (US LTL). |
| metrics.span_mm | integer | Rozsah v mm, vždy metrický. |
| metrics.pallet_positions_eur | integer | null | Fakturované pozice EUR palet. null, pokud je rozložení příliš velké na změření. |
| metrics.total_weight_kg | number | Celková hmotnost naloženého nákladu, vždy v kg. |
| metrics.overlaps | integer | Páry s průnikem — vždy 0 pro validní rozložení. |
| items[].placed | boolean | Zda se položka dostala do rozložení. |
| items[].x / y / z | number | null | Pozice v jednotkách požadavku: x od konce dveří, y od levé stěny, z od podlahy. Všechny tři jsou null, pokud je placed false. |
| items[].rotation_deg / tilt_deg | 0 | 90 | Orientace: rotace kolem svislé osy; tilt = položeno na bok. |
| items[].length / width / height / weight | number | Položka tak, jak byla odeslána, v jednotkách požadavku. |
| plan_url | string | null | Vytvořený plán v aplikaci. null pro úlohy v pískovišti. |
Verzování a stabilita
Kontrakt je verzován v cestě (/api/v1/). V rámci v1 jsou změny pouze přídavné — nové volitelné pole požadavku, nová pole odpovědi, nové kódy vozidel a chybové kódy se mohou objevit a klienti by měli ignorovat pole, která neznají. Stávající pole nikdy nemění význam ani typ a nic není odstraněno. Změna narušující kompatibilitu znamená novou verzi cesty, přičemž v1 je udržována paralelně po dobu nejméně 12 měsíců a oznámení o vyřazení je zasláno e-mailem každému pracovnímu prostoru s aktivním klíčem.
Pole požadavku
| Pole | Typ | Popis |
|---|---|---|
| vehicle | string | Kód vozidla z níže uvedených tabulek. Nebo zadejte {customVehicleId} (vozidlo z vaší pracovní flotily). |
| objective | "ldm" | "pallets" | Minimalizovat nakládací metry nebo fakturované pozice palet. Výchozí hodnota je "ldm". |
| units | "metric" | "imperial" | Jak jsou čteny a vraceny rozměry a hmotnosti položek: mm/kg (výchozí) nebo in/lb. Pozice v odpovědi používají stejné jednotky. |
| items | array, required | Seznam nákladu (pole níže). |
| sandbox | boolean | Testovací režim: kompletní výsledek, nic není uloženo. K dispozici na každém tarifu. |
| name | string | Název plánu (produkční režim). |
| ldm_limit_m | number | Omezení nákladu na prvních N nakládacích metrů (u nákladních vozů). |
| budget_ms | number | Časový limit optimalizace (produkční režim; výchozí 30000, max. 300000). |
| callback_url | https URL | Po dokončení úlohy je na tuto adresu odeslán POST s výsledkem, podepsaný (viz Webhooky). |
Pole položek
| Pole | Typ | Popis |
|---|---|---|
| length / width / height | number, required | Rozměry položky, čtené v jednotkách požadavku (výchozí mm, palce s "units": "imperial"). |
| weight | number, required | Hmotnost položky (výchozí kg, lb s "units": "imperial"). |
| quantity | integer, default 1 | Rozbalí se na jednotlivé kusy. |
| name | string, optional | Zobrazuje se v plánu a v odpovědi. |
| stackable | boolean, default true | Na tuto položku může být naložen další náklad. |
| max_stack | number, optional | Maximální hmotnost, kterou může položka unést navrchu (ve stejných jednotkách jako hmotnost). |
| fragile | boolean, default false | Křehké položky jsou umisťovány pouze do horních vrstev. |
| tiltable | boolean, default true | Zda může být položka položena na bok. |
| destination_stop | integer, default 1 | Místo doručení pro nakládku s více zastávkami (LIFO). |
Kódy vozidel
Generováno z aktuálních specifikací enginu. Vlastní vozidla z vaší pracovní flotily fungují přes custom_vehicle_id.
Nákladní vozy a návěsy
| Kód | Vozidlo | Vnitřní rozměry (D׊×V) | Nosnost |
|---|---|---|---|
| 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 |
Kontejnery
| Kód | Kontejner | Vnitřní rozměry (D׊×V) | Nosnost |
|---|---|---|---|
| 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 |
Úrovně přístupu a limity
| Pískoviště (každý tarif) | Produkce (Enterprise) | |
|---|---|---|
| Požadavky | 25 úspěšných / měsíc | 5 000 úspěšných / měsíc |
| Položek v seznamu nákladu | 20 | 5,000 |
| Souběžné úlohy | 1 | 10 |
| Časový limit optimalizace | 10 s | 30 s výchozí, až 300 s |
| Trvalé uložení | Nic není uloženo | Každé zabalení vytvoří reálný plán ve vašem pracovním prostoru |
Do limitu se započítávají pouze úspěšně dokončené plány — neúspěšné validace a neprovedené úlohy se nezapočítávají. Obě čítače se resetují 1. dne v měsíci (UTC). Výsledky v sandboxu jsou kompletní a neomezené — limity slouží jako brána, nikoli jako omezení výstupu. Potřebujete více než 5 000 plánů měsíčně? Obraťte se na nás ohledně objemových a OEM cen.
Webhooky
Zadejte callback_url, abyste po dokončení úlohy obdrželi výsledek pomocí POST. Každý callback obsahuje X-Hansatic-Signature: HMAC-SHA256 těla zprávy s webhook tajemstvím vašeho klíče (zobrazeno pouze při vytváření klíče). Ověřte ji:
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));
}Doručení probíhá jedním pokusem s časovým limitem 5 s — status_url zůstává vždy zdrojem pravdy.
Chyby
Všechny chyby mají { "error": { "code", "message", ... } } — strojově čitelný kód, srozumitelnou zprávu a field, pokud je chyba způsobena konkrétním vstupním polem.
| Kód | HTTP | Význam |
|---|---|---|
| invalid_key | 401 | Chybějící, poškozený nebo zrušený API klíč. |
| invalid_json | 400 | Tělo požadavku není platný JSON. |
| invalid_vehicle | 400 | Neznámý kód vozidla / {customVehicleId}. |
| invalid_items | 400 | Chybí některé pole položky, není číselné nebo je mimo rozsah. |
| suspicious_dimensions | 400 | Všechny rozměry pod 100 mm — pravděpodobně palce odeslané jako milimetry. Použijte "units": "imperial". |
| invalid_units | 400 | Pole units musí být "metric" nebo "imperial". |
| invalid_objective | 400 | Pole objective musí být "ldm" nebo "pallets". |
| invalid_callback | 400 | callback_url musí být https. |
| too_many_items | 400 | Seznam nákladu překračuje limit položek pro vaši úroveň přístupu. |
| upgrade_required | 402 | Produkční režim vyžaduje tarif Enterprise. Použijte pískoviště nebo proveďte upgrade. |
| sandbox_limit_reached | 402 | Měsíční limit pískoviště vyčerpán — obnovuje se 1. dne v měsíci. |
| quota_exceeded | 402 | Měsíční kvóta 5 000 plánů byla vyčerpána — resetuje se 1. dne v měsíci. Pro vyšší objemy nás kontaktujte. |
| too_many_jobs | 429 | Dosáhli jste limitu souběžných úloh. Dotazujte se na běžící úlohy a zkuste to znovu. |
| not_found | 404 | Pro tento pracovní prostor neexistuje žádná taková úloha. |
Máte dotazy, potřebujete vyšší limity nebo konektor, který vám chybí (Zapier, Excel, MCP)? hello@hansatic.com