პაკინგის API

გააგზავნეთ ტვირთი და მიიღეთ ოპტიმიზირებული, ფიზიკურად ვალიდური ტვირთის გეგმა — განლაგებები, ჩატვირთვის მეტრები, წრფივი ფუტები და გადასახადი პალეტების პოზიციები. იგივე ძრავა, რომელიც გამოიყენება აპლიკაციაში და განუწყვეტლივ შემოწმებულია რეალური დისპეჩერის განლაგებებით. სენდბოქსზე წვდომა ხელმისაწვდომია ყველა ტარიფზე; პროდაქშენზე წვდომა — Enterprise ტარიფზე.

სწრაფი დაწყება

  1. შესვლა → დააჭირეთ თქვენს სახელზე → API → გენერირება გასაღების.
  2. გაგზავნეთ პაკინგის დავალება (ეს სენდბოქსში სრულდება — უფასოა ყველა ტარიფზე):
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_countintegerრამდენი ერთეული დაეტია / არ დაეტია.
units"metric" | "imperial"ერთეულები, რომლებითაც გამოხატულია ყველა ქვემოთ მოცემული რიცხვი (მიმოწერიდან).
metrics.ldm_mnumberჩატვირთვის მეტრები — ტვირთის ბლოკის სიგრძე (მაქსიმალური დასასრული − მინიმალური დასაწყისი).
metrics.linear_ftnumberიგივე სიგრძე წრფივ ფუტებში (აშშ-ის LTL).
metrics.span_mmintegerსიგრძე მმ-ში, ყოველთვის მეტრული.
metrics.pallet_positions_eurinteger | nullგადასახადი EUR პალეტების პოზიციები. null, თუ განლაგება ზედმეტად დიდია გაზომვისთვის.
metrics.total_weight_kgnumberდატვირთული წონა, ყოველთვის კგ-ში.
metrics.overlapsintegerგადაჯვარედინებული წყვილები — ყოველთვის 0 ვალიდური განლაგებისთვის.
items[].placedbooleanდაეტია თუ არა ერთეული განლაგებაში.
items[].x / y / znumber | nullპოზიცია მოთხოვნის ერთეულებში: x კარის მხრიდან, y მარცხენა კედლიდან, z იატაკიდან. სამივე null-ია, თუ placed არის false.
items[].rotation_deg / tilt_deg0 | 90ორიენტაცია: ბრუნვა ვერტიკალურ ღერძზე; tilt = გვერდზე დაწოლილი.
items[].length / width / height / weightnumberერთეული, როგორც გაიგზავნა, მოთხოვნის ერთეულებში.
plan_urlstring | nullშექმნილი გეგმა აპლიკაციაში. null სენდბოქსის დავალებებისთვის.

ვერსიები და სტაბილურობა

კონტრაქტი ვერსიით არის მონიშნული მისამართში (/api/v1/). v1-ის ფარგლებში ცვლილებები მხოლოდ დამატებითია — ახალი არასავალდებულო მოთხოვნის ველდები, ახალი პასუხის ველდები, ახალი ტრანსპორტის კოდები და შეცდომების კოდები შეიძლება გამოჩნდეს, ხოლო კლიენტებმა უნდა იგნორირონ ველდები, რომლებსაც არ იცნობენ. არსებული ველდები არასდროს იცვლიან მნიშვნელობას ან ტიპს, და არაფერი არ იშლება. დამანგრეველი ცვლილება ნიშნავს ახალი ვერსიის მისამართს, ხოლო v1-ის მხარდაჭერა გაგრძელდება პარალელურად მინიმუმ 12 თვის განმავლობაში და გაუქმების შეტყობინება გაიგზავნება ელ. ფოსტით ყველა სამუშაო სივრცეში აქტიური გასაღებით.

მოთხოვნის ველდები

