Başlarken
Hata Yönetimi

Hata Yönetimi

Hata yanıtları tek bir zarf kullanır. Hatanın nereden çıktığı (kimlik doğrulama, yetki, iş kuralı, servis) fark etmez — alanlar aynıdır.

{
  "status": "failure",
  "code": "payment.card.declined",
  "message": "Kart reddedildi",
  "statusCode": 409,
  "timestamp": "2026-08-17T10:32:23.816Z",
  "service": "api-gateway",
  "systemTime": 1786962743816,
  "requestId": "req_7f3d9c1a4b2e",
  "docsUrl": "https://docs.lunixi.com/tr/getting-started/errors#INVALID_SIGNATURE"
}
🚫

message'a göre değil, code'a göre dallanın.

message insan içindir: çevrilir ve zamanla değişir. code sözleşmenin parçasıdır ve sabittir. Mesaj metnine göre if yazan bir entegrasyon, sözlüğe yeni bir dil ya da yeni bir metin girdiğimiz gün sessizce kırılır — ve bu artık teorik değil, çeviri yürürlükte.

Alanlar

AlanTipNot
statusstringHatada daima "failure"
codestringNoktalı granular kod (payment.card.declined) — dallanma bunun üzerinden
messagestringİnsan-okur açıklama; çevrilebilir
statusCodenumberHTTP durumu, gövdede de tekrarlanır
timestampstringISO 8601
servicestringHatayı üreten servis
systemTimenumberepoch milisaniye
requestIdstringKorelasyon anahtarı — destek talebinde bu değeri iletin
detailsobjectOpsiyonel — yalnız varsa eklenir
docsUrlstringOpsiyonel — yalnız dokümante edilmiş hatalarda döner
⚠️

docsUrl her hatada gelmez. Yalnız entegratörün kendisinin düzeltebileceği hatalar bir doküman bağlantısı taşır. Sunucu kaynaklı hatalarda (INTERNAL_ERROR, MICROSERVICE_ERROR, gateway.error …) alan hiç eklenmez — boş string ya da null değil, yok. Yapabileceğiniz bir şey olmadığı için link gürültü olurdu.

Koda dökerken alanın olmayabileceğini varsayın.

Zarfın kök seviyesinde düz alanlar vardır. Bir error nesnesi içine sarılmaz; response.error.code diye okumaya çalışmayın.

Doğrulama hataları

Alan doğrulaması başarısız olduğunda details alan bazlı döker:

{
  "status": "failure",
  "code": "validation.error",
  "message": "Doğrulama hatası",
  "statusCode": 400,
  "requestId": "req_7f3d9c1a4b2e",
  "details": {
    "errors": [
      { "field": "amount", "errors": ["amount minör birim tam sayı olmalıdır"] }
    ]
  }
}

requestId ile korelasyon

Her yanıt — başarılı ya da hatalı — x-request-id başlığı taşır. Aynı değer gövdedeki requestId alanında ve bizim mikroservis loglarımızda bulunur.

Destek talebi açarken bu değeri iletin. Tek anahtarla isteğin uçtan uca izini çıkarabiliyoruz.

Kendi id'nizi gönderebilirsiniz

İstekte x-request-id (ya da x-correlation-id) gönderirseniz ona saygı duyulur ve aynı değer yanıtta döner. Böylece kendi izleme sisteminizle bizimkini aynı anahtar üzerinden eşleyebilirsiniz.

Çözüm sırası: x-request-id → x-correlation-id → gateway kendi üretir.

⚠️

Kabul edilen biçim dardır: yalnız A-Z a-z 0-9 . _ : - karakterleri ve en fazla 128 karakter.

Bunun dışında bir değer gönderirseniz istek reddedilmez — değer sessizce yok sayılır ve gateway kendi id'sini üretir. Yani "gönderdiğim id neden dönmedi?" sorusunun cevabı genelde budur: karakter kümesi ya da uzunluk.

Dil seçimi

