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

  1. Přihlaste se → klikněte na své jméno → API → vygenerujte klíč.
  2. 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:

PoleTypPopis
placed_count / unplaced_countintegerKolik 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_mnumberNakládací metry — rozsah nákladového bloku (max. konec − min. začátek).
metrics.linear_ftnumberStejný rozsah v lineárních stopách (US LTL).
metrics.span_mmintegerRozsah v mm, vždy metrický.
metrics.pallet_positions_eurinteger | nullFakturované pozice EUR palet. null, pokud je rozložení příliš velké na změření.
metrics.total_weight_kgnumberCelková hmotnost naloženého nákladu, vždy v kg.
metrics.overlapsintegerPáry s průnikem — vždy 0 pro validní rozložení.
items[].placedbooleanZda se položka dostala do rozložení.
items[].x / y / znumber | nullPozice 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_deg0 | 90Orientace: rotace kolem svislé osy; tilt = položeno na bok.
items[].length / width / height / weightnumberPoložka tak, jak byla odeslána, v jednotkách požadavku.
plan_urlstring | nullVytvoř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

PoleTypPopis
vehiclestringKó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.
itemsarray, requiredSeznam nákladu (pole níže).
sandboxbooleanTestovací režim: kompletní výsledek, nic není uloženo. K dispozici na každém tarifu.
namestringNázev plánu (produkční režim).
ldm_limit_mnumberOmezení nákladu na prvních N nakládacích metrů (u nákladních vozů).
budget_msnumberČasový limit optimalizace (produkční režim; výchozí 30000, max. 300000).
callback_urlhttps URLPo dokončení úlohy je na tuto adresu odeslán POST s výsledkem, podepsaný (viz Webhooky).

Pole položek

PoleTypPopis
length / width / heightnumber, requiredRozměry položky, čtené v jednotkách požadavku (výchozí mm, palce s "units": "imperial").
weightnumber, requiredHmotnost položky (výchozí kg, lb s "units": "imperial").
quantityinteger, default 1Rozbalí se na jednotlivé kusy.
namestring, optionalZobrazuje se v plánu a v odpovědi.
stackableboolean, default trueNa tuto položku může být naložen další náklad.
max_stacknumber, optionalMaximální hmotnost, kterou může položka unést navrchu (ve stejných jednotkách jako hmotnost).
fragileboolean, default falseKřehké položky jsou umisťovány pouze do horních vrstev.
tiltableboolean, default trueZda může být položka položena na bok.
destination_stopinteger, default 1Mí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ódVozidloVnitřní rozměry (D׊×V)Nosnost
CURTAINSIDER_13613.6m Curtainsider13.62 × 2.48 × 2.70 m24 t
BOX_13613.6m Box Trailer13.62 × 2.46 × 2.68 m24 t
MEGA_13613.6m Mega Trailer13.62 × 2.48 × 3.00 m22.5 t
MEGA_CURTAIN_13613.6m Mega Curtainsider13.62 × 2.48 × 3.00 m22 t
FLATBED_13613.6m Flatbed13.62 × 2.48 × 3.00 m25 t
REEFER_13613.6m Reefer13.32 × 2.44 × 2.54 m22 t
CURTAINSIDER_757.5m City Curtainsider7.50 × 2.48 × 2.70 m12 t
SWAPBODY_7157.15m Swap Body7.15 × 2.48 × 2.70 m12 t
SWAPBODY_7457.45m Swap Body7.45 × 2.48 × 2.70 m12 t
DRY_VAN_5353ft Dry Van16.15 × 2.59 × 2.74 m20 t
FLATBED_5353ft Flatbed16.15 × 2.59 × 3.66 m22 t
REEFER_5353ft Reefer15.85 × 2.46 × 2.59 m18.5 t
CURTAINSIDER_125_CN12.5m Curtainsider (CN)12.50 × 2.50 × 2.80 m27 t
FLATBED_40_IN40ft Flatbed (IN)12.19 × 2.50 × 3.50 m26 t
BOX_138_BR13.8m Box Van (BR)13.80 × 2.50 × 2.90 m28 t
CURTAINSIDER_12_ZA12m Curtainsider (ZA)12.00 × 2.48 × 2.70 m28 t

Kontejnery

KódKontejnerVnitřní rozměry (D׊×V)Nosnost
20DC20' Dry Container5.89 × 2.35 × 2.39 m21.727 t
20HC20' High Cube5.89 × 2.35 × 2.70 m21.58 t
40DC40' Dry Container12.03 × 2.35 × 2.39 m26.63 t
40HC40' High Cube12.03 × 2.35 × 2.70 m26.58 t
45HC45' High Cube13.56 × 2.35 × 2.70 m25.68 t
20OT20' Open Top5.89 × 2.35 × 2.39 m21.64 t
40OT40' Open Top12.03 × 2.35 × 2.39 m26.58 t
20RF20' Reefer5.44 × 2.29 × 2.27 m21 t
40RF40' Reefer11.58 × 2.29 × 2.21 m25.6 t
40RFHC40' Reefer High Cube11.58 × 2.29 × 2.54 m25.88 t
53DC53' Domestic16.15 × 2.59 × 2.90 m26 t

Úrovně přístupu a limity

Pískoviště (každý tarif)Produkce (Enterprise)
Požadavky25 úspěšných / měsíc5 000 úspěšných / měsíc
Položek v seznamu nákladu205,000
Souběžné úlohy110
Časový limit optimalizace10 s30 s výchozí, až 300 s
Trvalé uloženíNic není uloženoKaž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ódHTTPVýznam
invalid_key401Chybějící, poškozený nebo zrušený API klíč.
invalid_json400Tělo požadavku není platný JSON.
invalid_vehicle400Neznámý kód vozidla / {customVehicleId}.
invalid_items400Chybí některé pole položky, není číselné nebo je mimo rozsah.
suspicious_dimensions400Všechny rozměry pod 100 mm — pravděpodobně palce odeslané jako milimetry. Použijte "units": "imperial".
invalid_units400Pole units musí být "metric" nebo "imperial".
invalid_objective400Pole objective musí být "ldm" nebo "pallets".
invalid_callback400callback_url musí být https.
too_many_items400Seznam nákladu překračuje limit položek pro vaši úroveň přístupu.
upgrade_required402Produkční režim vyžaduje tarif Enterprise. Použijte pískoviště nebo proveďte upgrade.
sandbox_limit_reached402Měsíční limit pískoviště vyčerpán — obnovuje se 1. dne v měsíci.
quota_exceeded402Mě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_jobs429Dosáhli jste limitu souběžných úloh. Dotazujte se na běžící úlohy a zkuste to znovu.
not_found404Pro 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