API Pakowania

Prześlij ładunek, a otrzymasz zoptymalizowany, fizycznie poprawny plan załadunku — pozycje, metry ładunkowe, stopy liniowe i rozliczane pozycje palet. Ten sam silnik, który napędza aplikację, stale weryfikowany na podstawie rzeczywistych układów dyspozytorów. Dostęp do sandboxa w każdym planie; dostęp produkcyjny w planie Enterprise.

Szybki start

  1. Zaloguj się → kliknij swoją nazwę → API → wygeneruj klucz.
  2. Wyślij zadanie pakowania (to działa w sandboxie — bezpłatnie w każdym planie):
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-..."
}

Odpytaj status_url (z tym samym nagłówkiem autoryzacyjnym), aż status będzie "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/..."
  }
}

Punkty końcowe

POST /api/v1/pack

Weryfikuje i kolejkuje zadanie pakowania. Zwraca 202 z job_id. Obsługuje nagłówek Idempotency-Key — ponowne próby z tym samym kluczem zwracają oryginalne zadanie zamiast ponownego pakowania.

GET /api/v1/jobs/{id}

Status zadania oraz, po zakończeniu, pełny wynik. Wyniki są przechowywane przez 30 dni; plany produkcyjne są trwale zapisywane w Twojej przestrzeni roboczej.

GET /api/v1/openapi.json

Zgodny z OpenAPI 3.1 kontrakt w formacie maszynowym — zaimportuj go do Postmana, generatorów kodu lub skieruj na niego narzędzie AI do kodowania. Kody pojazdów są pobierane z działającego silnika, więc specyfikacja jest zawsze aktualna. Otwórz specyfikację ↗

Pola odpowiedzi

Obiekt result dla zakończonego zadania:

PoleTypOpis
placed_count / unplaced_countintegerIle przedmiotów zmieściło się / nie zmieściło się.
units"metric" | "imperial"Jednostki, w których wyrażone są wszystkie poniższe wartości (odzwierciedlenie żądania).
metrics.ldm_mnumberMetry ładunkowe — długość bloku ładunku (maksymalny koniec − minimalny początek).
metrics.linear_ftnumberTa sama długość w stopach liniowych (US LTL).
metrics.span_mmintegerDługość w mm, zawsze metrycznie.
metrics.pallet_positions_eurinteger | nullRozliczane pozycje palet EUR. null, gdy układ jest zbyt duży do pomiaru.
metrics.total_weight_kgnumberCałkowita masa załadunku, zawsze w kg.
metrics.overlapsintegerPary nakładających się elementów — zawsze 0 dla poprawnego układu.
items[].placedbooleanCzy przedmiot trafił do układu.
items[].x / y / znumber | nullPozycja w jednostkach żądania: x od strony drzwi, y od lewej ściany, z od podłogi. Wszystkie trzy mają wartość null, gdy placed jest false.
items[].rotation_deg / tilt_deg0 | 90Orientacja: obrót wokół osi pionowej; tilt = położony na boku.
items[].length / width / height / weightnumberPrzedmiot zgodnie z danymi wejściowymi, w jednostkach żądania.
plan_urlstring | nullUtworzony plan w aplikacji. null dla zadań w sandboxie.

Wersjonowanie i stabilność

Kontrakt jest wersjonowany w ścieżce (/api/v1/). W ramach v1 zmiany są tylko dodawane — nowe opcjonalne pola żądania, nowe pola odpowiedzi, nowe kody pojazdów i kody błędów mogą się pojawić, a klienci powinni ignorować pola, których nie rozpoznają. Istniejące pola nigdy nie zmieniają znaczenia ani typu, a nic nie jest usuwane. Zmiana łamiąca oznacza nową ścieżkę wersji, przy czym v1 jest utrzymywana równolegle przez co najmniej 12 miesięcy, a o wycofaniu powiadamiamy e-mailem każdą przestrzeń roboczą z aktywnym kluczem.

Pola żądania

PoleTypOpis
vehiclestringKod pojazdu z poniższych tabel. Można też przekazać {customVehicleId} (pojazd z floty w Twojej przestrzeni roboczej).
objective"ldm" | "pallets"Minimalizacja metrów ładunkowych lub rozliczanych pozycji palet. Domyślnie „ldm”.
units"metric" | "imperial"Jednostki, w jakich podawane i zwracane są wymiary oraz wagi przedmiotów: mm/kg (domyślnie) lub in/lb. Pozycje w odpowiedzi są w tych samych jednostkach.
itemsarray, requiredLista ładunku (pola poniżej).
sandboxbooleanTryb testowy: pełny wynik, nic nie jest zapisywane. Dostępny w każdym planie.
namestringNazwa planu (tryb produkcyjny).
ldm_limit_mnumberOgraniczenie załadunku do pierwszych N metrów ładunkowych (ciężarówki).
budget_msnumberLimit czasu optymalizacji (tryb produkcyjny; domyślnie 30000, maksymalnie 300000).
callback_urlhttps URLAdres URL, na który zostanie wysłany wynik POST po zakończeniu zadania, podpisany (zob. Webhooki).