message alanı ve docsUrl bağlantısı istediğiniz dilde döner.

x-lang: tr

x-lang yoksa Accept-Language kullanılır; o da yoksa kurulumun varsayılan dili geçerlidir.

DilmessagedocsUrl
enİngilizcehttps://docs.lunixi.com/getting-started/errors#KOD
trTürkçehttps://docs.lunixi.com/tr/getting-started/errors#KOD

Desteklenmeyen bir dil istenirse varsayılana düşülür. Sözlükte olmayan bir kod için orijinal mesaj gösterilir — çıplak kod asla gösterilmez.

HTTP durum kodları

DurumAnlamı
400Geçersiz istek — eksik veya hatalı alan
401Kimlik doğrulanamadı — token yok, geçersiz ya da süresi dolmuş
403Yetki yok — kapsam yetersiz, IP izinli listede değil, ya da merchant askıya alınmış
404Kaynak bulunamadı
409İş kuralı çatışması — ör. kart reddi, çift kayıt
422İstek geçerli JSON ama iş kuralına takılıyor
429Hız limiti aşıldı
500Sunucu hatası
503Servis geçici olarak kullanılamıyor

Hangi hatada yeniden denenir

Yeniden deneyin: 500 · 502 · 503 · 504 — üstel geri çekilmeyle.

Denemeyin: 400 · 401 · 403 · 409 · 422 — istek aynı kaldığı sürece sonuç değişmez. Önce isteği düzeltin.

⚠️

Ödeme oluşturma çağrısını yeniden denerken aynı Idempotency-Key başlığını gönderin; aksi halde ikinci bir intent açarsınız. → API'ye Genel Bakış

Kod sözlüğü

Aşağıdaki kodların her birinin kendi başlığı ya da tablo satırı vardır. Yanıt bir docsUrl taşıyorsa bağlantı doğrudan oraya götürür.

VALIDATION_ERROR

Gönderdiğiniz alanlardan biri geçersiz. Sebep alan bazında details.errors[] içindedir; oradaki field değerine bakın.

UNAUTHENTICATED

Kimlik doğrulanamadı. Authorization: Bearer … başlığı yok, token geçersiz ya da süresi dolmuş. Token ömrü tipik olarak 5 dakikadır — önbelleğe alıp expires_at'e göre yenileyin. → Kimlik Doğrulama

PERMISSION_DENIED

Token geçerli ama bu işlem için gereken kapsamı taşımıyor. Anahtarınıza tanımlı kapsamları kontrol edin.

auth.permission.forbidden

PERMISSION_DENIED ile aynı durum, granular kod biçiminde döner.

INVALID_SIGNATURE

İmza doğrulanamadı. En sık üç sebep:

  1. Gövdesiz istekte Digest: satırını kanonik dizeye eklediniz — eklenmemeli. Token basma çağrısının kanonik dizesi dört satırdır.
  2. Satır sırası ya da başlık yazımı farklı.
  3. crypto.sign'ın ilk argümanı null değil — Ed25519'da hash algoritması belirtilmez.

→ Kanonik dize

NONCE_REPLAY

Bu X-Nonce daha önce kullanılmış. Nonce tek kullanımlıktır; her istek için yeni bir değer üretin (UUID uygundur).

IP_NOT_ALLOWED

İstek, anahtarınız için tanımlı izin listesinde olmayan bir IP'den geldi. Sunucunuzun çıkış IP'si değiştiyse (yeni deploy, NAT değişikliği) listeyi güncelleyin.

MERCHANT_SUSPENDED

Hesap askıya alınmış. Bu, istekle düzeltilebilecek bir durum değildir — destek ekibiyle iletişime geçin.

AUTH_REFRESH_REUSED

Bir yenileme jetonu ikinci kez kullanıldı ve oturum güvenlik gereği sonlandırıldı. Genellikle iki süreç aynı jetonu paylaştığında olur — token yenilemeyi tek bir yerde toplayın.

PRODUCT_NOT_ENABLED

