Karar API'si
Fraud ürünü tek bir gerçek zamanlı karar ucu sunar. Bir işlemi (ve müşteri, cihaz, işyeri hakkında elinizdeki bağlamı) gönderirsiniz; milisaniyeler içinde, daha ödemeyi çekmeden allow / review / block / force_3d kararını açıklanabilir gerekçe setiyle alırsınız.
Taşıma ve gateway bağımsızdır: ödeme orkestratörümüzü kullanmanız gerekmez. Kendi gateway'i veya tek POS'u olan bir işyeri de, kendi alt-işyerlerini skorlayan bir ödeme kuruluşu (PSP) da aynı şekilde entegre olur.
Tek karar yolu vardır. Kenarda nasıl kimlik doğrularsanız doğrulayın (sunucunuz, panel, SDK), her çağıran aynı motora ulaşır — yani bu sayfadaki alan sözleşmesi sözleşmenin tamamıdır.
Tüm örnekler için temel URL: https://api-gateway.lunixi.com/api/v1.
Kimlik Doğrulama
Fraud kararları Bearer erişim token'ı kullanır. Kayıtlı Ed25519 anahtarınızla POST /api/v1/auth/token'a imzalı istek atıp kısa ömürlü token alırsınız, sonra her karar çağrısında gönderirsiniz:
Authorization: Bearer <access-token>İmza şeması (X-Key-Id, X-Date, X-Nonce, Digest, X-Signature) Kimlik Doğrulama sayfasında anlatılır. Token'ınız fraud:view_decisions kapsamını taşımalıdır. Kimliği doğrulanan taraf (sizin merchantId değeriniz) token'dan alınır, asla istek gövdesinden değil — gövde başka bir kiracıyı taklit edemez.
Uç (Endpoint)
POST /api/v1/fraud/decisions/evaluateAşağıdaki her alan opsiyoneldir — elinizde ne varsa gönderin. Motor yalnızca aktif kurallarının başvurduğu alanları okur; gerisi bağlam olarak saklanır. Tüm tutarlar minör-birim tam sayıdır (ör. 250000 = ₺2.500,00). Asla ondalık göndermeyin.
Yalnız burada belgelenen üst seviye alanları gönderin. API, tanımsız bir üst seviye alanı 400 ile reddeder. Her objenin iç alanları serbesttir: payment, customer, metadata ve benzerlerinin içine kendi anahtarlarınızı hatasız ekleyebilirsiniz.
Eksik veya yanlış tipli alan, kuralı sessizce false yapmaz — kuralı TETİKLEYEBİLİR.
Kural değerlendirici üç durumludur: true · false · indeterminate. Bir koşulun işlenenleri eksikse ya da tipleri uyuşmuyorsa (ör. sayısal bir eşiğe "1500" yerine null göndermek), sonuç indeterminate olur ve fail-closed ilkesiyle eşleşmiş sayılır. Gerekçe metninde bu ayrıca not düşülür.
Pratik sonucu: alanı göndermemek "o kural çalışmasın" demek değildir — tam tersine kuralın tetiklenmesine yol açabilir. Bir kuralın çalışmasını istemiyorsanız kuralın kapsamını daraltın; alanı boş bırakarak susturmaya çalışmayın.
Yönlendirme alanları (üst seviye)
| Alan | Tip | Anlamı |
|---|---|---|
integrationMode | string | Yalnız standalone (varsayılan). Alanı göndermeseniz de bu değer kullanılır; başka bir değer 400 döner |
productContext | string | Ürün yüzeyiniz: live_session, payment_form, hosted_payment_form ya da direct_api |
subjectType | string | card_payment, bank_transfer, wallet_operation, bill_payment … hangi payload'ı göndereceğinizi seçer |
paymentRail | string | card, bank, wallet, crypto … |
transferDirection | string | inbound / outbound |
paymentId | string | Bu işlem için kendi referansınız |
merchantGroupIds | string[] | Kural hedeflemesi için grup kapsamı |
Kanal taksonomisi (üst seviye)
Bu alanlar isteğin nereden ve hangi anda geldiğini söyler. Akış tetikleyicileri bu boyutlarla eşleşir, karar kaydı bunları kolon olarak tutar ve raporlar bunlara göre kırılır. Hepsi opsiyoneldir, ama göndermek akışlarınızı daraltabilmenizi sağlar.
| Alan | Değerler | Anlamı |
|---|---|---|
channel | standalone_api (varsayılan) · merchant_form | Sunucudan sunucuya çağrıda standalone_api; kendi ödeme formunuzda Lunixi SDK kullanıyorsanız merchant_form |
surface | form_gate · transaction · withdrawal_gate · settlement | Kanal içindeki karar yüzeyi |
stage | pre_authorization · post_authentication · post_hoc · async_event · scheduled | İşlemin yaşam döngüsündeki değerlendirme anı |
operationKind | card_sale · card_preauth · bill_payment · merchant_payment · qr_payment · outbound_transfer · inbound_transfer · w2w_transfer · w2iban_withdrawal · bulk_payout · agent_cash_out · card_topup · agent_topup · bank_transfer_topup | İş işlemi türü. subjectType'ın ayıramadığı çakışmaları çözer (fatura ile işyerine ödemenin ikisi de cüzdan ödemesidir) |
authModeRequested | 2d · 3d | İşlem için istediğiniz kimlik doğrulama modu |
authModeApplied | 2d · 3d | İşlemde gerçekten uyguladığınız mod |
transactionRef | string (≤180) | Hesabınız içinde işlemi tanımlayan kimlik (sipariş numarası gibi). Aynı işlem için yapılan değerlendirmeler 30 gün boyunca tek işlem olarak sayılır; göndermezseniz her çağrı ayrı işlem sayılır |
subjectId | string (≤180) | Değerlendirilen konunun kimliği (sipariş, müşteri ya da oturum numarası) |
subMerchantRef | string (≤180) | Hesabınız altındaki alt işyerinin referansı. merchant.merchantRef ile birlikte gönderirseniz iki değer aynı olmalıdır |
identityAssertion | string | Tarayıcıdaki Lunixi SDK'nın ürettiği imzalı kimlik artefaktı |
channel kapalı bir sözlüktür ve yalnız iki değer beyan edilebilir. lunixi_checkout ve wallet kanalları Lunixi'nin kendi servislerinden gelir; dışarıdan beyan edilirse istek 400 FRAUD_CHANNEL_NOT_DECLARABLE döner. Aynı kural productContext için de geçerlidir: platformun iç şeritlerine ait bağlamlar (simulation, post_hoc_backfill, manual_review) dışarıdan beyan edilemez.
merchant_form kanalında üç alan birlikte gider. identityAssertion yalnız channel: merchant_form ile gönderilebilir ve yanında subjectId zorunludur — artefaktın bağlanacağı bir konu olmadan doğrulama "imza tuttu" demekle yetinirdi. subjectId değeri, SDK oturumunu başlatırken verdiğiniz değerle aynı olmalıdır; ayrışırsa karar düşmez ama kayıt assertion_subject_mismatch sebep koduyla işaretlenir ve artefakt güvenilmez sayılır.
tenantId göndermeniz gerekmez. Kiracı kimliği yalnız kimlik doğrulama token'ından damgalanır; gövdedeki bir değer dikkate alınmaz.
stage: post_authentication açık beyan ister. Akış tetikleyicilerinin genel kuralı "boyut beyan etmeyen akış her istekle eşleşir" biçimindedir. Bu aşamada kural tersine çevrilir: bir akış bu aşamayı açıkça beyan etmedikçe o şeritte koşmaz. Böylece bugün yayınlı ve boyutsuz akışlarınız 3DS dönüşünde kendiliğinden ikinci kez koşmaz.
Obje sözlüğü
subjectType değerinize uyan objeleri gönderin. Besler sütunu, alanın desteklediği risk senaryosunu adlandırır (TCMB referansları Türkiye Cumhuriyet Merkez Bankası Risk Yönetimi Rehberi'ne aittir; aynı alanlar başka regülasyon paketlerinde eşdeğer kuralları çalıştırır).
payment — kart ödemesi
| Alan | Tip | Besler |
|---|---|---|
amount | number (minör birim) | tutar eşikleri, velocity değeri, düz-tutar yoğunlaşması (5.4) |
currency | string | çok-para-birimli eşikler |
is3D | boolean | doğrulama duruşu |
country | string | işlem coğrafyası (4.5) |
cardCountry | string | kart ülkesi uyumsuzluğu |
installmentCount | number | taksit anomalileri |
method | string | ödeme yöntemi |
id | string | kart referansı (PCI uyumlu token ya da parmak izi kullanın) |
customer
| Alan | Tip | Besler |
|---|---|---|
id | string | müşteri-çapalı velocity & farklı-karşı-taraf sayımları (4.1) |
email | string | e-posta sinyalleri — güvenilmez sağlayıcı, ardışık adresler (4.4) |
country | string | müşteri coğrafyası |
isNew | boolean | genç/yeni-hesap eşikleri (4.2) |
groups | string[] | segment kapsamı |
assignedRuleIds | string[] | açık kural hedefleme |
device
| Alan | Tip | Besler |
|---|---|---|
ipAddress | string | aynı-IP çok-müşteri / çok-IP kuralları (4.3), ilişkili-hesap genişletme (8.2) |
fingerprintId | string | cihaz velocity, kart→cihaz oynaması (5.14) |
vpnDetected / proxyDetected / torDetected | boolean | anonimleştirilmiş-köken riski |
trustedDevice | boolean | yanlış-pozitifi azaltır |
country | string | cihaz coğrafyası |
session — ödemenin verildiği oturum bağlamı
Yönlendirilmiş ödeme (müşteriye telefonda anlatılan ödeme) sinyalleri buradan okunur. Göndermezseniz bu sinyaller "bilinmiyor" sayılır.
| Alan | Tip | Besler |
|---|---|---|
channel | string | oturumun geldiği yüzey (ör. app, web) |
activeCallDetected | boolean | ödeme anında süren telefon görüşmesi |
callStartedSecondsBefore | number | görüşmenin ödemeden kaç saniye önce başladığı |
remoteAccessToolDetected | boolean | uzaktan erişim aracı varlığı |
screenShareActive | boolean | ekran paylaşımının açık olması |
sessionAgeSeconds | number | oturumun yaşı |
scamQuestionnaire | object | müşteriye sorulan doğrulama sorularının yanıtları |
priorWarning | object | müşteriye daha önce gösterilmiş uyarı |
merchant — alt-işyeri bağlamı (PSP / kendi gateway'i)
Bunu, işyeri ilişkisinin sahibi siz olduğunuzda gönderin (ör. alt işyerlerini skorlayan bir ödeme kuruluşu). SaaS platformumuzu kullanıyorsanız ve göndermezseniz, MCC işyerinin kimlik bilgisinden çözülür.
| Alan | Tip | Besler |
|---|---|---|
merchantRef | string | sizin alt işyeri kimliğiniz (merchantId değerinizden ayrı) |
mcc | string | sektör-ortalaması ciro & segment (5.1) |
category / businessModel | string | segment yorumu (sektöre göre gece/hafta-sonu kuralları, 5.3) |
country | string | işyeri / POS-sunucu ülkesi (5.6) |
onboardingDate | ISO tarih | yeni-işyeri kümülatif hacim (5.8) |
firstTransactionDate | ISO tarih | ilk-faaliyet penceresi (5.8) |
hasFinancialHistory | boolean | yeni-işletme hacim eşikleri (5.8) |
domainAgeDays | number | genç-domain riski (5.6) |
registrationCountry | string | kayıt vs. faaliyet uyumsuzluğu |
bankTransfer — hesap / cüzdan transferleri
| Alan | Tip | Besler |
|---|---|---|
amount, currency | number / string | transfer eşikleri |
senderIban / receiverIban | string | farklı-karşı-taraf sayımları, toplayıcı/dağıtıcı hesaplar (4.1) |
senderAccountNumber / receiverAccountNumber | string | hesap ilişkilendirme |
senderName / receiverName | string | isim-örüntü analizi |
senderBankCode / receiverBankCode | string | bankalar-arası akış |
reference / description | string | işlem-açıklaması kelime taraması (4.6) |
country | string | koridor coğrafyası |
billPayment — fatura ödeme & para havalesi
| Alan | Tip | Besler |
|---|---|---|
billerId / billerCategory | string | kurum yoğunlaşması, aylık fatura sayıları (Bölüm 6) |
invoiceId / subscriberNumber | string | tekrar / sorgu-sayısı kontrolleri |
amount, currency, dueDate | number / string / tarih | tutar & zamanlama anomalileri |
Diğer işlem tipi payload'ları
walletOperation (walletId, operationType, amount, destinationWalletId), cryptoTransfer (asset, walletAddress, chain, travelRuleReference), loanApplication (requestedAmount, declaredIncome, employerName) ve payout (beneficiaryId, destinationType, destinationReference) aynı şekli izler — subjectType değerinize uyan objeyi gönderin; hangi alanların önemli olduğuna akışınızın kuralları karar verir.
telemetry, mobileApp, metadata
telemetry— davranışsal sinyaller (mouseMovementCount,copyPasteCount,typingCadenceScore,behavioralRiskScore).mobileApp— mobil kimlik & attestation (installId,deviceId,platformScopedIdHash,playIntegrityToken,appAttestAssertion…).metadata— serbest bağlam. Sunucuda türetilen sinyaller (işlem-açıklaması kelime bayrakları, back-URL uyumsuzluğu, IP ülkesi, telefon hash'i) event ingest sırasında hesaplanır ve kurallarametadata.fraudTransactionEvent.*altında sunulur.
Yanıt
{
"status": "success",
"code": "SUCCESS",
"message": "…",
"data": {
"decision": "allow | review | block | force_3d",
"score": 0.42,
"reasonCodes": ["TCMB_3.1.2_6"],
"matchedRuleGroups": [],
"matchedRules": [],
"flowPath": [],
"actions": [],
"tags": [],
"explainability": { "summary": "", "groupResults": [] },
"liveSignals": {},
"multiFlow": {
"enabled": true,
"executedFlows": [],
"skippedFlows": [],
"asyncFlows": []
},
"traceId": "…",
"latencyMs": 12
},
"statusCode": 200,
"requestId": "req_01J8ZV..."
}Yanıt zarfında success alanı yoktur. Başarı üst seviyedeki status alanında taşınır; yük data altındadır. İstemcide response.success okuyan bir kontrol her zaman undefined görür.
decision değerini yetkili kabul edin. reasonCodes ve explainability her kararı denetim için belgeler. multiFlow bloğu hangi akışların koştuğunu, hangilerinin atlandığını ve hangilerinin arka planda kuyruğa alındığını gösterir — ayrıntı: Akışlar ve Çözümleme.
traceId kararın tekil kimliğidir. Kararı sonradan okumak ya da bir destek talebinde göstermek için saklamanız gereken tek değer budur — bkz. Karar Kayıtları.
Hata kodları, kota yanıtı ve yeniden deneme kuralları: Hatalar, tekrarlı istekler ve yeniden deneme.
Örnek
curl https://api-gateway.lunixi.com/api/v1/fraud/decisions/evaluate \
-H "Authorization: Bearer <access-token>" \
-H "Content-Type: application/json" \
-d '{
"subjectType": "card_payment",
"paymentRail": "card",
"paymentId": "pi_123",
"payment": { "amount": 250000, "currency": "TRY", "id": "hmac:card-fingerprint" },
"customer": { "id": "cus_88", "email": "[email protected]", "isNew": true },
"device": { "fingerprintId": "dev_9f2c", "ipAddress": "203.0.113.7" },
"merchant": { "merchantRef": "sub_88", "mcc": "7995", "country": "TR", "onboardingDate": "2026-06-01" }
}'Sayan kurallar için geçmiş besleyin
Tek bir evaluate çağrısı yalnız önündeki işlemi bilir. Zamanla sayan kurallar — "bugün 10'dan fazla transfer", "5'ten fazla farklı alıcı", sektör ortalamasına göre ciro sapması — geçmişe ihtiyaç duyar. Geçmişi olay omurgasına beslersiniz:
POST /api/v1/fraud/events/transactions (tekil)
POST /api/v1/fraud/events/transactions/batch (parti)Bu uçlar Bearer token yerine istek başına Ed25519 imzası kullanır ve senkron yazar: sonraki evaluate çağrısı olayı anında görür. Kendi tarafınızda bir mesaj kuyruğuna ihtiyacınız yoktur.
Zorunlu alanlar, olay türü sözlüğü, parti sınırları ve imza ayrıntıları: Olay Alımı API'si.
İki çağrı, tek entegrasyon. Geçmiş için her işlemi olay alımına akıtırsınız, karar için ödeme anında decisions/evaluate çağırırsınız. Hız, farklı-sayım ve temel çizgi senaryoları ancak defterde veri olunca tetiklenir.