KolaySürec
/ API Dokümantasyonu v1
API v1

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.

Tek Endpoint
Tüm sipariş senaryoları tek bir /sync çağrısıyla
🔒
API Key Auth
Şirket kodu + API anahtarı ile güvenli kimlik doğrulama
🔁
Idempotent
Tekrar eden çağrılar güvenle desteklenir, çift kayıt olmaz
Not: Bu dokümantasyon yalnızca harici TMS entegrasyonu için geçerlidir. Platform yönetimi (sürücü/araç CRUD, raporlar) için dashboard arayüzünü kullanın.

Kimlik Doğrulama

Her istek, şirket kimliğinizi ve API anahtarınızı request body'de içermelidir. HTTP header tabanlı auth kullanılmaz.

Request Body — Auth Alanları
"company_code": 100001,      // 6 haneli şirket kodu (tam sayı)
"api_key":      "ks_live_xxxx"  // Dashboard'dan alınan API anahtarı
AlanTürAçı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.
Güvenlik: API anahtarınızı kaynak koduna gömmeyiniz. Ortam değişkenleri (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.

Base URLs
// 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>"
Üretim Erişimi: Üretim API adresi ve kimlik bilgileri, entegrasyon testi tamamlandıktan sonra güvenli kanal üzerinden iletilir. Lütfen doğrudan iletişim formunu kullanın.

Idempotency

Ağ hataları veya timeout durumlarında aynı isteği tekrar gönderseniz de çift sipariş oluşmaz. İki koruma katmanı mevcuttur:

1
X-Idempotency-Key Header ÖNERİLEN

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
2
tms_order_id Unique Check

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.

POST

/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)

Request Headers
Content-Type:       application/json
X-Idempotency-Key:  <uuid-v4>     // Önerilen — çift kayıt önler
Request Body — Tüm Alanlar
{
  // ── 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ı

AlanTürDurumAçıklama
company_codeintegerZorunlu6 haneli şirket kodu
api_keystringZorunluHam API anahtarı
tms_order_idstringZorunluKendi sisteminizden benzersiz sipariş referansı. Tekrar gönderilirse 409 döner.
customer_emailstringZorunluYükleme PIN kodu bu adrese gönderilir.
scenarioenumZorunluTaşıma senaryosu. Bkz. Senaryo Referansı.
primary_asset_typeenumOpsiyonelTRAILER veya UNIT. Yalnızca RoRo senaryolarında gerekli.
assets.truck_platestringOpsiyonelSistemdeki araç plakasıyla birebir eşleştirilir.
assets.trailer_platestringOpsiyonelDorse plakası.
assets.driver_licensestringOpsiyonelEhliyet numarasıyla sürücü eşleştirilir.
schedule.startISO 8601ZorunluSefer başlangıç zamanı (UTC).
schedule.endISO 8601ZorunluTahmini bitiş zamanı (UTC).
location.*string/floatOpsiyonelAlış ve teslim adresleri, koordinatlar.
cargo.*objectOpsiyonelYük bilgileri — raporlarda ve sürücü detaylarında gösterilir.

📤 Yanıt (Response)

200 OK Sipariş başarıyla oluşturuldu veya idempotent tekrar çağrı
Response Body — 200 OK
{
  "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
}
Araç Eşleştirme: 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ı

401
Unauthorized — TENANT_003
company_code veya api_key hatalı.
409
Conflict — ORDER_003
Bu tms_order_id ile kayıt zaten mevcut. Idempotency key kullanarak önlenebilir.
400
Bad Request — Validation
Zorunlu alan eksik veya geçersiz format. Response body'de message alanı detay içerir.
403
Forbidden — TENANT_002
Şirket hesabı askıya alınmış veya abonelik süresi dolmuş.

Taşı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.

Legs: 1 ROAD  |  Tasks: PICKUP → DELIVERY
PRE_CARRIAGE_RELAY Senaryo 2

Yurt içi kamyon aktarma noktasına taşır, ikinci kamyon devam eder.

Legs: 2 ROAD  |  Tasks: PICKUP → RELAY_HANDOVER → RELAY_ACCEPT → DELIVERY
RORO_TRAILER Senaryo 3

Sadece dorse RoRo gemisine yüklenir, çekici geride kalır.

primary_asset_type: TRAILER  |  Legs: ROAD + RORO
RORO_UNIT Senaryo 4

Kamyon + dorse birlikte RoRo gemisine yüklenir.

primary_asset_type: UNIT  |  Legs: ROAD + RORO
INTERMODAL_UNIT Senaryo 5

Kamyon + dorse: RoRo + tren (kombine taşımacılık).

Legs: ROAD + RORO + RAIL + ROAD
INTERMODAL_TRAILER Senaryo 6

Yalnızca dorse: RoRo + tren kombinasyonu.

primary_asset_type: TRAILER  |  Legs: ROAD + RORO + RAIL + ROAD

Sipariş Durumları

API yanıtındaki status alanı aşağıdaki değerleri alabilir:

DeğerAçı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"
}
KodHTTPAçıklama
TENANT_003401API anahtarı geçersiz veya yanlış.
TENANT_001401Şirket kodu bulunamadı.
TENANT_002403Şirket hesabı askıya alınmış.
ORDER_003409Bu tms_order_id ile sipariş zaten mevcut.
ASSET_002200Araç müsait değil — sipariş oluşur, issues dizisine eklenir.
DRIVER_002200Sürücü müsait değil — sipariş oluşur, issues dizisine eklenir.

Rate Limiting

API çağrı limitleri şirket aboneliğine göre belirlenir:

PlanLimitWindow
Standart120 istekdakika başına
Sandbox30 istekdakika 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.

Test şirket kodu, API anahtarı ve örnek araç verileri içerir
PIN e-postaları gerçek adrese gitmez, log'lara yazılır
Tüm senaryolar ve edge case'ler test edilebilir
Sandbox erişimi ücretsizdir
Sandbox endpoint ve kimlik bilgileri doğrudan paylaşılmamaktadır. Entegrasyon talebinizi iletişim formu üzerinden bize bildirin; ekibimiz size özel sandbox bilgilerini güvenli kanaldan iletecektir.
Sandbox Erişimi Talep Et

Kod Örnekleri

cURL — Minimum İstek

bash
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

javascript
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

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

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?
Tek endpoint entegrasyonu çoğu TMS için birkaç saatlik geliştirme gerektirir. Sandbox testleri dahil tipik entegrasyon süreci 1–3 iş günüdür.
Araç eşleştirme tam olmadığında ne olur?
Sipariş yine oluşturulur ve response'daki 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?
Sipariş durum sorgulama endpoint'i yakında eklenecektir. Şu an için order_id veya tms_order_id ile durum takibini dashboard'dan yapabilirsiniz.
Webhook / callback desteği var mı?
Outbound webhook desteği (sipariş durumu değişikliklerini TMS'inize push etme) yol haritamızda mevcuttur. Erken erişim için bize yazın.
API versiyonlama politikası nedir?
Mevcut sürüm v1'dir. Kırıcı değişiklikler yeni sürüm olarak yayınlanır (v2 vb.) ve eski sürüm en az 12 ay desteklenir. Bakım güncellemeleri önceden e-posta ile duyurulur.
🚀

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.