Pola przedmiotów

PoleTypOpis
length / width / heightnumber, requiredWymiary przedmiotu, odczytywane w jednostkach żądania (domyślnie mm, cale przy „units”: „imperial”).
weightnumber, requiredMasa przedmiotu (domyślnie kg, funty przy „units”: „imperial”).
quantityinteger, default 1Rozwija się na pojedyncze jednostki.
namestring, optionalWyświetlane w planie i odpowiedzi.
stackableboolean, default trueCzy na tym przedmiocie może spoczywać inny ładunek.
max_stacknumber, optionalMaksymalna masa, jaką ten przedmiot może udźwignąć (w tych samych jednostkach co waga).
fragileboolean, default falsePrzedmioty kruche są umieszczane tylko w górnych warstwach.
tiltableboolean, default trueCzy przedmiot może być położony na boku.
destination_stopinteger, default 1Przystanek dostawy w przypadku załadunku LIFO z wieloma przystankami.

Kody pojazdów

Generowane na podstawie specyfikacji działającego silnika. Pojazdy niestandardowe z floty w Twojej przestrzeni roboczej działają poprzez custom_vehicle_id.

Ciężarówki i naczepy

KodPojazdWymiary wewnętrzne (D×S×W)Ładowność
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

Kontenery

KodKontenerWymiary wewnętrzne (D×S×W)Ładowność
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

Poziomy dostępu i limity

Sandbox (każdy plan)Produkcja (Enterprise)
Wywołania25 udanych / miesiąc5 000 udanych pakowań / miesiąc
Przedmiotów na listę205,000
Zadań równoczesnych110
Limit optymalizacji10 s30 s domyślnie, do 300 s
TrwałośćNic nie jest zapisywaneKażde pakowanie tworzy rzeczywisty plan w Twojej przestrzeni roboczej

Liczone są tylko udane pakowania — nieudane walidacje i nieudane zadania nigdy nie są wliczane do limitu. Liczniki są resetowane 1. dnia miesiąca (UTC). Wyniki w środowisku sandbox są kompletne i nieograniczone — limity dotyczą jedynie dostępu, a nie funkcjonalności. Potrzebujesz więcej niż 5 000 pakowań miesięcznie? Skontaktuj się z nami w sprawie oferty dla dużych wolumenów i licencji OEM.

Webhooki

Przekaż callback_url, aby otrzymać wynik POST po zakończeniu zadania. Każde wywołanie zawiera X-Hansatic-Signature: HMAC-SHA256 treści surowego ciała z użyciem tajnego klucza webhooka (wyświetlanego jednokrotnie przy tworzeniu klucza). Zweryfikuj go:

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));
}

Dostarczenie odbywa się w jednej próbie z limitem czasu 5 s — status_url zawsze pozostaje źródłem prawdy.

Błędy

Wszystkie błędy mają kształt { "error": { "code", "message", ... } } — czytelny dla maszyn kod, czytelna dla człowieka wiadomość oraz field, gdy winne jest konkretne pole wejściowe.

KodHTTPZnaczenie
invalid_key401Brak, nieprawidłowy lub unieważniony klucz API.
invalid_json400Treść nie jest poprawnym JSON.
invalid_vehicle400Nieznany kod pojazdu / {customVehicleId}.
invalid_items400Pole przedmiotu jest brakujące, nienumeryczne lub poza zakresem.
suspicious_dimensions400Wszystkie wymiary poniżej 100 mm — prawdopodobnie cale wysłane jako mm. Przekaż „units”: „imperial”.
invalid_units400units musi być „metric” lub „imperial”.
invalid_objective400objective musi być „ldm” lub „pallets”.
invalid_callback400callback_url musi być https.
too_many_items400Lista ładunku przekracza limit przedmiotów dla Twojego poziomu dostępu.
upgrade_required402Tryb produkcyjny wymaga planu Enterprise. Użyj sandboxa lub uaktualnij plan.
sandbox_limit_reached402Miesięczny limit sandboxa wyczerpany — resetuje się 1. dnia miesiąca.
quota_exceeded402Wykorzystano miesięczny limit 5 000 pakowań — licznik zostanie zresetowany 1. dnia miesiąca. W przypadku większych wolumenów: skontaktuj się z nami.
too_many_jobs429Osiągnięto limit zadań równoczesnych. Odpytaj uruchomione zadania i spróbuj ponownie.
not_found404Brak takiego zadania dla tej przestrzeni roboczej.

Pytania, wyższe limity lub potrzebny konektor (Zapier, Excel, MCP)? hello@hansatic.com