İçeriğe geç
SiparişTakip ana sayfa

İptal, yeniden deneme ve düzeltme

Gönderi iptali, başarısız gönderiyi aynı veriyle yeniden deneme, alanları düzeltip yeniden gönderme, adres incelemesinde ilçe seçimi ve takibi durdurma.

Güncelleme:

Başarısız ya da yanlış oluşturulmuş bir gönderiyi kurtarmanın dört yolu var. Hepsi Idempotency-Key başlığını kabul eder (Gönderi oluşturma).

İşlemUçScopeNe zaman
İptalPOST /shipments/{id}/cancelshipments:cancelGönderiye artık gerek yoksa
Yeniden denemePOST /shipments/{id}/retryshipments:writefailed, veri doğruysa
DüzeltmePATCH /shipments/{id}shipments:writefailed ya da address_review, veri yanlışsa
İlçe seçimiPATCH /shipments/{id}/addressshipments:writeaddress_review

Bir işlemin şu an yapılıp yapılamayacağını gönderinin capabilities alanı söyler: cancel, retry, correct (düzeltme), choose_district (ilçe seçimi), stop_tracking (takibi durdurma). Düğmelerinizi bu alana göre gösterin; kuralı state'ten kendiniz türetmeyin. Değer yanıt anındaki görüntüdür: arada durum değişmişse uç yine 409 döner.

İptal

POST /api/v3/shipments/{id}/cancel (scope shipments:cancel), gövdesiz.

Gönderinin durumuSonuç
Kargo firmasına henüz gitmemiş (pending, awaiting_quota, address_review, retry_scheduled, failed)Hemen iptal: 200, state: "canceled".
Zaten iptal200; aynı istek ikinci kez zarar vermez.
İptal talebi zaten açık (cancel_requested: true)202, aynı yanıt; yeni talep açılmaz.
Kargo firmasında oluşmuş (created) ya da gönderilmekte (submitting, needs_reconciliation); hesapta cancel: carrier ya da localİptal istenir: her zaman 202, cancel_requested: true. Sonuç asenkrondur (İptal sonucu).
Hesapta iptal yok (cancel: none)409 cancel_not_supported.
Teslim ya da iade edilmiş, ya da kargo firmasının teslim aldığı gönderi409 shipment_not_cancelable.
Gönderi o anda başka bir işlemde (ör. kargo firmasına gönderiliyor)409 shipment_busy; kısa süre sonra tekrar deneyin.

409 shipment_not_cancelable gövdesinde gönderinin durumu döner: shipment_status (state) ve tracking_status (kargo firmasındaki durum). Gönderinin capabilities.cancel alanı aynı kuralla false'tur; düğmenizi bu alana göre gizlerseniz uç da aynı cevabı verir.

Açık bir iptal talebi varken de capabilities.cancel false'tur, ama tekrarlanan istek (ör. iki sekmeden) 409 değil, aynı 202 yanıtını alır.

Kargo hesabına göre iptal

Kargo firmasında oluşmuş gönderinin iptali kargo hesabına bağlıdır. Hesabın desteği GET /api/v3/carrier-accounts yanıtındaki capabilities.cancel alanındadır:

capabilities.cancelAnlamı
carrierİptal kargo firmasına iletilir.
localİptal bizim tarafımızda yapılır, kargo firmasına iptal isteği gitmez. Karardan hemen önce gönderinin kargo firmasındaki durumu sorgulanır: gönderi kargo firmasında kabul edilmiş ya da hareket görmüşse iptal edilmez.
noneKargo firmasında oluşmuş gönderi iptal edilemez: 409 cancel_not_supported.

carrier ve local hesapta iptal 202 ile istenir ve sonucu asenkrondur. Değer firmaya değil hesaba bağlıdır ve değişebilir; firmaya göre sabit bir liste tutmayın. Tek bir gönderi için gönderinin capabilities.cancel alanına, hesap için hesabın capabilities.cancel alanına bakın. Kargo firmasına henüz gitmemiş gönderi her hesapta iptal edilebilir.

İptal sonucu

202'den sonra gönderiyi GET /api/v3/shipments/{id} ile okuyun (ya da listeyi updated_since ile izleyin):

SonuçGönderide
İptal sürüyorstate created, cancel_requested: true. Kargo firmasındaki geçici bir hatada talep düşmez, kendiliğinden yeniden denenir; bu sırada cancel_requested true kalır.
İptal edildistate: "canceled", canceled_at dolu.
İptal edilmedistate created kalır, cancel_requested: false, last_error.code: "not_cancelable". Gönderi toplanmış ya da yoldadır; gönderi devam eder.
İptal doğrulanamadıstate created kalır, cancel_requested: false, last_error.code: "cancel_unconfirmed". İptal istendi ama kargo firmasında doğrulanamadı; kontrolü biz yaparız.

