REST API v2.0

API Dokümantasyonu

KargoSeç API ile kargo fiyat karşılaştırma, gönderi oluşturma ve takip işlemlerini uygulamanıza entegre edin.

API Anahtarı Gerekli

API'yi kullanmak için önce ücretsiz hesap oluşturun, ardından giriş yaparak API Anahtarları panelinden anahtarınızı alın.

Başlarken

Kargo Seç API v2, kargo fiyat karşılaştırma ve gönderi oluşturma işlemlerini programatik olarak yapmanızı sağlar. Tüm istekler https://kargosec.com/api/v2 base URL üzerinden yapılır.

Base URL

https://kargosec.com/api/v2

Format

JSON (application/json)

Kimlik Doğrulama

Tüm API isteklerinde X-Api-Key header'ı göndermeniz gerekir. API anahtarınızı giriş yapıp API Anahtarları panelinden alabilirsiniz.

curl -X GET "https://kargosec.com/api/v2/account/info" \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Accept: application/json"

Önemli: API anahtarınızı gizli tutun. Asla istemci tarafı kodda (JavaScript, mobil uygulama) kullanmayın.

Hızlı Başlangıç

  1. 1

    API anahtarını al

    Panelinizdeki API Anahtarları sayfasından ksk_... anahtarınızı oluşturun.

  2. 2

    İl, ilçe ve firma ID'lerini çek

    GET /locations/provinces, /locations/districts/{province_id} ve /cargo-companies ile gerekli ID'leri alın.

  3. 3

    Fiyatı önizle

    POST /prices/compare ile tüm firmaların indirimli fiyatını karşılaştırın.

  4. 4

    Gönderiyi oluştur

    POST /shipments ile gönderiyi basın; ücret bakiyenizden düşer, takip numarası döner.

Büyük desi / paletli mi gönderiyorsunuz? Standart parça kargonun taşımadığı yüksek desili sevkiyatlar için Büyük Desi Kargo Çözümü sayfasından kurumsal talep oluşturun.

İstek Limiti ve IP Kısıtı

İstek limiti iki katmanda uygulanır. Efektif limitiniz bu ikisinin küçüğüdür.

1. Rota katmanı

Tüm /api/v2 uçları için dakikada 120 istek.

2. Hesap katmanı

API anahtarınıza tanımlı limit — varsayılan dakikada 60 istek. Hesabınıza göre yükseltilebilir.

Limit aşıldığında 429 Too Many Requests döner. Sayaç 60 saniyelik pencerelerle sıfırlanır.

IP kısıtı: Hesabınıza izinli IP listesi (allowed_ips) tanımlıysa, bu listede olmayan bir IP'den gelen istek 403 Forbidden alır. Liste boşsa IP kısıtı uygulanmaz. Sunucunuzun çıkış IP'si değiştiğinde listeyi güncellemeyi unutmayın.

Endpoint'ler

Hesap

GET /api/v2/account/info

Hesap bilgisi ve bakiye sorgula

GET /api/v2/account/transactions

Bakiye hareketleri listesi. Parametreler: type, date_from, date_to, per_page

Lokasyonlar

GET /api/v2/locations/provinces

Türkiye'deki tüm illeri listele

GET /api/v2/locations/districts/{province_id}

Belirtilen ile ait ilçeleri listele

GET /api/v2/cargo-companies

Aktif kargo firmalarını listele

Fiyat Hesaplama

POST /api/v2/prices/compare

Tüm kargo firmalarından fiyat karşılaştırması yap (hesabınızın indirim oranı uygulanmış fiyatlar döner)

{
  "shipment_type": "koli",
  "from_province_id": 34,
  "from_district_id": 450,
  "to_province_id": 6,
  "to_district_id": 780,
  "weight": 5,
  "width": 30,
  "length": 40,
  "height": 20
}

Parametreler

