Fraud & Fraud AI
Hatalar ve Yeniden Deneme

Hatalar, tekrarlı istekler ve yeniden deneme

Fraud uçları platformun tek hata zarfını kullanır. Bu sayfa yalnız fraud'a özgü kodları, kota yanıtını ve yeniden deneme kurallarını toplar.

🚫

message değil code üzerinden dallanın. message insan içindir, çevrilir ve zamanla değişir. code sözleşmenin parçasıdır.

Hata zarfı

{
  "status": "failure",
  "code": "FRAUD_CHANNEL_NOT_DECLARABLE",
  "message": "…",
  "statusCode": 400,
  "timestamp": "2026-10-05T09:12:44.816Z",
  "service": "api-gateway",
  "systemTime": 1791277964816,
  "requestId": "req_7f3d9c1a4b2e"
}

requestId her yanıtta X-Request-Id başlığında da döner. Bir destek talebinde verdiğiniz değer budur.

Başarılı yanıtta status

⚠️

Başarı zarfında success alanı yoktur. Fraud uçlarının başarılı yanıtı üst seviyede status: "success" taşır; yük data altındadır. İstemcide response.success okuyan bir kontrol her zaman undefined görür — status alanını ya da HTTP durum kodunu okuyun.

Karar API'si — doğrulama hataları (400)

codeNeden
VALIDATION_ERRORBir alan tipi ya da uzunluğu geçersiz, ya da belgelenmemiş bir üst seviye alan gönderildi. Alan kırılımı details.errors içinde döner
FRAUD_CHANNEL_NOT_DECLARABLEYalnız Lunixi'nin kendi servislerine ait bir kanal ya da ürün bağlamı beyan edildi (ör. productContext: hosted_payment_form)
FRAUD_SUB_MERCHANT_REF_MISMATCHsubMerchantRef ile merchant.merchantRef farklı. İkisi aynı kavramdır; hangi alt işyerinin değerlendirildiği belirsiz kalamaz
FRAUD_SUB_MERCHANT_REF_INVALIDAlt işyeri referansı biçime uymuyor (harf, rakam ve . _ : @ -; en fazla 180 karakter)
FRAUD_ASSERTION_CHANNEL_INVALIDidentityAssertion yalnız channel: merchant_form ile gönderilebilir
FRAUD_ASSERTION_SUBJECT_REQUIREDidentityAssertion gönderildi ama subjectId yok. Bağlanacak bir konu olmadan artefakt doğrulanamaz

channel ve integrationMode kapalı sözlüklerdir. Dışarıdan beyan edilebilen kanallar merchant_form ve standalone_api; integrationMode yalnız standalone olabilir. lunixi_checkout ve wallet kanalları Lunixi'nin kendi servislerinden gelir, çünkü o kanallara bağlı akışların dışarıdan tetiklenmesi doğru olmazdı.

Olay alımı — doğrulama hataları (400)

codeNeden
FRAUD_EVENT_INVALIDZorunlu alan eksik, eventType sözlük dışı, sözlüklü bir alan tanınmayan değer taşıyor, ya da olay türünün gerektirdiği alan yok
FRAUD_EVENT_BATCH_INVALIDParti gövdesi ne bir dizi ne de { "events": [...] }
FRAUD_EVENT_BATCH_TOO_LARGEParti 500 olaydan fazla. Partinin tamamı reddedilir

Parti çağrısında tek tek olayların doğrulaması results[].error alanında döner ve HTTP durumu 200 kalır — failed alanını her zaman kontrol edin. Beklenmeyen bir iç hata o olayda FRAUD_EVENT_INGEST_FAILED olarak görünür; ayrıntı yanıta çıkmaz.

Kimlik doğrulama (401 / 403)

codeDurumNeden
AUTH_HEADERS_MISSING401X-Key-Id, X-Date, X-Nonce ya da X-Signature yok
INVALID_DATE401X-Date beş dakikalık pencerenin dışında
NONCE_REPLAY401Aynı anahtar + aynı nonce ikinci kez kullanıldı
INVALID_KID401X-Key-Id tanınmıyor
DIGEST_MISSING401Gövdesi olan istekte Digest başlığı yok
INVALID_DIGEST401Özet gövdeyle uyuşmuyor — neredeyse her zaman girintili JSON imzalanmasından kaynaklanır
INVALID_SIGNATURE401Kanonik dizgenin imzası doğrulanamadı
MERCHANT_SUSPENDED403Hesap etkin değil
IP_NOT_ALLOWED403İstek, anahtara tanımlı IP listesi dışından geldi

Yetki ve ürün kapısı (403 / 503)

