Packing API

Hantar kargo, dapatkan semula pelan muatan yang dioptimumkan dan sah dari segi fizikal — penempatan, meter pemuatan, kaki linear dan kedudukan palet yang ditagih. Enjin yang sama digunakan dalam aplikasi, disahkan secara berterusan berbanding susun atur dispatcher sebenar. Akses sandbox tersedia dalam setiap pelan; akses pengeluaran untuk Enterprise.

Mula pantas

  1. Log masuk → klik nama anda → API → hasilkan kunci.
  2. Hantar tugas pemuatan (tugas ini berjalan dalam sandbox — percuma dalam setiap pelan):
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-..."
}

Semak status_url (dengan pengepala pengesahan yang sama) sehingga status ialah "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/..."
  }
}

Titik akhir

POST /api/v1/pack

Mengesahkan dan meletakkan tugas pemuatan dalam baris gilir. Mengembalikan 202 dengan job_id. Menyokong pengepala Idempotency-Key — percubaan semula dengan kunci yang sama akan mengembalikan tugas asal dan bukannya memuatkan semula.

GET /api/v1/jobs/{id}

Status tugas dan, apabila selesai, keputusan penuh. Keputusan disimpan selama 30 hari; pelan pengeluaran kekal dalam ruang kerja anda secara kekal.

GET /api/v1/openapi.json

Kontrak OpenAPI 3.1 yang boleh dibaca mesin — import ke Postman, penjana kod, atau arahkan alat pengkodan AI anda kepadanya. Kod kenderaan disuntik dari enjin langsung, jadi ia sentiasa terkini. Buka spesifikasi ↗

Medan respons

Objek result untuk tugas yang selesai:

MedanJenisPenerangan
placed_count / unplaced_countintegerBerapa banyak item yang muat / tidak muat.
units"metric" | "imperial"Unit yang digunakan untuk semua nombor di bawah (mengulangi permintaan).
metrics.ldm_mnumberMeter pemuatan — panjang blok kargo (maks akhir − min mula).
metrics.linear_ftnumberPanjang yang sama dalam kaki linear (US LTL).
metrics.span_mmintegerPanjang dalam mm, sentiasa metrik.
metrics.pallet_positions_eurinteger | nullKedudukan palet EUR yang ditagih. null jika susun atur terlalu besar untuk diukur.
metrics.total_weight_kgnumberBerat yang dimuatkan, sentiasa kg.
metrics.overlapsintegerPasangan yang saling menembusi — sentiasa 0 untuk susun atur yang sah.
items[].placedbooleanSama ada item berjaya dimuatkan ke dalam susun atur.
items[].x / y / znumber | nullKedudukan dalam unit permintaan: x dari hujung pintu, y dari dinding kiri, z dari lantai. Ketiga-tiganya null jika placed ialah false.
items[].rotation_deg / tilt_deg0 | 90Orientasi: putaran pada paksi menegak; tilt = diletakkan secara mendatar.
items[].length / width / height / weightnumberItem seperti yang dihantar, diulangi dalam unit permintaan.
plan_urlstring | nullPelan yang dibuat dalam aplikasi. null untuk tugas sandbox.

Versi & kestabilan

Kontrak versi dalam laluan (/api/v1/). Dalam v1, perubahan hanya bersifat tambahan — medan permintaan pilihan baharu, medan respons baharu, kod kenderaan baharu dan kod ralat baharu mungkin muncul, dan klien harus mengabaikan medan yang tidak dikenali. Medan sedia ada tidak akan mengubah maksud atau jenis, dan tiada apa yang akan dikeluarkan. Perubahan memecahkan bermakna laluan versi baharu, dengan v1 dikekalkan selari sekurang-kurangnya 12 bulan dan notis penamatan dihantar melalui e-mel kepada setiap ruang kerja dengan kunci aktif.

Medan permintaan

MedanJenisPenerangan
vehiclestringKod kenderaan dari jadual di bawah. Atau hantar {customVehicleId} (kenderaan dari armada ruang kerja anda).
objective"ldm" | "pallets"Kurangkan meter pemuatan, atau kurangkan kedudukan palet yang ditagih. Lalai "ldm".
units"metric" | "imperial"Cara dimensi dan berat item dibaca DAN dikembalikan: mm/kg (lalai) atau in/lb. Kedudukan dalam respons mengikut unit yang sama.
itemsarray, requiredManifest kargo (medan di bawah).
sandboxbooleanMod ujian: keputusan penuh, tiada yang disimpan. Tersedia dalam setiap pelan.
namestringNama pelan (mod pengeluaran).
ldm_limit_mnumberHadkan muatan kepada N meter pemuatan pertama (trak).
budget_msnumberBelanjawan masa pengoptimuman (pengeluaran; lalai 30000, maks 300000).
callback_urlhttps URLDihantar melalui POST hasil apabila tugas selesai, ditandatangani (lihat Webhook).