Kimliğiniz doğrulandı, izniniz de yerinde — ama çağırdığınız uç bir ürüne ait ve o ürüne yetkiniz yok. Ürün, izinden ayrı bir eksendir: bir işlemi yapma izniniz olması, o ürünün hesabınızda açık olduğu anlamına gelmez.

İki ayrı koşul birden gerekir; hangisinin eksik olduğunu panelden görebilirsiniz:

KoşulNeredeNasıl açılır
Ürüne aktif abonelikAbonelik ekranıÜrüne abone olun
API anahtarında ürünün tanımlı olmasıAPI Anahtarları ekranıAnahtarı düzenleyip ürünü ekleyin

Aboneliğiniz varken bu hatayı alıyorsanız neredeyse her zaman ikinci koşul eksiktir: API anahtarı bilinçli bir daraltmadır ve abonelik açıldığında mevcut anahtarlarınız kendiliğinden genişlemez.

Panelden yaptığınız değişiklik anında yansımaz: yetki görüntüsü erişim jetonunuza gömülüdür ve jeton yenilenince tazelenir. Sunucu tarafında bekleyecek bir şey yoksa yeni bir jeton alın.

PRODUCT_ENTITLEMENT_UNAVAILABLE

PRODUCT_NOT_ENABLED ile karıştırmayın. Bu kod "ürününüz yok" demez; "ürün yetkinizi şu anda doğrulayamıyoruz" der. HTTP durumu 503'tür ve geçicidir.

Yetkilendirme kapısı fail-closed çalışır: doğrulayamadığımız bir yetkiyle isteği geçirmeyiz. Yapmanız gereken, hesabınızda bir değişiklik değil — yeniden denemektir. Üstel geri çekilmeli (exponential backoff) bir yeniden deneme yeterlidir.

payment.amount.field_removed

Ödeme isteğinde kaldırılmış bir tutar alanı (price ya da paidPrice) gönderdiniz. Ödeme uçlarında tek tutar alanı amount'tır: kuruş cinsinden tam sayı, en az 1. Gönderdiğiniz kaldırılmış alanlar details.fields içinde, varsa diğer alan hataları details.errors[] içinde döner.

  • amount sepet toplamıdır: alıcının ödediği ürün ve hizmet bedeli, vade farkı hariç. basketItems gönderirseniz kalemlerin price toplamı amount'a eşit olmalıdır. Kalemdeki price alanı kalem tutarıdır ve yerinde durur.
  • Vade farkını göndermezsiniz. Taksitte sistem vade farkını bağlayıcı taksit teklifinden hesaplar ve çekilen tutara ekler.

→ Checkout Formu · Kart — 2D · Taksit & BIN

payment.method.disabled

Seçtiğiniz ödeme yöntemi işletmenizin panelindeki form ayarlarında kapalı. Panelde kapatılan yöntem her kanalda kapalıdır: Checkout Formu'nda gösterilmez, GET /payments/methods listesinde yer almaz ve POST /payments/direct/payment ile de başlatılamaz. HTTP durumu 422'dir; ödeme başlamadan reddedilir, para hareket etmez.

  • Yöntemi kullanmak istiyorsanız panelde Ödeme Formu Ayarları'ndan açın.
  • Hangi yöntemlerin açık olduğunu GET /payments/methods ile okuyun.

→ Payment · Checkout Formu — Payment

payment.method.unknown

Gönderdiğiniz yöntem kodu tanınmıyor. HTTP durumu 400'dür. Yöntem kodları büyük harfle yazılır (CARD, WALLET, MOBILE_BILLING …); başka bir yönteme ya da karta çevrilmez.

  • POST /payments/direct/payment isteğinde paymentMethod alanına geçerli bir kod gönderin.
  • GET /payments/methods?paymentMethod= süzgecinde tanınmayan, küçük harfle yazılmış, boş ya da tekrarlanan değer bu kodu alır. Yanıtta details.field paymentMethod'dur; tanınan bütün kodlar details.allowed listesindedir.

