Pakke-API

Send last, få tilbake en optimalisert og fysisk gyldig lastplan — plasseringer, laste-meter, lineære fot og fakturerte pallposisjoner. Samme motor som i appen, kontinuerlig validert mot reelle dispatchers oppsett. Sandbox-tilgang på alle abonnementer; produksjonstilgang på Enterprise.

Kom i gang

  1. Logg inn → klikk på navnet ditt → API → generer en nøkkel.
  2. Send en pakkejobb (denne kjører i sandbox — gratis på alle abonnementer):
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-..."
}

Poll status_url (samme autentiseringsheader) til status er "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/..."
  }
}

Endepunkter

POST /api/v1/pack

Validerer og setter en pakkejobb i kø. Returnerer 202 med en job_id. Støtter en Idempotency-Key-header — gjentatte forespørsler med samme nøkkel returnerer den opprinnelige jobben i stedet for å pakke på nytt.

GET /api/v1/jobs/{id}

Jobbstatus og, når ferdig, hele resultatet. Resultater lagres i 30 dager; produksjonsplaner lagres permanent i arbeidsområdet ditt.

GET /api/v1/openapi.json

Den maskinlesbare OpenAPI 3.1-kontrakten — importer den i Postman, kodegeneratorer eller pek AI-kodeverktøyet ditt mot den. Kjøretøykoder hentes fra den aktive motoren, så den er alltid oppdatert. Åpne spesifikasjonen ↗

Svarsfelt

result-objektet for en fullført jobb:

FeltTypeBeskrivelse
placed_count / unplaced_countintegerHvor mange enheter som passet / ikke passet.
units"metric" | "imperial"Enhetene alle tall nedenfor er uttrykt i (gjentar forespørselen).
metrics.ldm_mnumberLaste-meter — utstrekningen av lastblokken (maks slutt − min start).
metrics.linear_ftnumberSamme utstrekning i lineære fot (US LTL).
metrics.span_mmintegerUtstrekningen i mm, alltid metrisk.
metrics.pallet_positions_eurinteger | nullFakturerte EUR-pallposisjoner. null når oppsettet er for stort til å måle.
metrics.total_weight_kgnumberPlassert vekt, alltid kg.
metrics.overlapsintegerGjennomtrengende par — alltid 0 for et gyldig oppsett.
items[].placedbooleanOm enheten kom med i oppsettet.
items[].x / y / znumber | nullPosisjon i forespurte enheter: x fra dørsiden, y fra venstre vegg, z fra gulvet. Alle tre er null når placed er false.
items[].rotation_deg / tilt_deg0 | 90Orientering: rotasjon om vertikal akse; tilt = lagt på siden.
items[].length / width / height / weightnumberEnheten slik den ble sendt inn, gjentatt i forespurte enheter.
plan_urlstring | nullDen opprettede planen i appen. null for sandbox-jobber.

Versjonering og stabilitet

Kontrakten er versjonert i stien (/api/v1/). Innen v1 er endringer kun additive — nye valgfrie forespørselsfelt, nye svarsfelt, nye kjøretøykoder og feilkoder kan dukke opp, og klienter bør ignorere felt de ikke kjenner igjen. Eksisterende felt endrer aldri betydning eller type, og ingenting fjernes. En brytende endring medfører en ny versjonssti, med v1 vedlikeholdt parallelt i minst 12 måneder og varsel om utfasing sendt på e-post til alle arbeidsområder med en aktiv nøkkel.

Forespørselsfelt

FeltTypeBeskrivelse
vehiclestringEn kjøretøykode fra tabellene nedenfor. Eller angi {customVehicleId} (et kjøretøy fra flåten i arbeidsområdet ditt).
objective"ldm" | "pallets"Minimer laste-meter eller fakturerte pallposisjoner. Standard "ldm".
units"metric" | "imperial"Hvordan enhetsdimensjoner og vekter leses OG returneres: mm/kg (standard) eller in/lb. Posisjoner i svaret følger samme enheter.
itemsarray, requiredLastemanifestet (feltene nedenfor).
sandboxbooleanTestmodus: fullt resultat, ingenting lagres. Tilgjengelig på alle abonnementer.
namestringPlannavn (produksjonsmodus).
ldm_limit_mnumberBegrens lasten til de første N laste-meterne (lastebiler).
budget_msnumberOptimaliseringstidsbudsjett (produksjon; standard 30000, maks 300000).
callback_urlhttps URLPOSTes resultatet når jobben er ferdig, signert (se Webhooks).