Medan item

MedanJenisPenerangan
length / width / heightnumber, requiredDimensi item, dibaca dalam unit permintaan (mm secara lalai, inci dengan "units": "imperial").
weightnumber, requiredBerat item (kg secara lalai, lb dengan "units": "imperial").
quantityinteger, default 1Diperluaskan kepada unit individu.
namestring, optionalDitunjukkan dalam pelan dan respons.
stackableboolean, default trueKargo lain boleh diletakkan di atas item ini.
max_stacknumber, optionalBerat maksimum yang boleh ditanggung item ini di atas (unit sama dengan berat).
fragileboolean, default falseItem rapuh hanya diletakkan pada lapisan atas.
tiltableboolean, default trueBolehkah item diletakkan secara mendatar.
destination_stopinteger, default 1Hentian penghantaran untuk pemuatan LIFO berbilang hentian.

Kod kenderaan

Dihasilkan dari spesifikasi enjin langsung. Kenderaan tersuai dari armada ruang kerja anda berfungsi melalui custom_vehicle_id.

Trak & treler

KodKenderaanBahagian dalam (P×L×T)Muatan
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

Kontena

KodKontenaBahagian dalam (P×L×T)Muatan
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

Tahap akses & had

Sandbox (setiap pelan)Pengeluaran (Enterprise)
Panggilan25 berjaya / bulan5,000 berjaya / bulan
Item setiap manifest205,000
Tugas serentak110
Belanjawan pengoptimuman10 s30 s lalai, sehingga 300 s
KekalTiada yang disimpanSetiap pemuatan mencipta pelan sebenar dalam ruang kerja anda

Hanya pek yang berjaya dikira — pek yang gagal disahkan dan tugasan yang gagal tidak akan dikenakan terhadap kuota. Kedua-dua pembilang akan ditetapkan semula pada hari ke-1 (UTC). Keputusan kotak pasir adalah lengkap dan tidak terhad — had ini adalah pintu masuk, bukan output. Perlu lebih daripada 5,000 pek sebulan? Hubungi kami untuk membincangkan harga volum dan OEM.

Webhook

Hantar callback_url untuk menerima hasil melalui POST apabila tugas selesai. Setiap panggilan balik membawa X-Hansatic-Signature: HMAC-SHA256 bagi badan mentah dengan rahsia webhook kunci anda (ditunjukkan sekali semasa penciptaan kunci). Sahkan:

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

Penghantaran adalah satu percubaan dengan masa tamat 5s — status_url sentiasa kekal sebagai sumber kebenaran.

Ralat

Semua ralat adalah { "error": { "code", "message", ... } } — kod yang boleh dibaca mesin, mesej yang boleh dibaca manusia, dan field apabila input tertentu salah.

KodHTTPMaksud
invalid_key401Kunci API hilang, rosak, atau dibatalkan.
invalid_json400Badan bukan JSON yang sah.
invalid_vehicle400Kod kenderaan / {customVehicleId} tidak dikenali.
invalid_items400Medan item hilang, bukan nombor, atau di luar julat.
suspicious_dimensions400Semua dimensi di bawah 100mm — kemungkinan inci dihantar sebagai mm. Hantar "units": "imperial".
invalid_units400units mestilah "metric" atau "imperial".
invalid_objective400objective mestilah "ldm" atau "pallets".
invalid_callback400callback_url mestilah https.
too_many_items400Manifest melebihi had item untuk tahap akses anda.
upgrade_required402Mod pengeluaran memerlukan pelan Enterprise. Gunakan sandbox, atau naik taraf.
sandbox_limit_reached402Elaun sandbox bulanan telah digunakan — tetapkan semula pada 1 haribulan.
quota_exceeded402Kuota pengeluaran bulanan sebanyak 5,000 pek telah digunakan — ditetapkan semula pada hari ke-1. Volum yang lebih tinggi: hubungi kami.
too_many_jobs429Had tugas serentak tercapai. Semak tugas yang berjalan dan cuba semula.
not_found404Tiada tugas sedemikian untuk ruang kerja ini.

Soalan, had yang lebih tinggi, atau penyambung yang anda perlukan (Zapier, Excel, MCP)? hello@hansatic.com