Paketleme API

Kargonuzu gönderin, fiziksel olarak geçerli, optimize edilmiş bir yükleme planı alın — yerleşimler, yükleme metreleri, lineer feet ve faturalandırılan palet pozisyonları. Uygulamanın arkasında çalışan aynı motor, gerçek sevkiyatçı yerleşimleriyle sürekli doğrulanır. Her planda sandbox erişimi; üretim erişimi Enterprise'da.

Hızlı başlangıç

  1. Oturum açın → adınıza tıklayın → API → bir anahtar oluşturun.
  2. Bir paketleme işi gönderin (bu örnek sandbox'ta çalışır — her planda ücretsizdir):
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 adresini sorgulayın (aynı kimlik doğrulama başlığıyla) ta ki status "done" olana kadar:

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

Uç noktalar

POST /api/v1/pack

Bir paketleme işini doğrular ve kuyruğa alır. 202 kodu ve bir job_id döndürür. Idempotency-Key başlığı desteklenir — aynı anahtarla tekrarlanan istekler, orijinal işi döndürür, iki kez paketleme yapmaz.

GET /api/v1/jobs/{id}

İş durumu ve tamamlandığında tam sonuç. Sonuçlar 30 gün boyunca saklanır; üretim planları çalışma alanınızda kalıcı olarak tutulur.

GET /api/v1/openapi.json

Makine tarafından okunabilir OpenAPI 3.1 sözleşmesi — Postman'e, kod üreticilerine aktarın veya yapay zeka kodlama aracınıza yönlendirin. Araç kodları canlı motordan alındığı için her zaman günceldir. Şartnameyi aç ↗

Yanıt alanları

Tamamlanmış bir işteki result nesnesi:

AlanTürAçıklama
placed_count / unplaced_countintegerYerleşen / yerleşmeyen öğe sayısı.
units"metric" | "imperial"Aşağıdaki tüm sayıların ifade edildiği birimler (istekte belirtilenle aynı).
metrics.ldm_mnumberYükleme metreleri — kargo bloğunun uzunluğu (maksimum bitiş − minimum başlangıç).
metrics.linear_ftnumberAynı uzunluk lineer feet cinsinden (ABD LTL).
metrics.span_mmintegerAynı uzunluk mm cinsinden, her zaman metrik.
metrics.pallet_positions_eurinteger | nullFaturalandırılan EUR palet pozisyonları. Yerleşim ölçülemeyecek kadar büyükse null değer döner.
metrics.total_weight_kgnumberYerleşen toplam ağırlık, her zaman kg.
metrics.overlapsintegerÇakışan çiftler — geçerli bir yerleşimde her zaman 0'dır.
items[].placedbooleanÖğenin yerleşim planına dahil olup olmadığı.
items[].x / y / znumber | nullİstek birimlerine göre pozisyon: x kapı tarafından, y sol duvardan, z zeminden. placed false ise her üçü de null değer alır.
items[].rotation_deg / tilt_deg0 | 90Yönelim: dikey eksen etrafında dönüş; tilt = yan yatırılmış.
items[].length / width / height / weightnumberİstekte gönderilen öğe boyutları, istek birimlerinde yansıtılır.
plan_urlstring | nullUygulamada oluşturulan planın bağlantısı. Sandbox işleri için null değer döner.

Sürüm yönetimi ve kararlılık

Sözleşme, yolda (/api/v1/) sürümlendirilir. v1 içinde yapılan değişiklikler yalnızca eklemelidir — yeni isteğe bağlı alanlar, yeni yanıt alanları, yeni araç kodları ve hata kodları eklenebilir. İstemciler tanımadıkları alanları görmezden gelmelidir. Mevcut alanların anlamı veya türü asla değişmez ve hiçbir şey kaldırılmaz. Kırılım değişikliği, yeni bir sürüm yolu anlamına gelir; v1 en az 12 ay boyunca paralel olarak sürdürülür ve aktif anahtarı olan her çalışma alanına e-posta ile kullanımdan kaldırma bildirimi gönderilir.

İstek alanları

AlanTürAçıklama
vehiclestringAşağıdaki tablolardan bir araç kodu. Ya da custom_vehicle_id (çalışma alanınızdaki filo araçlarından biri) gönderin.
objective"ldm" | "pallets"Yükleme metrelerini ya da faturalandırılan palet pozisyonlarını en aza indirin. Varsayılan "ldm".
units"metric" | "imperial"Öğe boyutları ve ağırlıklarının nasıl okunacağı VE döndürüleceği: mm/kg (varsayılan) veya in/lb. Yanıttaki pozisyonlar aynı birimleri takip eder.
itemsarray, requiredKargo manifestosu (aşağıdaki alanlar).
sandboxbooleanTest modu: tam sonuç, hiçbir şey kalıcı olarak saklanmaz. Her planda mevcuttur.
namestringPlan adı (üretim modu).
ldm_limit_mnumberYükü ilk N yükleme metresiyle sınırlayın (kamyonlar).
budget_msnumberOptimizasyon süresi bütçesi (üretim; varsayılan 30000, maksimum 300000).
callback_urlhttps URLİş tamamlandığında sonucu POST ile gönderir, imzalı (Webhook'lara bakın).

Öğe alanları

AlanTürAçıklama
length / width / heightnumber, requiredÖğe boyutları, istekte belirtilen birimlerle okunur (varsayılan mm, "units": "imperial" ile inç).
weightnumber, requiredÖğe ağırlığı (varsayılan kg, "units": "imperial" ile lb).
quantityinteger, default 1Bireysel birimlere ayrılır.
namestring, optionalPlan ve yanıtta gösterilir.
stackableboolean, default trueBu öğenin üzerine başka kargo konulabilir.
max_stacknumber, optionalBu öğenin üstüne konulabilecek maksimum ağırlık (ağırlıkla aynı birimlerde).
fragileboolean, default falseKırılgan öğeler yalnızca üst katmanlara yerleştirilir.
tiltableboolean, default trueÖğe yan yatırılabilir.
destination_stopinteger, default 1Çok duraklı LIFO yüklemesi için teslimat durak numarası.

Araç kodları

Canlı motor özelliklerinden oluşturulmuştur. Çalışma alanınızdaki özel araçlar custom_vehicle_id ile çalışır.

Kamyonlar ve römorklar

KodAraçİç Ölçüler (U×G×Y)Yük Kapasitesi
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

Konteynerler

KodKonteynerİç Ölçüler (U×G×Y)Yük Kapasitesi
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

Erişim seviyeleri ve sınırlar

Sandbox (her planda)Üretim (Enterprise)
İstekler25 başarılı / ay5.000 başarılı paketleme / ay
Manifest başına öğe sayısı205,000
Eşzamanlı işler110
Optimizasyon bütçesi10 s30 s varsayılan, 300 s'ye kadar
KalıcılıkHiçbir şey saklanmazHer paketleme gerçek bir plan oluşturur

Yalnızca başarılı paketlemeler kota hesabına dahil edilir — geçersiz doğrulama ve başarısız işler kotayı etkilemez. Her iki sayaç da ayın 1'inde (UTC) sıfırlanır. Sandbox sonuçları eksiksiz ve sınırsızdır — sınırlar yalnızca giriş kriteridir, çıktıyı etkilemez. Ayda 5.000'den fazla paketlemeye mi ihtiyacınız var? Toplu ve OEM fiyatlandırması için bizimle iletişime geçin.

Webhook'lar

İş tamamlandığında sonucu POST ile almak için callback_url gönderin. Her geri çağırma, X-Hansatic-Signature içerir: ham gövdenin HMAC-SHA256 imzası, anahtarınızın webhook gizli anahtarıyla (anahtar oluşturulurken bir kez gösterilir). Doğrulayı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));
}

