Packing API

Kirimkan kargo, dapatkan rencana muatan yang optimal dan valid secara fisik — mencakup penempatan, loading meter, linear feet, dan posisi palet yang ditagih. Mesin yang sama dengan aplikasi, terus divalidasi berdasarkan tata letak dispatcher nyata. Akses sandbox tersedia di setiap paket; akses produksi di Enterprise.

Mulai cepat

  1. Masuk → klik nama Anda → API → buat kunci.
  2. Kirimkan pekerjaan packing (contoh ini berjalan di sandbox — gratis di setiap paket):
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-..."
}

Pantau status_url (dengan header autentikasi yang sama) hingga status menjadi "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/..."
  }
}

Endpoint

POST /api/v1/pack

Memvalidasi dan mengantrekan pekerjaan packing. Mengembalikan 202 dengan job_id. Mendukung header Idempotency-Key — pengulangan dengan kunci yang sama akan mengembalikan pekerjaan asli alih-alih memproses ulang.

GET /api/v1/jobs/{id}

Status pekerjaan dan, jika selesai, hasil lengkap. Hasil disimpan selama 30 hari; paket produksi tersimpan permanen di workspace Anda.

GET /api/v1/openapi.json

Kontrak OpenAPI 3.1 yang dapat dibaca mesin — impor ke Postman, generator kode, atau arahkan alat coding AI Anda. Kode kendaraan diambil dari mesin aktif, sehingga selalu terbaru. Buka spesifikasi ↗

Field respons

Objek result pada pekerjaan yang selesai:

FieldTipeDeskripsi
placed_count / unplaced_countintegerJumlah item yang muat / tidak muat.
units"metric" | "imperial"Satuan yang digunakan untuk semua angka di bawah (mengikuti permintaan).
metrics.ldm_mnumberLoading meter — panjang blok kargo (akhir maks − awal min).
metrics.linear_ftnumberPanjang yang sama dalam linear feet (US LTL).
metrics.span_mmintegerPanjang dalam mm, selalu metrik.
metrics.pallet_positions_eurinteger | nullPosisi palet EUR yang ditagih. null jika tata letak terlalu besar untuk diukur.
metrics.total_weight_kgnumberBerat muatan, selalu dalam kg.
metrics.overlapsintegerPasangan yang saling tumpang tindih — selalu 0 untuk tata letak yang valid.
items[].placedbooleanApakah item masuk ke dalam tata letak.
items[].x / y / znumber | nullPosisi dalam satuan permintaan: x dari ujung pintu, y dari dinding kiri, z dari lantai. Ketiganya null jika placed bernilai false.
items[].rotation_deg / tilt_deg0 | 90Orientasi: rotasi terhadap sumbu vertikal; tilt = diletakkan miring.
items[].length / width / height / weightnumberItem seperti yang dikirimkan, dalam satuan permintaan.
plan_urlstring | nullRencana yang dibuat di aplikasi. null untuk pekerjaan sandbox.

Versi & stabilitas

Kontrak diberi versi dalam path (/api/v1/). Dalam v1, perubahan hanya bersifat penambahan — field permintaan opsional baru, field respons baru, kode kendaraan baru, dan kode kesalahan baru dapat muncul, dan klien harus mengabaikan field yang tidak dikenali. Field yang ada tidak pernah mengubah arti atau tipe, dan tidak ada yang dihapus. Perubahan yang memutus kompatibilitas berarti path versi baru, dengan v1 dipertahankan secara paralel setidaknya selama 12 bulan dan pemberitahuan penghentian melalui email ke setiap workspace dengan kunci aktif.

Field permintaan

FieldTipeDeskripsi
vehiclestringKode kendaraan dari tabel di bawah. Atau gunakan custom_vehicle_id (kendaraan dari armada workspace Anda).
objective"ldm" | "pallets"Meminimalkan loading meter, atau meminimalkan posisi palet yang ditagih. Default "ldm".
units"metric" | "imperial"Cara membaca DAN mengembalikan dimensi dan berat item: mm/kg (default) atau in/lb. Posisi dalam respons mengikuti satuan yang sama.
itemsarray, requiredDaftar kargo (field di bawah).
sandboxbooleanMode uji: hasil lengkap, tidak disimpan. Tersedia di setiap paket.
namestringNama rencana (mode produksi).
ldm_limit_mnumberBatasi muatan hingga N loading meter pertama (truk).
budget_msnumberBatas waktu optimasi (produksi; default 30000, maks 300000).
callback_urlhttps URLDikirimkan hasilnya via POST saat pekerjaan selesai, dengan tanda tangan (lihat Webhook).

