KYC Seviyeleri
- Taban yol
/api/v1/wallet- Kimlik
- Ed25519 istek imzası —
X-Key-Id,X-Date,X-Nonce,Digest(body varsa),X-Signature. Zaman penceresi ±5 dk, nonce tek kullanımlık, anahtarda IP allow-list olabilir. - Yetki
- Anahtarınız cüzdan ürününü ve çağrının gerektirdiği cüzdan iznini taşımalıdır; izni olmayan çağrı
403 WALLET_INSUFFICIENT_SCOPEalır. Uç başına izinler: Anahtar izinleri. - Çapraz yüzey
GET end-users/:id/kyc-levels2s ve panelde ORTAKTIR.PUT end-users/:id/kyc-levelyalnız s2s'tedir (KYC kararına dayanır). Panelde elle seviye değişikliği bir dört-göz talebidir:POST end-users/:id/kyc-level/override-requests(talepwallet:enduser:kyc-override, onay başka bir yetkilidenwallet:enduser:kyc-approve). Seviye yükseltmesi iki yüzeyde de onaylı bir KYC oturumu ister.GET end-users/:id/kyc-level/historyyalnız panelde vardır.
Her son kullanıcı bir KYC seviyesi taşır. Seviye iki şeyi belirler: kullanıcının hangi işlemleri yapabileceği ve limitlerinin ne kadar olacağı.
Seviyeyi okuma
GET /api/v1/wallet/end-users/{endUserId}/kyc-levelSon kullanıcı tarafında:
GET /api/portal/v1/wallet/me/kyc-levelYanıt, mevcut seviyeyi ve o seviyede hangi operasyonların açık olduğunu içerir. Uygulamanızda kapalı yetenekleri gizlemeyin, kilitli gösterin — kullanıcı neyi kazanacağını görmeden seviye atlamak istemez.
Seviyeyi güncelleme
Seviye yalnız doğrulanabilir bir KYC kararıyla yükseltilir. Kararın kaynağı, aynı kiracıdaki onaylı bir KYC oturumudur; cüzdan bu oturumu KYC hizmetinden teyit etmeden seviyeyi yükseltmez.
PUT /api/v1/wallet/end-users/{endUserId}/kyc-levelBu çağrı Idempotency-Key header'ı ve anahtarınızda wallet:enduser:kyc-override izni gerektirir.
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
kycLevel | string | ✅ | Yeni seviye: NONE, LOW, SUBSTANTIAL, HIGH |
sourceRef | string | ✅ | Yükseltmede: onaylı KYC oturumunun kimliği (sessionId). Düşürmede: kararın dayanağı olan kayıt referansı |
externalCustomerId | string | — | Kullanıcıyı kendi kimliğinizle hedefleme |
programId | string | — | Birden fazla programda zorunlu |
reason | string | — | Denetim gerekçesi |
effectiveAt | string | — | Geçerlilik anı |
expectedCurrentLevel | string | — | İyimser kilit: mevcut seviye bu değilse istek reddedilir |
Yükseltme hangi koşulda kabul edilir
Hedef seviye NONE'un üstündeyse ve mevcut seviyeden düşük değilse (yükseltme ya da aynı seviyenin yenilenmesi) aşağıdakilerin tamamı sağlanmalıdır:
sourceRef, sizin kiracınızdaki bir KYC oturumunun kimliğidir.- Oturum onaylanmıştır ve son kararı onaydır.
- Oturum bu son kullanıcıya aittir: oturumun
externalCustomerIddeğeri son kullanıcınınexternalCustomerIddeğeriyle ya da son kullanıcınınkycRefdeğeri oturumun kişi anahtarıyla eşleşir. - Aynı oturum daha önce başka bir son kullanıcının seviyesini belirlemek için kullanılmamıştır.
- Oturumun teyit ettiği seviye, istenen seviyeye eşit ya da ondan yüksektir.
Teyit edilen seviye, onaylı oturumda ölçülen kimlik kanıtı gücü ile kişi–belge bağının zayıf olanıdır. Örneğin kimlik kanıtı HIGH, kişi–belge bağı SUBSTANTIAL olan bir oturum en fazla SUBSTANTIAL seviyesini açar.
Koşullardan biri sağlanmazsa istek WALLET_KYC_LEVEL_UNVERIFIED (HTTP 403) ile reddedilir ve seviye değişmez. KYC hizmetine o an ulaşılamazsa istek WALLET_KYC_VERIFIER_UNAVAILABLE (HTTP 503) ile reddedilir; doğrulanamayan bir yükseltme hiçbir durumda uygulanmaz.
Serbest metin bir referans (ör. REVIEW-2026-07-21-00042) seviye yükseltmek için kabul edilmez. Bu kural hem API hem panel için geçerlidir: paneldeki dört-göz onayı ek bir şarttır, KYC kararının yerini tutmaz.
Seviye düşürme
Seviyeyi düşürmek (ör. HIGH → LOW ya da NONE) KYC kararı gerektirmez. sourceRef yine zorunludur; kararın dayanağı olan kaydı (inceleme numarası, uyum kararı) yazın.
Son kullanıcı açılışında seviye
Son kullanıcılar her zaman NONE seviyesinde açılır. Açılış isteğinde kycLevelCache alanına NONE dışında bir değer gönderirseniz istek WALLET_KYC_LEVEL_UNVERIFIED ile reddedilir. Seviyeyi, açılıştan sonra yukarıdaki uç ile yükseltin.
Eşzamanlı güncellemelerde expectedCurrentLevel kullanın. İki sistem aynı anda seviye değiştirirse, beklenen seviyeyi taşımayan istek reddedilir ve sessiz üzerine yazma olmaz.
Kimliği doğrulanmamış seviye (NONE)
Kimliği doğrulanmamış cüzdan için aşağıdaki kurallar platform düzeyindedir ve her programa uygulanır. Program ayarınız boş olsa da geçerlidir.
| İşlem | NONE seviyesinde |
|---|---|
| Para yükleme (kart, temsilci) | Açık, bakiye tavanına kadar |
| Cüzdanla ödeme (işyerine ödeme) | Açık |
Cüzdandan cüzdana transfer (W2W_TRANSFER) | Kapalı |
IBAN'a ve banka hesabına çekim (W2IBAN_WITHDRAW, WITHDRAW_BANK) | Kapalı |
Nakit çekim — ATM ve QR (CASHOUT_ATM, CASHOUT_QR) | Kapalı |
Kart ihracı ve kart harcaması (CARD_AUTH) | Kapalı |
Kapalı işlemler en az LOW seviyesi ister ve WALLET_KYC_LEVEL_INSUFFICIENT (HTTP 403) ile reddedilir. Kimliği doğrulanmamış bir kullanıcıya daha önce ihraç edilmiş kartın otorizasyonları da reddedilir.
Bakiye tavanı
NONE seviyesindeki bir TRY hesabının bakiyesi 5.000 TL'yi aşamaz. Bu tavanı aşacak bir kart yüklemesi, temsilci yüklemesi ya da gelen cüzdan transferi, para hareketi başlamadan WALLET_KYC_BALANCE_CAP_EXCEEDED (HTTP 403) ile reddedilir. Kullanıcının seviyesi yükseltildiğinde tavan kalkar.
Bakiye tavanı yalnız açık devre programlarda uygulanır. Kapalı devre programlarda (bakiye yalnız programın kendi ağında harcanır) bakiye tavanı yoktur; işlem yasakları ve limit şemasındaki işlem tavanları yine geçerlidir.
Seviye → yetenek matrisi
Platform kuralları bir tabandır. Programınız bu tabanı yalnız sıkılaştırabilir, gevşetemez: railPolicy.minKycLevelByOperation ile bir işlem için daha yüksek bir seviye isteyebilirsiniz (ör. cüzdandan cüzdana transfer için SUBSTANTIAL); tabandaki bir işlemi NONE'a açmaya çalışan bir ayar etkisizdir. Uygulanan eşik, platform tabanı ile program ayarından yüksek olanıdır.
Tabanda olmayan işlemler (ör. ödeme) için eşik yalnız program ayarından gelir; ayar yoksa o işlem için seviye kontrolü yapılmaz.
Tipik bir kurgu:
| Seviye | Tipik yetkiler |
|---|---|
NONE | Yükleme ve ödeme; açık devrede 5.000 TL bakiye tavanıyla |
LOW | Transfer, çekim, nakit ve kart — düşük tavanlarla |
SUBSTANTIAL / HIGH | Aynı işlemler, yüksek tavanlarla |
Hangi seviyede hangi tutar tavanlarının geçerli olduğunu programınızın limit şeması belirler. Bkz. Limitler.
Programı canlıya almadan önce şu kontrol listesini geçin:
- Platform tabanından daha sıkı olmasını istediğiniz işlemler için eşik tanımlı mı?
- Limit şemasında her seviye için tavanlar dolu mu?
- Doğrulama akışınız onaylı KYC oturumunun kimliğini saklıyor mu? Seviye yükseltirken bu kimliğe ihtiyacınız olacak.
Seviye atlatma akışı
Tipik ürün akışı:
- Kullanıcı bir işlemi denerken limite ya da kapalı bir yeteneğe takılır.
- Uygulamanız "bu işlem için seviyenizi yükseltmeniz gerekiyor" der ve bir KYC oturumu başlatır. Oturumu açarken
externalCustomerIdalanına son kullanıcının cüzdandakiexternalCustomerIddeğerini verin. - Oturum onaylandığında sisteminiz
PUT /wallet/end-users/{id}/kyc-levelçağırır vesourceRefalanında oturumun kimliğini gönderir. - Cüzdan kararı KYC hizmetinden teyit eder; kullanıcının limitleri ve yetenekleri anında güncellenir.
Adım 2'de kullanıcıya yeni seviyede ne kazanacağını somut olarak gösterin ("günlük 50.000 ₺'ye kadar çekim"). Soyut "hesabını doğrula" çağrısı en düşük dönüşüm oranına sahip ekrandır.
İlgili ürünler
Kimlik doğrulama sürecinin kendisi (belge, canlılık, adres) ayrı bir üründür ve cüzdandan bağımsız çalışır. Cüzdan yalnızca sonucu (seviye) tüketir. Bkz. Identity.
Yaygın hatalar
| Durum | Sebep | Çözüm |
|---|---|---|
WALLET_KYC_LEVEL_UNVERIFIED | sourceRef onaylı bir KYC oturumu değil, başka bir kişiye ait ya da istenen seviyeyi teyit etmiyor | Doğru oturumun kimliğini gönderin; oturumun externalCustomerId değerini kontrol edin |
WALLET_KYC_LEVEL_UNVERIFIED (açılışta) | Açılış isteğinde kycLevelCache NONE dışında | Kullanıcıyı NONE ile açın, sonra yükseltin |
WALLET_KYC_LEVEL_INSUFFICIENT | Kimliği doğrulanmamış kullanıcı transfer, çekim, nakit ya da kart denedi | Kullanıcıyı doğrulama akışına yönlendirin |
WALLET_KYC_BALANCE_CAP_EXCEEDED | Yükleme kimliksiz bakiye tavanını aşıyor | Tutarı düşürün ya da seviyeyi yükseltin |
| Seviye yükseldi ama limit değişmedi | Limit şemasında o seviye için katman yok | Şemayı kontrol edin |
Yükseltme WALLET_KYC_LEVEL_CONFLICT ile reddedildi | expectedCurrentLevel uyuşmuyor | Güncel seviyeyi okuyup tekrar deneyin |
| Kullanıcı neden reddedildiğini anlamıyor | Arayüz kilitli yetenekleri gizliyor | Kilitli gösterin ve şartını yazın |