Жүктеу 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 еденнен жоғары. Барлығы да placed false болғанда 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 | Төмендегі кестелерден көлік коды. Немесе custom_vehicle_id (сіздің жұмыс аймағыңыздағы көліктен) беріңіз. |
| 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 | Тапсырма аяқталғанда нәтижені POST арқылы жіберу, қол қойылған (қараңыз: Вебхуктар). |
Зат өрістері
| Өріс | Типі | Сипаттама |
|---|---|---|
| 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 с |
| Сақтау | Ештеңе сақталмайды | Әрбір жүктеу нақты жоспарды сіздің жұмыс аймағыңызда жасайды |
Тек сәтті пакеттеулер ғана есептеледі — жарамсыз деректерді тексеру және орындалмаған тапсырмалар квотаға есептелмейді. Екі есептегіш те айдың 1-і күні (UTC) нөлден басталады. Sandbox нәтижелері толық және шектеусіз — лимит тек шектеу ретінде қолданылады, нәтижелерге әсер етпейді. Айына 5,000 пакеттен артық қажет пе? Көлемді және OEM бағалары туралы бізбен байланысыңыз.
Вебхуктар
Тапсырма аяқталғанда нәтижені POST арқылы алу үшін callback_url беріңіз. Әрбір хабарламада X-Hansatic-Signature болады: сіздің кілттің вебхук құпия сөзімен (кілт жасалған кезде бір рет көрсетіледі) 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 | Белгісіз көлік коды / custom_vehicle_id. |
| 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