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ıç
- Oturum açın → adınıza tıklayın → API → bir anahtar oluşturun.
- 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:
| Alan | Tür | Açıklama |
|---|---|---|
| placed_count / unplaced_count | integer | Yerleş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_m | number | Yükleme metreleri — kargo bloğunun uzunluğu (maksimum bitiş − minimum başlangıç). |
| metrics.linear_ft | number | Aynı uzunluk lineer feet cinsinden (ABD LTL). |
| metrics.span_mm | integer | Aynı uzunluk mm cinsinden, her zaman metrik. |
| metrics.pallet_positions_eur | integer | null | Faturalandırılan EUR palet pozisyonları. Yerleşim ölçülemeyecek kadar büyükse null değer döner. |
| metrics.total_weight_kg | number | Yerleşen toplam ağırlık, her zaman kg. |
| metrics.overlaps | integer | Çakışan çiftler — geçerli bir yerleşimde her zaman 0'dır. |
| items[].placed | boolean | Öğenin yerleşim planına dahil olup olmadığı. |
| items[].x / y / z | number | 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_deg | 0 | 90 | Yönelim: dikey eksen etrafında dönüş; tilt = yan yatırılmış. |
| items[].length / width / height / weight | number | İstekte gönderilen öğe boyutları, istek birimlerinde yansıtılır. |
| plan_url | string | null | Uygulamada 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ı
| Alan | Tür | Açıklama |
|---|---|---|
| vehicle | string | Aş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. |
| items | array, required | Kargo manifestosu (aşağıdaki alanlar). |
| sandbox | boolean | Test modu: tam sonuç, hiçbir şey kalıcı olarak saklanmaz. Her planda mevcuttur. |
| name | string | Plan adı (üretim modu). |
| ldm_limit_m | number | Yükü ilk N yükleme metresiyle sınırlayın (kamyonlar). |
| budget_ms | number | Optimizasyon süresi bütçesi (üretim; varsayılan 30000, maksimum 300000). |
| callback_url | https URL | İş tamamlandığında sonucu POST ile gönderir, imzalı (Webhook'lara bakın). |
Öğe alanları
| Alan | Tür | Açıklama |
|---|---|---|
| length / width / height | number, required | Öğe boyutları, istekte belirtilen birimlerle okunur (varsayılan mm, "units": "imperial" ile inç). |
| weight | number, required | Öğe ağırlığı (varsayılan kg, "units": "imperial" ile lb). |
| quantity | integer, default 1 | Bireysel birimlere ayrılır. |
| name | string, optional | Plan ve yanıtta gösterilir. |
| stackable | boolean, default true | Bu öğenin üzerine başka kargo konulabilir. |
| max_stack | number, optional | Bu öğenin üstüne konulabilecek maksimum ağırlık (ağırlıkla aynı birimlerde). |
| fragile | boolean, default false | Kırılgan öğeler yalnızca üst katmanlara yerleştirilir. |
| tiltable | boolean, default true | Öğe yan yatırılabilir. |
| destination_stop | integer, 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
| Kod | Araç | İç Ölçüler (U×G×Y) | Yük Kapasitesi |
|---|---|---|---|
| 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 |
Konteynerler
| Kod | Konteyner | İç Ölçüler (U×G×Y) | Yük Kapasitesi |
|---|---|---|---|
| 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 |
Erişim seviyeleri ve sınırlar
| Sandbox (her planda) | Üretim (Enterprise) | |
|---|---|---|
| İstekler | 25 başarılı / ay | 5.000 başarılı paketleme / ay |
| Manifest başına öğe sayısı | 20 | 5,000 |
| Eşzamanlı işler | 1 | 10 |
| Optimizasyon bütçesi | 10 s | 30 s varsayılan, 300 s'ye kadar |
| Kalıcılık | Hiçbir şey saklanmaz | Her 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.
| Kod | HTTP | Anlam |
|---|---|---|
| invalid_key | 401 | Eksik, hatalı biçimlendirilmiş veya iptal edilmiş API anahtarı. |
| invalid_json | 400 | Gövde geçerli bir JSON değil. |
| invalid_vehicle | 400 | Bilinmeyen araç kodu / custom_vehicle_id. |
| invalid_items | 400 | Bir öğe alanı eksik, sayısal değil veya aralık dışında. |
| suspicious_dimensions | 400 | Tüm boyutlar 100 mm'nin altında — muhtemelen inç mm olarak gönderilmiş. "units": "imperial" gönderin. |
| invalid_units | 400 | units "metric" veya "imperial" olmalıdır. |
| invalid_objective | 400 | objective "ldm" veya "pallets" olmalıdır. |
| invalid_callback | 400 | callback_url https olmalıdır. |
| too_many_items | 400 | Manifest, erişim seviyeniz için öğe sınırını aşıyor. |
| upgrade_required | 402 | Üretim modu Enterprise planını gerektirir. Sandbox kullanın veya planınızı yükseltin. |
| sandbox_limit_reached | 402 | Aylık sandbox kotası doldu — ayın 1'inde sıfırlanır. |
| quota_exceeded | 402 | Aylı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_jobs | 429 | Eşzamanlı iş sınırına ulaşıldı. Çalışan işleri sorgulayın ve yeniden deneyin. |
| not_found | 404 | Bu ç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