→ Yöntemleri Listeleme · Payment

payment.provider.required

Bu yöntemde sağlayıcıyı alıcı seçer (providerSelectionMode: BUYER) ve hesabınıza birden fazla sağlayıcı bağlı, ama istekte providerCode yok. HTTP durumu 400'dür; ödeme başlamadan reddedilir.

  • Bağlı sağlayıcıların kodları details.boundProviderCodes içindedir.
  • Sağlayıcıları alıcıya gösterin ve seçtiği sağlayıcının kodunu yöntem bloğunda providerCode ile gönderin (ör. wallet.providerCode).

→ Yöntemleri Listeleme › Sağlayıcı seçimi · Cüzdanla Öde

payment.provider.none_eligible

Bu yöntemde sağlayıcıyı platform seçer (providerSelectionMode: PLATFORM), istekte providerCode yok ve hesabınıza bağlı sağlayıcıların hiçbiri bu ödemeyi karşılamıyor. HTTP durumu 422'dir. Ödeme başlatılmaz ve tutar çekilmez.

Her sağlayıcının sonucu details.candidates[] içindedir:

AlanAçıklama
providerCodeSağlayıcının kodu
outcomeINELIGIBLE: sağlayıcı bu ödemeyi karşılamıyor. UNAVAILABLE: sağlayıcıdan uygunluk yanıtı alınamadı. NOT_CHECKED: seçim süresi dolduğu için sağlayıcı denenmedi
reasonSebep kodu ya da null
  • Sonuçlardan biri UNAVAILABLE ya da NOT_CHECKED ise aynı isteği daha sonra tekrar deneyebilirsiniz.
  • Sağlayıcıyı yöntem bloğunda providerCode ile kendiniz de seçebilirsiniz.
  • Bütün sonuçlar INELIGIBLE ise alıcıya başka bir yöntem önerin.

→ Faturana Yansıt › Hiçbir sağlayıcı uygun değil · Yöntemleri Listeleme › Sağlayıcı seçimi

payment.provider.disabled_in_form

Seçilen sağlayıcı işletmenin Form Ayarları'nda yalnız formda kapatılmış. HTTP durumu 422'dir; ödeme başlamadan reddedilir ve para hareket etmez. Bu kod yalnız Checkout Formu yolunda döner.

  • Checkout Formu alıcıya formda açık başka bir sağlayıcı ya da yöntem sunar.
  • Sağlayıcıyı formda kullanmak istiyorsanız panelde Ödeme → Form Ayarları ekranında yöntemin Ödeme seçenekleri listesinden açın.
  • Formda kapalı sağlayıcı GET /payments/methods listesinde görünür ve POST /payments/direct/payment ile kullanılabilir.

→ Checkout Formu — Payment › Sıra ve formda gösterilen sağlayıcılar

payment.method.selection_attempts_exhausted

Bu ödemede kart dışı yöntem seçimi deneme sınırına (3) ulaşıldı. HTTP durumu 409'dur; seçim yazılmaz, sağlayıcı çağrılmaz ve para hareket etmez.

  • Sınır ödeme (sipariş) başınadır; aynı siparişin yeni denemeleri de aynı sayacı kullanır.
  • Alıcı aynı siparişi kartla ödeyebilir.

→ Checkout Formu — Payment › Sağlayıcı seçimi

payment.checkout.order_locked

Siparişte parçalı ödeme sürüyor; sonuçlanmadan aynı siparişte tek kartla, kart dışı yöntemle ya da cüzdanla ödeme başlatılamaz. HTTP durumu 409'dur; ödeme kaydına dokunulmaz.

  • Parçalı ödemenin sonuçlanmasını bekleyin. Parçalı ödeme başarısız olur, süresi dolar ya da alıcı vazgeçerse sipariş açık kalır ve başka bir yöntemle ödenebilir.

→ Parçalı Ödeme › Sipariş kilidi

split_pay.checkout.order_not_open