Alan Kural Açıklama
shipment_type zorunlu · palet|koli|dosya Gönderi tipi
from_province_id zorunlu · integer Çıkış ili ID
from_district_id zorunlu · integer Çıkış ilçesi ID
to_province_id zorunlu · integer Varış ili ID
to_district_id zorunlu · integer Varış ilçesi ID
weight opsiyonel · numeric, min 0.1 Ağırlık (kg)
width opsiyonel · numeric, min 1 En (cm)
length opsiyonel · numeric, min 1 Boy (cm)
height opsiyonel · numeric, min 1 Yükseklik (cm)
desi opsiyonel · numeric, min 0 Ölçü vermek yerine doğrudan desi bildirimi
preset_desi_range opsiyonel · 0-5|5-10|10-20|20-30 Hazır desi aralığı
pallet_size opsiyonel · string Palet ölçüsü (palet gönderilerde; varsayılan all)
weight_range opsiyonel · string Palet ağırlık bandı (varsayılan 0-600)
pallet_quantity opsiyonel · integer, min 1 Palet adedi (varsayılan 1)

Ölçü (width/length/height), desi ve preset_desi_range alanlarının hiçbiri gönderilmezse fiyat hesaplanamaz. Yanıttaki her sonuçta original_price, discount_rate, discount_amount ve indirim uygulanmış total_price bulunur.

POST /api/v2/prices/calculate

Belirli bir kargo firması için fiyat hesapla. compare ile aynı alanları alır; ek olarak cargo_company_id (zorunlu) ve quantity (opsiyonel, integer, min 1) kabul eder. preset_desi_range bu uçta kullanılmaz. Firma için fiyat bulunamazsa 404 döner.

Gönderiler

POST /api/v2/shipments

Yeni gönderi oluştur (ücret API bakiyenizden otomatik düşülür)

{
  "cargo_company_id": 1,
  "shipment_type": "koli",
  "sender_name": "Ali Veli",
  "sender_phone": "05551234567",
  "sender_address": "Atatürk Cad. No:1",
  "sender_province_id": 34,
  "sender_district_id": 450,
  "receiver_name": "Ayşe Fatma",
  "receiver_phone": "05559876543",
  "receiver_address": "İstiklal Cad. No:2",
  "receiver_province_id": 6,
  "receiver_district_id": 780,
  "weight": 5,
  "width": 30,
  "length": 40,
  "height": 20,
  "quantity": 1,
  "content_description": "Elektronik parçalar"
}

Doğrulama kuralları

Alan Kural Açıklama
cargo_company_id zorunlu · geçerli firma ID /cargo-companies ucundan alınır
shipment_type zorunlu · dosya|koli|palet Gönderi tipi
sender_name zorunlu · string, max 255 Gönderici adı
sender_phone zorunlu · string, max 20 Gönderici telefonu
sender_email opsiyonel · e-posta, max 255 Gönderici e-postası
sender_address zorunlu · string Açık adres
sender_province_id zorunlu · geçerli il ID Çıkış ili
sender_district_id zorunlu · geçerli ilçe ID Çıkış ilçesi
receiver_name zorunlu · string, max 255 Alıcı adı
receiver_phone zorunlu · string, max 20 Alıcı telefonu
receiver_email opsiyonel · e-posta, max 255 Alıcı e-postası
receiver_address zorunlu · string Açık adres
receiver_province_id zorunlu · geçerli il ID Varış ili
receiver_district_id zorunlu · geçerli ilçe ID Varış ilçesi
weight zorunlu · numeric, min 0.1 Ağırlık (kg) — 0 kabul edilmez
width opsiyonel · numeric, min 0 En (cm) — ölçü kapısına bakın
length opsiyonel · numeric, min 0 Boy (cm) — ölçü kapısına bakın
height opsiyonel · numeric, min 0 Yükseklik (cm) — ölçü kapısına bakın
desi opsiyonel · numeric, min 0 Ölçü vermek yerine doğrudan desi bildirimi
quantity opsiyonel · integer, min 1 Koli adedi (varsayılan 1)
content_description opsiyonel · string, max 500 İçerik açıklaması

