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
- Daxil olun → adınıza klikləyin → API → açar yaradın.
- 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. 202 və job_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ə | Tip | Təsvir |
|---|---|---|
| placed_count / unplaced_count | integer | Neçə əş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_m | number | Yük metrləri — yük blokunun uzunluğu (maksimal son − minimal başlanğıc). |
| metrics.linear_ft | number | Eyni uzunluq xətti futlarla (ABŞ LTL). |
| metrics.span_mm | integer | Uzunluq millimetrlə, həmişə metrik. |
| metrics.pallet_positions_eur | integer | null | Hesablanan EUR palet mövqeləri. Plan ölçüləri ölçmək üçün çox böyük olduqda null. |
| metrics.total_weight_kg | number | Yerləşdirilmiş çəkisi, həmişə kq. |
| metrics.overlaps | integer | Bir-birinə nüfuz edən cütlər — düzgün planda həmişə 0. |
| items[].placed | boolean | Əşya planın içərisinə yerləşdirilibmi. |
| items[].x / y / z | number | null | Sorğ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_deg | 0 | 90 | İstiqamət: şaquli ox ətrafında fırlanma; tilt = yan üstə qoyulub. |
| items[].length / width / height / weight | number | Əşyanın təqdim olunduğu ölçülər, sorğunun vahidlərində təkrar olunur. |
| plan_url | string | null | Tə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ə | Tip | Təsvir |
|---|---|---|
| vehicle | string | Aş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. |
| items | array, required | Yük manifesti (aşağıdakı sahələr). |
| sandbox | boolean | Test rejimi: tam nəticə, heç nə saxlanılmır. Hər plan üçün mövcuddur. |
| name | string | Plan adı (istehsalat rejimində). |
| ldm_limit_m | number | Yükü ilk N yük metrində məhdudlaşdırın (yük maşınları üçün). |
| budget_ms | number | Optimallaşdırma vaxt limiti (istehsalat; standart 30000, maksimum 300000). |
| callback_url | https URL | Tapşırıq bitdikdə nəticə {callbackUrl} ünvanına POST edilir, imzalanır (Vebxuklara baxın). |
Əşya sahələri
| Sahə | Tip | Təsvir |
|---|---|---|
| length / width / height | number, required | Əşya ölçüləri, sorğunun vahidlərində oxunur (standart mm, "units": "imperial" olduqda düym). |
| weight | number, required | Əşya çəkisi (standart kq, "units": "imperial" olduqda funt). |
| quantity | integer, default 1 | Fərdi vahidlərə ayrılır. |
| name | string, optional | Planda və cavabda göstərilir. |
| stackable | boolean, default true | Bu əşyanın üstünə başqa yük qoyula bilər. |
| max_stack | number, optional | Bu əşyanın üstünə qoyula bilən maksimum çəkisi (çəki ilə eyni vahidlərdə). |
| fragile | boolean, default false | Kırılğan əşyalar yalnız üst təbəqələrə yerləşdirilir. |
| tiltable | boolean, default true | Əşya yan üstə qoyula bilər. |
| destination_stop | integer, 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
| Kod | Nəqliyyat vasitəsi | Daxili ölçülər (U×E×H) | Yük qabiliyyəti |
|---|---|---|---|
| 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 |
Konteynerlər
| Kod | Konteyner | Daxili ölçülər (U×E×H) | Yük qabiliyyəti |
|---|---|---|---|
| 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 |
Giriş səviyyələri və limitlər
| Sınaq (hər plan) | İstehsalat (Enterprise) | |
|---|---|---|
| Sorğular | Ayda 25 uğurlu | 5,000 uğurlu paket / ay |
| Manifestdə əşyaların sayı | 20 | 5,000 |
| Eyni vaxtda işləyən tapşırıqlar | 1 | 10 |
| Optimallaşdırma limiti | 10 saniyə | Standart 30 saniyə, maksimum 300 saniyə |
| Saxlama | Heç nə saxlanılmır | Hə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.
| Kod | HTTP | Məna |
|---|---|---|
| invalid_key | 401 | Yoxdur, düzgün deyil və ya ləğv edilmiş API açarı. |
| invalid_json | 400 | Gövdə düzgün JSON deyil. |
| invalid_vehicle | 400 | Naməlum nəqliyyat vasitəsi kodu / {customVehicleId}. |
| invalid_items | 400 | Əşya sahəsi yoxdur, ədədi deyil və ya diapazondan kənardır. |
| suspicious_dimensions | 400 | Bü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_units | 400 | units "metric" və ya "imperial" olmalıdır. |
| invalid_objective | 400 | objective "ldm" və ya "pallets" olmalıdır. |
| invalid_callback | 400 | callback_url https olmalıdır. |
| too_many_items | 400 | Manifest giriş səviyyənizin əşya limitini aşır. |
| upgrade_required | 402 | İstehsalat rejimi Enterprise planını tələb edir. Sınaqdan istifadə edin və ya planı yüksəldin. |
| sandbox_limit_reached | 402 | Aylıq sınaq limiti istifadə olunub — ayın 1-də sıfırlanır. |
| quota_exceeded | 402 | Aylı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_jobs | 429 | Eyni 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_found | 404 | Bu 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