Pakke-API

Indsend gods, få en optimeret og fysisk gyldig lastplan tilbage — placeringer, lastmeter, lineære fod og fakturerede pallplaceringer. Samme motor som i appen, løbende valideret mod virkelige dispatchers layouter. Sandbox-adgang på alle abonnementer; produktionsadgang på Enterprise.

Hurtig start

  1. Log ind → klik på dit navn → API → generér en nøgle.
  2. Indsend en pakkeopgave (denne kø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 autentificeringsheader) indtil 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 sætter en pakkeopgave i kø. Returnerer 202 med et job_id. Understøtter en Idempotency-Key-header — gentagne forespørgsler med samme nøgle returnerer den oprindelige opgave i stedet for at pakke to gange.

GET /api/v1/jobs/{id}

Opgavestatus og, når den er færdig, det fulde resultat. Resultater gemmes i 30 dage; produktionsplaner ligger permanent i dit workspace.

GET /api/v1/openapi.json

Den maskinlæsbare OpenAPI 3.1-kontrakt — importer den i Postman, kodegeneratorer eller peg dit AI-kodningsværktøj på den. Køretøjskoder hentes fra den aktive motor, så den er altid opdateret. Åbn specifikationen ↗

Svarfelter

result-objektet for en afsluttet opgave:

FeltTypeBeskrivelse
placed_count / unplaced_countintegerAntal varer, der passer / ikke passer.
units"metric" | "imperial"De enheder, alle nedenstående tal er angivet i (gentager forespørgslen).
metrics.ldm_mnumberLastmeter — godsets udstrækning (maks. slut − min. start).
metrics.linear_ftnumberSamme udstrækning i lineære fod (US LTL).
metrics.span_mmintegerUdstrækningen i mm, altid metrisk.
metrics.pallet_positions_eurinteger | nullFakturerede EUR-pallplaceringer. null, hvis layoutet er for stort til at måle.
metrics.total_weight_kgnumberPlaceret vægt, altid kg.
metrics.overlapsintegerGennemtrængende par — altid 0 for et gyldigt layout.
items[].placedbooleanOm varen kom med i layoutet.
items[].x / y / znumber | nullPosition i forespørgslens enheder: x fra dørsiden, y fra venstre væg, z fra gulvet. Alle tre er null, når placed er false.
items[].rotation_deg / tilt_deg0 | 90Orientering: rotation omkring lodret akse; tilt = lagt på siden.
items[].length / width / height / weightnumberVaren som indsendt, gentaget i forespørgslens enheder.
plan_urlstring | nullDen oprettede plan i appen. null for sandbox-opgaver.

Versionering og stabilitet

Kontrakten er versioneret i stien (/api/v1/). Inden for v1 er ændringer kun additive — nye valgfrie forespørgselsfelter, nye svarsfelter, nye køretøjskoder og fejlkoder kan forekomme, og klienter bør ignorere felter, de ikke genkender. Eksisterende felter ændrer aldrig betydning eller type, og intet fjernes. En brydende ændring betyder en ny versionssti, hvor v1 vedligeholdes parallelt i mindst 12 måneder med afviklingsmeddelelse pr. e-mail til alle workspaces med en aktiv nøgle.

Forespørgselsfelter

FeltTypeBeskrivelse
vehiclestringEn køretøjskode fra tabellerne nedenfor. Eller angiv {customVehicleId} (et køretøj fra din workspace-flåde).
objective"ldm" | "pallets"Minimer lastmeter eller fakturerede pallplaceringer. Standard "ldm".
units"metric" | "imperial"Hvordan varernes dimensioner og vægte læses OG returneres: mm/kg (standard) eller in/lb. Positioner i svaret følger samme enheder.
itemsarray, requiredGodsmanifestet (felter nedenfor).
sandboxbooleanTesttilstand: fuldt resultat, intet gemmes. Tilgængelig på alle abonnementer.
namestringPlannavn (produktionstilstand).
ldm_limit_mnumberBegræns lasten til de første N lastmeter (lastbiler).
budget_msnumberOptimeringsbudget i tid (produktion; standard 30000, maks. 300000).
callback_urlhttps URLPOSTes resultatet, når opgaven er færdig, underskrevet (se Webhooks).

