Akışlar

Hata Kodları

Bir şeyler ters gittiğinde API rastgele bir mesaj dönmez. Her hata hep aynı düzende, makinelerin ve insanların birlikte okuyabildiği tek bir standart biçimde gelir. Sistemde toplam 50 farklı iş hatası tanımlıdır. Aynı hata her zaman aynı kod ve aynı HTTP durumuyla döner — yani bir kez tanıdığınız hatayı her yerde tanırsınız.

Hata biçimi: RFC 7807 ProblemDetails

Tüm hatalar RFC 7807 ProblemDetails (hataların standart JSON biçimi) formatında döner. Bu format sayesinde ister bir uygulama ister bir insan, hatanın ne olduğunu ve nasıl çözüleceğini aynı alanlara bakarak anlar. Alanların anlamı şöyle:

AlanNe işe yarar
codeHatanın makine-okunur kimliği (örn. error.account.not_found). Uygulamanız kararlarını hep buna göre verir, metne göre değil — çünkü metin dile göre değişir, kod değişmez.
statusHTTP durum kodu (örn. 404). Hatanın kabaca hangi türde olduğunu söyler. Her code her zaman aynı status ile eşleşir.
titleHatanın kısa, kullanıcıya gösterilebilir başlığı (örn. "Hesap bulunamadı"). Kullanıcının diline göre çevrilir.
detailNe olduğunu ve genelde ne yapılması gerektiğini anlatan daha uzun açıklama. Bu da çevrilir.
traceIdBir isteği loglarda bulmaya yarayan takip numarası. Bir sorunu araştırırken bu numarayı Kibana'da aratarak o isteğe ait tüm log satırlarına ulaşırsınız.
instanceHatanın oluştuğu istek yolu (örn. /api/v1/auth/register).
errorsYalnızca alan-bazlı doğrulama hatalarında bulunur: hangi alanda ne yanlış, alan alan listelenir.

Hata yanıtı neye benzer?

Aşağıda gerçek bir hata yanıtı var. Kayıt sırasında kullanıcı anahtarı çok kısa, müşteri numarası da boş gönderilmişse API şuna benzer bir JSON döner:

{
  "type": "https://yos.91.98.230.19.nip.io/errors/error.validation.failed",
  "title": "Doğrulama hatası",
  "detail": "Bir veya daha fazla alan geçersiz. Lütfen girdilerinizi kontrol edin.",
  "status": 400,
  "instance": "/api/v1/auth/register",
  "code": "error.validation.failed",
  "traceId": "0HN7G8K5H2J3L4M5",
  "errors": {
    "userKey": ["UserKey en az 3 karakter olmalı"],
    "customerNo": ["CustomerNo boş olamaz"]
  }
}

Buradaki errors alanı yalnızca form doğrulama hatalarında görünür — her alanın yanında sorunun ne olduğu yazar, böylece kullanıcıya tam olarak hangi kutuyu düzelteceğini gösterebilirsiniz. Diğer hatalarda bu alan bulunmaz.

Dil nasıl seçilir? Önce isteğin Accept-Language başlığına bakılır; o yoksa kullanıcının hesabındaki tercih edilen dile; o da yoksa varsayılan olarak Türkçeye düşülür. Yani title ve detail metinleri kullanıcının diline göre gelirken code her zaman İngilizce ve sabit kalır.

Bir hatayı adım adım nasıl çözerim?

Kısa yol: koda bakın, sorunu anlayın; çözemezseniz traceId ile logdan detayına inin.

  • 1. code'a bakın. Örneğin 404 error.account.not_found = istenen hesap bulunamadı. Kod size hatanın tam sebebini söyler; aşağıdaki tablolarda her kodun ne anlama geldiğini bulabilirsiniz.
  • 2. detail'i okuyun. Çoğu hata ne yapılması gerektiğini de söyler (örn. "Lütfen bağlantı akışını yeniden başlatın").
  • 3. Hâlâ anlaşılmıyorsa traceId'yi kopyalayın ve Kibana'da aratın. Bu takip numarası o isteğe ait tüm log satırlarını (isteğin gövdesi, hata, varsa bankaya/kuruma giden çağrı) tek yerde toplar.

HTTP durum kodları ne anlama gelir?

HTTP durumu hatanın kaba türünü söyler. Kabaca: 4xx = "isteğinizde bir sorun var, düzeltip tekrar deneyin"; 5xx = "sunucu/banka/kurum tarafında bir sorun var, genelde bekleyip tekrar denemek gerekir".

400 — İstek hatalı / eksik alan401 — Giriş gerekli / token geçersiz404 — Kayıt yok (izolasyon için de kullanılır)409 — Çakışma / red / eşzamanlılık422 — İş kuralı engeli503 — Banka/Kurum ulaşılamıyor504 — Banka/Kurum zamanında yanıt vermedi

