Packnings-API

Skicka gods, få tillbaka en optimerad och fysiskt giltig lastplan — placeringar, lastmeter, löpmeter och fakturerade pallpositioner. Samma motor som i appen, kontinuerligt validerad mot verkliga dispatcherlayouter. Sandbox-åtkomst på varje plan; produktionsåtkomst på Enterprise.

Kom igång snabbt

  1. Logga in → klicka på ditt namn → API → generera en nyckel.
  2. Skicka en packningsuppgift (den här körs i sandbox — gratis på alla plan):
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:a status_url (samma autentiseringsheader) tills status är "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/..."
  }
}

Slutpunkter

POST /api/v1/pack

Validerar och köar en packningsuppgift. Returnerar 202 med ett job_id. Stöder en Idempotency-Key-header — upprepade anrop med samma nyckel returnerar den ursprungliga uppgiften istället för att packa två gånger.

GET /api/v1/jobs/{id}

Uppgiftsstatus och, när den är klar, hela resultatet. Resultat sparas i 30 dagar; produktionsplaner finns kvar permanent i ditt workspace.

GET /api/v1/openapi.json

Det maskinläsbara OpenAPI 3.1-kontraktet — importera det i Postman, kodgeneratorer eller peka ditt AI-kodverktyg mot det. Fordonskoder hämtas från den aktiva motorn, så det är alltid aktuellt. Öppna specifikationen ↗

Svarsfält

result-objektet för en avslutad uppgift:

FältTypBeskrivning
placed_count / unplaced_countintegerHur många artiklar som fick plats / inte fick plats.
units"metric" | "imperial"Enheterna som alla nedanstående värden anges i (återger förfrågan).
metrics.ldm_mnumberLastmeter — godsets utsträckning (max slut − min start).
metrics.linear_ftnumberSamma utsträckning i löpmeter (US LTL).
metrics.span_mmintegerUtsträckningen i mm, alltid metriskt.
metrics.pallet_positions_eurinteger | nullFakturerade EUR-pallpositioner. null när layouten är för stor för att mätas.
metrics.total_weight_kgnumberPlacerad vikt, alltid i kg.
metrics.overlapsintegerÖverlappande par — alltid 0 för en giltig layout.
items[].placedbooleanOm artikeln kom med i layouten.
items[].x / y / znumber | nullPosition i förfrågans enheter: x från dörränden, y från vänster vägg, z från golvet. Alla tre är null när placed är false.
items[].rotation_deg / tilt_deg0 | 90Orientering: rotation kring vertikalaxeln; tilt = liggande på sidan.
items[].length / width / height / weightnumberArtikeln som skickades, återgiven i förfrågans enheter.
plan_urlstring | nullDen skapade planen i appen. null för sandbox-uppgifter.

Versionshantering och stabilitet

Kontraktet är versionshanterat i sökvägen (/api/v1/). Inom v1 är ändringar endast tillägg — nya valfria fält i förfrågan, nya svarsfält, nya fordonskoder och felkoder kan tillkomma, och klienter bör ignorera fält de inte känner igen. Befintliga fält ändrar aldrig betydelse eller typ, och inget tas bort. En brytande ändring innebär en ny versionssökväg, med v1 som underhålls parallellt i minst 12 månader och avvecklingsmeddelande via e-post till varje workspace med en aktiv nyckel.

Förfrågningsfält

FältTypBeskrivning
vehiclestringEn fordonskod från tabellerna nedan. Eller ange {customVehicleId} (ett fordon från din workspace-flotta).
objective"ldm" | "pallets"Minimera lastmeter eller fakturerade pallpositioner. Standard "ldm".
units"metric" | "imperial"Hur artikeldimensioner och vikter tolkas OCH returneras: mm/kg (standard) eller tum/lbs. Positioner i svaret följer samma enheter.
itemsarray, requiredGodsmanifestet (fält nedan).
sandboxbooleanTestläge: fullständigt resultat, inget sparas. Tillgängligt på alla plan.
namestringPlannamn (produktionsläge).
ldm_limit_mnumberBegränsa lasten till de första N lastmetrarna (lastbilar).
budget_msnumberTidsbudget för optimering (produktion; standard 30000, max 300000).
callback_urlhttps URLPOST:as med resultatet när uppgiften är klar, signerat (se Webhooks).