Ölçü kapısı (zorunlu)

  • En/boy/yükseklik ya da desi verilmeden koli gönderisi açılamaz; ikisi de yoksa istek 422 ile reddedilir.
  • Beyan ettiğiniz desi, ölçülerden hesaplanan hacimsel desinin altındaysa hacimsel desiye yükseltilir ve kayda ücrete esas desi yazılır. Fiyat da bu desi üzerinden hesaplanır.
  • Yanıttaki dimensions.desi ücrete esas desidir; dimensions.desi_source bu değerin nereden geldiğini söyler (volumetric, declared, marketplace, default).
  • Üst sınırlar: tek koli en fazla 1000 desi, tek kenar en fazla 300 cm, tek koli en fazla 1000 kg. Aşan istek 422 alır.
  • Neden: taşıyıcı gönderiyi teslim alırken yeniden ölçer ve gerçek desi üzerinden fatura keser. Düşük beyan, sonradan ölçü farkı borcuna dönüşür.

Örnek yanıt (201 Created)

{
  "success": true,
  "message": "Gönderi başarıyla oluşturuldu.",
  "data": {
    "id": 123,
    "tracking_number": "KS80000123",
    "status": "confirmed",
    "cargo_company": { "id": 1, "name": "..." },
    "pricing": { "total_price": 128.75, "discount_amount": 14.30 },
    "payment_status": "paid",
    "payment_method": "api_balance"
  }
}

Gönderi payment_status: paid olarak doğar ve arka planda taşıyıcıya iletilir. Bakiyeniz yetmiyorsa ya da ödenmemiş bir ölçü farkı borcunuz varsa 402 döner (bkz. Hata Kodları). Webhook adresiniz tanımlıysa aynı anda shipment.created olayı POST edilir.

GET /api/v2/shipments

Gönderileri listele. Filtreler: status, tracking_number, date_from, date_to, per_page

GET /api/v2/shipments/{id}

Gönderi detayı

POST /api/v2/shipments/{id}/cancel

Gönderiyi iptal et — ücretin tamamı API bakiyenize iade edilir.

İptal kısıtı: Yalnızca gönderi durumu pending, confirmed veya payment_pending iken çalışır. Diğer tüm durumlarda (alındı, yolda, teslim edildi, iptal edilmiş vb.) 400 Bad Request döner.

Örnek yanıt (200 OK)

{
  "success": true,
  "message": "Gönderi iptal edildi ve bakiyeniz iade edildi.",
  "data": {
    "refunded_amount": 128.75,
    "new_balance": 1871.25
  }
}
GET /api/v2/shipments/{id}/track

Gönderi takip bilgisi

GET /api/v2/shipments/{id}/label

Kargo etiketini al. Etiket, taşıyıcının resmî şablonu varsa o şablondur; yoksa 10x15 KargoSeç etiketidir — panelde bastığınızla birebir aynı kaynaktır.

Örnek yanıt (200 OK)

{
  "success": true,
  "data": {
    "tracking_number": "KS80000123",
    "content_type": "application/pdf",
    "label_base64": "JVBERi0xLjQKJ...",
    "label_url": "https://kargosec.com/api/v2/shipments/123/label-download?expires=...&signature=...",
    "label_url_expires_at": "2026-08-12T09:30:00.000000Z"
  }
}
  • label_base64: PDF'in base64 hâli — decode edip doğrudan yazıcıya gönderebilirsiniz, ek istek gerekmez.
  • label_url: imzalı ve 24 saat geçerli bağlantı. API anahtarı gerektirmez; depo yazıcınıza veya personelinize doğrudan verebilirsiniz. Süre dolduğunda bağlantı geçersizleşir.
  • label_url_expires_at: bağlantının geçerlilik bitiş zamanı (ISO 8601).
  • Ödeme yapılmamış gönderide 400 döner.
  • Etiket henüz hazır değilse (gönderi taşıyıcıya iletilmemişse) 409 Conflict döner; gönderi taşıyıcıya iletildikten sonra tekrar deneyin.
