Limitler
- 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
- Limit OKUMA üç yüzeydedir (
GET end-users/:id/limits, portaldame/limits). Limit şeması yazma panele özeldir:limit-schemes,programs/:id/limit-scheme,programs/:id/shared-limit-caps,programs/:id/otp-policy— izinwallet: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ır | Sayaç |
|---|---|
operationType: "*" | Cüzdan toplamı. Aynı yöndeki tüm operasyon tipleri tek sayacı paylaşır. |
operationType: "W2W_TRANSFER" gibi bir tip | Yalnı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:
| Alan | Tip | Açıklama |
|---|---|---|
kycLevel | string | Hangi KYC seviyesine uygulanacağı |
operationType | string | * (ya da boş) = cüzdan toplamı; bir tip adı = o tipin kendi sayacı |
currency | string | Seçici — satır hangi işlemlerle eşleşir. * = tüm para birimleri |
amountCurrency | string | Denominasyon — aşağıdaki tutarlar hangi para birimi cinsinden. * geçersizdir |
singleMax | string | Tek işlemde en fazla (minor-unit) |
dailyAmount | string | Günlük toplam tutar tavanı |
monthlyAmount | string | Aylık toplam tutar tavanı |
dailyCount | number | Günlük işlem adedi tavanı |
monthlyCount | number | Aylı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:
currencybir seçicidir: "bu satır hangi işlemlere uygulanır".*onun için meşru bir değerdir.amountCurrencybir 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}/limitsSorguyu operationType ve currency ile daraltabilirsiniz. Yanıttaki her satır bucket alanıyla hangi sayacı gösterdiğini belirtir:
bucket | Anlamı |
|---|---|
OPERATION_TYPE | Operasyon 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/limitsKullanı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:
| Durum | Davranış |
|---|---|
| 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ız | Kapı 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
| Durum | Sebep | Çözüm |
|---|---|---|
| "Bu tipte limitim var ama işlem reddediliyor" | Cüzdan toplamı dolu: * satırı aynı yöndeki tüm tiplerce paylaşılır | bucket: 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şıyor | Quote'taki requiredAmount'a bakın |
| Beklenmedik biçimde erken limite dayanma | Platform şablonunda tüm para çıkışı tipleri tek toplamı paylaşır | Tiplere 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 reddedildi | Açık devre programda kimliği doğrulanmamış hesabın bakiyesi tavanı aşacak | Kullanıcının seviyesini doğrulanmış bir KYC kararıyla yükseltin |