Ачааны API
Ачаагаа илгээж, оновчтой, бодит баталгаатай ачааны төлөвлөгөөг буцааж авна — байршил, ачааны метр, шугаман фут, тооцоологдсон паллетийн байрлал. Энэ нь аппликейшны ар талд ажилладаг ижил хөдөлгүүр бөгөөд бодит ачаа тээвэрлэгчдийн байрлалаар баталгааждаг. Туршилтын горим бүх төлөвлөгөөнд байгаа бөгөөд үйлдвэрлэлийн горим Enterprise төлөвлөгөөнд байдаг.
Хурдан эхлэлт
- Нэвтрэх → нэр дээрээ дарна уу → API → түлхүүр үүсгэнэ үү.
- Ачаа төлөвлөлтийн ажлыг илгээх (энэ нь туршилтын горимд ажиллана — бүх төлөвлөгөөнд үнэгүй):
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-..."
}status_url-г шалгах (status "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/..."
}
}Эндпойнтууд
POST /api/v1/pack
Ачаа төлөвлөлтийн ажлыг баталгаажуулж, дараалалд оруулна. 202 кодтой job_id-г буцаана. Idempotency-Key толгой ашиглах боломжтой — ижил түлхүүртэй давтан дуудлага нь анхны ажлыг буцаана, хоёр дахь удаа ачаа төлөвлөхгүй.
GET /api/v1/jobs/{id}
Ажлын төлөв, дууссан үед бүрэн үр дүнг агуулна. Үр дүн 30 хоног хадгалагдана; үйлдвэрлэлийн төлөвлөгөөний үр дүн танд байнгын байршуулна.
GET /api/v1/openapi.json
Машины уншиж болох OpenAPI 3.1 гэрээ — Postman, код үүсгэгч эсвэл AI кодчиллын хэрэгсэлд импортлох боломжтой. Тээврийн хэрэгслийн код нь амьд хөдөлгүүрээс авсан тул үргэлж шинэчлэгдсэн байна. Тодорхойлолтыг нээх ↗
Хариуны талбарууд
Дууссан ажлын result объект:
| Талбар | Төрөл | Тайлбар |
|---|---|---|
| placed_count / unplaced_count | integer | Орсон / ороогүй барааны тоо. |
| units | "metric" | "imperial" | Доорх бүх тооны нэгж (хүсэлтээр илгээсэн нэгж). |
| metrics.ldm_m | number | Ачааны метр — ачааны блокийн урт (хамгийн их төгсгөл − хамгийн бага эхлэл). |
| metrics.linear_ft | number | Ижил урт шугаман футээр (АНУ-ын LTL). |
| metrics.span_mm | integer | Урт мм-ээр, үргэлж метрийн нэгж. |
| metrics.pallet_positions_eur | integer | null | Тооцоологдсон EUR паллетийн байрлал. Хэт том байрлал үед null байна. |
| metrics.total_weight_kg | number | Орсон жин, үргэлж кг. |
| metrics.overlaps | integer | Давамгайлсан хослол — зөв байрлал үед үргэлж 0. |
| items[].placed | boolean | Бараа байрлалд орсон эсэх. |
| items[].x / y / z | number | null | Хүсэлтийн нэгжээр байрлал: x — хаалгаас эхлэн, y — зүүн ханаас, z — шалнаас. Орсонгүй үед гурвуулаа null байна. |
| items[].rotation_deg / tilt_deg | 0 | 90 | Чиглэл: босоо тэнхлэгээр эргүүлэлт; tilt — хажуу тийш хэвтээсэн. |
| items[].length / width / height / weight | number | Илгээсэн барааны хэмжээ, хүсэлтийн нэгжээр давтагдсан. |
| plan_url | string | null | Апп дээр үүсгэсэн төлөвлөгөө. Туршилтын ажлын үед null байна. |
Верс ба тогтвортой байдал
Гэрээг зам дахь (/api/v1/) хувилбараар ялгадаг. v1 дотор өөрчлөлт нь нэмэлт байдалтай байна — шинэ сонгож болох хүсэлтийн талбар, шинэ хариуны талбар, шинэ тээврийн хэрэгслийн код, алдааны код гарч болох бөгөөд клиентүүд танихгүй талбарыг үл тоомсорлох ёстой. Оршин буй талбарууд утга, төрөлөө өөрчлөхгүй бөгөөд юу ч хасагдахгүй. Үндсэн өөрчлөлт нь шинэ хувилбарын замтай байх бөгөөд v1-ийг дор хаяж 12 сарын хугацаанд зэрэгцэн ажиллуулж, идэвхтэй түлхүүр бүхий бүх байршуулганд имэйлээр мэдэгдэл илгээдэг.
Хүсэлтийн талбарууд
| Талбар | Төрөл | Тайлбар |
|---|---|---|
| vehicle | string | Доорх хүснэгтээс тээврийн хэрэгслийн код. Эсвэл {customVehicleId} (таны байршуулгын тээврийн хэрэгсэл) илгээнэ үү. |
| objective | "ldm" | "pallets" | Ачааны метрийг багасгах эсвэл тооцоологдсон паллетийн байрлалыг багасгах. Анхдагч утга нь "ldm". |
| units | "metric" | "imperial" | Барааны хэмжээ, жинг хүсэлт болон хариултад хэрхэн унших вэ: мм/кг (анхдагч) эсвэл инч/фунт. Хариултын байрлал нь ижил нэгжээр илэрхийлэгдэнэ. |
| items | array, required | Ачааны жагсаалт (доорх талбарууд). |
| sandbox | boolean | Туршилтын горим: бүрэн үр дүн, юу ч хадгалагдахгүй. Бүх төлөвлөгөөнд байдаг. |
| name | string | Төлөвлөгөөний нэр (үйлдвэрлэлийн горим). |
| ldm_limit_m | number | Ачааг эхний N ачааны метр хүртэл хязгаарлах (ачааны машин). |
| budget_ms | number | Оновчлолтын хугацааны хязгаар (үйлдвэрлэлийн горим; анхдагч утга 30000, дээд хязгаар 300000). |
| callback_url | https URL | Ажил дууссаны дараа үр дүнг {callbackUrl}-руу POST илгээх, гарын үсэгтэй (Webhook үзнэ үү). |
Барааны талбарууд
| Талбар | Төрөл | Тайлбар |
|---|---|---|
| length / width / height | number, required | Барааны хэмжээ, хүсэлтийн нэгжээр уншина (анхдагч мм, "units": "imperial" үед инч). |
| weight | number, required | Барааны жин (анхдагч кг, "units": "imperial" үед фунт). |
| quantity | integer, default 1 | Тус тусад нь нэгжүүдэд задлах. |
| name | string, optional | Төлөвлөгөө, хариултад харуулагдана. |
| stackable | boolean, default true | Энэ барааны дээр бусад ачаа байрлах боломжтой. |
| max_stack | number, optional | Энэ барааны дээр байрлах хамгийн их жин (жинтэй ижил нэгж). |
| fragile | boolean, default false | Хэврэг барааг зөвхөн дээд давхарт байрлуулна. |
| tiltable | boolean, default true | Барааг хажуу тийш хэвтээж болох эсэх. |
| destination_stop | integer, default 1 | Олон зогсоолын LIFO ачааллын зогсоол. |
Тээврийн хэрэгслийн код
Амьд хөдөлгүүрийн тодорхойлолтоос үүсгэсэн. Таны байршуулгын тээврийн хэрэгслийг custom_vehicle_id-ээр ашиглана.
Ачааны машин, чиргүүл
| Код | Тээврийн хэрэгсэл | Дотор тал (У×Ө×Өндөр) | Ачааны чадвар |
|---|---|---|---|
| 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 |
Контейнерүүд
| Код | Контейнер | Дотор тал (У×Ө×Өндөр) | Ачааны чадвар |
|---|---|---|---|
| 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 |
Хандалтын түвшин ба хязгаарлалт
| Туршилтын горим (бүх төлөвлөгөө) | Үйлдвэрлэлийн горим (Enterprise) | |
|---|---|---|
| Дуудлага | Сар бүр 25 амжилттай | Сар бүр 5,000 амжилттай багц |
| Жагсаалт дахь барааны тоо | 20 | 5,000 |
| Зэрэг ажиллах ажлын тоо | 1 | 10 |
| Оновчлолтын хугацааны хязгаар | 10 с | Анхдагч 30 с, дээд хязгаар 300 с |
| Хадгалалт | Юу ч хадгалагдахгүй | Ачаа төлөвлөх үед танд бодит төлөвлөгөө үүснэ |
Зөвхөн амжилттай багц тоологдоно — баталгаажуулалт болон ажлын алдаа нь хязгаарыг тооцохгүй. Хоёр тоолуур нь UTC-ээр сарын 1-нд шинэчлэгдэнэ. Тест орчинд үр дүн бүрэн, хязгаарлалтгүй байх бөгөөд хязгаар нь зөвхөн хэрэглээний түвшин, гаралтын чанарт нөлөөлөхгүй. Сар бүр 5,000-гаас илүү багц хэрэгтэй юу? Том хэмжээ болон OEM үнийн санал авахын тулд бидэнтэй холбогдоно уу.
Webhook-ууд
Ажил дууссаны дараа үр дүнг POST-оор хүлээн авахын тулд callback_url илгээнэ үү. Бүх callback-д X-Hansatic-Signature байна: таны түлхүүрийн webhook нууц үгийн (түлхүүр үүсгэх үед ганц удаа харуулсан) HMAC-SHA256-ээр гарын үсэгжүүлсэн түүхий биеийн утга. Үүнийг баталгаажуулна уу:
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));
}Илгээлт нь 5с хугацаатай нэг удаагийн оролдлого байна — status_url үргэлж үнэн эх сурвалж хэвээр байна.
Алдаанууд
Бүх алдаа { "error": { "code", "message", ... } } хэлбэртэй байна — машин уншиж болох код, хүний хэлээр бичигдсэн мессеж, алдаатай оролтын талбарыг заасан field.
| Код | HTTP | Утга |
|---|---|---|
| invalid_key | 401 | API түлхүүр байхгүй, буруу хэлбэртэй эсвэл хүчингүй болсон. |
| invalid_json | 400 | Бие нь хүчинтэй JSON биш байна. |
| invalid_vehicle | 400 | Танихгүй тээврийн хэрэгслийн код / {customVehicleId}. |
| invalid_items | 400 | Барааны талбар байхгүй, тоон бус эсвэл хүрээний гадна байна. |
| suspicious_dimensions | 400 | Бүх хэмжээ 100мм-ээс бага байна — магадгүй инчийг мм гэж илгээсэн байна. "units": "imperial" илгээнэ үү. |
| invalid_units | 400 | units нь "metric" эсвэл "imperial" байх ёстой. |
| invalid_objective | 400 | objective нь "ldm" эсвэл "pallets" байх ёстой. |
| invalid_callback | 400 | callback_url нь https байх ёстой. |
| too_many_items | 400 | Жагсаалт тань хандалтын түвшний барааны тооны хязгаарыг хэтрүүллээ. |
| upgrade_required | 402 | Үйлдвэрлэлийн горимд Enterprise төлөвлөгөө шаардлагатай. Туршилтын горим эсвэл төлөвлөгөөнд дэвших шаардлагатай. |
| sandbox_limit_reached | 402 | Сарын туршилтын хязгаар дууссан — дараагийн сарын 1-нд шинэчлэгдэнэ. |
| quota_exceeded | 402 | Сарын 5,000 багцын хязгаар дууссан — сарын 1-нд шинэчлэгдэнэ. Илүү их хэмжээний хэрэглээний тухай бидэнтэй холбогдоно уу. |
| too_many_jobs | 429 | Зэрэг ажиллах ажлын хязгаар хүрсэн. Ажиллаж буй ажлуудыг шалгаад дахин оролдоно уу. |
| not_found | 404 | Энэ байршуулганд ийм ажил байхгүй. |
Асуулт, илүү өндөр хязгаар эсвэл танд хэрэгтэй холболт (Zapier, Excel, MCP) байна уу? hello@hansatic.com