Yerləşdirmə API

Yük təqdim edin, fiziki cəhətdən düzgün optimallaşdırılmış yük planı — yerləşdirmə, yük metrləri, xətti fut və hesablaşdırılan palet mövqeləri ilə geri alın. Tətbiqin arxasında duran eyni mühərrik, real dispetçer planları ilə davamlı doğrulanır. Hər plan üçün sınaq girişi; Enterprise planında isə istehsalat girişi mövcuddur.

Sürətli başlanğıc

  1. Daxil olun → adınıza klikləyin → API → açar yaradın.
  2. Yerləşdirmə tapşırığını göndərin (bu sınaq mühitində işləyir — hər plan üçün pulsuzdur):
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 ünvanını sorğulayın (eyni autentifikasiya başlığı ilə) status "done" olana qədər:

{
  "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/..."
  }
}

Son nöqtələr

POST /api/v1/pack

Yerləşdirmə tapşırığını yoxlayır və növbəyə alır. 202job_id qaytarır. Idempotency-Key başlığı dəstəkləyir — eyni açarla təkrar sorğular orijinal tapşırığı qaytarır, ikiqat yerləşdirmə etmədən.

GET /api/v1/jobs/{id}

Tapşırığın statusu və, bitdikdə, tam nəticə. Nəticələr 30 gün saxlanılır; istehsalat planları iş sahənizdə daimi qalır.

GET /api/v1/openapi.json

Maşın oxunaqlı OpenAPI 3.1 kontraktı — onu Postman, kod generatorlarına idxal edin və ya AI kodlaşdırma alətinizi ona yönəldin. Nəqliyyat vasitəsi kodları canlı mühərrikdən götürülür, ona görə də həmişə aktualdır. Spesifikasiyanı açın ↗

Cavab sahələri

Bitmiş tapşırıqda result obyekti:

SahəTipTəsvir
placed_count / unplaced_countintegerNeçə əşya yerləşdirildi / yerləşdirilmədi.
units"metric" | "imperial"Aşağıdakı bütün rəqəmlərin ifadə olunduğu vahidlər (sorğunun təkrarı).
metrics.ldm_mnumberYük metrləri — yük blokunun uzunluğu (maksimal son − minimal başlanğıc).
metrics.linear_ftnumberEyni uzunluq xətti futlarla (ABŞ LTL).
metrics.span_mmintegerUzunluq millimetrlə, həmişə metrik.
metrics.pallet_positions_eurinteger | nullHesablanan EUR palet mövqeləri. Plan ölçüləri ölçmək üçün çox böyük olduqda null.
metrics.total_weight_kgnumberYerləşdirilmiş çəkisi, həmişə kq.
metrics.overlapsintegerBir-birinə nüfuz edən cütlər — düzgün planda həmişə 0.
items[].placedbooleanƏşya planın içərisinə yerləşdirilibmi.
items[].x / y / znumber | nullSorğunun vahidlərində mövqe: x qapı tərəfdən, y sol divardan, z döşəmədən. Yerləşdirilməyibsə, hər üçü null.
items[].rotation_deg / tilt_deg0 | 90İstiqamət: şaquli ox ətrafında fırlanma; tilt = yan üstə qoyulub.
items[].length / width / height / weightnumberƏşyanın təqdim olunduğu ölçülər, sorğunun vahidlərində təkrar olunur.
plan_urlstring | nullTətbiqdə yaradılmış plan. Sınaq tapşırıqları üçün null.

Versiyalaşdırma və sabitlik

Kontrakt yolun içində versiyalaşdırılır (/api/v1/). v1 daxilində dəyişikliklər yalnız əlavə xarakter daşıyır — yeni seçimli sorğu sahələri, yeni cavab sahələri, yeni nəqliyyat vasitəsi kodları və səhv kodları əlavə edilə bilər, müştərilər tanımadıqları sahələri görməzlikdən gələ bilərlər. Mövcud sahələrin mənası və tipi heç vaxt dəyişmir, heç nə silinmir. Radikal dəyişiklik yeni versiya yolu deməkdir, v1 ən azı 12 ay paralel saxlanılır və aktiv açarı olan hər iş sahəsinə elektron poçtla ləğvetmə bildirişi göndərilir.

Sorğu sahələri

SahəTipTəsvir
vehiclestringAşağıdakı cədvəllərdən nəqliyyat vasitəsi kodu. Və ya {customVehicleId} ötürün (iş sahənizin nəqliyyat parkından nəqliyyat vasitəsi).
objective"ldm" | "pallets"Yük metrlərinin və ya hesablaşdırılan palet mövqelərinin minimallaşdırılması. Standart "ldm".
units"metric" | "imperial"Əşya ölçüləri və çəkilərinin necə oxunması və qaytarılması: mm/kq (standart) və ya düym/funt. Cavabda mövqelər eyni vahidlərdə olur.
itemsarray, requiredYük manifesti (aşağıdakı sahələr).
sandboxbooleanTest rejimi: tam nəticə, heç nə saxlanılmır. Hər plan üçün mövcuddur.
namestringPlan adı (istehsalat rejimində).
ldm_limit_mnumberYükü ilk N yük metrində məhdudlaşdırın (yük maşınları üçün).
budget_msnumberOptimallaşdırma vaxt limiti (istehsalat; standart 30000, maksimum 300000).
callback_urlhttps URLTapşırıq bitdikdə nəticə {callbackUrl} ünvanına POST edilir, imzalanır (Vebxuklara baxın).

