Packing API

Geef lading op en ontvang een geoptimaliseerd, fysiek geldig laadplan — posities, laadmeters, lineaire meters en gefactureerde palletposities. Dezelfde engine als in de app, continu gevalideerd aan de hand van echte dispatcher-indelingen. Sandbox-toegang op elk abonnement; productietoegang op Enterprise.

Snel starten

  1. Log in → klik op je naam → API → genereer een sleutel.
  2. Dien een pack-taak in (deze wordt in de sandbox uitgevoerd — gratis op elk abonnement):
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 de status_url (zelfde auth-header) totdat status "done" is:

{
  "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/..."
  }
}

Eindpunten

POST /api/v1/pack

Valideert en plaatst een pack-taak in de wachtrij. Retourneert 202 met een job_id. Ondersteunt een Idempotency-Key-header — herhalingen met dezelfde sleutel retourneren de oorspronkelijke taak in plaats van dubbel te packen.

GET /api/v1/jobs/{id}

Taakstatus en, indien voltooid, het volledige resultaat. Resultaten worden 30 dagen bewaard; productieplannen blijven permanent in je werkruimte beschikbaar.

GET /api/v1/openapi.json

De machineleesbare OpenAPI 3.1-specificatie — importeer deze in Postman, codegenerators of richt je AI-coderingstool erop. Voertuigcodes worden ingevoegd vanuit de live-engine, dus deze is altijd actueel. Bekijk de specificatie ↗

Antwoordvelden

Het result-object bij een voltooide taak:

VeldTypeOmschrijving
placed_count / unplaced_countintegerAantal items dat past / niet past.
units"metric" | "imperial"De eenheden waarin alle onderstaande getallen worden uitgedrukt (overeenkomstig het verzoek).
metrics.ldm_mnumberLaadmeters — de omvang van het laadblok (max. einde − min. begin).
metrics.linear_ftnumberDezelfde omvang in lineaire voet (US LTL).
metrics.span_mmintegerDe omvang in mm, altijd metrisch.
metrics.pallet_positions_eurinteger | nullGefactureerde EUR-palletposities. null als de indeling te groot is om te meten.
metrics.total_weight_kgnumberGewicht van de geplaatste lading, altijd in kg.
metrics.overlapsintegerOverlappende paren — altijd 0 bij een geldige indeling.
items[].placedbooleanOf het item in de indeling is geplaatst.
items[].x / y / znumber | nullPositie in de eenheden van het verzoek: x vanaf de deurzijde, y vanaf de linkermuur, z vanaf de vloer. Alle drie zijn null als placed false is.
items[].rotation_deg / tilt_deg0 | 90Oriëntatie: rotatie om de verticale as; tilt = op de zijde gelegd.
items[].length / width / height / weightnumberHet item zoals opgegeven, herhaald in de eenheden van het verzoek.
plan_urlstring | nullHet aangemaakte plan in de app. null voor sandbox-taken.

Versiebeheer en stabiliteit

Het contract is versiebeheerd in het pad (/api/v1/). Binnen v1 zijn wijzigingen alleen additief — nieuwe optionele aanvraagvelden, nieuwe antwoordvelden, nieuwe voertuigcodes en foutcodes kunnen verschijnen, en clients moeten velden negeren die ze niet herkennen. Bestaande velden veranderen nooit van betekenis of type, en niets wordt verwijderd. Een breaking change betekent een nieuw versiepad, waarbij v1 minimaal 12 maanden parallel wordt onderhouden en er een deprecation-melding per e-mail wordt verzonden naar elke werkruimte met een actieve sleutel.

Aanvraagvelden

VeldTypeOmschrijving
vehiclestringEen voertuigcode uit de onderstaande tabellen. Of geef {customVehicleId} op (een voertuig uit je werkruimte-vloot).
objective"ldm" | "pallets"Minimaliseer laadmeters of minimaliseer gefactureerde palletposities. Standaard "ldm".
units"metric" | "imperial"Hoe itemafmetingen en -gewichten worden gelezen EN geretourneerd: mm/kg (standaard) of in/lb. Posities in het antwoord volgen dezelfde eenheden.
itemsarray, requiredDe ladingmanifest (velden hieronder).
sandboxbooleanTestmodus: volledig resultaat, niets wordt opgeslagen. Beschikbaar op elk abonnement.
namestringNaam van het plan (productiemodus).
ldm_limit_mnumberBeperk de lading tot de eerste N laadmeters (vrachtwagens).
budget_msnumberOptimalisatie-tijdsbudget (productie; standaard 30000, max. 300000).
callback_urlhttps URLWordt via POST verzonden wanneer de taak is voltooid, ondertekend (zie Webhooks).