ველდიტიპიაღწერა
vehiclestringტრანსპორტის კოდი ქვემოთ მოცემული ცხრილებიდან. ან გადაეცით {customVehicleId} (ტრანსპორტი თქვენი სამუშაო სივრცის ფლოტიდან).
objective"ldm" | "pallets"მინიმიზაცია ჩატვირთვის მეტრების ან გადასახადი პალეტების პოზიციების. ნაგულისხმევი "ldm".
units"metric" | "imperial"რომელი ერთეულებით იკითხება და ბრუნდება ერთეულების ზომები და წონა: მმ/კგ (ნაგულისხმევი) ან დუიმი/ფუნტი. პასუხში პოზიციები იგივე ერთეულებითაა.
itemsarray, requiredტვირთის მანიფესტი (ქვემოთ მოცემული ველდებით).
sandboxbooleanტესტირების რეჟიმი: სრული შედეგი, არაფერი ინახება. ხელმისაწვდომია ყველა ტარიფზე.
namestringგეგმის სახელი (პროდაქშენ რეჟიმში).
ldm_limit_mnumberტვირთის შეზღუდვა პირველ N ჩატვირთვის მეტრამდე (სატვირთო მანქანები).
budget_msnumberოპტიმიზაციის დროის ბიუჯეტი (პროდაქშენში; ნაგულისხმევი 30000, მაქსიმუმი 300000).
callback_urlhttps URLგაგზავნილი იქნება პასუხი POST-ით დავალების დასრულებისას, ხელმოწერით (იხ. ვებჰუკები).

ერთეულის ველდები

ველდიტიპიაღწერა
length / width / heightnumber, requiredერთეულის ზომები, იკითხება მოთხოვნის ერთეულებით (ნაგულისხმევად მმ, დუიმებით, თუ "units": "imperial").
weightnumber, requiredერთეულის წონა (ნაგულისხმევად კგ, ფუნტებით, თუ "units": "imperial").
quantityinteger, default 1გადადის ცალკეულ ერთეულებად.
namestring, optionalნაჩვენებია გეგმასა და პასუხში.
stackableboolean, default trueშეიძლება სხვა ტვირთი დაიდოს ამ ერთეულზე.
max_stacknumber, optionalმაქსიმალური წონა, რომელსაც ეს ერთეული ატარებს ზემოდან (იგივე ერთეულებით, რაც წონა).
fragileboolean, default falseმყიფე ერთეულები განთავსდება მხოლოდ ზედა ფენებზე.
tiltableboolean, default trueშეიძლება ერთეული გვერდზე დააწვინოს.
destination_stopinteger, default 1მიწოდების გაჩერება მრავალგაჩერებიანი LIFO ჩატვირთვისთვის.

ტრანსპორტის კოდები

გენერირებულია აქტიური ძრავის სპეციფიკაციებიდან. თქვენი სამუშაო სივრცის ფლოტის საკუთარი ტრანსპორტი მუშაობს custom_vehicle_id-ის საშუალებით.

სატვირთო მანქანები და ტრეილერები

კოდიტრანსპორტიშიდა ზომები (ს×ს×ს)ტვირთამწეობა
CURTAINSIDER_13613.6m Curtainsider13.62 × 2.48 × 2.70 m24 t
BOX_13613.6m Box Trailer13.62 × 2.46 × 2.68 m24 t
MEGA_13613.6m Mega Trailer13.62 × 2.48 × 3.00 m22.5 t
MEGA_CURTAIN_13613.6m Mega Curtainsider13.62 × 2.48 × 3.00 m22 t
FLATBED_13613.6m Flatbed13.62 × 2.48 × 3.00 m25 t
REEFER_13613.6m Reefer13.32 × 2.44 × 2.54 m22 t
CURTAINSIDER_757.5m City Curtainsider7.50 × 2.48 × 2.70 m12 t
SWAPBODY_7157.15m Swap Body7.15 × 2.48 × 2.70 m12 t
SWAPBODY_7457.45m Swap Body7.45 × 2.48 × 2.70 m12 t
DRY_VAN_5353ft Dry Van16.15 × 2.59 × 2.74 m20 t
FLATBED_5353ft Flatbed16.15 × 2.59 × 3.66 m22 t
REEFER_5353ft Reefer15.85 × 2.46 × 2.59 m18.5 t
CURTAINSIDER_125_CN12.5m Curtainsider (CN)12.50 × 2.50 × 2.80 m27 t
FLATBED_40_IN40ft Flatbed (IN)12.19 × 2.50 × 3.50 m26 t
BOX_138_BR13.8m Box Van (BR)13.80 × 2.50 × 2.90 m28 t
CURTAINSIDER_12_ZA12m Curtainsider (ZA)12.00 × 2.48 × 2.70 m28 t

