Cüzdan
Limitler

Limitler

Bu uçları kim çağırır?Dış API (s2s)
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_SCOPE alır. Uç başına izinler: Anahtar izinleri.
Çapraz yüzey
Limit OKUMA üç yüzeydedir (GET end-users/:id/limits, portalda me/limits). Limit şeması yazma panele özeldir: limit-schemes, programs/:id/limit-scheme, programs/:id/shared-limit-caps, programs/:id/otp-policy — izin wallet:limit:manage.

Limit motoru, bir kullanıcının ne kadar ve ne sıklıkta işlem yapabileceğini belirler. Her para hareketi, işlem başlamadan önce limit kapısından geçer; kapı geçirmezse operasyon hiç açılmaz.

Cüzdan toplamı ve operasyon tipine özel sayaçlar

Bir işlemi şemanızdaki iki tür satır bağlayabilir. Hangi sayacın kullanılacağını satırın operationType değeri belirler:

SatırSayaç
operationType: "*"Cüzdan toplamı. Aynı yöndeki tüm operasyon tipleri tek sayacı paylaşır.
operationType: "W2W_TRANSFER" gibi bir tipYalnız o tipin kendi sayacı.
İkisi birdenİkisi de uygulanır: işlem hem kendi tipinin sayacından hem cüzdan toplamından geçmek zorundadır.

Cüzdan toplamı yöne göre iki ayrı sayaçtır:

  • Para çıkışı: cüzdandan cüzdana transfer, IBAN transferi, banka çekimi, ödeme, fatura ödemesi, nakit çekim, kart harcaması, toplu ödeme.
  • Para girişi: kartla yükleme, havale ile yükleme, temsilci yüklemesi, iade kredisi.

Yükleme yaptığınız tutar harcama sayacından düşmez; aynı tutar iki kez sayılmaz.

⚠️

Platform şablonunun tüm satırları operationType: "*" taşır. Kendi şemanızı atamadıysanız kullanıcının günlük ve aylık tavanı tüm para çıkışı tiplerinde birlikte dolar: örneğin kimliksiz bir kullanıcı aynı ay içinde transfer, ödeme ve fatura ödemesini toplam aylık tavana kadar yapabilir; her tip için ayrı bir tavan yoktur.

Örnek: şemanızda * satırı aylık 500.000 ve W2W_TRANSFER satırı aylık 300.000 taşıyorsa, kullanıcı cüzdandan cüzdana en fazla 300.000 gönderebilir ve tüm para çıkışlarının toplamı 500.000'i geçemez. Cüzdandan cüzdana 300.000 gönderen kullanıcı aynı ay içinde ödeme için en fazla 200.000 kullanabilir.

Limit şeması

Bir limit şeması, KYC seviyesi × operasyon tipi × para birimi kesişiminde tavanları tanımlar. Şemalar programa ve kullanıcıya atanır.

Bir katman (tier) şu alanları taşır:

AlanTipAçıklama
kycLevelstringHangi KYC seviyesine uygulanacağı
operationTypestring* (ya da boş) = cüzdan toplamı; bir tip adı = o tipin kendi sayacı
currencystringSeçici — satır hangi işlemlerle eşleşir. * = tüm para birimleri
amountCurrencystringDenominasyon — aşağıdaki tutarlar hangi para birimi cinsinden. * geçersizdir
singleMaxstringTek işlemde en fazla (minor-unit)
dailyAmountstringGünlük toplam tutar tavanı
monthlyAmountstringAylık toplam tutar tavanı
dailyCountnumberGünlük işlem adedi tavanı
monthlyCountnumberAylık işlem adedi tavanı

currency ile amountCurrency aynı şey değildir

🚫

Bu iki alan iki ayrı eksendir ve karıştırılması ölçülmüş bir üretim hatasıdır:

  • currency bir seçicidir: "bu satır hangi işlemlere uygulanır". * onun için meşru bir değerdir.
  • amountCurrency bir denominasyondur: "bu tutarlar neyin cinsinden". Bir tutar için * anlamsızdır — "10.000" neyin 10.000'i?