Field item

FieldTipeDeskripsi
length / width / heightnumber, requiredDimensi item, dibaca dalam satuan permintaan (mm secara default, inci dengan "units": "imperial").
weightnumber, requiredBerat item (kg secara default, lb dengan "units": "imperial").
quantityinteger, default 1Diuraikan menjadi unit individual.
namestring, optionalDitampilkan dalam rencana dan respons.
stackableboolean, default trueItem lain dapat diletakkan di atas item ini.
max_stacknumber, optionalBerat maksimum yang dapat ditopang item ini (satuan sama dengan berat).
fragileboolean, default falseItem rapuh hanya ditempatkan di lapisan atas.
tiltableboolean, default trueApakah item boleh diletakkan miring.
destination_stopinteger, default 1Titik pengiriman untuk pemuatan LIFO multi-stop.

Kode kendaraan

Dihasilkan dari spesifikasi mesin aktif. Kendaraan khusus dari armada workspace Anda dapat digunakan melalui custom_vehicle_id.

Truk & trailer

KodeKendaraanInterior (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

Kontainer

KodeKontainerInterior (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

Tingkat akses & batasan

Sandbox (setiap paket)Produksi (Enterprise)
Panggilan25 berhasil / bulan5.000 pengemasan berhasil / bulan
Item per manifes205,000
Pekerjaan bersamaan110
Batas waktu optimasi10 s30 s default, hingga 300 s
PenyimpananTidak ada yang disimpanSetiap packing membuat rencana nyata di workspace Anda

Hanya pengemasan yang berhasil dihitung — validasi gagal dan pekerjaan yang gagal tidak mengurangi kuota. Kedua penghitung akan direset pada tanggal 1 (UTC). Hasil sandbox lengkap dan tidak dibatasi — batasannya adalah gerbang, bukan keluaran. Butuh lebih dari 5.000 pengemasan per bulan? Hubungi kami untuk diskusi mengenai volume dan harga OEM.

Webhook

Sertakan callback_url untuk menerima hasil via POST saat pekerjaan selesai. Setiap callback membawa X-Hansatic-Signature: HMAC-SHA256 dari body mentah dengan rahasia webhook kunci Anda (ditampilkan sekali saat pembuatan kunci). Verifikasi:

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

Pengiriman dilakukan satu kali dengan batas waktu 5s — status_url tetap menjadi sumber kebenaran.

Kesalahan

Semua kesalahan berbentuk { "error": { "code", "message", ... } } — kode yang dapat dibaca mesin, pesan yang dapat dibaca manusia, dan field jika input tertentu bermasalah.

KodeHTTPArti
invalid_key401Kunci API hilang, salah format, atau dicabut.
invalid_json400Body bukan JSON yang valid.
invalid_vehicle400Kode kendaraan / custom_vehicle_id tidak dikenal.
invalid_items400Field item hilang, bukan angka, atau di luar rentang.
suspicious_dimensions400Semua dimensi di bawah 100mm — kemungkinan inci dikirim sebagai mm. Gunakan "units": "imperial".
invalid_units400units harus "metric" atau "imperial".
invalid_objective400objective harus "ldm" atau "pallets".
invalid_callback400callback_url harus https.
too_many_items400Manifes melebihi batas item untuk tingkat akses Anda.
upgrade_required402Mode produksi memerlukan paket Enterprise. Gunakan sandbox, atau tingkatkan paket.
sandbox_limit_reached402Kuota sandbox bulanan habis — akan direset pada tanggal 1.
quota_exceeded402Kuota produksi bulanan sebesar 5.000 pengemasan telah terpakai — akan direset pada tanggal 1. Untuk volume lebih besar: hubungi kami.
too_many_jobs429Batas pekerjaan bersamaan tercapai. Pantau pekerjaan yang berjalan dan coba lagi.
not_found404Tidak ada pekerjaan seperti itu untuk workspace ini.

Pertanyaan, batasan lebih tinggi, atau konektor yang Anda butuhkan (Zapier, Excel, MCP)? hello@hansatic.com