Gönderi oluşturma: tekil, toplu ve Idempotency-Key
Tekil ve toplu gönderi oluşturma, istek alanları, birimler, Idempotency-Key ile güvenli tekrar ve aynı sipariş numarasıyla yeniden gönderim.
Güncelleme:
Gönderi oluşturma asenkrondur. API isteği doğrular, gönderiyi sıraya alır ve hemen 202 döner. Kargo firmasına iletim arka planda yapılır; sonuç gönderinin state alanına yansır.
- Senkron ret (
422): kabulde bilinen kurallar: alan biçimi, sipariş numarasının firmaya uygunluğu, firmaya özel seçenekler, hesap kuralları. Gönderi oluşmaz. - Asenkron ret (
failed): kargo firması gönderiyi kendisi reddederse gönderifailedolur, nedenlast_erroralanına yazılır. Düzeltip yeniden gönderebilirsiniz (İptal ve düzeltme). - Hesap askıda ya da kapalıysa (
403 tenant_not_active): yeni gönderi kabul edilmez; tekil ve toplu oluşturma aynı kodu döner. Gövdedenotice(code,reason,action,message) bulunabilir;messagekullanıcıya gösterilebilecek açıklamadır. - Kargo hesabının bilgileri eksikse (
422 carrier_account_incomplete): hesabın gönderi için gereken bilgileri henüz dolmamıştır; eksik alanların adlarımissing'dedir. Bilgiler hesap doğrulandığında gelir; sonra tekrar deneyin.
Tekil gönderi
POST /api/v3/shipments (scope shipments:write)
{
"reference": "SIP-1001",
"carrier": "yurtici",
"carrier_account_id": 12,
"recipient": {
"name": "Ayşe Yılmaz",
"phone": "05321234567",
"email": "ayse@example.com",
"address_line": "Atatürk Cad. No: 10 D: 3",
"neighborhood": "Kızılay Mah.",
"district": "Çankaya",
"city": "Ankara",
"postal_code": "06420"
},
"parcels": [{ "weight_grams": 1500, "length_mm": 300, "width_mm": 200, "height_mm": 100, "quantity": 1 }],
"payer": "sender",
"cash_on_delivery": { "amount": 149990, "currency": "TRY", "collection_method": "cash" },
"declared_value": { "amount": 149990, "currency": "TRY" },
"content_description": "Tekstil ürünü",
"invoice_number": "ABC2026000001234"
}Yanıt 202:
{ "data": { "id": "01JB…", "reference": "SIP-1001", "state": "pending", "…": "…" }, "resubmitted": false }Alanlar
| Alan | Tip | Kural |
|---|---|---|
reference | string, 1–64 | Zorunlu. Sipariş numaranız. Kargo firmasının numara kuralına uymazsa 422 carrier_reference_rejected; numara kırpılmaz. |
carrier | enum | Zorunlu. ptt, yurtici, dhl_ecommerce, hepsijet, aras, surat, kolay_gelsin. Paketinizde olmayan firma 422 carrier_not_in_plan. |
carrier_account_id | integer | İsteğe bağlı. Yoksa o firmadaki varsayılan hesabınız kullanılır; hesap yoksa 422 no_carrier_account. |
recipient | object | name, phone, address_line, district, city zorunlu; email, neighborhood, postal_code isteğe bağlı. |
parcels | array, 1–50 | Her koli: weight_grams (isteğe bağlı; girilirse en az 1 ve kargo firmasına iletilir), length_mm / width_mm / height_mm (üçü birlikte), quantity 1–999, declared_desi. |
payer | sender | recipient | Kargo ücretini kim öder. Varsayılan sender. |
cash_on_delivery | {amount, currency, collection_method} | Kapıda ödeme. amount > 0; collection_method zorunlu: cash ya da card. |
declared_value | {amount, currency} | Beyan değeri, ≥ 0. |
content_description | string, en çok 255 | Paket içeriği. |
invoice_number | string, en çok 64 | Fatura numarası. Tek fatura alanıdır: kargo firması fatura numarası istiyorsa bu alan kullanılır, options içinde ayrı fatura alanı yoktur. Firmaya göre uzunluğu ve zorunluluğu gönderi formu şemasında (Firma notları). |
options | object | Firmaya özel alanlar. Yalnız firmanın gönderi formundaki anahtarlar kabul edilir (Firma notları); başka bir anahtar 422 validation_failed, alan kodu not_allowed. Fatura numarası options içinde değil, invoice_number'dadır. |
Birimler ve biçimler:
- Para kuruş cinsinden tamsayı ve para birimi:
{"amount": 149990, "currency": "TRY"}= 1.499,90 TL. - Ağırlık gram, ölçüler milimetre.
- Desi ondalık string:
"2.5". Sayı değil, yuvarlama farkı olmasın diye metin. - Telefon: Türkiye numarası;
+90,0ile ya da 10 hane yazılabilir, API normalleştirir. Yanıtta+905321234567biçiminde döner. - İl ve ilçe adı metin olarak gönderilir. API'nin il ve ilçe sözlüğü:
GET /api/v3/geo/cities,GET /api/v3/geo/districts.
Aynı sipariş numarası
Sipariş numarası bir kanalda, kargo firması başına tekildir.
- Aynı numarayla aynı firmaya gönderi işlenmekteyse ya da oluşmuşsa:
409 reference_in_use. Problem gövdesinde mevcut gönderinin kimliği ve durumu (shipment_id,shipment_status) döner. - Aynı numaralı gönderi
failedya daaddress_reviewdurumundaysa yeni istek onu yeniden kuyruğa alır: yanıt202veresubmitted: true. Böylece başarısız siparişi aynı numarayla yeniden göndermek için önce silmeniz gerekmez. - Aynı numaralı gönderi kargo firmasında oluşup iptal edildiyse numara aynı firmada yeniden kullanılamaz. İstek kabul edilir (
202), ama gönderifailedolur:last_error.codereference_used_at_carrier,retryable: false. Yeniden deneme ya da düzeltme sonucu değiştirmez (düzeltmede sipariş numarası değişmez); siparişi yeni bir numarayla gönderin.
Toplu gönderi
POST /api/v3/shipments/batch (scope shipments:write), gövde {"items": [ … ]}. Her kalem tekil gönderinin gövdesiyle aynıdır. En çok 100 kalem.
Kalemler bağımsızdır: biri reddedilirse diğerleri yine kabul edilir. Yanıt 200:
{
"data": [
{ "index": 0, "status": "accepted", "shipment": { "id": "01JB…", "state": "pending" }, "resubmitted": false },
{
"index": 1,
"status": "rejected",
"error": {
"status": 422,
"code": "validation_failed",
"errors": [{ "field": "recipient.phone", "code": "invalid", "detail": "…" }]
}
}
]
}index, isteğinizdeki kalemin sırasıdır (0'dan başlar).- Reddedilen kalemin
erroralanı tekil istekteki problem gövdesinin aynısıdır. - Toplu istek, hız sınırında tek istek sayılır (Hatalar ve sınırlar).
Idempotency-Key
Ağ hatasında isteği güvenle tekrarlamak için Idempotency-Key başlığı gönderin. Oluşturma ve toplu oluşturmada zorunlu değil, önerilir. İptal, yeniden deneme ve düzeltme uçları da bu başlığı kabul eder.
Idempotency-Key: 6f1c2b7e-9d3a-4c1e-8b2f-0a5e7d9c4b11- 1–255 karakter, yazdırılabilir ASCII. İstek başına benzersiz bir değer üretin (ör. UUID) ve tekrar denemelerde aynı değeri gönderin.
- Anahtar hesabınızın API kanalında (bütün API istemcileriniz için ortak) 24 saat geçerlidir; istemciler arasında çakışmayan anahtarlar kullanın (ör. sipariş numarası + istemci öneki).
| Durum | Sonuç |
|---|---|
| Aynı anahtar, aynı istek | İlk yanıt aynen döner, Idempotent-Replayed: true başlığıyla. Güncel durum için GET. |
| Aynı anahtar, farklı gövde | 422 idempotency_key_reused |
| Aynı anahtarla ilk istek hâlâ işleniyor | 409 idempotency_key_in_progress; kısa bir süre sonra aynı anahtarla tekrar deneyin. |
422doğrulama hataları saklanmaz: hatayı düzeltip aynı anahtarla tekrar gönderebilirsiniz.200/202yanıtları ve409durum hataları saklanır.5xxsaklanmaz.- Anahtar göndermeseniz de sipariş numarası tekilliği çift gönderiyi önler (
409 reference_in_use).
Gönderinin yanıttaki hali
| Alan | Anlamı |
|---|---|
id | Gönderi kimliği (ULID). Sonraki isteklerde bunu kullanın. |
state | İşlem durumu (Gönderileri izleme). |
tracking_status | Kargo firmasındaki durum; gönderi created olduktan sonra dolar. |
tracking_number, tracking_url | Takip numarası ve takip bağlantısı; kargo firması verdiğinde dolar. |
channel, capabilities | Kanal ve şu an yapılabilecek işlemler (Gönderileri izleme). |
last_error | {code, message, retryable}; failed ve retry_scheduled durumlarında son hata, created'da iptal reddinden sonra (İptal sonucu). |
address_review | {reason, candidates}; yalnız adres incelemesinde (İptal ve düzeltme). |
parcels[].barcodes | Koli barkodları (firma veriyorsa); vermeyen firmalarda dizi boştur. |
version | Gönderi her değiştiğinde artar. |
accepted_at, submitted_at, picked_up_at, delivered_at, returned_at, canceled_at, updated_at | Zaman damgaları (UTC). |
Alıcı bilgileri yalnız tekil getirmede (GET /shipments/{id}) döner. Saklama süresi dolup silinmiş alıcı bilgisi null olur.