GET /api/v2/shipments/{id}/label-download

label_url alanının işaret ettiği uç. PDF'i doğrudan (Content-Type: application/pdf) döner. Kimlik doğrulaması imza iledir, X-Api-Key gönderilmez. Bu adresi kendiniz kurgulamayın; her zaman /label ucundan dönen hazır bağlantıyı kullanın.

Hata Kodları

Kod Durum Açıklama
400Bad RequestGeçersiz istek — ör. iptale uygun olmayan durumdaki gönderiyi iptal etmek, ödemesiz gönderinin etiketini istemek
401UnauthorizedEksik veya geçersiz API anahtarı
402Payment Requiredİki farklı sebebi var: (1) API bakiyeniz gönderi ücretini karşılamıyor — yanıtta data.balance ve data.required döner; (2) ödenmemiş ölçü farkı borcunuz var — yanıtta error: "measurement_difference_unpaid", amount ve doğrudan ödeyebileceğiniz payment_url döner. Bakiyeniz borcu karşılıyorsa borç oradan tahsil edilir ve istek normal şekilde devam eder.
403ForbiddenHesap devre dışı ya da istek, hesabınıza tanımlı izinli IP listesi dışındaki bir adresten geldi
404Not FoundKaynak bulunamadı (gönderi size ait değilse de bu kod döner)
409ConflictEtiket henüz hazır değil — gönderi taşıyıcıya iletildikten sonra tekrar deneyin
422Validation ErrorDoğrulama hatası — ölçü kapısının reddettiği gönderiler de (ölçüsüz/sıfır desi, absürt ölçü) bu kodu döndürür
429Too Many Requestsİstek limiti aşıldı (rota katmanı 120/dk veya hesap limitiniz)
500Server ErrorSunucu hatası

Örnek: ödenmemiş ölçü farkı (402)

{
  "success": false,
  "error": "measurement_difference_unpaid",
  "message": "Ödenmemiş ölçü farkınız bulunuyor.",
  "amount": 42.50,
  "payment_url": "https://kargosec.com/..."
}

Yanıt Formatı

Tüm yanıtlar aşağıdaki yapıdadır:

{
  "success": true,
  "message": "İşlem başarılı",
  "data": { ... },
  "meta": {
    "current_page": 1,
    "last_page": 5,
    "per_page": 20,
    "total": 100
  }
}

Webhook'lar

Gönderilerinizin durumunu sürekli sorgulamak yerine, olay gerçekleştiği anda sizin sisteminize bildirim gönderebiliriz. API müşteri kaydınızdaki webhook_url alanı doldurulduğunda, aşağıdaki olaylar bu adrese HTTP POST edilir. Adresin tanımlanmasını isterseniz destek ekibimize iletin.

Olaylar

Olay Ne zaman gönderilir
shipment.created API ile yeni bir gönderi oluşturulduğunda
shipment.status_updated Gönderinin durumu değiştiğinde (taşıyıcıdan gelen otomatik güncellemeler dahil)
shipment.cancelled Gönderi iptal edildiğinde

API müşterisi webhook'unda olay filtresi yoktur — üç olayın hepsi aynı adrese gider. Hangi olayın geldiğini event alanından veya X-KargoSec-Event header'ından ayırt edin.

Header'lar

Header Değer
Content-Type application/json
User-Agent KargoSec-Webhook/1.0
X-KargoSec-Event Olay adı (ör. shipment.status_updated)
X-KargoSec-Signature sha256=<hmac_sha256(ham gövde, API anahtarınız)>

İmza sırrı ayrı bir değer değildir; API anahtarınızın kendisidir. Zaten sizde olduğu için ayrıca bir sır paylaşmanız gerekmez.

Örnek gövde — shipment.status_updated