Varerfelter

FeltTypeBeskrivelse
length / width / heightnumber, requiredVarens dimensioner, læst i forespørgslens enheder (mm som standard, tommer med "units": "imperial").
weightnumber, requiredVarens vægt (kg som standard, lb med "units": "imperial").
quantityinteger, default 1Udvider til individuelle enheder.
namestring, optionalVises i planen og svaret.
stackableboolean, default trueAndre varer må stables ovenpå denne vare.
max_stacknumber, optionalMaks. vægt, denne vare kan bære ovenpå (samme enheder som vægt).
fragileboolean, default falseFragile varer placeres kun i de øverste lag.
tiltableboolean, default trueOm varen må lægges på siden.
destination_stopinteger, default 1Leveringsstop for flerstop-LIFO-lastning.

Køretøjskoder

Genereret ud fra de aktuelle motorspecifikationer. Brugerdefinerede køretøjer fra din workspace-flåde fungerer via custom_vehicle_id.

Lastbiler og trailere

KodeKøretøjIndvendig (L×B×H)Nyttelast
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

KodeContainerIndvendig (L×B×H)Nyttelast
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

Adgangsniveauer og begrænsninger

Sandbox (alle abonnementer)Produktion (Enterprise)
Forespørgsler25 succesfulde / måned5.000 vellykkede / måned
Varer pr. manifest205,000
Samtidige opgaver110
Optimeringsbudget10 s30 s standard, op til 300 s
PersistensIntet gemmesHver pakning opretter en reel plan i dit workspace

Kun vellykkede pakninger tæller — mislykkede valideringer og fejlede jobs trækker ikke fra kvoten. Begge tællere nulstilles den 1. (UTC). Sandbox-resultater er komplette og ubegrænsede — grænserne er adgangsporten, ikke outputtet. Har du brug for mere end 5.000 pakninger om måneden? Kontakt os for at høre om volumen- og OEM-priser.

Webhooks

Angiv callback_url for at modtage resultatet via POST, når opgaven er færdig. Hver callback indeholder X-Hansatic-Signature: en HMAC-SHA256 af den rå body med din nøgles webhook-hemmelighed (vises én gang ved nøglegenerering). Verificér 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 sker i ét forsøg med 5 s timeout — status_url er altid den endelige sandhedskilde.

Fejl

Alle fejl er { "error": { "code", "message", ... } } — maskinlæsbar kode, menneskeligt læsbar besked og field, når et bestemt input er fejlbehæftet.

KodeHTTPBetydning
invalid_key401Manglende, forkert formateret eller tilbagekaldt API-nøgle.
invalid_json400Body er ikke gyldig JSON.
invalid_vehicle400Ukendt køretøjskode / {customVehicleId}.
invalid_items400Et varerfelt mangler, er ikke-numerisk eller uden for gyldigt interval.
suspicious_dimensions400Alle dimensioner under 100 mm — sandsynligvis tommer sendt som mm. Angiv "units": "imperial".
invalid_units400units skal være "metric" eller "imperial".
invalid_objective400objective skal være "ldm" eller "pallets".
invalid_callback400callback_url skal være https.
too_many_items400Manifestet overskrider varergrænsen for dit adgangsniveau.
upgrade_required402Produktionstilstand kræver Enterprise-abonnement. Brug sandbox eller opgrader.
sandbox_limit_reached402Månedlig sandbox-kvote opbrugt — nulstilles den 1.
quota_exceeded402Månedlig produktionskvote på 5.000 pakninger er opbrugt — nulstilles den 1. Større volumen: kontakt os.
too_many_jobs429Begrænsning for samtidige opgaver nået. Poll kørende opgaver og prøv igen.
not_found404Ingen sådan opgave for dette workspace.

Spørgsmål, højere grænser eller en connector, du har brug for (Zapier, Excel, MCP)? hello@hansatic.com