Gerçekte yaşanan: currency='*' taşıyan satırların tutarları TRY cinsindendi; çok para birimli bir programda bir USD işlemi ₺2.750'lik tavana değil $2.750'lik bir tavana çarpıyordu — yani gerçek risk sınırı yaklaşık 35 kat geniş uygulanıyordu.

⚠️

Eşleşmeyen para biriminde tavan fail-closed'dır. Satırın amountCurrency değeri işlem para biriminden farklıysa işlem WALLET_LIMIT_CURRENCY_MISMATCH ile reddedilir. Kur çevirisi yapılmaz: limit motorunda kur kaynağı yoktur ve bir tavanı dalgalı kurdan geçirmek onu öngörülemez kılardı.

Çözüm operatörün elindedir ve tek bir satırdır: ilgili para birimi için currency=<CCY> ve amountCurrency=<CCY> taşıyan bir katman ekleyin.

Adet tavanları etkilenmez. "Günde 10 işlem" cümlesi para biriminden bağımsızdır; yalnız dailyCount/monthlyCount taşıyan satırlarda amountCurrency boş kalır ve bu kapı susar. Tutar taşıyan bir satırda ise denominasyon zorunludur (veritabanı kısıtı da bunu zorlar).

Aynı sözleşme kanal-üstü ortak tavan katmanları için de geçerlidir.

Şema yönetimi merchant panelden yapılır: Panel — Limit & Ücret Şemaları.

Kullanıcının limit durumunu okuma

GET /api/v1/wallet/end-users/{endUserId}/limits

Sorguyu operationType ve currency ile daraltabilirsiniz. Yanıttaki her satır bucket alanıyla hangi sayacı gösterdiğini belirtir:

bucketAnlamı
OPERATION_TYPEOperasyon tipine özel satırın kendi sayacı
WALLET_TOTAL_OUTFLOW* satırının para çıkışı toplamı
WALLET_TOTAL_INFLOW* satırının para girişi toplamı

operationType verdiğinizde o tipi bağlayan tüm sayaçlar döner: tipe özel satır ve varsa cüzdan toplamı. İşlemin geçebilmesi için hepsinde yer olmalıdır.

Son kullanıcı tarafında aynı bilgi:

GET /api/portal/v1/wallet/me/limits

Kullanıcı arayüzünüzde tutar girildiği anda kalan limiti gösterin. "Gönder"e bastıktan sonra limit reddi almak, kullanıcı deneyiminde en sık şikâyet edilen davranıştır.

Rezervasyon ve işlem ömrü

Limit sayacı işlem başlarken rezerve edilir, işlem tamamlandığında kesinleşir:

quote        → kontrol (rezervasyon yok)
execute      → rezervasyon (sayaç düşer)
complete     → kesinleşme
fail/expire  → rezervasyon çözülür (sayaç geri gelir)

Rezervasyon, işlem sonuçlanana kadar tutulur:

  • Rezervasyonun süresi işlemin olağan ömründen türetilir (onay penceresi, banka çekiminin mutabakat süresi, nakit kodunun geçerlilik süresi, kart otorizasyonunun bekleme süresi gibi).
  • Bu süre dolduğunda işlem hâlâ açıksa (örneğin fraud incelemesinde bekliyor ya da banka sonucu henüz gelmediyse) rezervasyon çözülmez, süresi uzatılır.
  • İşlem başarısız ya da iptal ile sonuçlandığında rezervasyon çözülür ve sayaç geri gelir.

İncelemede bekleyen bir işlem onaylandığında limit yeniden kontrol edilir. Rezervasyon bu arada çözülmüşse ve kullanıcı limitini başka işlemlerle doldurduysa onay reddedilir ve işlem bekletilmeye devam eder.

Kesinleşen ve süren harcamalar kalıcı olarak kaydedilir. Sayaç hizmeti yeniden başlasa bile kullanıcının o gün ve o ay kullandığı limit sıfırlanmaz; kesinleşmiş bir harcama sayaçtan düşmez.

Kısmi kesinleştirmede (örneğin otorize edilen tutarın bir kısmının kesinleştirilmesi) sayaç kesinleşen tutarı sayar; aradaki fark tutar sayacına geri verilir. İşlem adedi bir kez sayılır.

Kanal-üstü ortak tavan

