Pakavimo API

Pateikite krovinius, gaukite optimizuotą, fiziškai pagrįstą krovos planą — pozicijas, krovinio metrus, tiesinius pėdas ir apmokestinamas palečių vietas. Tas pats variklis, kuris naudojamas programėlėje, nuolat tikrinamas pagal realių dispečerių sudarytus planus. Sandbox prieiga prieinama kiekviename plane; produkcijos prieiga — Enterprise plane.

Greitas pradžiamokslis

  1. Prisijunkite → spustelėkite savo vardą → API → sugeneruokite raktą.
  2. Pateikite pakavimo užduotį (ši veikia sandbox režime — nemokamai kiekviename plane):
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-..."
}

Periodiškai tikrinkite status_url (su tuo pačiu autentifikacijos antraštės raktu), kol status bus "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/..."
  }
}

Galutiniai taškai

POST /api/v1/pack

Patvirtina ir įkelia pakavimo užduotį. Grąžina 202 su job_id. Palaiko Idempotency-Key antraštę — pakartotiniai užklausimai su tuo pačiu raktu grąžina originalią užduotį, užuot pakavę dar kartą.

GET /api/v1/jobs/{id}

Užduoties būsena ir, kai baigta, pilnas rezultatas. Rezultatai saugomi 30 dienų; produkcijos planai jūsų darbo erdvėje išlieka nuolat.

GET /api/v1/openapi.json

Mašininiu būdu skaitoma OpenAPI 3.1 specifikacija — importuokite ją į Postman, kodų generatorius ar nukreipkite savo AI kūrimo įrankį. Transporto priemonių kodai įterpiami iš veikiančio variklio, todėl ji visada atnaujinta. Atidaryti specifikaciją ↗

Atsakymo laukai

result objektas baigtoje užduotyje:

LaukasTipasAprašymas
placed_count / unplaced_countintegerKiek daiktų tilpo / netilpo.
units"metric" | "imperial"Vienetai, kuriais išreikšti visi žemiau pateikti skaičiai (atkartoja užklausą).
metrics.ldm_mnumberKrovinio metrai — krovinio bloko ilgis (maksimalus galas − minimalus pradžios taškas).
metrics.linear_ftnumberTas pats ilgis tiesiniais pėdais (JAV LTL).
metrics.span_mmintegerIlgis milimetrais, visada metrinis.
metrics.pallet_positions_eurinteger | nullApmokestinamos EUR palečių vietos. null, jei išdėstymas per didelis matavimui.
metrics.total_weight_kgnumberSveriamas krovinys, visada kg.
metrics.overlapsintegerSusikertančių porų skaičius — visada 0, jei išdėstymas tinkamas.
items[].placedbooleanAr daiktas pateko į išdėstymą.
items[].x / y / znumber | nullPozicija užklausos vienetais: x nuo durų pusės, y nuo kairės sienos, z nuo grindų. Visi trys laukai yra null, jei placed yra false.
items[].rotation_deg / tilt_deg0 | 90Orientacija: pasukimas apie vertikalią ašį; tilt = padėtas ant šono.
items[].length / width / height / weightnumberDaiktas, kaip pateiktas, atkartotas užklausos vienetais.
plan_urlstring | nullSukurtas planas programėlėje. null sandbox užduotims.

Versijavimas ir stabilumas

Sutartis versijuojama kelio (/api/v1/) lygmeniu. v1 versijoje pakeitimai yra tik papildomi — nauji neprivalomi užklausos laukai, nauji atsakymo laukai, nauji transporto priemonių kodai ir klaidų kodai gali pasirodyti, o klientai turėtų ignoruoti jiems nežinomus laukus. Esami laukai niekada nekeičia reikšmės ar tipo, ir niekas nėra pašalinama. Esminis pakeitimas reiškia naują versijos kelią, o v1 versija palaikoma lygiagrečiai bent 12 mėnesių ir apie išėjimą iš naudojimo pranešama el. paštu kiekvienai darbo erdveii, turinčiai aktyvų raktą.

Užklausos laukai