Teslimat tek deneme ile 5s zaman aşımına sahiptir — status_url her zaman gerçek kaynaktır.

Hatalar

Tüm hatalar { "error": { "code", "message", ... } } şeklindedir — makine tarafından okunabilir kod, insan tarafından okunabilir mesaj ve hatalı bir giriş olduğunda field.

KodHTTPAnlam
invalid_key401Eksik, hatalı biçimlendirilmiş veya iptal edilmiş API anahtarı.
invalid_json400Gövde geçerli bir JSON değil.
invalid_vehicle400Bilinmeyen araç kodu / custom_vehicle_id.
invalid_items400Bir öğe alanı eksik, sayısal değil veya aralık dışında.
suspicious_dimensions400Tüm boyutlar 100 mm'nin altında — muhtemelen inç mm olarak gönderilmiş. "units": "imperial" gönderin.
invalid_units400units "metric" veya "imperial" olmalıdır.
invalid_objective400objective "ldm" veya "pallets" olmalıdır.
invalid_callback400callback_url https olmalıdır.
too_many_items400Manifest, erişim seviyeniz için öğe sınırını aşıyor.
upgrade_required402Üretim modu Enterprise planını gerektirir. Sandbox kullanın veya planınızı yükseltin.
sandbox_limit_reached402Aylık sandbox kotası doldu — ayın 1'inde sıfırlanır.
quota_exceeded402Aylık 5.000 paket üretim kotası doldu — ayın 1'inde sıfırlanır. Daha yüksek hacim için: bizimle iletişime geçin.
too_many_jobs429Eşzamanlı iş sınırına ulaşıldı. Çalışan işleri sorgulayın ve yeniden deneyin.
not_found404Bu çalışma alanı için böyle bir iş bulunamadı.

Sorularınız mı var, daha yüksek sınırlara mı ihtiyacınız var ya da ihtiyacınız olan bir bağlantı (Zapier, Excel, MCP) var mı? hello@hansatic.com