Şema satırlarına ek olarak, program bazında seçili çıkış kanallarının paylaştığı bir üst tavan tanımlanabilir. Bu tavan açıkken IBAN transferi, banka çekimi, nakit çekim ve kart otorizasyonu aynı günlük/aylık havuzu tüketir; şema satırlarının sayaçları alt-limit olarak yürürlükte kalır.

Ortak tavan varsayılan olarak kapalıdır; platform şablonunda bu tavan için bir değer yoktur. Programınızda açılmadıkça yalnız şema satırlarının sayaçları çalışır. Açmak, uyum ekibinizin belirleyeceği eşik değerleriyle panelden program bazında yapılır.

Fail-closed davranış

Limit servisi cevap veremezse ne olacağı operasyona göre belirlenmiştir:

DurumDavranış
Limit kontrolü yapılamıyor (para çıkışı)İşlem reddedilir — "geçir gitsin" yoktur
Kart otorizasyonu, limit servisi yavaşKısa bir son tarih içinde cevap gelmezse otorizasyon reddedilir
Transfer, çekim, nakit, kart — kimliği doğrulanmamış kullanıcıProgram ayarından bağımsız olarak reddedilir (platform tabanı)
İşleme uyan limit satırı yok (ne tipe özel ne *)İşlem WALLET_LIMIT_TIER_UNDEFINED ile reddedilir
KYC eşiği tanımsızKapı devreye girmez — eşik koymamış program etkilenmez
⚠️

Cüzdandan cüzdana transfer, IBAN ve banka çekimi, nakit çekim ve kart işlemleri için en az LOW seviyesi platform düzeyinde zorunludur; programınız bu eşiği yalnız yükseltebilir. Tabanda olmayan bir işlem için KYC eşiği tanımlamazsanız o işlemde seviye kontrolü yapılmaz. Bkz. KYC Seviyeleri.

Kimliği doğrulanmamış bakiye tavanı

NONE seviyesindeki bir TRY hesabının bakiyesi 5.000 TL'yi aşamaz. Tavan, işlem sayaçlarından ayrı bir kontroldür: kart yüklemesi, temsilci yüklemesi ve gelen cüzdan transferi, hesabın güncel bakiyesi ile işlem tutarının toplamı tavanı aşacaksa para hareketi başlamadan WALLET_KYC_BALANCE_CAP_EXCEEDED ile reddedilir. LOW ve üstü seviyelerde bakiye tavanı yoktur; işlem tavanları limit şemasından gelir.

Bakiye tavanı yalnız açık devre programlarda uygulanır. Kapalı devre programlarda bakiye tavanı yoktur; kimliği doğrulanmamış kullanıcının işlem tavanlarını limit şemasıyla belirlersiniz.

Limit reddini kullanıcıya anlatma

Quote yanıtındaki limitBlocked: true size reddi önceden söyler. Kullanıcıya:

  • hangi sayacın dolduğunu (günlük mü aylık mı, tutar mı adet mi),
  • ne zaman yenileneceğini,
  • daha yüksek KYC seviyesiyle tavanın artıp artmayacağını

gösterin. Bkz. KYC Seviyeleri.

Yaygın hatalar

DurumSebepÇözüm
"Bu tipte limitim var ama işlem reddediliyor"Cüzdan toplamı dolu: * satırı aynı yöndeki tüm tiplerce paylaşılırbucket: WALLET_TOTAL_OUTFLOW satırına bakın
Limit geri gelmediİşlem hâlâ açık (inceleme, banka sonucu bekleniyor)İşlem sonuçlandığında rezervasyon çözülür
Tutar limitin altında ama redÜcret+vergi dahil requiredAmount tavanı aşıyorQuote'taki requiredAmount'a bakın
Beklenmedik biçimde erken limite dayanmaPlatform şablonunda tüm para çıkışı tipleri tek toplamı paylaşırTiplere ayrı tavan istiyorsanız kendi şemanızda tipe özel satır tanımlayın; * satırı yine toplamı sınırlar
Yükleme WALLET_KYC_BALANCE_CAP_EXCEEDED ile reddedildiAçık devre programda kimliği doğrulanmamış hesabın bakiyesi tavanı aşacakKullanıcının seviyesini doğrulanmış bir KYC kararıyla yükseltin