Siparişte başka bir ödeme başlamış ya da sipariş kapanmış; parçalı ödeme başlatılamaz. HTTP durumu 409'dur; parçalı ödeme yazılmaz ve kart çekilmez. Sebep details.reason içindedir:

details.reasonAnlamı
ORDER_NOT_OPENSipariş açık değil: tek yöntemli bir deneme başlamış ya da sipariş kapanmış
METHOD_IN_PROGRESSSiparişte kart dışı bir yöntem seçilmiş ve sürüyor
WALLET_PAYMENT_IN_PROGRESSSiparişte onayı gönderilmiş ve sonucu kesinleşmemiş bir cüzdan ödemesi var
METHOD_PINNEDSipariş intent'te kart dışı bir yönteme sabitlenmiş
ORDER_LOCKEDSiparişte başka bir parçalı ödeme başlıyor ya da sürüyor

→ Parçalı Ödeme › Sipariş kilidi

Parçalı ödeme kodları

Parçalı ödeme uçlarının (POST /payments/split, POST /payments/split/{splitPaymentId}/refund ve Checkout Formu'nun parçalı ödeme uçları) kodları. Ayrıntı her zaman details içindedir.

Doğrulama

Parçalı ödeme başlamadan reddedilir; hiçbir parçadan para çekilmez. HTTP durumu 422'dir. details.legIndex ya da details.index sorunlu parçanın sırasını (0'dan başlar) gösterir.

KodAnlamıNe yapmalı
split_pay.validation.amount_mismatchParçaların toplamı sipariş tutarına eşit değilToplamı details.totalAmount yapın
split_pay.validation.leg_count_out_of_rangeParça sayısı izin verilen aralığın dışındadetails.min ile details.max arasında parça gönderin
split_pay.validation.card_leg_count_out_of_rangeKart sayısı sınırı aşıyorEn çok details.max kart kullanın. Çoklu Kartla Ödeme kapalıyken sınır 1'dir
split_pay.validation.invalid_leg_amountParça tutarı pozitif tam sayı değilTutarı minor unit cinsinden tam sayı gönderin
split_pay.validation.currency_mismatchBir parçanın para birimi siparişle uyuşmuyor ya da seçilen sağlayıcı bu para birimini desteklemiyorBütün parçaları siparişin para biriminde, bu para birimini destekleyen sağlayıcıyla gönderin
split_pay.validation.missing_card_tokenKart parçasında kart bilgisi yok ya da kart dışı parça kart bilgisi taşıyorKart parçasına cardToken ekleyin; kart dışı parçadan kart alanlarını çıkarın
split_pay.validation.methods_disabledKart dışı yöntemlerle parçalı ödeme kapalıPanelde Kart Dışı Yöntemlerle Parçalı Ödeme'yi açın ya da yalnız kartlarla bölün
split_pay.validation.method_not_allowedYöntem parçalı ödemeye açılmamışYöntemi Form Ayarları'nda parçalı ödemeye açın ya da başka bir yöntem seçin
split_pay.validation.provider_not_availableSağlayıcı bu yöntem için kullanılamıyor ya da sağlayıcı kodu yokGET /payments/methods listesindeki bir sağlayıcının kodunu gönderin
split_pay.validation.provider_not_split_eligibleSağlayıcı parçalı ödemede kullanılamıyorsplitEligible: true olan bir sağlayıcı ya da başka bir yöntem seçin
split_pay.validation.duplicate_providerAynı sağlayıcı birden fazla parçadaBir sağlayıcıyı tek parçada kullanın
split_pay.validation.multiple_irreversible_legsBirden fazla geri alınamayan parça varGeri alınamayan en fazla bir parça gönderin
split_pay.validation.leg_below_minimumBir parça, parça başına en az tutarın altındaParçayı details.minLegAmount ya da üzerine çıkarın
split_pay.validation.leg_outside_provider_limitsBir parça sağlayıcının tutar aralığının dışındaParçayı details.minAmount ile details.maxAmount arasına getirin
split_pay.validation.invalid_installmentBir parçanın taksit sayısı geçersizTaksiti 1 ile details.max arasında seçin. details.reason CREDIT_APPROVAL_PHASE ise kredi onayı içeren ödemede kart taksitli olamaz; NON_CARD_LEG ise kart dışı parçada taksit gönderilemez
split_pay.validation.installment_quote_rejectedKart parçasının taksit teklifi kullanılamıyor: süresi dolmuş ya da parçanın tutarı veya taksitle eşleşmiyorTeklifi parçanın tutarıyla yenileyin. Sebep details.reason, taksit details.installment içindedir
split_pay.insurance.requires_card_legSigorta seçili ama parçalı ödemede kart parçası yok. Sigorta primi kart parçasından tahsil edilir; sigortalı parçalı ödemede kart parçaları tek çekimle alınırEn az bir kart parçası ekleyin ya da sigortasız devam edin (details.canContinueWithoutInsurance). Sigorta seçimi kullanılmış sayılmaz

