Nasıl çalışır?
Yazma işlemi yapan tümPOST endpoint’leri Idempotency-Key header’ını kabul eder. Aynı anahtarla gönderilen ikinci istek, ilk yanıtın birebir aynısını döner — yeni bir işlem oluşmaz.
Idempotent-Replayed: true header’ını ekler:
Anahtar kuralları
| Kural | Değer |
|---|---|
| Format | UUID v7 önerilir (RFC 9562, zaman-sıralı — debug ve audit’te kronolojiyi korur). UUID v4 veya başka herhangi bir string de kabul edilir. |
| Maksimum uzunluk | 128 karakter |
| Saklama süresi | Ödeme endpoint’lerinde (POST /payments ve alt-akışlar) 24 saat; diğer yazma endpoint’lerinde 3 dakika. Hassas işlemler (refund, void, capture, transfer) ödeme endpoint’leri kapsamındadır. |
| Eşsiz olma kapsamı | Tenant + endpoint kombinasyonu içinde |
| Body değişikliği | Aynı anahtarla farklı body → 409 idempotency_key_in_use |
Anahtar tenant düzeyinde scope’lanır — farklı bir tenant aynı anahtarla başka bir
işlem oluşturabilir, bu beklenen davranıştır.
Senaryolar
Başarılı istek + tekrar deneme
Başarılı istek + tekrar deneme
- İstemci
POST /paymentsgönderir,Idempotency-Key: order-1001-payment. - Payven işlemi başarıyla yapar,
200 OKdöner. - İstemci network timeout aldığını sanıp aynı isteği aynı anahtarla tekrar gönderir.
- Payven yeni ödeme oluşturmaz; ilk yanıtı döner ve
Idempotent-Replayed: trueheader’ı ekler.
Eşzamanlı tekrar istek
Eşzamanlı tekrar istek
- İki istek aynı anda atılır, ikisinde de
Idempotency-Key: ABC123. - Birinci istek işlenmeye başlar — cache’e eklenir.
- İkinci istek cache’e ulaştığında ilk yanıt henüz hazırsa onu döner; değilse (race) backend’in deduplication mantığı devreye girer.
Aynı anahtar farklı payload ile
Aynı anahtar farklı payload ile
- İstemci
Idempotency-Key: ABC123ile15000kuruşluk ödeme atar. - Aynı anahtarla
25000kuruşluk ödeme atar. - Payven
409 Conflictdöner — anahtar farklı body için kullanılmış:
TTL süresi sonrası
TTL süresi sonrası
- Saklama süresi dolmuş bir anahtar (ödemeler için 24 saat, diğer endpoint’ler için 3 dakika).
- Aynı anahtar tekrar kullanılırsa yeni bir işlem oluşur — cache temizlenmiş.
- Bu nedenle uzun süreli retry mantığında her seferinde anahtar üretmek değil, üst seviye iş kimliğini (örn.
order_id) anahtar olarak kullanmak daha güvenlidir.
Önerilen kullanım
İstemci tarafında yüksek seviye iş kimliğini anahtar olarak kullanın. Böylece aynı sipariş için yapılan tüm tekrar denemeler aynı işleme yönlendirilir.Hangi endpoint’lerde kullanın
| Kategori | Idempotency |
|---|---|
POST /api/v1/payments (Non-3D ödeme) | Önerilir |
POST /api/v1/payments/3d/init (3DS init) | Önerilir |
POST /api/v1/payments/{id}/refund (iade) | Şiddetle önerilir — aynı tutarın iki kez iade edilmesini engeller |
POST /api/v1/payments/{id}/void (iptal) | Şiddetle önerilir |
POST /api/v1/payments/{id}/capture (ön provizyon çekimi) | Şiddetle önerilir |
POST /api/v1/checkout/sessions (hosted checkout) | Önerilir |
POST /api/v1/transfers/... (para transferi) | Şiddetle önerilir |
POST /api/v1/webhook-subscriptions | Opsiyonel |
GET istekleri | İhtiyaç yok — GET doğası gereği idempotenttir |