Artikelfält

FältTypBeskrivning
length / width / heightnumber, requiredArtikelns dimensioner, tolkade i förfrågans enheter (mm som standard, tum med "units": "imperial").
weightnumber, requiredArtikelns vikt (kg som standard, lbs med "units": "imperial").
quantityinteger, default 1Expanderas till enskilda enheter.
namestring, optionalVisas i planen och svaret.
stackableboolean, default trueAndra gods kan placeras ovanpå denna artikel.
max_stacknumber, optionalMaximal vikt som artikeln tål ovanpå (samma enheter som vikt).
fragileboolean, default falseÖmtåliga artiklar placeras endast i de översta lagren.
tiltableboolean, default trueArtikeln får läggas på sidan.
destination_stopinteger, default 1Leveransstopp för flerstoppad LIFO-lastning.

Fordonskoder

Genererade från den aktiva motorns specifikationer. Anpassade fordon från din workspace-flotta fungerar via custom_vehicle_id.

Lastbilar och släp

KodFordonInvändigt (L×B×H)Lastkapacitet
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

Containrar

KodContainerInvändigt (L×B×H)Lastkapacitet
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

Åtkomstnivåer och gränser

Sandbox (alla plan)Produktion (Enterprise)
Anrop25 lyckade / månad5 000 lyckade / månad
Artiklar per manifest205,000
Samtidiga uppgifter110
Optimeringsbudget10 s30 s som standard, upp till 300 s
LagringIngenting sparasVarje packning skapar en verklig plan i ditt workspace

Endast lyckade packningar räknas — misslyckad validering och misslyckade jobb debiteras aldrig mot kvoten. Båda räknarna nollställs den 1:a (UTC). Sandbox-resultat är fullständiga och utan begränsningar — gränserna gäller åtkomst, inte resultat. Behöver du mer än 5 000 packningar per månad? Kontakta oss för volym- och OEM-priser.

Webhooks

Ange callback_url för att ta emot resultatet via POST när uppgiften är klar. Varje callback innehåller X-Hansatic-Signature: en HMAC-SHA256 av den råa brödtexten med din nyckels webhook-hemlighet (visas en gång vid nyckelgenerering). Verifiera 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));
}

Leverans sker i ett försök med 5s timeout — status_url är alltid den giltiga källan.

Fel

Alla fel har { "error": { "code", "message", ... } } — maskinläsbar kod, läsbar beskrivning och field när ett specifikt inmatningsfält är felaktigt.

KodHTTPBetydelse
invalid_key401Saknad, felaktig eller återkallad API-nyckel.
invalid_json400Brödtexten är inte giltig JSON.
invalid_vehicle400Okänd fordonskod / {customVehicleId}.
invalid_items400Ett artikelfält saknas, är icke-numeriskt eller utanför giltigt intervall.
suspicious_dimensions400Alla dimensioner under 100 mm — troligen tum skickade som mm. Ange "units": "imperial".
invalid_units400units måste vara "metric" eller "imperial".
invalid_objective400objective måste vara "ldm" eller "pallets".
invalid_callback400callback_url måste vara https.
too_many_items400Manifestet överskrider artikelgränsen för din åtkomstnivå.
upgrade_required402Produktionsläge kräver Enterprise-planen. Använd sandbox eller uppgradera.
sandbox_limit_reached402Månadens sandbox-kvot är förbrukad — återställs den 1:a.
quota_exceeded402Månadskvoten på 5 000 packningar är förbrukad — nollställs den 1:a. För högre volymer: kontakta oss.
too_many_jobs429Gränsen för samtidiga uppgifter är nådd. Poll:a pågående uppgifter och försök igen.
not_found404Ingen sådan uppgift för detta workspace.

Frågor, högre gränser eller en koppling du behöver (Zapier, Excel, MCP)? hello@hansatic.com