{
  "event": "shipment.status_updated",
  "api_client_id": 12,
  "timestamp": "2026-08-11T14:22:05.000000Z",
  "shipment_id": 123,
  "tracking_number": "KS80000123",
  "old_status": "confirmed",
  "new_status": "in_transit",
  "status_label": "Yolda"
}

shipment.cancelled gövdesi aynı alanları taşır, new_status değeri cancelled olur. shipment.created gövdesinde ise old_status/new_status yerine status ve total_price alanları bulunur.

İmza doğrulama (PHP)

<?php

$rawBody   = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_KARGOSEC_SIGNATURE'] ?? '';
$apiKey    = getenv('KARGOSEC_API_KEY'); // ksk_...

$expected = 'sha256=' . hash_hmac('sha256', $rawBody, $apiKey);

// Zamanlama saldirisina karsi hash_equals kullanin
if (! hash_equals($expected, $signature)) {
    http_response_code(401);
    exit('Gecersiz imza');
}

$payload = json_decode($rawBody, true);

// ... $payload['event'] degerine gore isinizi yapin ...

http_response_code(200);
echo 'OK';

İmzayı ham gövde üzerinden hesaplayın. JSON'u decode edip yeniden encode ederseniz byte dizilimi değişir ve imza tutmaz.

Yeniden deneme davranışı

  • Toplam 3 deneme yapılır (ilk deneme dahil), denemeler arasında yaklaşık 500 ms beklenir.
  • Yalnızca geçici hatalar tekrarlanır: 5xx, 408, 429 ve bağlantı hataları.
  • 4xx yanıtları kalıcı hata sayılır (yanlış URL veya imza) ve tekrar denenmez.
  • İstek zaman aşımı 10 saniyedir. Uzun işleri kuyruğa alıp hemen 2xx dönün.
  • Aynı olay birden fazla kez ulaşabilir; işleyicinizi idempotent yazın (shipment_id + new_status ikilisini anahtar olarak kullanabilirsiniz).

Shopify Entegrasyonu

Shopify mağazanız için kod yazmanıza gerek yok. KargoSeç Paneli → Pazaryerleri bölümünden Shopify bağlantısını kurun; siparişleriniz otomatik olarak panele düşer, kargoyu oluşturduğunuzda takip numarası Shopify'a geri yazılır ve müşteriniz bilgilendirilir.

Kurulum adımları

  1. 1

    Shopify yönetim paneline girin

    Shopify Admin → SettingsApps and sales channels

  2. 2

    Uygulama geliştirmeyi açın

    Develop appsCreate an app. Uygulamaya bir isim verin (ör. "KargoSeç").

  3. 3

    Yetkileri seçin

    Configure Admin API scopes adımında şu iki yetkiyi işaretleyin: read_orders ve write_merchant_managed_fulfillment_orders

  4. 4

    Uygulamayı kurun

    Install app ile uygulamayı mağazanıza kurun.

  5. 5

    Token'ı kopyalayın

    Admin API access token değerini kopyalayın — shpat_ ile başlar. Bu değer yalnızca bir kez gösterilir.

  6. 6

    KargoSeç panelinde tanımlayın

    Pazaryerleri bölümünde Shopify'ı seçin; mağaza adresinizi (magazaniz.myshopify.com) ve kopyaladığınız token'ı girip bağlantıyı test edin.

Bilmeniz gerekenler: Yalnızca açık ve kargolanmamış siparişler çekilir; iptal edilmiş siparişler atlanır. Shopify'da desi kavramı olmadığı için bağlantınızda tanımladığınız varsayılan desi kullanılır — doğru ayarlayın, aksi hâlde taşıyıcının yeniden ölçümünden ölçü farkı doğar. Mağaza adresini magazaniz.myshopify.com biçiminde girin.

Hazır Entegrasyonlar

WooCommerce, Shopify, Trendyol ve 36+ platform için hazır entegrasyon modüllerimizi inceleyin.

Entegrasyon Merkezini Keşfet
WhatsApp ile Destek Al