KolaySürec TMS
Entegrasyon API'si
KolaySürec REST API'si, TMS (Taşıma Yönetim Sistemi) yazılımınızdan doğrudan
sipariş göndererek nakliye süreçlerini otomatikleştirmenizi sağlar.
Tek bir POST isteğiyle
sipariş oluşturulur, araçlar eşleştirilir ve sürücüye atanır.
/sync çağrısıylaKimlik Doğrulama
Her istek, şirket kimliğinizi ve API anahtarınızı request body'de içermelidir. HTTP header tabanlı auth kullanılmaz.
"company_code": 100001, // 6 haneli şirket kodu (tam sayı) "api_key": "ks_live_xxxx" // Dashboard'dan alınan API anahtarı
| Alan | Tür | Açıklama |
|---|---|---|
company_code |
integer | 6 haneli şirket tanımlayıcısı. Dashboard → Ayarlar'dan öğrenilir. |
api_key |
string | SUPER_ADMIN veya şirket yöneticisi tarafından oluşturulan ham API anahtarı. Veritabanında SHA-256 ile saklanır. |
ENV) veya secrets manager kullanın.
Şüphe durumunda dashboard'dan anahtarı yenileyebilirsiniz.
Base URL
Üretim ortamı bilgileri yalnızca onaylı entegrasyon ortaklarına verilmektedir. Sandbox erişimi için aşağıya bakın.
// Sandbox (test ortamı — entegrasyon için bizimle iletişime geçin) BASE_URL = "https://sandbox.kolaysurec.com/api" // Üretim (yalnızca onaylı ortaklar — doğrudan paylaşılmamaktadır) BASE_URL = "<production-url-on-request>"
Idempotency
Ağ hataları veya timeout durumlarında aynı isteği tekrar gönderseniz de çift sipariş oluşmaz. İki koruma katmanı mevcuttur:
Her istek için benzersiz bir UUID gönderin. Aynı key ile tekrar çağrılırsa ilk yanıt döner, yeni kayıt oluşmaz.
X-Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000
Aynı şirkete ait tms_order_id değeri daha önce kaydedilmişse 409 Conflict döner. Sipariş no'larınız sisteminizde benzersizse çift kayıt olmaz.
/v1/tms/sync
TMS sisteminizden bir sipariş gönderir. Araçlar plaka/ehliyet üzerinden otomatik eşleştirilir. Tüm varlıklar müsaitse sipariş CONFIRMED statüsünde oluşur ve sürücüye atanır; eksik eşleşme varsa CONFIRMED statüsünde oluşur, atama bekler.
📥 İstek (Request)
Content-Type: application/json X-Idempotency-Key: <uuid-v4> // Önerilen — çift kayıt önler
{
// ── Kimlik Doğrulama ─────────────────────────────────
"company_code": 100001, // zorunlu — integer
"api_key": "ks_live_xxxxxxxxxxxx", // zorunlu — string
// ── Sipariş Bilgisi ───────────────────────────────────
"tms_order_id": "ORD-2025-001", // zorunlu — sisteminizden benzersiz sipariş no
"customer_email": "musteri@firma.com", // zorunlu — PIN e-postası buraya gider
"scenario": "DIRECT_ROAD", // zorunlu — bkz. Senaryo Referansı
"primary_asset_type": "TRAILER", // opsiyonel — RORO senaryoları için
// ── Araç Eşleştirme ──────────────────────────────────
"assets": {
"truck_plate": "34 ABC 1234", // opsiyonel — sistemdeki plaka ile eşleşir
"trailer_plate": "06 XYZ 5678", // opsiyonel
"driver_license": "B-12345678" // opsiyonel — ehliyet no ile eşleşir
},
// ── Zaman Planı ──────────────────────────────────────
"schedule": {
"start": "2025-06-01T08:00:00Z", // zorunlu — ISO 8601
"end": "2025-06-02T18:00:00Z" // zorunlu — ISO 8601
},
// ── Adres Bilgisi ────────────────────────────────────
"location": {
"pickup_address": "İstanbul, Türkiye", // opsiyonel
"delivery_address":"Ankara, Türkiye", // opsiyonel
"pickup_lat": 41.0082, // opsiyonel — ondalık derece
"pickup_lng": 28.9784, // opsiyonel
"delivery_lat": 39.9334, // opsiyonel
"delivery_lng": 32.8597 // opsiyonel
},
// ── Yük Bilgisi (Opsiyonel) ──────────────────────────
"cargo": {
"description": "Otomotiv yedek parça", // opsiyonel
"weight_kg": 15000, // opsiyonel — kilogram
"volume_m3": 45.5, // opsiyonel — metreküp
"dangerous_goods": false, // opsiyonel — ADR
"temperature_controlled":false // opsiyonel — soğuk zincir
}
}
Alan Referansı
| Alan | Tür | Durum | Açıklama |
|---|---|---|---|
company_code | integer | Zorunlu | 6 haneli şirket kodu |
api_key | string | Zorunlu | Ham API anahtarı |
tms_order_id | string | Zorunlu | Kendi sisteminizden benzersiz sipariş referansı. Tekrar gönderilirse 409 döner. |
customer_email | string | Zorunlu | Yükleme PIN kodu bu adrese gönderilir. |
scenario | enum | Zorunlu | Taşıma senaryosu. Bkz. Senaryo Referansı. |
primary_asset_type | enum | Opsiyonel | TRAILER veya UNIT. Yalnızca RoRo senaryolarında gerekli. |
assets.truck_plate | string | Opsiyonel | Sistemdeki araç plakasıyla birebir eşleştirilir. |
assets.trailer_plate | string | Opsiyonel | Dorse plakası. |
assets.driver_license | string | Opsiyonel | Ehliyet numarasıyla sürücü eşleştirilir. |
schedule.start | ISO 8601 | Zorunlu | Sefer başlangıç zamanı (UTC). |
schedule.end | ISO 8601 | Zorunlu | Tahmini bitiş zamanı (UTC). |
location.* | string/float | Opsiyonel | Alış ve teslim adresleri, koordinatlar. |
cargo.* | object | Opsiyonel | Yük bilgileri — raporlarda ve sürücü detaylarında gösterilir. |
📤 Yanıt (Response)
{
"order_id": "clx8k2mn0000108l4gq9p1234", // KolaySürec sipariş UUID'si
"shipment_id": "clx8k2mn0000208l4abc45678", // Sevkiyat UUID'si
"status": "CONFIRMED", // Sipariş durumu
"legs_created": 1, // Oluşturulan güzergah segmenti sayısı
"issues": ["truck_plate eşleşmedi"], // Boşsa tüm araçlar eşleşti
"idempotent": false // true ise daha önce işlendi
}
issues dizisi boşsa tüm araçlar eşleşti ve sipariş sürücüye atandı.
Dizi dolu ise sipariş CONFIRMED statüsünde oluştu ama araç ataması beklemede —
dashboard üzerinden manuel atama yapılabilir.
Hata Yanıtları
TENANT_003ORDER_003message alanı detay içerir.TENANT_002Taşıma Senaryoları
scenario alanı taşımanın tipini belirler.
Her senaryo farklı sayıda güzergah (leg) ve görev (task) oluşturur.
DIRECT_ROAD
Senaryo 1
Tek kamyon + dorse, A noktasından B noktasına doğrudan karayolu.
PRE_CARRIAGE_RELAY
Senaryo 2
Yurt içi kamyon aktarma noktasına taşır, ikinci kamyon devam eder.
RORO_TRAILER
Senaryo 3
Sadece dorse RoRo gemisine yüklenir, çekici geride kalır.
RORO_UNIT
Senaryo 4
Kamyon + dorse birlikte RoRo gemisine yüklenir.
INTERMODAL_UNIT
Senaryo 5
Kamyon + dorse: RoRo + tren (kombine taşımacılık).
INTERMODAL_TRAILER
Senaryo 6
Yalnızca dorse: RoRo + tren kombinasyonu.
Sipariş Durumları
API yanıtındaki status alanı aşağıdaki değerleri alabilir:
| Değer | Açıklama |
|---|---|
CONFIRMED |
Sipariş alındı. Araçlar eşleştiyse atama tamamlandı; issues boşsa tam atama yapıldı. |
IN_PROGRESS |
Sefer başladı, sürücü yolda. |
COMPLETED |
Tüm teslimat görevleri tamamlandı. |
CANCELLED |
Sipariş iptal edildi (dashboard üzerinden). |
DRAFT |
Taslak — API üzerinden oluşturulan siparişlerde görünmez. |
Hata Kodları
Tüm hata yanıtları aşağıdaki formata sahiptir:
{
"code": "TENANT_003", // Makine tarafından okunabilir hata kodu
"message": "API key invalid", // İnsan tarafından okunabilir açıklama
"statusCode": 401, // HTTP durum kodu
"timestamp": "2025-06-01T10:00:00.000Z",
"path": "/api/v1/tms/sync"
}
| Kod | HTTP | Açıklama |
|---|---|---|
TENANT_003 | 401 | API anahtarı geçersiz veya yanlış. |
TENANT_001 | 401 | Şirket kodu bulunamadı. |
TENANT_002 | 403 | Şirket hesabı askıya alınmış. |
ORDER_003 | 409 | Bu tms_order_id ile sipariş zaten mevcut. |
ASSET_002 | 200 | Araç müsait değil — sipariş oluşur, issues dizisine eklenir. |
DRIVER_002 | 200 | Sürücü müsait değil — sipariş oluşur, issues dizisine eklenir. |
Rate Limiting
API çağrı limitleri şirket aboneliğine göre belirlenir:
| Plan | Limit | Window |
|---|---|---|
| Standart | 120 istek | dakika başına |
| Sandbox | 30 istek | dakika başına |
Limit aşıldığında 429 Too Many Requests döner.
Response header'larında Retry-After saniye cinsinden bekleme süresini içerir.
Sandbox Ortamı
Entegrasyonunuzu üretim verilerini etkilemeden test etmek için sandbox ortamı sunuyoruz. Sandbox, tam üretim API'siyle aynı davranışa sahiptir ancak gerçek araç/sürücü verileri içermez.
Kod Örnekleri
cURL — Minimum İstek
curl -X POST "https://sandbox.kolaysurec.com/api/v1/tms/sync" \ -H "Content-Type: application/json" \ -H "X-Idempotency-Key: $(uuidgen)" \ -d '{ "company_code": 100001, "api_key": "your_api_key_here", "tms_order_id": "ORD-2025-001", "customer_email": "musteri@firma.com", "scenario": "DIRECT_ROAD", "assets": { "truck_plate": "34 ABC 1234", "trailer_plate": "06 XYZ 5678", "driver_license": "B-12345678" }, "schedule": { "start": "2025-06-01T08:00:00Z", "end": "2025-06-02T18:00:00Z" }, "location": { "pickup_address": "Gebze OSB, Kocaeli", "delivery_address": "OSTİM, Ankara" } }'
JavaScript / Node.js
const response = await fetch('https://sandbox.kolaysurec.com/api/v1/tms/sync', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Idempotency-Key': crypto.randomUUID(), }, body: JSON.stringify({ company_code: 100001, api_key: process.env.KOLAYSUREC_API_KEY, tms_order_id: 'ORD-2025-001', customer_email: 'musteri@firma.com', scenario: 'DIRECT_ROAD', assets: { truck_plate: '34 ABC 1234', trailer_plate: '06 XYZ 5678', driver_license: 'B-12345678', }, schedule: { start: '2025-06-01T08:00:00Z', end: '2025-06-02T18:00:00Z', }, location: { pickup_address: 'Gebze OSB, Kocaeli', delivery_address: 'OSTİM, Ankara', }, }), }); const data = await response.json(); if (data.issues.length === 0) { console.log('✓ Tam atama:', data.order_id); } else { console.warn('⚠ Bekleyen atama, issues:', data.issues); }
Python
import requests, uuid, os response = requests.post( "https://sandbox.kolaysurec.com/api/v1/tms/sync", headers={ "Content-Type": "application/json", "X-Idempotency-Key": str(uuid.uuid4()), }, json={ "company_code": 100001, "api_key": os.environ["KOLAYSUREC_API_KEY"], "tms_order_id": "ORD-2025-001", "customer_email": "musteri@firma.com", "scenario": "DIRECT_ROAD", "assets": { "truck_plate": "34 ABC 1234", "trailer_plate": "06 XYZ 5678", "driver_license": "B-12345678", }, "schedule": {"start": "2025-06-01T08:00:00Z", "end": "2025-06-02T18:00:00Z"}, "location": { "pickup_address": "Gebze OSB, Kocaeli", "delivery_address": "OSTİM, Ankara", }, }, ) data = response.json() print("order_id:", data["order_id"], "| issues:", data["issues"])
PHP
$payload = [ 'company_code' => 100001, 'api_key' => $_ENV['KOLAYSUREC_API_KEY'], 'tms_order_id' => 'ORD-2025-001', 'customer_email' => 'musteri@firma.com', 'scenario' => 'DIRECT_ROAD', 'assets' => ['truck_plate' => '34 ABC 1234', 'driver_license' => 'B-12345678'], 'schedule' => ['start' => '2025-06-01T08:00:00Z', 'end' => '2025-06-02T18:00:00Z'], 'location' => ['pickup_address' => 'Gebze OSB', 'delivery_address' => 'OSTİM Ankara'], ]; $ch = curl_init('https://sandbox.kolaysurec.com/api/v1/tms/sync'); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => json_encode($payload), CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', 'X-Idempotency-Key: ' . bin2hex(random_bytes(16)), ], ]); $data = json_decode(curl_exec($ch), true); echo $data['order_id'];
Sık Sorulan Sorular
Mevcut TMS sistemime entegrasyon ne kadar sürer?
Araç eşleştirme tam olmadığında ne olur?
issues dizisi eşleşmeyen varlıkları listeler.
Şirket yöneticisi dashboard üzerinden manuel atama yapabilir. Bu, API çağrısının hiç başarısız olmayacağı anlamına gelir.
Sipariş durumunu sonradan sorgulayabilir miyim?
order_id veya tms_order_id ile durum
takibini dashboard'dan yapabilirsiniz.
Webhook / callback desteği var mı?
API versiyonlama politikası nedir?
Entegrasyona Başlamaya Hazır mısınız?
Sandbox erişimi alın, birkaç test çağrısı yapın ve üretimdeki entegrasyonu tamamlayın. Ekibimiz her adımda yanınızdadır.