LaukasTipasAprašymas
vehiclestringTransporto priemonės kodas iš žemiau pateiktų lentelių. Arba perduokite custom_vehicle_id (transporto priemonė iš jūsų darbo erdvės flotilės).
objective"ldm" | "pallets"Minimizuoti krovinio metrus arba apmokestinamas palečių vietas. Numatyta reikšmė „ldm“.
units"metric" | "imperial"Kaip suprasti ir grąžinti daiktų matmenis bei svorius: mm/kg (numatyta) arba coliai/svarai. Atsakymo pozicijos naudojamos tos pačios vienetų sistemos.
itemsarray, requiredKrovinio manifestas (žemiau pateikti laukai).
sandboxbooleanBandomasis režimas: pilnas rezultatas, niekas nėra išsaugoma. Prieinama kiekviename plane.
namestringPlano pavadinimas (produkcijos režime).
ldm_limit_mnumberApriboti krovinį iki pirmųjų N krovinio metrų (sunkvežimiai).
budget_msnumberOptimizavimo laiko biudžetas (produkcijoje; numatyta 30000, maksimaliai 300000).
callback_urlhttps URLRezultatas bus POST metodas į {callbackUrl}, kai užduotis bus baigta, pasirašytas (žr. Webhook'ai).

Daiktų laukai

LaukasTipasAprašymas
length / width / heightnumber, requiredDaikto matmenys, suprantami pagal užklausos vienetus (numatytas mm, coliai su „units“: „imperial“).
weightnumber, requiredDaikto svoris (numatytas kg, svarai su „units“: „imperial“).
quantityinteger, default 1Išplečiamas į atskirus vienetus.
namestring, optionalRodomas plane ir atsakyme.
stackableboolean, default trueAr ant šio daikto gali būti kraunami kiti kroviniai.
max_stacknumber, optionalMaksimalus svoris, kurį šis daiktas gali išlaikyti viršuje (tos pačios vienetų sistemos kaip svoris).
fragileboolean, default falseTrapius daiktus reikia dėti tik į viršutinius sluoksnius.
tiltableboolean, default trueAr daiktą galima padėti ant šono.
destination_stopinteger, default 1Pristatymo stotelė daugiaetapio LIFO pakrovimo atveju.

Transporto priemonių kodai

Sugeneruota iš veikiančio variklio specifikacijų. Jūsų darbo erdvės flotilės transporto priemonės veikia per custom_vehicle_id.

Sunkvežimiai ir priekabos

KodasTransporto priemonėVidaus matmenys (L×P×A)Krovumas
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

Konteineriai

KodasKonteinerisVidaus matmenys (L×P×A)Krovumas
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

Prieigos lygiai ir apribojimai

Sandbox (kiekviename plane)Produkcija (Enterprise)
Užklausos25 sėkmingos / mėnesį5 000 sėkmingų pakuočių / mėnesį
Daiktų skaičius manifeste205,000
Vykdomos užduotys tuo pačiu metu110
Optimizavimo biudžetas10 s30 s numatyta, iki 300 s
IšsaugojimasNieko neišsaugomaKiekvienas pakavimas sukuria realų planą jūsų darbo erdvėje

Skaičiuojamos tik sėkmingai suformuotos pakuotės — netinkami užklausos duomenys ir nepavykę darbai į kvotą neįskaičiuojami. Abu skaitikliai atnaujinami kiekvieno mėnesio 1-ąją (UTC). Bandomojoje aplinkoje rezultatai yra pilni ir neapriboti — ribojamas tik kvotos dydis, o ne funkcionalumas. Reikia daugiau nei 5 000 pakuočių per mėnesį? Susisiekite su mumis dėl didesnių apimčių ir OEM kainodaros.

Webhook'ai

Nurodykite callback_url, kad gautumėte rezultatą POST metodu, kai užduotis bus baigta. Kiekvienas atgalinis iškvietimas turi X-Hansatic-Signature: HMAC-SHA256 parašą iš žinutės kūno su jūsų rakto webhook paslaptimi (rodoma tik kartą, kai raktas sukuriamas). Patvirtinkite ją:

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

Pristatymas vykdomas vieną kartą su 5 s laukimo laiku — status_url visada lieka pagrindiniu tiesos šaltiniu.

Klaidos

Visos klaidos yra { "error": { "code", "message", ... } } formato — mašininiu būdu skaitomas kodas, žmogui suprantama žinutė ir field, jei klaida susijusi su konkrečiu įvesties lauku.

KodasHTTPReikšmė
invalid_key401Trūksta, netinkamai suformuotas arba atšauktas API raktas.
invalid_json400Pranešimo turinys nėra tinkamas JSON.
invalid_vehicle400Nežinomas transporto priemonės kodas arba custom_vehicle_id.
invalid_items400Trūksta daikto lauko, jis nėra skaitinis arba yra už leidžiamų ribų.
suspicious_dimensions400Visi matmenys mažesni nei 100 mm — greičiausiai coliai perduoti kaip milimetrai. Nurodykite „units“: „imperial“.
invalid_units400units turi būti „metric“ arba „imperial“.
invalid_objective400objective turi būti „ldm“ arba „pallets“.
invalid_callback400callback_url turi būti https.
too_many_items400Manifestas viršija daiktų skaičiaus limitą jūsų prieigos lygyje.
upgrade_required402Produkcijos režimui reikalingas Enterprise planas. Naudokite sandbox arba atnaujinkite planą.
sandbox_limit_reached402Mėnesinė sandbox kvota išnaudota — atnaujinama kiekvieno mėnesio 1-ąją.
quota_exceeded402Mėnesinė 5 000 pakuočių kvota išnaudota — atnaujinama kiekvieno mėnesio 1-ąją. Didesnėms apimtims: susisiekite su mumis.
too_many_jobs429Pasiektas lygiagrečių užduočių limitas. Patikrinkite vykdomų užduočių būseną ir bandykite dar kartą.
not_found404Tokios užduoties šioje darbo erdvėje nėra.

Klausimų, didesnių apribojimų ar reikalingas sujungimas (Zapier, Excel, MCP)? hello@hansatic.com