codeDurumNeden
PRODUCT_NOT_ENABLED403Kimlik FRAUD_SERVICE ürününe yetkili değil
PRODUCT_ENTITLEMENT_UNAVAILABLE503Ürün yetkisi doğrulanamadı. Geçicidir; Retry-After varsa ona uyun
PRODUCT_ENTITLEMENT_NOT_RESOLVED403Token ürün damgası olmadan basılmış
fraud.module.not_enabled403subMerchantRef gönderildi ama hesapta alt işyeri / ödeme kuruluşu modülü açık değil. details.module hangi modül olduğunu söyler
FRAUD_PANEL_SURFACE_NOT_MACHINE_CALLABLE403İstenen uç fraud operasyon konsoluna aittir ve API anahtarıyla çağrılamaz
⚠️

Panel yüzeyi ile API yüzeyi ayrıdır. API anahtarıyla çağrılabilen fraud uçları yalnız bu dokümantasyonda belgelenenlerdir: karar, olay alımı ve karar kayıtları. Operasyon konsolunun uçları panel oturumuyla çalışır ve varsayılan olarak makine çağıranına kapalıdır.

Sayfalama (400)

codeNeden
INVALID_CURSORcursor değeri bozuk. Sessizce ilk sayfaya dönülmez: bir mutabakat döngüsünde aynı sayfanın iki kez işlenmesi demek olurdu

Kota (429 / 503)

codeDurumNeden
fraud.quota.exceeded429Günlük kota doldu ya da istek hızı limiti aşıldı. details.breach hangisi olduğunu söyler
fraud.quota.unavailable503Kota arka ucuna erişilemedi. Yalnız olay alımında döner

Karar yolu kota arka ucu erişilemezse durmaz. Kota kontrolü atlanır ve karar üretilmeye devam eder; ödeme bir sayaç yüzünden durmamalıdır. Olay alımında ise 503 döner: olayı yeniden gönderebilirsiniz, böylece ne olay kaybolur ne de kota delinir.

Kota başlıkları

Kota reddinde yanıt şu başlıkları taşır. Değerler uydurulmaz: hepsi kotayı uygulayan katmanın döndürdüğü gerçek sayılardır, dolayısıyla bir değer bilinmiyorsa o başlık hiç basılmaz.

BaşlıkAnlamı
Retry-AfterKaç saniye sonra yeniden denenebilir
X-RateLimit-LimitHız limiti
X-RateLimit-RemainingPencerede kalan istek
X-RateLimit-ResetGünlük sayacın sıfırlanma anı (epoch saniye)
X-Quota-LimitGünlük kota
X-Quota-RemainingGünlük kotadan kalan
X-Quota-ResetGünlük kotanın sıfırlanma anı (epoch saniye)

Aynı değerler yanıt gövdesinin details.quota alanında da döner. Başlıkların yokluğunu bir limit tahminine çevirmeyin — yanlış hızda yeniden denemeye yol açar.

Kota eşiğine yaklaştığınızda fraud.quota.threshold_reached platform webhook olayı gönderilir. Teslimat ve imza: Webhook kurulumu.

Tekrarlı istekler

⚠️

Fraud uçlarında Idempotency-Key başlığı bir tekrar bastırma mekanizması değildir. Tekrar bastırma uca göre farklı çalışır:

UçTekrar davranışı
POST /fraud/events/transactionseventId üzerinden bastırılır. Aynı hesap + aynı eventId ikinci kez yazılmaz; yanıt deduplicated: true döner. Yeniden deneme güvenlidir
POST /fraud/events/transactions/batchHer olay kendi eventId değeriyle tek tek bastırılır. Partiyi bütün olarak yeniden gönderebilirsiniz
POST /fraud/decisions/evaluateBastırma yoktur. İkinci çağrı ikinci bir karar ve ikinci bir karar kaydı üretir. Faturalamada aynı transactionRef 30 gün boyunca tek işlem sayılır, ancak bu bir tekrar bastırma değildir — karar yeniden hesaplanır
GET uçlarıDoğası gereği tekrarlanabilir

Yeniden deneme kuralları

DurumYeniden denenir mi
400 (doğrulama)Hayır. İsteği düzeltin; aynı istek her zaman aynı yanıtı verir
401 imza / nonce / tarihYalnız yeni bir nonce ve yeni bir X-Date ile. Aynı imzayı tekrar göndermek NONCE_REPLAY verir
403 ürün / modül kapısıHayır. Yetkilendirme gerekir
429Evet, Retry-After kadar bekledikten sonra
503Evet, Retry-After kadar bekledikten sonra
5xx (diğer)Olay alımında evet, aynı eventId ile. Karar çağrısında otomatik yeniden denemeyin: ödeme anındaki kararın zamanlaması çağıranın elindedir
🚫

Karar çağrısını kör döngüyle yeniden denemeyin. Kart hamili bir yanıt bekliyor; sonsuz deneme hem gecikmeyi büyütür hem de kotanızı tüketir. Karar alınamadığında kendi iş kuralınızı uygulayın (ödemeyi durdurun, elle incelemeye alın ya da kendi yedek eşiğinizle devam edin) ve bu durumu kendi tarafınızda ölçün.

Sonraki adım