Packing API
Dërgo mallra, merri një plan ngarkimi të optimizuar dhe fizikisht të vlefshëm — pozicionime, metra ngarkimi, këmbë lineare dhe pozicione paletash të faturuara. E njëjta makinë që qëndron pas aplikacionit, e verifikuar vazhdimisht ndaj planeve reale të dispeçerëve. Qasje në sandbox në çdo plan; qasje në prodhim në Enterprise.
Fillimi i shpejtë
- Hyni → klikoni emrin tuaj → API → gjeneroni një çelës.
- Dërgoni një punë paketimi (kjo ekzekutohet në sandbox — falas në çdo plan):
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-..."
}Pyeteni status_url (me të njëjtin header autentikimi) derisa status të jetë "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/..."
}
}Pikat fundore
POST /api/v1/pack
Verifikon dhe radhitet një punë paketimi. Kthen 202 me një job_id. Mbështet header-in Idempotency-Key — përsëritjet me të njëjtin çelës kthejnë punën origjinale në vend që të paketojnë dy herë.
GET /api/v1/jobs/{id}
Statusi i punës dhe, kur përfundon, rezultati i plotë. Rezultatet ruhen për 30 ditë; planet në prodhim jetojnë përgjithmonë në hapësirën tuaj të punës.
GET /api/v1/openapi.json
Kontrata e lexueshme nga makina OpenAPI 3.1 — importojeni në Postman, gjeneratorë kodi, ose drejtoni mjetin tuaj të kodimit me AI te të. Kodet e automjeteve injektohen nga makina aktive, kështu që është gjithmonë e përditësuar. Shihni specifikimin ↗
Fusha të përgjigjes
Objekti result për një punë të përfunduar:
| Fusha | Lloji | Përshkrim |
|---|---|---|
| placed_count / unplaced_count | integer | Sa artikuj u futën / nuk u futën. |
| units | "metric" | "imperial" | Njësitë në të cilat shprehen të gjitha numrat më poshtë (pasqyrojnë kërkesën). |
| metrics.ldm_m | number | Metra ngarkimi — shtrirja e bllokut të ngarkesës (maks. fund − min. fillim). |
| metrics.linear_ft | number | E njëjta shtrirje në këmbë lineare (LTL SHBA). |
| metrics.span_mm | integer | Shtrirja në mm, gjithmonë metrike. |
| metrics.pallet_positions_eur | integer | null | Pozicione paletash EUR të faturuara. null kur plani është shumë i madh për t’u matur. |
| metrics.total_weight_kg | number | Pesha e ngarkuar, gjithmonë në kg. |
| metrics.overlaps | integer | Çiftet që përshkojnë njëra-tjetrën — gjithmonë 0 për një plan të vlefshëm. |
| items[].placed | boolean | Nëse artikulli u fut në plan. |
| items[].x / y / z | number | null | Pozicioni në njësitë e kërkesës: x nga fundi i derës, y nga muri i majtë, z nga dyshemeja. Të tre janë null kur placed është false. |
| items[].rotation_deg / tilt_deg | 0 | 90 | Orientimi: rrotullim rreth boshtit vertikal; tilt = i shtrirë anash. |
| items[].length / width / height / weight | number | Artikulli siç u dërgua, i pasqyruar në njësitë e kërkesës. |
| plan_url | string | null | Plani i krijuar në aplikacion. null për punët në sandbox. |
Versionim & stabilitet
Kontrata versionohet në rrugën (/api/v1/). Brenda v1, ndryshimet janë vetëm shtuese — fusha të reja opsionale në kërkesë, fusha të reja në përgjigje, kode të reja automjetesh dhe kode gabimi mund të shfaqen, dhe klientët duhet të injorojnë fushat që nuk i njohin. Fushat ekzistuese nuk ndryshojnë kurrë kuptim ose lloj, dhe asgjë nuk hiqet. Një ndryshim thyesor nënkupton një rrugë versioni të re, me v1 të mbajtur paralelisht për të paktën 12 muaj dhe njoftim për heqje me email për çdo hapësirë pune me një çelës aktiv.
Fusha të kërkesës
| Fusha | Lloji | Përshkrim |
|---|---|---|
| vehicle | string | Një kod automjeti nga tabelat më poshtë. Ose kaloni {customVehicleId} (një automjet nga flota juaj në hapësirën e punës). |
| objective | "ldm" | "pallets" | Minimizo metrat e ngarkimit, ose minimizo pozicionet e paletave të faturuara. Parazgjedhja "ldm". |
| units | "metric" | "imperial" | Si lexohen dhe kthehen dimensionet dhe peshat e artikujve: mm/kg (parazgjedhje) ose in/lb. Pozicionet në përgjigje ndjekin të njëjtat njësitë. |
| items | array, required | Manifesti i ngarkesës (fushat më poshtë). |
| sandbox | boolean | Mënyrë testimi: rezultat i plotë, asgjë nuk ruhet. Disponibël në çdo plan. |
| name | string | Emri i planit (mënyrë prodhim). |
| ldm_limit_m | number | Kufizo ngarkesën në N metra të parë ngarkimi (kamionë). |
| budget_ms | number | Buxheti kohor i optimizimit (prodhim; parazgjedhje 30000, maksimum 300000). |
| callback_url | https URL | POSTohet rezultati kur puna përfundon, i nënshkruar (shihni Webhooks). |
Fusha të artikujve
| Fusha | Lloji | Përshkrim |
|---|---|---|
| length / width / height | number, required | Dimensionet e artikullit, të lexuara në njësitë e kërkesës (mm si parazgjedhje, inç me "units": "imperial"). |
| weight | number, required | Pesha e artikullit (kg si parazgjedhje, lb me "units": "imperial"). |
| quantity | integer, default 1 | Zgjerohet në njësi individuale. |
| name | string, optional | Shfaqet në plan dhe në përgjigje. |
| stackable | boolean, default true | Mund të vendosen mallra të tjerë mbi këtë artikull. |
| max_stack | number, optional | Pesha maksimale që ky artikull mund të mbajë mbi vete (njësi të njëjta me peshën). |
| fragile | boolean, default false | Artikujt e brishtë vendosen vetëm në shtresat e sipërme. |
| tiltable | boolean, default true | Nëse artikulli mund të shtrihet anash. |
| destination_stop | integer, default 1 | Ndalesa e dorëzimit për ngarkim LIFO me shumë ndalesa. |
Kodet e automjeteve
Të gjeneruara nga specifikimet e makinës aktive. Automjetet personalizuar nga flota juaj në hapësirën e punës funksionojnë përmes custom_vehicle_id.
Kamionë & rimorkio
| Kod | Automjet | Brendësi (G×Gj×L) | Ngarkesë |
|---|---|---|---|
| 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 |
Kontejnerë
| Kod | Kontejner | Brendësi (G×Gj×L) | Ngarkesë |
|---|---|---|---|
| 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 |
Nivele qasjeje & kufizime
| Sandbox (çdo plan) | Prodhim (Enterprise) | |
|---|---|---|
| Thirrje | 25 të suksesshme / muaj | 5,000 paketim të suksesshëm / muaj |
| Artikuj për manifest | 20 | 5,000 |
| Puna njëkohësisht | 1 | 10 |
| Buxheti i optimizimit | 10 s | 30 s parazgjedhje, deri në 300 s |
| Ruajtje | Asgjë nuk ruhet | Çdo paketim krijon një plan real në hapësirën tuaj të punës |
Numërohen vetëm paketimet e suksesshme — validimet e dështuara dhe punët e dështuara nuk llogariten në kuotë. Të dyja numëruesit rivendosen më 1-tën (UTC). Rezultatet në sandbox janë të plota dhe pa kufizime — kufijtë janë porta, jo rezultati. Ju duhen më shumë se 5,000 paketime në muaj? Kontaktoni për çmime volumetrike dhe OEM.
Webhooks
Kaloni callback_url për të marrë rezultatin përmes POST kur puna përfundon. Çdo callback mbart X-Hansatic-Signature: një HMAC-SHA256 i trupit të papërpunuar me sekretin e webhook-ut të çelësit tuaj (shfaqet një herë gjatë krijimit të çelësit). Verifikojeni:
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));
}Dërgimi bëhet në një përpjekje me kohëzgjatje 5s — status_url mbetet gjithmonë burimi i së vërtetës.
Gabime
Të gjitha gabimet janë { "error": { "code", "message", ... } } — kod i lexueshëm nga makina, mesazh i lexueshëm nga njeriu, dhe field kur një hyrje specifike është fajtor.
| Kod | HTTP | Kuptim |
|---|---|---|
| invalid_key | 401 | Çelësi API mungon, është i gabuar ose i revokuar. |
| invalid_json | 400 | Trupi nuk është JSON i vlefshëm. |
| invalid_vehicle | 400 | Kodi i panjohur i automjetit / {customVehicleId}. |
| invalid_items | 400 | Një fushë artikulli mungon, nuk është numerike ose është jashtë intervalit. |
| suspicious_dimensions | 400 | Të gjitha dimensionet nën 100mm — ka të ngjarë që inçet të jenë dërguar si mm. Kaloni "units": "imperial". |
| invalid_units | 400 | units duhet të jetë "metric" ose "imperial". |
| invalid_objective | 400 | objective duhet të jetë "ldm" ose "pallets". |
| invalid_callback | 400 | callback_url duhet të jetë https. |
| too_many_items | 400 | Manifesti e kalon kufirin e artikujve për nivelin tuaj të qasjes. |
| upgrade_required | 402 | Mënyra prodhim kërkon planin Enterprise. Përdorni sandbox, ose përmirësoni. |
| sandbox_limit_reached | 402 | Kufiri mujor i sandbox është shfrytëzuar — rikthehet më 1-të. |
| quota_exceeded | 402 | Kuota mujore e prodhimit prej 5,000 paketimesh është shfrytëzuar — rivendoset më 1-tën. Për vëllime më të mëdha: kontaktoni. |
| too_many_jobs | 429 | Kufiri i punëve njëkohësisht është arritur. Pyeteni punët në ekzekutim dhe riprovoni. |
| not_found | 404 | Nuk ekziston një punë e tillë për këtë hapësirë pune. |
Pyetje, kufij më të lartë, ose një lidhës që ju nevojitet (Zapier, Excel, MCP)? hello@hansatic.com