Itemvelden

VeldTypeOmschrijving
length / width / heightnumber, requiredAfmetingen van het item, gelezen in de eenheden van het verzoek (standaard mm, inches bij "units": "imperial").
weightnumber, requiredGewicht van het item (standaard kg, lb bij "units": "imperial").
quantityinteger, default 1Wordt uitgevouwen naar individuele eenheden.
namestring, optionalWordt weergegeven in het plan en het antwoord.
stackableboolean, default trueAndere lading mag bovenop dit item worden geplaatst.
max_stacknumber, optionalMaximaal gewicht dat dit item kan dragen (zelfde eenheden als gewicht).
fragileboolean, default falseBreekbare items worden alleen op de bovenste lagen geplaatst.
tiltableboolean, default trueMag het item op de zijde worden gelegd.
destination_stopinteger, default 1Afleverstop voor multi-stop LIFO-laden.

Voertuigcodes

Gegenereerd vanuit de live-engine-specificaties. Aangepaste voertuigen uit je werkruimte-vloot werken via custom_vehicle_id.

Vrachtwagens & opleggers

CodeVoertuigInterieur (L×B×H)Laadvermogen
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

Containers

CodeContainerInterieur (L×B×H)Laadvermogen
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

Toegangsniveaus en limieten

Sandbox (elk abonnement)Productie (Enterprise)
Aanroepen25 geslaagd / maand5.000 succesvolle / maand
Items per manifest205,000
Gelijktijdige taken110
Optimalisatiebudget10 s30 s standaard, tot 300 s
PersistentieNiets opgeslagenElke pack creëert een echt plan in je werkruimte

Alleen succesvolle pakketten tellen mee — mislukte validaties en mislukte taken worden niet in rekening gebracht voor een quotum. Beide tellers worden op de 1e (UTC) gereset. Sandbox-resultaten zijn volledig en onbeperkt — de limieten zijn de drempel, niet de uitkomst. Meer dan 5.000 pakketten per maand nodig? Neem contact met ons op voor volumekorting en OEM-prijzen.

Webhooks

Geef callback_url op om het resultaat via POST te ontvangen wanneer de taak is voltooid. Elke callback bevat een X-Hansatic-Signature: een HMAC-SHA256 van de onbewerkte body met het webhook-geheim van je sleutel (eenmalig getoond bij het aanmaken van de sleutel). Verifieer deze:

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 gebeurt in één poging met een time-out van 5s — de status_url blijft altijd de bron van waarheid.

Fouten

Alle fouten hebben de vorm { "error": { "code", "message", ... } } — een machineleesbare code, een menselijk leesbaar bericht en field als een specifiek invoerveld de fout veroorzaakt.

CodeHTTPBetekenis
invalid_key401Ontbrekende, onjuist gevormde of ingetrokken API-sleutel.
invalid_json400Body is geen geldige JSON.
invalid_vehicle400Onbekende voertuigcode / {customVehicleId}.
invalid_items400Een itemveld ontbreekt, is niet-numeriek of buiten het bereik.
suspicious_dimensions400Alle afmetingen onder 100 mm — waarschijnlijk inches verzonden als mm. Geef "units": "imperial" op.
invalid_units400units moet "metric" of "imperial" zijn.
invalid_objective400objective moet "ldm" of "pallets" zijn.
invalid_callback400callback_url moet https zijn.
too_many_items400Manifest overschrijdt de itemlimiet voor je toegangsniveau.
upgrade_required402Productiemodus vereist het Enterprise-abonnement. Gebruik de sandbox of upgrade.
sandbox_limit_reached402Maandelijks sandbox-contingent verbruikt — reset op de 1e van de maand.
quota_exceeded402Maandelijks productiequota van 5.000 pakketten bereikt — reset op de 1e. Voor hogere volumes: neem contact met ons op.
too_many_jobs429Limiet voor gelijktijdige taken bereikt. Poll actieve taken en probeer opnieuw.
not_found404Geen dergelijke taak voor deze werkruimte.

Vragen, hogere limieten of een connector die je nodig hebt (Zapier, Excel, MCP)? hello@hansatic.com