cancel_unconfirmed sonrasında: gönderi ne iptal ne yolda sayılır; beklemeniz gerekmez. Aynı iptal isteğini tekrarlamayın, aynı sonuç döner. Gerekirse destekle görüşün. Gönderi sonradan kargo firmasında iptal edilirse takip durumu tracking_status: "canceled_by_carrier" olur; bu durumda yeni bir iptal isteği hemen 200 ve state: "canceled" döner.

Red sonrası yeni istek: not_cancelable ya da cancel_unconfirmed sonrasında talep kapanmıştır (cancel_requested: false). Yeni bir iptal isteği iptal kuralıyla yeniden değerlendirilir:

  • Teslim ya da iade edilmiş gönderi: 409 shipment_not_cancelable.
  • Hesapta cancel: local ise kargo firmasının teslim aldığı ya da hareket görmüş gönderi de 409 shipment_not_cancelable alır.
  • Diğer durumlarda yeniden 202. Hesapta cancel: carrier ise yoldaki gönderinin iptali de yeniden istenebilir; kararı kargo firması verir, yine reddederse last_error.code yeniden not_cancelable olur.

Yeniden istemeden önce gönderinin capabilities.cancel alanına bakın; false ise uç 409 döner.

last_error kodlarının tam listesi API referansında (x-last-error-codes).

Yeniden deneme

POST /api/v3/shipments/{id}/retry, gövdesiz. Yalnız failed gönderide çalışır ve veriyi değiştirmeden yeniden sıraya alır: örneğin kargo hesabı bilgilerinizi düzelttikten sonra. Başka durumda 409 shipment_not_retryable (gövdede gönderinin durumu shipment_status).

Aynı sipariş numarasıyla yeni bir oluşturma isteği göndermek de failed gönderiyi yeniden sıraya alır (resubmitted: true).

Düzeltme

PATCH /api/v3/shipments/{id}: failed ya da address_review durumundaki gönderinin alanlarını değiştirip yeniden gönderir (capabilities.correct). Gövde oluşturma gövdesinin alanlarını alır, hepsi isteğe bağlıdır ve JSON Merge Patch (RFC 7396) kuralıyla gönderinin bugünkü verisine uygulanır:

  • Yalnız gönderdiğiniz alanlar değişir.
  • recipient ve options alan alan birleşir: recipient.phone gönderirseniz alıcının yalnız telefonu değişir.
  • Bir alana null göndermek onu siler. Zorunlu bir alan silinirse 422.
  • parcels gönderilirse koli listesinin tamamı yenisiyle değişir.
curl -X PATCH https://api.siparistakip.com/api/v3/shipments/01JB… \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/merge-patch+json" \
  -d '{"recipient": {"phone": "5321234567", "address_line": "Atatürk Cad. No: 12 D: 3"}}'

Birleşen veri oluşturmadaki kurallarla yeniden doğrulanır: alan kuralları ve kargo hesabının gönderi formu (Firma notları). Yanıt 202, state: "pending"; varış adresi yeniden çözülür, çözülemezse gönderi address_review olur.

DurumSonuç
Boş gövde {}Geçerli; veri değişmeden yeniden gönderilir. failed'da yeniden denemeyle aynıdır.
reference ya da carrier gönderildi422 validation_failed, alan kodu not_allowed. Bunlar değişmez.
carrier_account_id aynı firmadaki başka bir aktif hesabınızKabul. Başka firmanın hesabı ya da aktif olmayan hesap 422. Firma değiştirmek için iptal edip yeni gönderin.
Gövde JSON nesnesi değil400 bad_request.
Content-Type application/merge-patch+json ya da application/json değil415 unsupported_media_type. İki tür aynı işlenir.
Gönderi failed ya da address_review değil409 shipment_not_correctable (gövdede shipment_status).
Gönderi o anda başka bir işlemde409 shipment_busy.

Yalnız API kanalınızdaki gönderiyi düzeltebilirsiniz; panelden ya da eklentiden açılan gönderi 404 döner. Düzeltme, ilçe seçimi ve yeniden deneme yeni kredi harcamaz.

Çift gönderi koruması

Kargo firmasında oluşmuş (created) ya da sipariş numarası serbest kalmış gönderi hiçbir yoldan yeniden gönderilmez: yeniden deneme 409 shipment_not_retryable, düzeltme 409 shipment_not_correctable, aynı numarayla oluşturma 409 reference_in_use döner. Gönderinin capabilities.retry ve capabilities.correct alanları bu durumda false'tur.

İptal edilen gönderinin numarası serbest kalır, ama aynı kargo firmasında yeniden kullanılamaz: aynı firmaya bu numarayla açılan yeni gönderi failed olur (reference_used_at_carrier). Yeni bir numara kullanın (Aynı sipariş numarası).

Adres incelemesi ve ilçe seçimi