Əşya sahələri

SahəTipTəsvir
length / width / heightnumber, requiredƏşya ölçüləri, sorğunun vahidlərində oxunur (standart mm, "units": "imperial" olduqda düym).
weightnumber, requiredƏşya çəkisi (standart kq, "units": "imperial" olduqda funt).
quantityinteger, default 1Fərdi vahidlərə ayrılır.
namestring, optionalPlanda və cavabda göstərilir.
stackableboolean, default trueBu əşyanın üstünə başqa yük qoyula bilər.
max_stacknumber, optionalBu əşyanın üstünə qoyula bilən maksimum çəkisi (çəki ilə eyni vahidlərdə).
fragileboolean, default falseKırılğan əşyalar yalnız üst təbəqələrə yerləşdirilir.
tiltableboolean, default trueƏşya yan üstə qoyula bilər.
destination_stopinteger, default 1Çox dayanacaqlı LIFO yükləməsi üçün çatdırılma dayanacağı.

Nəqliyyat vasitəsi kodları

Canlı mühərrik spesifikasiyalarından yaradılıb. İş sahənizin nəqliyyat parkından fərdi nəqliyyat vasitələri custom_vehicle_id ilə işləyir.

Yük maşınları və tirkərlər

KodNəqliyyat vasitəsiDaxili ölçülər (U×E×H)Yük qabiliyyəti
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

Konteynerlər

KodKonteynerDaxili ölçülər (U×E×H)Yük qabiliyyəti
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

Giriş səviyyələri və limitlər

Sınaq (hər plan)İstehsalat (Enterprise)
SorğularAyda 25 uğurlu5,000 uğurlu paket / ay
Manifestdə əşyaların sayı205,000
Eyni vaxtda işləyən tapşırıqlar110
Optimallaşdırma limiti10 saniyəStandart 30 saniyə, maksimum 300 saniyə
SaxlamaHeç nə saxlanılmırHər yerləşdirmə iş sahənizdə real plan yaradır

Yalnız uğurlu paketlər hesaba alınır — yoxlanışda və ya işdə uğursuzluqlar kvotaya təsir etmir. Hər iki sayğac ayın 1-də (UTC) sıfırlanır. Sandbox nəticələri tam və məhdudiyyətsizdir — məhdudiyyətlər giriş qapısıdır, çıxış deyil. Aydan 5,000-dən çox paketə ehtiyacınız varsa, həcm və OEM qiymətləri haqqında bizimlə əlaqə saxlayın.

Vebxuklar

Tapşırıq bitdikdə nəticəni POST ilə almaq üçün callback_url ötürün. Hər vebxuk X-Hansatic-Signature daşıyır: xam gövdənin HMAC-SHA256 imzası açarınızın vebxuk sirri ilə (açar yaradılarkən bir dəfə göstərilir). Onu yoxlayın:

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));
}

Çatdırılma bir cəhdlə 5 saniyə vaxt limitində həyata keçirilir — status_url həmişə həqiqət mənbəyidir.

Səhvlər

Bütün səhvlər { "error": { "code", "message", ... } } formasında olur — maşın oxunaqlı kod, insan oxunaqlı mesaj və səhvli giriş sahəsi göstərildikdə field.

KodHTTPMəna
invalid_key401Yoxdur, düzgün deyil və ya ləğv edilmiş API açarı.
invalid_json400Gövdə düzgün JSON deyil.
invalid_vehicle400Naməlum nəqliyyat vasitəsi kodu / {customVehicleId}.
invalid_items400Əşya sahəsi yoxdur, ədədi deyil və ya diapazondan kənardır.
suspicious_dimensions400Bütün ölçülər 100 mm-dən azdır — ehtimal ki, düymlər mm kimi göndərilib. "units": "imperial" ötürün.
invalid_units400units "metric" və ya "imperial" olmalıdır.
invalid_objective400objective "ldm" və ya "pallets" olmalıdır.
invalid_callback400callback_url https olmalıdır.
too_many_items400Manifest giriş səviyyənizin əşya limitini aşır.
upgrade_required402İstehsalat rejimi Enterprise planını tələb edir. Sınaqdan istifadə edin və ya planı yüksəldin.
sandbox_limit_reached402Aylıq sınaq limiti istifadə olunub — ayın 1-də sıfırlanır.
quota_exceeded402Aylıq 5,000 paketlik istehsal kvotası istifadə olundu — ayın 1-də sıfırlanır. Daha yüksək həcm üçün bizimlə əlaqə saxlayın.
too_many_jobs429Eyni vaxtda işləyən tapşırıq limiti dolub. İşləyən tapşırıqları sorğulayın və təkrar cəhd edin.
not_found404Bu iş sahəsi üçün belə tapşırıq yoxdur.

Sualınız, daha yüksək limitlər və ya ehtiyac duyduğunuz birləşdirici (Zapier, Excel, MCP) var? hello@hansatic.com