Olay Alımı API'si
Karar API'si yalnız önündeki işlemi görür. Zamanla sayan kurallar — "bugün 10'dan fazla transfer", "ayda 5'ten fazla farklı alıcı", kendi cironuza göre sapma — bir geçmişe ihtiyaç duyar. O geçmişi bu uçlarla beslersiniz.
POST /api/v1/fraud/events/transactions (tekil)
POST /api/v1/fraud/events/transactions/batch (parti)İki uç, tek entegrasyon. Her iş olayını olay alımına akıtırsınız; ödeme anında Karar API'sini çağırırsınız. Hız, farklı-sayım ve temel çizgi senaryoları ancak defterde veri biriktikçe tetiklenir. Kendi tarafınızda bir mesaj kuyruğuna ihtiyacınız yoktur: alım senkron yazar, hemen sonraki karar olayı görür.
Kimlik doğrulama — istek başına imza
Bu iki uç Bearer token ile çağrılmaz. Karar API'si kısa ömürlü bir Bearer token kullanır; olay alımı her istekte Ed25519 imzası ister. İmza, olayı sizin hesabınıza bağlayan şeydir — gövde başka bir hesabı iddia edemez.
Her istekte şu başlıklar bulunur:
| Başlık | Zorunlu | Değer |
|---|---|---|
X-Key-Id | ✔ | Kayıtlı açık anahtarınızın kimliği |
X-Date | ✔ | ISO 8601 zaman damgası. Sunucu saatinden ±300 saniye dışındaki istek 401 döner |
X-Nonce | ✔ | İstek başına tekil değer. Aynı anahtar + aynı nonce ikinci kez kullanılırsa 401 döner |
Digest | ✔ (gövde varsa) | SHA-256= + gövdenin SHA-256 özetinin Base64 hâli |
X-Signature | ✔ | Kanonik dizgenin Ed25519 imzasının Base64 hâli |
Kanonik dizge satırları \n ile birleştirilir:
POST
/api/v1/fraud/events/transactions
X-Date:2026-10-05T09:12:44.000Z
X-Nonce:5f1c9a6e-7b2d-4a11-9c3e-2f8a7d41b0c6
Digest:SHA-256=47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=- İlk satır HTTP yöntemi (büyük harf), ikinci satır sorgu dizesi dahil yoldur.
Digestsatırı yalnızDigestbaşlığı gönderildiğinde eklenir.
Özeti sıkıştırılmış JSON üzerinden hesaplayın.
Sunucu, aldığı gövdeyi ayrıştırıp yeniden serileştirerek özeti doğrular — yani girintisiz, boşluksuz JSON üzerinden. Gövdeyi okunabilirlik için girintileyip özeti o hâlin üzerinden hesaplarsanız her istek 401 INVALID_DIGEST döner. Anahtar sırası gönderdiğiniz sıra olarak korunur; yalnız biçimlendirme boşlukları kaldırılmalıdır.
Anahtarınızın ayrıca FRAUD_SERVICE ürün yetkisi olmalıdır; olmazsa uç 403 döner. Anahtara IP kısıtı tanımladıysanız istek o adreslerden gelmelidir.
Tekil olay
POST /api/v1/fraud/events/transactionsZorunlu alanlar
| Alan | Tip | Anlamı |
|---|---|---|
eventId | string | Olayın sizin tarafınızdaki tekil kimliği. Tekrar bastırmanın anahtarıdır |
eventType | string | Olay türü sözlüğünden bir değer (aşağıda). En fazla 64 karakter |
subjectType | string | Olayın konusu (transaction, customer, account, mobile_payment …). En fazla 64 karakter |
occurredAt | string | number | Olayın gerçekleştiği an (ISO 8601 ya da epoch milisaniye) |
merchantId gövdeden okunmaz. Kimliği doğrulanan anahtardan damgalanır, bu yüzden gövdeye yazılan bir değer dikkate alınmaz.
Bağlam alanları
Hepsi opsiyoneldir; elinizde olanı gönderin. Bir alanı göndermemek onu "bilinmiyor" yapar.
| Grup | Alanlar |
|---|---|
| Sonuç | outcome, failureCode |
| Taraflar | customerId, accountId, counterparty, counterpartyType |
| Ağ ve cihaz | ip, ipCountry, sourcePort, destPort, deviceFingerprintId, userAgent |
| İşlem | amountMinor, currency, description, cardFingerprint, installment, phone |
| Bağlam | paymentId, merchantOrderId, merchantUrl, backUrl, apiKeyId, terminalId, terminalLocation |
| Sınıflandırma | productContext, operationKind, direction, paymentScheme |
| Yönlendirilmiş ödeme | payeeConfirmationOutcome, paymentPurpose, payerType, claimRef, relatedEventId |
| Hesap | accountOpenedAt |
| Alt işyeri | subMerchantRef |
| Serbest | metadata |
amountMinorminör birim tam sayıdır (250000= ₺2.500,00). Ondalık göndermeyin.operationKindvedirectiongibi sözlüklü alanlarda sözlük dışı bir değer400döner — bir yazım hatası bir kuralı sessizce ıskalamasın.relatedEventIden fazla 180 karakterdir.
Kişisel veri açık gelir, açık saklanmaz. ip, phone, description, counterparty, userAgent ve metadata.email isteğe açık metin olarak girer; alım katmanı bunları arama için özet, saklama için şifreli kolonlara çevirir. Ham değer olduğu gibi saklanmaz.
Karşı taraf zorunluluğu
Şu olay türleri bir karşı tarafa değer taşır; counterparty göndermezseniz istek 400 döner:
transfer_requested · transfer_completed · withdrawal_requested · withdrawal_completed
subjectType ya da productContext mobile_payment değerini taşıyorsa phone zorunludur: operatör tahsilatında hesap anahtarı telefon numarasıdır.
Tekrar bastırma
Aynı hesap için aynı eventId ikinci kez gönderilirse olay yeniden yazılmaz; yanıt o olayı deduplicated: true ile bildirir. Bu, yeniden deneme güvenliği sağlar: bir zaman aşımından sonra aynı olayı aynı eventId ile tekrar gönderebilirsiniz.
Olay alımında tekrar bastırma anahtarı eventId'dir, Idempotency-Key başlığı değil. Karar API'sinin tekrar bastırması yoktur: aynı işlem için ikinci bir evaluate çağrısı ikinci bir karar kaydı üretir. Faturalamada aynı transactionRef 30 gün boyunca tek işlem sayılır — ayrıntı: Hatalar, tekrarlı istekler ve yeniden deneme.
Örnek
BODY='{"eventId":"evt_8812","eventType":"transfer_completed","subjectType":"transaction","occurredAt":"2026-10-05T09:12:40.000Z","customerId":"cus_88","counterparty":"TR330006100519786457841326","amountMinor":250000,"currency":"TRY","ip":"203.0.113.7","direction":"outbound"}'
DIGEST="SHA-256=$(printf '%s' "$BODY" | openssl dgst -sha256 -binary | openssl base64 -A)"
curl https://api-gateway.lunixi.com/api/v1/fraud/events/transactions \
-H "Content-Type: application/json" \
-H "X-Key-Id: $LUNIXI_KEY_ID" \
-H "X-Date: $(date -u +%Y-%m-%dT%H:%M:%S.000Z)" \
-H "X-Nonce: $(uuidgen)" \
-H "Digest: $DIGEST" \
-H "X-Signature: $SIGNATURE" \
-d "$BODY"Yanıt
{
"status": "success",
"code": "SUCCESS",
"message": "...",
"data": {
"eventId": "evt_8812",
"id": "a3f1c0d2-...",
"deduplicated": false,
"matchedFlowCount": 2
},
"statusCode": 200,
"requestId": "req_01J8ZV..."
}idyalnız gerçekten satır yazıldığında döner; tekrar bastırmada gelmez.matchedFlowCount, bu olayla eşleşen ve koşan akış sayısıdır.
Parti
POST /api/v1/fraud/events/transactions/batchGövde ya doğrudan bir JSON dizisi ya da { "events": [...] } nesnesidir. İkisi de olmayan bir gövde 400 FRAUD_EVENT_BATCH_INVALID döner — boş bir parti sessizce "0 kayıt başarılı" sayılmaz.
Parti başına en fazla 500 olay. Üstü 400 FRAUD_EVENT_BATCH_TOO_LARGE ile partinin tamamını reddeder; kısmen alınmaz. Daha büyük beslemeleri 500'lük dilimlere bölün.
Parti sırayla işlenir ve kısmen başarılı olabilir: bir olayın doğrulaması düşerse diğerleri yazılmaya devam eder.
{
"status": "success",
"data": {
"total": 3,
"inserted": 2,
"deduplicated": 0,
"failed": 1,
"results": [
{ "eventId": "evt_1", "id": "…", "deduplicated": false },
{ "eventId": "evt_2", "id": "…", "deduplicated": false },
{ "eventId": "evt_3", "deduplicated": false, "error": "Event is missing required field(s): occurredAt." }
]
}
}results dizisini her zaman okuyun: HTTP durumu 200 olsa da failed sıfırdan büyük olabilir. Düşen olayları error metnine göre düzeltip aynı eventId ile yeniden gönderebilirsiniz.
Olay türü sözlüğü
Sözlük dışı bir eventType 400 döner. Bu bilinçlidir: transfer_requsted gibi bir yazım hatası sessizce kabul edilse, o olayı sayan kural hiç tetiklenmez ve eksiklik aylarca görünmezdi.
Hesap ve oturum
account_created · account_closed · account_restricted · relationship_terminated · login_succeeded · login_failed · otp_failed · pin_failed · password_changed · phone_changed · email_changed · device_registered
Ödeme
payment_attempted · payment_completed · payment_failed · refund · chargeback · chargeback_reversed · authentication_completed
Transfer, çekim ve havale
transfer_requested · transfer_completed · withdrawal_requested · withdrawal_completed · beneficiary_created · settlement_requested
Fatura ödeme
bill_payment · bill_query
İşyeri ve hesap bütünlüğü
merchant_iban_changed · domain_changed · api_key_created · api_request
Yönlendirilmiş ödeme bağlamı
Bunlar para hareketi değildir; bir ödemenin çevresindeki olgulardır. Mevcut eşikleri değiştirmezler, yalnız kendilerini adıyla okuyan kurallara girerler.
payee_confirmation_checked · payee_confirmation_requested · scam_warning_presented · scam_warning_acknowledged · scam_hold_applied · scam_hold_released · app_scam_reported · app_scam_claim_notified
Bu ailede bazı alanlar zorunludur:
| Olay | Zorunlu |
|---|---|
payee_confirmation_checked | payeeConfirmationOutcome + counterparty |
payee_confirmation_requested | payeeConfirmationOutcome + accountId |
scam_warning_presented / scam_warning_acknowledged | paymentId ya da relatedEventId |
scam_hold_applied / scam_hold_released | paymentId ya da relatedEventId |
app_scam_reported | paymentId ya da claimRef |
app_scam_claim_notified | claimRef + accountId |
account_restricted | accountId ya da customerId |
Eksik alan 400 döner: bir uyarının hangi ödemeye ait olduğu kayıtta yoksa, "uyarı gösterildi mi" sorusu sonradan cevaplanamaz.
Sektör ortalaması kuralları için
Kendi cironuza göre sapma kuralları yalnız kendi geçmişinizi okur ve ek alan istemez. Sektör ortalaması karşılaştırması ise sektör kırılımına ihtiyaç duyar: olaylara işyerinin MCC değerini metadata.mcc altında ekleyin. MCC taşımayan olaylar kendi-geçmiş kurallarını beslemeye devam eder, yalnız sektör karşılaştırması veri bulamaz.
Hata ve kota
Alım, kota reddini Retry-After başlığıyla döndürür ve olay kaybolmaz: başlıktaki süre kadar bekleyip aynı eventId ile yeniden gönderin. Durum kodları, hata kodları ve kota başlıkları: Hatalar, tekrarlı istekler ve yeniden deneme.
Sonraki adım
- Karar API'si — ödeme anında karar
- Karar Kayıtları — verilmiş kararları okuma ve mutabakat
- Akışlar ve Çözümleme — hangi akışın hangi olayla tetiklendiği