Gönderi address_review durumundaysa address_review alanı nedeni ve aday ilçeleri taşır:

{
  "address_review": {
    "reason": "ambiguous",
    "candidates": [{ "district_id": 1234, "district": "Çankaya", "city": "Ankara" }]
  }
}

Adaylardan birini ya da ilçe sözlüğünden (GET /api/v3/geo/districts) doğru ilçeyi seçip gönderin:

curl -X PATCH https://api.siparistakip.com/api/v3/shipments/01JB…/address \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"district_id": 1234}'
reasonAnlamı
unmatchedAdresteki ilçe bulunamadı.
ambiguousBirden çok ilçeye uyuyor; adaylardan birini seçin.
low_confidenceEşleşme zayıf; doğru ilçeyi onaylayın.
carrier_mapping_missingİlçenin kargo firması karşılığı platformda eksik; sorun isteğinizde değil.

Aday listesi boş olsa da ilçe seçebilirsiniz: seçim adaylarla sınırlı değildir, ilçe sözlüğündeki herhangi bir ilçe olabilir. Yanıt 202; gönderi yeniden sıraya alınır. Seçim yalnız bu gönderiye uygulanır.

İlçe sözlüğünde olmayan district_id 422; address_review dışındaki gönderi 409 shipment_not_correctable. Content-Type, shipment_busy ve Idempotency-Key düzeltmedeki gibidir.

carrier_mapping_missing'de ilçe seçimi yapılamaz (capabilities.choose_district: false) ve uç 409 address_issue_on_platform döner. Seçtiğiniz ilçenin kargo firması karşılığı eksikse de aynı kod döner.

Takibi durdurma

POST /api/v3/shipments/{id}/stop-tracking (scope shipments:write), gövdesiz; Idempotency-Key isteğe bağlıdır. Kargo firmasında oluşmuş (created) bir gönderinin takibini kapatır; yanıt 200 ve gönderinin güncel hali. Yalnız API istemcinizin kanalındaki gönderiler durdurulabilir: başka kanalın gönderisi okuma uçlarındaki gibi 404 not_found döner (Tekil gönderi).

  • İptal değildir: kargo firmasına istek gitmez, durdurma yalnız SiparişTakip'te kaydedilir; gönderi kargo firmasında olduğu gibi kalır. Gönderiyi iptal etmek için İptal ucunu kullanın.
  • Geri alınmaz: takibi durdurulan gönderinin takibi yeniden açılamaz.
  • Durdurulduktan sonra yeni takip hareketi gelmez; teslim ya da iade bilgisi de gelmez.
  • Takip süren gönderide takip durur, stop_reason customer olur.
  • Takip kalıcı olmayan bir sebeple durmuşsa (not_found, not_picked_up, untrackable) çağrı sebebi customer'a çevirir; stopped_at değişmez. Böylece takip sonradan kendiliğinden yeniden başlamaz.
  • Sebep zaten customer ya da carrier_final ise (ya da başka kalıcı bir sebepse) 200 döner, gönderi değişmez. Aynı istek tekrarlanırsa da aynı 200 yanıtı döner.
  • Gönderi kargo firmasında oluşmamışsa (created dışında her durum) 409 shipment_not_trackable. Gönderinin capabilities.stop_tracking alanı aynı kuralla false'tur.

Gönderinin tracking alanı her zaman bir nesnedir, kendisi hiçbir zaman null olmaz:

AlanAnlamı
tracking.stopped_atTakibin durduğu an (UTC).
tracking.stop_reasonTakibin neden durduğu (aşağıdaki tablo).

Takip sürerken ya da gönderi henüz kargo firmasında oluşmamışken (pending, failed…) iki alan da null'dır. Kalıcı olmayan bir sebeple duran takip yeniden başlarsa iki alan yeniden null olur.

stop_reasonAnlamı
customerTakibi siz ya da panel kullanıcısı durdurdu (stop-tracking). Kalıcıdır.
carrier_finalKargo firması son durumu bildirdi (teslim, iade, firma iptali, kayıp ya da hasar); takip doğal olarak bitti.
not_foundKargo firması gönderiyi tanımıyor; bekleme süresi doldu.
not_picked_upKargo firması paketi teslim almadı; 30 gün hareket gelmediği için takip durdu.
untrackableBu kargo hesabında takip yapılamıyor. Hesapta takip açılınca yeni gönderiler takip edilir.
otherDiğer platform sebepleri (ör. uzun süre hareketsiz, hesap kapatıldı).

Listeye ileride yeni değer eklenebilir; tanımadığınız bir değeri other gibi ele alın.

Kargo entegrasyonunuzu bugün kurun

Ücretsiz paketle başlayın, kart bilgisi istemiyoruz. Kargo hesabınızı bağlayın, ilk gönderinizi oluşturun.

Fiyatları görÜcretsiz başla