Tüm hata kodları

Hatalar konularına göre gruplanmıştır. Her satırda soldan sağa: HTTP durumu, makine kodu, kullanıcıya gösterilen başlık ve açıklama yer alır.

Genel

HTTPKodBaşlıkAçıklama
400error.validation.failedDoğrulama hatasıBir veya daha fazla alan geçersiz. Lütfen girdilerinizi kontrol edin.
404error.common.not_foundBulunamadıİstenen kayıt bulunamadı.
409error.common.conflictÇakışmaİstek mevcut durumla çakışıyor.
401error.common.unauthorizedYetkisizBu işlem için kimlik doğrulaması gerekiyor.
422error.common.business_ruleİş kuralı ihlaliİşlem bir iş kuralı tarafından engellendi.
500error.common.internalSunucu hatasıBeklenmeyen bir hata oluştu. Lütfen daha sonra tekrar deneyin.

Kullanıcı & Kimlik

HTTPKodBaşlıkAçıklama
404error.user.not_foundKullanıcı bulunamadıKullanıcı bulunamadı.
401error.auth.app_key_invalidGeçersiz uygulama anahtarıX-App-Key başlığı eksik veya tanınmayan bir uygulama anahtarı içeriyor.
401error.auth.refresh_invalidGeçersiz yenileme belirteciYenileme belirteci geçersiz veya süresi dolmuş.
401error.auth.token_expiredBelirtecin süresi dolduErişim belirtecinin süresi doldu. Lütfen tekrar giriş yapın.

Banka/Kurum Bağlantısı & Rıza

HTTPKodBaşlıkAçıklama
404error.hhs.not_foundHHS bulunamadıBelirtilen HHS kayıtlı değil.
422error.hhs.disabledHHS kullanılamıyorBu HHS şu anda yeni bağlantılar için kullanılamıyor.
404error.hhs_connection.not_foundHHS bağlantısı bulunamadıBelirtilen HHS bağlantısı bulunamadı.
422error.hhs_connection.customer_not_foundKimlik HHS'de bulunamadıVerilen kimlik (TCKN/VKN) HHS tarafında bir müşteriyle eşleşmedi. Kimlik bilgisini kontrol edin.
400error.hhs_connection.state_mismatchDurum uyuşmazlığıOnay durum parametresi uyuşmuyor. Bağlantı akışı tekrar başlatılmalı.
409error.hhs_connection.authorization_code_invalidGeçersiz yetki koduSağlanan yetkilendirme kodu geçersiz veya süresi dolmuş.
400error.hhs_connection.identity_value_invalidGeçersiz kimlik değeriSağlanan kimlik değeri (TCKN/VKN) geçerli bir biçimde değil.
400error.hhs_connection.access_duration_requiredErişim süresi zorunluErişim süresi (gün) alanı zorunludur. En az 1 gün belirtilmelidir.
409error.hhs_connection.not_authorizedBağlantı yetkilendirilmemişHHS bağlantısı bu işlem için henüz yetkilendirilmemiş.
409error.hhs_connection.authorization_code_expiredYetki kodu süresi dolduYetkilendirme kodunun süresi doldu veya rıza henüz yetkilendirilmedi. Lütfen bağlantı akışını yeniden başlatın.
409error.hhs_connection.token_revokedErişim iptal edildiHHS erişimi iptal edildi. Lütfen bu HHS'yi yeniden bağlayın.
504error.hhs_connection.authorization_url_unavailableYetkilendirme adresi alınamadıHHS yönlendirme yetkilendirme adresini zamanında döndürmedi. Lütfen tekrar deneyin.
409error.hhs_connection.active_consent_existsAktif rıza zaten mevcutBu HHS için zaten aktif bir rıza mevcut. Yeni rıza oluşturmadan önce mevcut rızayı iptal edin.
409error.hhs_connection.rejected_by_hhsHHS rıza isteğini reddettiHHS rıza isteğini kabul etmedi. Bu kimlik için HHS tarafında yetkilendirilmiş bir rıza zaten olabilir; önce onu iptal edin.

Rıza Kuralları & Olay

HTTPKodBaşlıkAçıklama
400error.consent.invalid_time_windowGeçersiz zaman aralığıİstenen erişim veya sorgu aralığı izin verilen sınırı aşıyor.
400error.consent.permission_dependencyİzin bağımlılığı ihlaliİstenen izin kümesi bir bağımlılık kuralını ihlal ediyor.
400error.event.signature_invalidGeçersiz olay imzasıOlay imzası doğrulanamadı.
400error.event.unsupported_typeDesteklenmeyen olay tipiOlay tipi desteklenmiyor.