კონტეინერები

კოდიკონტეინერიშიდა ზომები (ს×ს×ს)ტვირთამწეობა
20DC20' Dry Container5.89 × 2.35 × 2.39 m21.727 t
20HC20' High Cube5.89 × 2.35 × 2.70 m21.58 t
40DC40' Dry Container12.03 × 2.35 × 2.39 m26.63 t
40HC40' High Cube12.03 × 2.35 × 2.70 m26.58 t
45HC45' High Cube13.56 × 2.35 × 2.70 m25.68 t
20OT20' Open Top5.89 × 2.35 × 2.39 m21.64 t
40OT40' Open Top12.03 × 2.35 × 2.39 m26.58 t
20RF20' Reefer5.44 × 2.29 × 2.27 m21 t
40RF40' Reefer11.58 × 2.29 × 2.21 m25.6 t
40RFHC40' Reefer High Cube11.58 × 2.29 × 2.54 m25.88 t
53DC53' Domestic16.15 × 2.59 × 2.90 m26 t

წვდომის დონეები და ლიმიტები

სენდბოქსი (ყველა ტარიფზე)პროდაქშენი (Enterprise)
მოწოდებები25 წარმატებული / თვე5,000 წარმატებული პაკეტი / თვე
ერთეულები მანიფესტში205,000
პარალელური დავალებები110
ოპტიმიზაციის ბიუჯეტი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_key401გამოტოვებული, არასწორი ფორმატის ან გაუქმებული API გასაღები.
invalid_json400სხეული არ არის ვალიდური JSON.
invalid_vehicle400უცნობი ტრანსპორტის კოდი / {customVehicleId}.
invalid_items400ერთეულის ველი გამოტოვებულია, არასწორია ან არ არის დიაპაზონში.
suspicious_dimensions400ყველა ზომა 100 მმ-ზე ნაკლებია — სავარაუდოდ, დუიმები გაიგზავნა მმ-ებად. გადაეცით "units": "imperial".
invalid_units400units უნდა იყოს "metric" ან "imperial".
invalid_objective400objective უნდა იყოს "ldm" ან "pallets".
invalid_callback400callback_url უნდა იყოს https.
too_many_items400მანიფესტი აღემატება ერთეულების ლიმიტს თქვენი წვდომის დონისთვის.
upgrade_required402პროდაქშენ რეჟიმი მოითხოვს Enterprise ტარიფს. გამოიყენეთ სენდბოქსი ან განაახლეთ ტარიფი.
sandbox_limit_reached402თვიური სენდბოქსის ლიმიტი ამოწურულია — განახლდება თვის დასაწყისში.
quota_exceeded402თვიური წარმოების კვოტა (5,000 პაკეტი) ამოწურულია — იბრუნებს საწყის მდგომარეობას 1-ელ რიცხვს. მეტი მოცულობისთვის: დაგვიკავშირდით.
too_many_jobs429პარალელური დავალებების ლიმიტი გადაჭარბებულია. შეამოწმეთ მიმდინარე დავალებები და სცადეთ ხელახლა.
not_found404ასეთი დავალება არ არსებობს ამ სამუშაო სივრცეში.

კითხვები, მაღალი ლიმიტები ან კონექტორი, რომელიც გჭირდებათ (Zapier, Excel, MCP)? hello@hansatic.com