Enhetsfelt

FeltTypeBeskrivelse
length / width / heightnumber, requiredEnhetens dimensjoner, lest i forespørselens enheter (mm som standard, tommer med "units": "imperial").
weightnumber, requiredEnhetens vekt (kg som standard, lb med "units": "imperial").
quantityinteger, default 1Utvides til individuelle enheter.
namestring, optionalVises i planen og svaret.
stackableboolean, default trueAndre enheter kan stables på toppen av denne.
max_stacknumber, optionalMaks vekt denne enheten tåler på toppen (samme enheter som vekt).
fragileboolean, default falseSkjøre enheter plasseres kun i de øverste lagene.
tiltableboolean, default trueOm enheten kan legges på siden.
destination_stopinteger, default 1Leveringsstopp for lasting med LIFO-prinsipp (flere stopp).

Kjøretøykoder

Generert fra de aktive motorspesifikasjonene. Egendefinerte kjøretøy fra flåten i arbeidsområdet ditt fungerer via custom_vehicle_id.

Lastebiler og tilhengere

KodeKjøretøyInteriør (L×B×H)Lastekapasitet
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

Containere

KodeContainerInteriør (L×B×H)Lastekapasitet
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

Tilgangsnivåer og grenser

Sandbox (alle abonnementer)Produksjon (Enterprise)
Forespørsler25 vellykkede / måned5 000 vellykkede / måned
Enheter per manifest205,000
Samtidige jobber110
Optimaliseringsbudsjett10 s30 s standard, opptil 300 s
LagringIngenting lagresHver pakking oppretter en reell plan i arbeidsområdet ditt

Bare vellykkede pakkinger telles — mislykkede valideringer og mislykkede jobber belaster aldri en kvote. Begge tellerne nullstilles den 1. (UTC). Sandbox-resultater er komplette og ubegrensede — grensene gjelder tilgangen, ikke resultatet. Trenger du mer enn 5 000 pakkinger i måneden? Ta kontakt for volum- og OEM-priser.

Webhooks

Angi callback_url for å motta resultatet via POST når jobben er ferdig. Hver callback inneholder X-Hansatic-Signature: en HMAC-SHA256 av rådataene med webhook-hemmeligheten din (vises én gang ved nøkkelopprettelse). Verifiser den:

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

Levering er ett forsøk med 5s timeout — status_url forblir alltid den endelige sannhetskilden.

Feil

Alle feil er { "error": { "code", "message", ... } } — maskinlesbar kode, menneskelig lesbar melding, og field når et bestemt inndatafelt er feil.

KodeHTTPBetydning
invalid_key401Manglende, feilformet eller tilbakekalt API-nøkkel.
invalid_json400Innholdet er ikke gyldig JSON.
invalid_vehicle400Ukjent kjøretøykode / {customVehicleId}.
invalid_items400Et enhetsfelt mangler, er ikke numerisk eller utenfor gyldig område.
suspicious_dimensions400Alle dimensjoner under 100 mm — sannsynligvis tommer sendt som mm. Angi "units": "imperial".
invalid_units400units må være "metric" eller "imperial".
invalid_objective400objective må være "ldm" eller "pallets".
invalid_callback400callback_url må være https.
too_many_items400Manifestet overskrider enhetsgrensen for ditt tilgangsnivå.
upgrade_required402Produksjonsmodus krever Enterprise-abonnement. Bruk sandbox eller oppgrader.
sandbox_limit_reached402Månedlig sandbox-kvote brukt — tilbakestilles den 1.
quota_exceeded402Månedlig produksjonskvote på 5 000 pakkinger er brukt — nullstilles den 1. Ønsker du høyere volum: ta kontakt.
too_many_jobs429Grensen for samtidige jobber er nådd. Poll pågående jobber og prøv igjen.
not_found404Ingen slik jobb for dette arbeidsområdet.

Spørsmål, høyere grenser eller en tilkobling du trenger (Zapier, Excel, MCP)? hello@hansatic.com