პაკინგის 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-ია, თუ placed არის false. |
| 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 | გაგზავნილი იქნება პასუხი 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). სენდბოქსის შედეგები სრული და შეუზღუდავია — ლიმიტი წარმოადგენს შეზღუდვას, არა შედეგს. გჭირდებათ 5,000-ზე მეტი პაკეტი თვეში? დაგვიკავშირდით მოცულობითი და OEM ფასების შესახებ.
ვებჰუკები
გადაეცით callback_url, რომ მიიღოთ შედეგი POST-ით დავალების დასრულებისას. ყოველ ვებჰუკს თან ახლავს 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 | უცნობი ტრანსპორტის კოდი / {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 | თვიური სენდბოქსის ლიმიტი ამოწურულია — განახლდება თვის დასაწყისში. |
| quota_exceeded | 402 | თვიური წარმოების კვოტა (5,000 პაკეტი) ამოწურულია — იბრუნებს საწყის მდგომარეობას 1-ელ რიცხვს. მეტი მოცულობისთვის: დაგვიკავშირდით. |
| too_many_jobs | 429 | პარალელური დავალებების ლიმიტი გადაჭარბებულია. შეამოწმეთ მიმდინარე დავალებები და სცადეთ ხელახლა. |
| not_found | 404 | ასეთი დავალება არ არსებობს ამ სამუშაო სივრცეში. |
კითხვები, მაღალი ლიმიტები ან კონექტორი, რომელიც გჭირდებათ (Zapier, Excel, MCP)? hello@hansatic.com