Adımlar, devam bağlantısı ve devam sayfası

KodHTTPAnlamıNe yapmalı
split_pay.step.not_allowed409Parçalı ödemede bu adım şu anda yapılamaz; kayıt değişmez ve para hareket etmezDurumu okuyup beklenen adımı izleyin. Sebep details.reason içindedir (aşağıda)
split_pay.step.busy409Aynı parçalı ödemeyi şu anda başka bir istek yürütüyorBirkaç saniye sonra tekrar deneyin
split_pay.continuation.unavailable410Devam bağlantısı artık kullanılamıyor. details.reason: INVALID (kod tanınmıyor), EXPIRED (süre doldu), CLOSED (ödeme sonuçlandı ya da artık alıcı adımı beklemiyor)Alıcı yeni bir ödeme başlatabilir
split_pay.resume.unavailable410Devam sayfasının bağlantısı artık kullanılamıyor. details.reason: INVALID (bağlantı tanınmıyor), EXPIRED (süre doldu)Alıcı yeni bir ödeme başlatabilir. Ödemenin sonucu size webhook ile gelir
split_pay.resume.already_opened409Devam sayfası başka bir pencerede açıldı; bağlantı tek pencerede kullanılırAlıcı ödemeye ilk açtığı pencereden devam eder
split_pay.resume.proof_invalid401Devam sayfasının oturumu doğrulanamadıAlıcı ödemeye devam sayfasının ilk açıldığı pencereden devam eder
split_pay.resume.not_configured503Parçalı ödeme şu anda başlatılamıyor. Ödeme başlatılmadı, para hareket etmediAlıcı tek yöntemle ödeyebilir ya da kısa süre sonra tekrar deneyebilir
split_pay.three_ds.restart_exhausted409Banka pencereye izin vermediği için bu kart parçasının 3D Secure'ü ayrı sayfada zaten bir kez yeniden başlatıldı ve ayrı sayfa açıldı; ikinci kez başlatılmaz. Ayrı sayfa henüz açılmadıysa aynı istek hata değil, aynı yanıtı alırAlıcı doğrulamayı açık olan ayrı sayfada tamamlar. Doğrulama tamamlanmazsa ödeme terk edilen 3D Secure kuralıyla sonuçlanır
split_pay.three_ds.restart_expired410Bu kart parçasının 3D Secure oturumu kapandı ya da süresi doldu; ayrı sayfada yeniden başlatma yapılmaz. details.reason: THREE_DS_CLOSED (oturum kapandı), THREE_DS_SESSION_EXPIRED (oturumun süresi doldu)Alıcıdan kartı yeniden girmesi istenir

split_pay.step.not_allowed için details.reason:

