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
API anahtarını al
Panelinizdeki API Anahtarları sayfasından
ksk_...anahtarınızı oluşturun. -
2
İl, ilçe ve firma ID'lerini çek
GET /locations/provinces,/locations/districts/{province_id}ve/cargo-companiesile gerekli ID'leri alın. -
3
Fiyatı önizle
POST /prices/compareile tüm firmaların indirimli fiyatını karşılaştırın. -
4
Gönderiyi oluştur
POST /shipmentsile gönderiyi basın; ücret bakiyenizden düşer, takip numarası döner.
İ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
/api/v2/account/info
Hesap bilgisi ve bakiye sorgula
/api/v2/account/transactions
Bakiye hareketleri listesi. Parametreler: type, date_from, date_to, per_page
Lokasyonlar
/api/v2/locations/provinces
Türkiye'deki tüm illeri listele
/api/v2/locations/districts/{province_id}
Belirtilen ile ait ilçeleri listele
/api/v2/cargo-companies
Aktif kargo firmalarını listele
Fiyat Hesaplama
/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.
/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
/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
422ile 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_sourcebu 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
422alı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.
/api/v2/shipments
Gönderileri listele. Filtreler: status, tracking_number, date_from, date_to, per_page
/api/v2/shipments/{id}
Gönderi detayı
/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
}
}
/api/v2/shipments/{id}/track
Gönderi takip bilgisi
/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
400döner. - Etiket henüz hazır değilse (gönderi taşıyıcıya iletilmemişse)
409 Conflictdöner; gönderi taşıyıcıya iletildikten sonra tekrar deneyin.
/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 |
|---|---|---|
| 400 | Bad Request | Geçersiz istek — ör. iptale uygun olmayan durumdaki gönderiyi iptal etmek, ödemesiz gönderinin etiketini istemek |
| 401 | Unauthorized | Eksik veya geçersiz API anahtarı |
| 402 | Payment 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. |
| 403 | Forbidden | Hesap devre dışı ya da istek, hesabınıza tanımlı izinli IP listesi dışındaki bir adresten geldi |
| 404 | Not Found | Kaynak bulunamadı (gönderi size ait değilse de bu kod döner) |
| 409 | Conflict | Etiket henüz hazır değil — gönderi taşıyıcıya iletildikten sonra tekrar deneyin |
| 422 | Validation Error | Doğ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 |
| 429 | Too Many Requests | İstek limiti aşıldı (rota katmanı 120/dk veya hesap limitiniz) |
| 500 | Server Error | Sunucu 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,429ve bağlantı hataları. 4xxyanı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
2xxdönün. - Aynı olay birden fazla kez ulaşabilir; işleyicinizi idempotent yazın (
shipment_id+new_statusikilisini 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
Shopify yönetim paneline girin
Shopify Admin → Settings → Apps and sales channels
-
2
Uygulama geliştirmeyi açın
Develop apps → Create an app. Uygulamaya bir isim verin (ör. "KargoSeç").
-
3
Yetkileri seçin
Configure Admin API scopes adımında şu iki yetkiyi işaretleyin:
read_ordersvewrite_merchant_managed_fulfillment_orders -
4
Uygulamayı kurun
Install app ile uygulamayı mağazanıza kurun.
-
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
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