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:
| Alan | Ne işe yarar |
|---|
code | Hatanı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. |
status | HTTP durum kodu (örn. 404). Hatanın kabaca hangi türde olduğunu söyler. Her code her zaman aynı status ile eşleşir. |
title | Hatanın kısa, kullanıcıya gösterilebilir başlığı (örn. "Hesap bulunamadı"). Kullanıcının diline göre çevrilir. |
detail | Ne olduğunu ve genelde ne yapılması gerektiğini anlatan daha uzun açıklama. Bu da çevrilir. |
traceId | Bir 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. |
instance | Hatanın oluştuğu istek yolu (örn. /api/v1/auth/register). |
errors | Yalnı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
| HTTP | Kod | Başlık | Açıklama |
|---|
| 400 | error.validation.failed | Doğrulama hatası | Bir veya daha fazla alan geçersiz. Lütfen girdilerinizi kontrol edin. |
| 404 | error.common.not_found | Bulunamadı | İstenen kayıt bulunamadı. |
| 409 | error.common.conflict | Çakışma | İstek mevcut durumla çakışıyor. |
| 401 | error.common.unauthorized | Yetkisiz | Bu işlem için kimlik doğrulaması gerekiyor. |
| 422 | error.common.business_rule | İş kuralı ihlali | İşlem bir iş kuralı tarafından engellendi. |
| 500 | error.common.internal | Sunucu hatası | Beklenmeyen bir hata oluştu. Lütfen daha sonra tekrar deneyin. |
Kullanıcı & Kimlik
| HTTP | Kod | Başlık | Açıklama |
|---|
| 404 | error.user.not_found | Kullanıcı bulunamadı | Kullanıcı bulunamadı. |
| 401 | error.auth.app_key_invalid | Geçersiz uygulama anahtarı | X-App-Key başlığı eksik veya tanınmayan bir uygulama anahtarı içeriyor. |
| 401 | error.auth.refresh_invalid | Geçersiz yenileme belirteci | Yenileme belirteci geçersiz veya süresi dolmuş. |
| 401 | error.auth.token_expired | Belirtecin süresi doldu | Erişim belirtecinin süresi doldu. Lütfen tekrar giriş yapın. |
Banka/Kurum Bağlantısı & Rıza
| HTTP | Kod | Başlık | Açıklama |
|---|
| 404 | error.hhs.not_found | HHS bulunamadı | Belirtilen HHS kayıtlı değil. |
| 422 | error.hhs.disabled | HHS kullanılamıyor | Bu HHS şu anda yeni bağlantılar için kullanılamıyor. |
| 404 | error.hhs_connection.not_found | HHS bağlantısı bulunamadı | Belirtilen HHS bağlantısı bulunamadı. |
| 422 | error.hhs_connection.customer_not_found | Kimlik HHS'de bulunamadı | Verilen kimlik (TCKN/VKN) HHS tarafında bir müşteriyle eşleşmedi. Kimlik bilgisini kontrol edin. |
| 400 | error.hhs_connection.state_mismatch | Durum uyuşmazlığı | Onay durum parametresi uyuşmuyor. Bağlantı akışı tekrar başlatılmalı. |
| 409 | error.hhs_connection.authorization_code_invalid | Geçersiz yetki kodu | Sağlanan yetkilendirme kodu geçersiz veya süresi dolmuş. |
| 400 | error.hhs_connection.identity_value_invalid | Geçersiz kimlik değeri | Sağlanan kimlik değeri (TCKN/VKN) geçerli bir biçimde değil. |
| 400 | error.hhs_connection.access_duration_required | Erişim süresi zorunlu | Erişim süresi (gün) alanı zorunludur. En az 1 gün belirtilmelidir. |
| 409 | error.hhs_connection.not_authorized | Bağlantı yetkilendirilmemiş | HHS bağlantısı bu işlem için henüz yetkilendirilmemiş. |
| 409 | error.hhs_connection.authorization_code_expired | Yetki kodu süresi doldu | Yetkilendirme kodunun süresi doldu veya rıza henüz yetkilendirilmedi. Lütfen bağlantı akışını yeniden başlatın. |
| 409 | error.hhs_connection.token_revoked | Erişim iptal edildi | HHS erişimi iptal edildi. Lütfen bu HHS'yi yeniden bağlayın. |
| 504 | error.hhs_connection.authorization_url_unavailable | Yetkilendirme adresi alınamadı | HHS yönlendirme yetkilendirme adresini zamanında döndürmedi. Lütfen tekrar deneyin. |
| 409 | error.hhs_connection.active_consent_exists | Aktif rıza zaten mevcut | Bu HHS için zaten aktif bir rıza mevcut. Yeni rıza oluşturmadan önce mevcut rızayı iptal edin. |
| 409 | error.hhs_connection.rejected_by_hhs | HHS rıza isteğini reddetti | HHS 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
| HTTP | Kod | Başlık | Açıklama |
|---|
| 400 | error.consent.invalid_time_window | Geçersiz zaman aralığı | İstenen erişim veya sorgu aralığı izin verilen sınırı aşıyor. |
| 400 | error.consent.permission_dependency | İzin bağımlılığı ihlali | İstenen izin kümesi bir bağımlılık kuralını ihlal ediyor. |
| 400 | error.event.signature_invalid | Geçersiz olay imzası | Olay imzası doğrulanamadı. |
| 400 | error.event.unsupported_type | Desteklenmeyen olay tipi | Olay tipi desteklenmiyor. |
Yönlendirme Adresleri (Redirect URL)
| HTTP | Kod | Başlık | Açıklama |
|---|
| 400 | error.redirect_url.invalid | Geçersiz yönlendirme adresi | Tü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). |
| 422 | error.redirect_url.host_not_allowed | Yönlendirme adresi alan adına izin verilmiyor | Tüketici yönlendirme adresinin alan adı, uygulamanız için tanımlı izinli alan adı listesinde yer almıyor. |
Hesap & Kart
| HTTP | Kod | Başlık | Açıklama |
|---|
| 404 | error.account.not_found | Hesap bulunamadı | Belirtilen hesap bulunamadı. |
| 404 | error.card.not_found | Kart bulunamadı | Belirtilen kart bulunamadı. |
Ödemeler
| HTTP | Kod | Başlık | Açıklama |
|---|
| 422 | error.payment.invalid_amount | Geçersiz tutar | Ödeme tutarı sıfırdan büyük olmalı. |
| 400 | error.payment.purpose_code_invalid | Geçersiz ödeme amacı | Ödeme amaç kodu (purposeCode) desteklenen değerlerden biri değil. |
| 404 | error.payment_order.not_found | Ödeme emri bulunamadı | Belirtilen ödeme emri bulunamadı. |
| 409 | error.payment_order.rejected_by_hhs | HHS ödeme emrini reddetti | HHS ödeme emri rıza isteğini kabul etmedi. Ödeme bilgilerini kontrol edip yeni bir ödeme emri oluşturun. |
| 404 | error.recurring_payment.not_found | Düzenli ödeme bulunamadı | Belirtilen düzenli ödeme talimatı bulunamadı. |
| 409 | error.recurring_payment.rejected_by_hhs | HHS düzenli ödemeyi reddetti | HHS düzenli ödeme rıza isteğini kabul etmedi. Talimat bilgilerini kontrol edip yeni bir talimat oluşturun. |
| 422 | error.recurring_payment.not_active | Düzenli ödeme aktif değil | Düzenli ödeme zaten iptal edilmiş veya tamamlanmış; tekrar iptal edilemez. |
| 422 | error.recurring_payment.payment_count_invalid | Geçersiz ödeme sayısı | Düzenli ödeme talimatı en az 2 ödeme içermeli. |
| 404 | error.forward_dated_payment.not_found | İleri tarihli ödeme bulunamadı | Belirtilen ileri tarihli ödeme talimatı bulunamadı. |
| 409 | error.forward_dated_payment.rejected_by_hhs | HHS ileri tarihli ödemeyi reddetti | HHS ileri tarihli ödeme rıza isteğini kabul etmedi. Talimat bilgilerini kontrol edip yeni bir talimat oluşturun. |
| 422 | error.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. |
| 422 | error.forward_dated_payment.date_range_invalid | Geçersiz işlem tarihi | İşlem tarihi yarın ile bir yıl sonrası arasında olmalı. |
Entegrasyon & Tekrar Koruması
| HTTP | Kod | Başlık | Açıklama |
|---|
| 503 | error.integration.hhs_unavailable | HHS servisi kullanılamıyor | HHS servisine şu anda ulaşılamıyor. Lütfen daha sonra tekrar deneyin. |
| 409 | error.integration.sync_dispatch_failed | Senkronizasyon kuyruğa alınamadı | HHS senkronizasyon işi kuyruğa alınamadı. Otomatik olarak yeniden denenecek. |
| 422 | error.integration.query_quota_exceeded | Sorgu kotası aşıldı | Bu dönem için HHS sorgu limiti doldu. En son kullanılabilir veriler gösteriliyor. |
| 400 | error.idempotency.key_missing | Idempotency-Key eksik | Bu işlem için Idempotency-Key başlığı zorunlu. |
| 409 | error.idempotency.key_conflict | Idempotency-Key çakışması | Aynı Idempotency-Key farklı bir istek gövdesiyle kullanıldı. |
| 409 | error.idempotency.in_progress | İstek halihazırda işleniyor | Bu 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.