DeğerAnlamı
SPLIT_NOT_WAITINGSiparişte süren parçalı ödeme yok ya da parçalı ödeme bu adımı beklemiyor
NOT_CURRENT_LEGİstenen parça sırası gelen parça değil
LEG_NOT_STARTABLEParça başlatılabilecek durumda değil
PROVIDER_MISMATCH, METHOD_MISMATCHGönderilen sağlayıcı ya da yöntem parçadakiyle aynı değil
SPLIT_EXPIREDToplam süre doldu
REPLACEMENT_WINDOW_CLOSEDYeni kart için verilen süre doldu
CARD_LEG_REQUIREDBu adım bir kart parçası bekliyor
CARD_SOURCE_UNSUPPORTEDGönderilen kart bu adımda kullanılamıyor

İade

KodHTTPAnlamıNe yapmalı
split_pay.refund.amount_exceeded400İade tutarı iade edilebilir toplamı aşıyor. details.refundableAmount ve details.nonRefundableAmount dönerTutarı details.refundableAmount ile sınırlayın
split_pay.refund.amount_not_distributable422Tutar iade edilebilir toplamın içinde ama parçalara bölünemiyor; kart dışı parça yalnız kalan tutarının tamamıyla iade edilirKart dışı parçayı tam kapsayan ya da kart parçalarına sığan bir tutar seçin
split_pay.refund.not_allowed409İade şu anda yapılamaz. details.reason: SPLIT_NOT_COMPLETED (parçalı ödeme tamamlanmadı), SPLIT_IN_PROGRESS (parçalı ödeme sürüyor), COMPENSATION_REFUND_PENDING (parçanın telafi iadesi sürüyor)Parçalı ödemenin ya da telafi iadesinin bitmesini bekleyin
split_pay.refund.incomplete—Bazı parçalar iade edilemedi; parça parça sonuç yanıttadır. Ana ödeme iade ucunda başarısız yanıtın kodudur; parçalı ödeme iade ucunda success: false ile dönerAynı Idempotency-Key ile tekrar deneyin; iade edilmiş parça yeniden iade edilmez

→ Parçalı Ödeme › Hatalar

Diğer sık görülen kodlar

Bunlar docsUrl taşımaz ama sık karşılaşılır:

KodNe yapmalı
INVALID_DATEİmzalı istekte X-Date ±5 dakika penceresi dışında — sunucu saatinizi kontrol edin
DIGEST_MISSINGGövde var ama Digest başlığı yok
INVALID_DIGESTGövde özeti Digest ile uyuşmuyor — başlık SHA-256= önekli olmalı
INVALID_CURSORSayfalama cursor'ı bozuk — elle üretmeyin, önceki yanıttaki pageInfo.nextCursor'ı aynen gönderin. → Sayfalama
fraud.decision.unconfiguredHata değil — yapılandırılmamış merchant için varsayılan karar. → Akışlar
fraud.quota.exceededFraud kotanız doldu — Retry-After kadar bekleyip yeniden deneyin. → Hatalar ve Yeniden Deneme
FRAUD_EVENT_INVALIDOlay alımına gönderilen olay doğrulamadan geçmedi. → Hatalar ve Yeniden Deneme
payment.promissory_note.not_found404 — Ödemeye ait senet yok: ödeme senetle yapılmamış ya da başka hesaba ait. paymentId değerini kontrol edin. → Senetle Öde
payment.promissory_note.document_unavailable503 — Senet belgesi şu anda sağlayıcıdan alınamıyor; bir süre sonra tekrar deneyin. → Senetle Öde
payment.promissory_note.not_cancellable, payment.promissory_note.provider_unavailable, payment.promissory_note.cancel_rejectedHata yanıtı değildir; senet iptal yanıtında senet başına cancelResults[].errorCode değeridir. → Senetle Öde — Senetleri iptal etme

Fraud uçlarının tüm hata kodları, kota başlıkları ve yeniden deneme kuralları: Fraud — Hatalar ve Yeniden Deneme.

Gizlilik

İstek gövdeleriniz loglanmaz. Sunucu tarafında yalnız yol, HTTP durumu, süre, requestId, merchantId ve hata kodu kaydedilir; sorgu dizesi log'a yazılmadan kırpılır.

İlgili