Yönlendirme Adresleri (Redirect URL)

HTTPKodBaşlıkAçıklama
400error.redirect_url.invalidGeçersiz yönlendirme adresiTüketici yönlendirme adresi en fazla 2048 karakter uzunluğunda mutlak bir URL olmalı ve https kullanmalıdır (http yalnızca localhost için geçerlidir).
422error.redirect_url.host_not_allowedYönlendirme adresi alan adına izin verilmiyorTüketici yönlendirme adresinin alan adı, uygulamanız için tanımlı izinli alan adı listesinde yer almıyor.

Hesap & Kart

HTTPKodBaşlıkAçıklama
404error.account.not_foundHesap bulunamadıBelirtilen hesap bulunamadı.
404error.card.not_foundKart bulunamadıBelirtilen kart bulunamadı.

Ödemeler

HTTPKodBaşlıkAçıklama
422error.payment.invalid_amountGeçersiz tutarÖdeme tutarı sıfırdan büyük olmalı.
400error.payment.purpose_code_invalidGeçersiz ödeme amacıÖdeme amaç kodu (purposeCode) desteklenen değerlerden biri değil.
404error.payment_order.not_foundÖdeme emri bulunamadıBelirtilen ödeme emri bulunamadı.
409error.payment_order.rejected_by_hhsHHS ödeme emrini reddettiHHS ödeme emri rıza isteğini kabul etmedi. Ödeme bilgilerini kontrol edip yeni bir ödeme emri oluşturun.
404error.recurring_payment.not_foundDüzenli ödeme bulunamadıBelirtilen düzenli ödeme talimatı bulunamadı.
409error.recurring_payment.rejected_by_hhsHHS düzenli ödemeyi reddettiHHS düzenli ödeme rıza isteğini kabul etmedi. Talimat bilgilerini kontrol edip yeni bir talimat oluşturun.
422error.recurring_payment.not_activeDüzenli ödeme aktif değilDüzenli ödeme zaten iptal edilmiş veya tamamlanmış; tekrar iptal edilemez.
422error.recurring_payment.payment_count_invalidGeçersiz ödeme sayısıDüzenli ödeme talimatı en az 2 ödeme içermeli.
404error.forward_dated_payment.not_foundİleri tarihli ödeme bulunamadıBelirtilen ileri tarihli ödeme talimatı bulunamadı.
409error.forward_dated_payment.rejected_by_hhsHHS ileri tarihli ödemeyi reddettiHHS ileri tarihli ödeme rıza isteğini kabul etmedi. Talimat bilgilerini kontrol edip yeni bir talimat oluşturun.
422error.forward_dated_payment.not_cancellableİleri tarihli ödeme iptal edilemezİleri tarihli ödeme gerçekleşmiş, başarısız olmuş veya iptal edilmiş; tekrar iptal edilemez.
422error.forward_dated_payment.date_range_invalidGeçersiz işlem tarihiİşlem tarihi yarın ile bir yıl sonrası arasında olmalı.

Entegrasyon & Tekrar Koruması

HTTPKodBaşlıkAçıklama
503error.integration.hhs_unavailableHHS servisi kullanılamıyorHHS servisine şu anda ulaşılamıyor. Lütfen daha sonra tekrar deneyin.
409error.integration.sync_dispatch_failedSenkronizasyon kuyruğa alınamadıHHS senkronizasyon işi kuyruğa alınamadı. Otomatik olarak yeniden denenecek.
422error.integration.query_quota_exceededSorgu kotası aşıldıBu dönem için HHS sorgu limiti doldu. En son kullanılabilir veriler gösteriliyor.
400error.idempotency.key_missingIdempotency-Key eksikBu işlem için Idempotency-Key başlığı zorunlu.
409error.idempotency.key_conflictIdempotency-Key çakışmasıAynı Idempotency-Key farklı bir istek gövdesiyle kullanıldı.
409error.idempotency.in_progressİstek halihazırda işleniyorBu Idempotency-Key ile gönderilen bir istek halen işleniyor. Lütfen kısa süre sonra tekrar deneyin.
Güvenlik notu: Başkasının kaydına erişmeye çalışmak bilerek 404 "bulunamadı" döner (403 değil) — böylece kaynağın var olup olmadığı bile sızmaz (buna BOLA koruması denir: herkes yalnız kendi verisini görür). Banka/Kurum (HHS) kaynaklı hatalar da kullanıcıya sadeleştirilerek gösterilir; bankadan/kurumdan gelen ham teknik detay dışarı sızdırılmaz, yalnızca logda (redakte edilmiş halde) tutulur.