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
- Log masuk → klik nama anda → API → hasilkan kunci.
- 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:
| Medan | Jenis | Penerangan |
|---|---|---|
| placed_count / unplaced_count | integer | Berapa banyak item yang muat / tidak muat. |
| units | "metric" | "imperial" | Unit yang digunakan untuk semua nombor di bawah (mengulangi permintaan). |
| metrics.ldm_m | number | Meter pemuatan — panjang blok kargo (maks akhir − min mula). |
| metrics.linear_ft | number | Panjang yang sama dalam kaki linear (US LTL). |
| metrics.span_mm | integer | Panjang dalam mm, sentiasa metrik. |
| metrics.pallet_positions_eur | integer | null | Kedudukan palet EUR yang ditagih. null jika susun atur terlalu besar untuk diukur. |
| metrics.total_weight_kg | number | Berat yang dimuatkan, sentiasa kg. |
| metrics.overlaps | integer | Pasangan yang saling menembusi — sentiasa 0 untuk susun atur yang sah. |
| items[].placed | boolean | Sama ada item berjaya dimuatkan ke dalam susun atur. |
| items[].x / y / z | number | null | Kedudukan 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_deg | 0 | 90 | Orientasi: putaran pada paksi menegak; tilt = diletakkan secara mendatar. |
| items[].length / width / height / weight | number | Item seperti yang dihantar, diulangi dalam unit permintaan. |
| plan_url | string | null | Pelan 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
| Medan | Jenis | Penerangan |
|---|---|---|
| vehicle | string | Kod 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. |
| items | array, required | Manifest kargo (medan di bawah). |
| sandbox | boolean | Mod ujian: keputusan penuh, tiada yang disimpan. Tersedia dalam setiap pelan. |
| name | string | Nama pelan (mod pengeluaran). |
| ldm_limit_m | number | Hadkan muatan kepada N meter pemuatan pertama (trak). |
| budget_ms | number | Belanjawan masa pengoptimuman (pengeluaran; lalai 30000, maks 300000). |
| callback_url | https URL | Dihantar melalui POST hasil apabila tugas selesai, ditandatangani (lihat Webhook). |
Medan item
| Medan | Jenis | Penerangan |
|---|---|---|
| length / width / height | number, required | Dimensi item, dibaca dalam unit permintaan (mm secara lalai, inci dengan "units": "imperial"). |
| weight | number, required | Berat item (kg secara lalai, lb dengan "units": "imperial"). |
| quantity | integer, default 1 | Diperluaskan kepada unit individu. |
| name | string, optional | Ditunjukkan dalam pelan dan respons. |
| stackable | boolean, default true | Kargo lain boleh diletakkan di atas item ini. |
| max_stack | number, optional | Berat maksimum yang boleh ditanggung item ini di atas (unit sama dengan berat). |
| fragile | boolean, default false | Item rapuh hanya diletakkan pada lapisan atas. |
| tiltable | boolean, default true | Bolehkah item diletakkan secara mendatar. |
| destination_stop | integer, default 1 | Hentian 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
| Kod | Kenderaan | Bahagian dalam (P×L×T) | Muatan |
|---|---|---|---|
| CURTAINSIDER_136 | 13.6m Curtainsider | 13.62 × 2.48 × 2.70 m | 24 t |
| BOX_136 | 13.6m Box Trailer | 13.62 × 2.46 × 2.68 m | 24 t |
| MEGA_136 | 13.6m Mega Trailer | 13.62 × 2.48 × 3.00 m | 22.5 t |
| MEGA_CURTAIN_136 | 13.6m Mega Curtainsider | 13.62 × 2.48 × 3.00 m | 22 t |
| FLATBED_136 | 13.6m Flatbed | 13.62 × 2.48 × 3.00 m | 25 t |
| REEFER_136 | 13.6m Reefer | 13.32 × 2.44 × 2.54 m | 22 t |
| CURTAINSIDER_75 | 7.5m City Curtainsider | 7.50 × 2.48 × 2.70 m | 12 t |
| SWAPBODY_715 | 7.15m Swap Body | 7.15 × 2.48 × 2.70 m | 12 t |
| SWAPBODY_745 | 7.45m Swap Body | 7.45 × 2.48 × 2.70 m | 12 t |
| DRY_VAN_53 | 53ft Dry Van | 16.15 × 2.59 × 2.74 m | 20 t |
| FLATBED_53 | 53ft Flatbed | 16.15 × 2.59 × 3.66 m | 22 t |
| REEFER_53 | 53ft Reefer | 15.85 × 2.46 × 2.59 m | 18.5 t |
| CURTAINSIDER_125_CN | 12.5m Curtainsider (CN) | 12.50 × 2.50 × 2.80 m | 27 t |
| FLATBED_40_IN | 40ft Flatbed (IN) | 12.19 × 2.50 × 3.50 m | 26 t |
| BOX_138_BR | 13.8m Box Van (BR) | 13.80 × 2.50 × 2.90 m | 28 t |
| CURTAINSIDER_12_ZA | 12m Curtainsider (ZA) | 12.00 × 2.48 × 2.70 m | 28 t |
Kontena
| Kod | Kontena | Bahagian dalam (P×L×T) | Muatan |
|---|---|---|---|
| 20DC | 20' Dry Container | 5.89 × 2.35 × 2.39 m | 21.727 t |
| 20HC | 20' High Cube | 5.89 × 2.35 × 2.70 m | 21.58 t |
| 40DC | 40' Dry Container | 12.03 × 2.35 × 2.39 m | 26.63 t |
| 40HC | 40' High Cube | 12.03 × 2.35 × 2.70 m | 26.58 t |
| 45HC | 45' High Cube | 13.56 × 2.35 × 2.70 m | 25.68 t |
| 20OT | 20' Open Top | 5.89 × 2.35 × 2.39 m | 21.64 t |
| 40OT | 40' Open Top | 12.03 × 2.35 × 2.39 m | 26.58 t |
| 20RF | 20' Reefer | 5.44 × 2.29 × 2.27 m | 21 t |
| 40RF | 40' Reefer | 11.58 × 2.29 × 2.21 m | 25.6 t |
| 40RFHC | 40' Reefer High Cube | 11.58 × 2.29 × 2.54 m | 25.88 t |
| 53DC | 53' Domestic | 16.15 × 2.59 × 2.90 m | 26 t |
Tahap akses & had
| Sandbox (setiap pelan) | Pengeluaran (Enterprise) | |
|---|---|---|
| Panggilan | 25 berjaya / bulan | 5,000 berjaya / bulan |
| Item setiap manifest | 20 | 5,000 |
| Tugas serentak | 1 | 10 |
| Belanjawan pengoptimuman | 10 s | 30 s lalai, sehingga 300 s |
| Kekal | Tiada yang disimpan | Setiap 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.
| Kod | HTTP | Maksud |
|---|---|---|
| invalid_key | 401 | Kunci API hilang, rosak, atau dibatalkan. |
| invalid_json | 400 | Badan bukan JSON yang sah. |
| invalid_vehicle | 400 | Kod kenderaan / {customVehicleId} tidak dikenali. |
| invalid_items | 400 | Medan item hilang, bukan nombor, atau di luar julat. |
| suspicious_dimensions | 400 | Semua dimensi di bawah 100mm — kemungkinan inci dihantar sebagai mm. Hantar "units": "imperial". |
| invalid_units | 400 | units mestilah "metric" atau "imperial". |
| invalid_objective | 400 | objective mestilah "ldm" atau "pallets". |
| invalid_callback | 400 | callback_url mestilah https. |
| too_many_items | 400 | Manifest melebihi had item untuk tahap akses anda. |
| upgrade_required | 402 | Mod pengeluaran memerlukan pelan Enterprise. Gunakan sandbox, atau naik taraf. |
| sandbox_limit_reached | 402 | Elaun sandbox bulanan telah digunakan — tetapkan semula pada 1 haribulan. |
| quota_exceeded | 402 | Kuota pengeluaran bulanan sebanyak 5,000 pek telah digunakan — ditetapkan semula pada hari ke-1. Volum yang lebih tinggi: hubungi kami. |
| too_many_jobs | 429 | Had tugas serentak tercapai. Semak tugas yang berjalan dan cuba semula. |
| not_found | 404 | Tiada tugas sedemikian untuk ruang kerja ini. |
Soalan, had yang lebih tinggi, atau penyambung yang anda perlukan (Zapier, Excel, MCP)? hello@hansatic.com