Sanction
Yaptırım Taraması API

Yaptırım Taraması API

Bir kişiyi, kurumu, kripto cüzdanını, banka hesabını ya da işlemi yaptırım, PEP ve diğer risk listelerine karşı tarar. Karar döndürmez; eşleşme döndürür — ne yapacağınıza siz karar verirsiniz.

Yaptırım taraması entegrasyon akışıAkış: sunucunuz Ed25519 imzasıyla kısa ömürlü bir erişim jetonu alır, jetonla tarama ucunu çağırır ve eşleşme listesi döner. Eşleşme yoksa akışınız devam eder; eşleşme varsa karar sizin tarafınızda verilir ve sürekli izlemeye kayıt yapılabilir.BEARER İLEBOŞEŞLEŞMESunucunuzEd25519 özel anahtarPOST /api/v1/auth/tokenimzalı istekErişim jetonukısa ömürlü BearerPOST /api/v1/sanction/screening/name · wallet · account · transactionmatches[]skor · hitType · listeAkış devamSizin kararınızblokla / inceleAÇIKLAMASİZİN TARAFINIZTARAMA ÇAĞRISIYANIT
Kararı Lunixi vermez, siz verirsiniz: tarama ucu eşleşme listesi ve skor döner, "blokla" demez. Eşik (threshold) ve eşleşme tipine göre ne yapacağınız sizin politikanızdır — bu ayrım denetimde de böyle savunulur.

Kimlik doğrulama

Tarama uçları kısa ömürlü bir erişim jetonu ister. Jetonu Ed25519 imzasıyla alırsınız:

POST https://api-gateway.lunixi.com/api/v1/auth/token
HeaderZorunluAçıklama
X-Key-Id✅Açık anahtar kimliğiniz (kid)
X-Signature✅Ed25519 imzası (Base64)
X-Date✅ISO-8601 istek zamanı
X-Nonce✅Tekil istek nonce'u
Digest—Gövdenin SHA-256 özeti (Base64); gövde varsa zorunlu

Dönen jetonu tarama çağrılarında Authorization: Bearer … olarak gönderin.

⚠️

Anahtarınızın sanction:view_results yetkisi olmalıdır; yetkisiz anahtarla alınan jeton tarama uçlarında reddedilir. Kanonik imza string'i ve hata kodları: Kimlik Doğrulama.

Tarama uçları

Dört özne tipi, dört ayrı uç:

POST /api/v1/sanction/screening/name          # kişi veya kurum
POST /api/v1/sanction/screening/wallet        # kripto cüzdan adresi
POST /api/v1/sanction/screening/account       # banka hesabı / IBAN
POST /api/v1/sanction/screening/transaction   # işlem (taraflarıyla birlikte)

İsim, cüzdan ve işlem taramaları ile kamu ihale yasağı taraması aktif liste yayınına karşı yapılır: her tarama, o an yürürlükte olan yayını sabitler ve yanıtta hangi yayını okuduğunu söyler. Liste yayınının ne olduğu: Yaptırım Taraması.

İsim taraması gövdesi

AlanTipZorunluAçıklama
namestring✅Taranacak ad
subjectTypestring—person | organization
countrystring—ISO 3166-1 alpha-2
dateOfBirthstring—ISO-8601; kişi taramasında yanlış-pozitifi ciddi düşürür
identifiersarray—Kimlik numarası, vergi no, pasaport gibi tekilleştiriciler
riskDomainsstring[]—Taramayı bu risk alanlarıyla sınırlar: sanctions, pep, rca, wanted, regulatory, debarment, ownership, vessel, securities. Gönderilmezse bütün risk alanları taranır
modestring—sanctions_only | sanctions_pep | full_risk — hazır bir risk alanı kümesi (bkz. AML Taraması). riskDomains ile birlikte verilirse ikisinin kesişimi taranır
thresholdnumber—Eşleşme skoru alt sınırı
customerReferencestring—Kendi kayıt kimliğiniz (denetim izine yazılır)
curl -X POST "https://api-gateway.lunixi.com/api/v1/sanction/screening/name" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Mehmet Öz",
    "subjectType": "person",
    "country": "TR",
    "dateOfBirth": "1980-04-12",
    "riskDomains": ["sanctions", "pep", "rca"],
    "threshold": 0.85,
    "customerReference": "cust_84213"
  }'
⚠️

Bilinmeyen bir mode ya da risk alanı, veya mode ile riskDomains kesişiminin boş olması sanction.screening.scope_invalid (400) ile reddedilir. Geçersiz bir alan sessizce düşürülmez; düşürülseydi hiç taranmamış bir alan "eşleşme yok" gibi görünürdü.

Yanıt

Yanıt standart yanıt zarfı içinde döner; tarama alanları data altındadır.

{
  "status": "success",
  "code": "sanction.screen_name.completed",
  "message": "…",
  "data": {
    "latencyMs": 128,
    "screeningRequestId": "…",
    "publicationId": "…",
    "publicationRevision": 34,
    "coverageStatus": "COMPLETE",
    "evidenceRef": "…",
    "screenedRiskDomains": ["sanctions", "wanted", "regulatory", "debarment", "pep", "rca"],
    "uncoveredRiskDomains": [],
    "matches": [
      {
        "hitId": "…",
        "entityId": "…",
        "matchedName": "Mehmet Oz",
        "score": 0.91,
        "hitType": "probable",
        "listCode": "OFAC SDN",
        "sourceListName": "OFAC SDN",
        "recordType": "person",
        "riskDomains": ["sanctions"],
        "reason": "PROBABLE_MATCH",
        "explanationJson": "{…}",
        "lists": [
          {
            "datasetCode": "OFAC",
            "displayName": "OFAC SDN",
            "datasetKind": "SANCTIONS",
            "datasetVersionId": "…",
            "subLists": [],
            "programs": ["…"],
            "entityIds": ["…"],
            "listings": [
              { "subList": "", "label": "…", "program": "…", "reference": "…", "listedOn": "…" }
            ]
          },
          {
            "datasetCode": "UN",
            "displayName": "…",
            "datasetKind": "SANCTIONS",
            "datasetVersionId": "…",
            "subLists": [],
            "programs": ["…"],
            "entityIds": ["…"],
            "listings": []
          }
        ]
      }
    ],
    "datasetFreshnessJson": "{…}"
  },
  "statusCode": 200,
  "requestId": "…"
}
AlanAnlamı
matchesBoş dizi, yalnız status: "success" iken temiz demektir — ve coverageStatus COMPLETE değilse yalnız taranan alanlar için. Ayrıntı: Tarama yapılamadığında
score0–1 arası benzerlik; threshold altındakiler elenir
hitTypeexact | probable | possible
riskDomainsEşleşen kişi veya kurumun risk alanları (sanctions, pep, wanted …)
listsEşleşmenin yer aldığı her liste — liste kodu ve adı, okunan liste sürümü, program ve alt listeler, listeleme kayıtları (listings)
sourceListNameEşleşmenin temsilci kaydının listesi. Bütün listeler için lists okunmalıdır
screeningRequestIdTaramanın kimliği; tarama geçmişinde ve rapor talebinde bu kimliği kullanın. Üst seviyedeki requestId HTTP isteğinin kimliğidir, taramanın değil
publicationId · publicationRevisionTaramanın okuduğu liste yayını ve yayının tarama anındaki revizyonu
coverageStatusCOMPLETE | PARTIAL | DEGRADED — aşağıda
screenedRiskDomainsTaranması istenen risk alanları
uncoveredRiskDomainsİstenen ama yayındaki hiçbir listenin kapsamadığı risk alanları
evidenceRefTaramanın değiştirilemez kanıt kaydının kimliği; denetim ve itirazlarda bu kimliği kullanın
datasetFreshnessJsonHangi tarihli veriye karşı tarandığı. Denetimde "PEP tarandı" beyanı tek başına savunulamaz

Birleşik eşleşme

Aynı kişi veya kurum birden çok listede yer alıyorsa tek eşleşme döner: skor, listelerin en yüksek skorudur ve kişinin yer aldığı listelerin tamamı lists içindedir. Aynı kişi için OFAC, BM ve AB'den üç ayrı satır almazsınız; tek satırda üç liste görürsünüz.

Aynı listedeki iki kayıt ise adları aynı olsa da ayrı eşleşmelerdir: bir yayıncının aynı adla listelediği iki kayıt iki ayrı kişi veya kurumdur.

Kapsam durumu

coverageStatusAnlamıEşleşme yoksa
COMPLETEİstenen bütün risk alanları tarandıTemiz sonuç
PARTIALİstenen risk alanlarından en az biri için yayında liste yok; bu alanlar uncoveredRiskDomains içindedirYalnız taranan alanlar için temiz. uncoveredRiskDomains için temiz değildir
DEGRADEDYazım farkı olan adları bulan aday araması kullanılamadı ya da çok yaygın bir ad nedeniyle aday penceresi doldu; benzer yazılmış adlar kaçmış olabilirTam bir tarama gibi değerlendirmeyin; taramayı yeniden çalıştırın

Liste yayınına geçişten önce yapılmış bir taramanın aynı idempotency anahtarıyla tekrarında publicationId, publicationRevision, coverageStatus ve evidenceRef null döner.

⚠️

datasetFreshnessJson boş dönerse tazelik manifestosu üretilememiş demektir. Bu durumda uyum beyanınızı muhafazakâr kurun — "şu tarihli listeye karşı tarandı" diyemezsiniz.

Tarama yapılamadığında

Aktif bir liste yayını sabitlenemezse tarama yapılmaz ve eski verilere geri düşülmez. Yanıt status: "failure" ve HTTP 503 ile döner:

Uçcode
İsim taramasısanction.screen_name.failed
Cüzdan taramasısanction.wallet.failed
İşlem taramasısanction.transaction.failed
Kamu ihale yasağı taramasısanction.public_procurement.failed
🚫

Başarısız bir tarama hiçbir koşulda "eşleşme yok" olarak değerlendirilmemelidir. Müşteri kaydını veya işlemi "taranmadı" durumunda bekletin; taramayı tekrarlayın ya da incelemeye alın. Boş matches listesi yalnız status: "success" iken anlam taşır.

Cüzdan taraması

POST /api/v1/sanction/screening/wallet
AlanTipZorunluAçıklama
walletAddressstring✅Taranacak adres
chainstring—Ağ (ör. ethereum, bitcoin, tron, solana)
modestring—wallet_sanctions (varsayılan) | wallet_risk | wallet_full_aml — geniş modlar maruziyet ve kripto istihbaratı isabetlerini de ekler
customerReferencestring—Kendi kayıt kimliğiniz

Adres, aktif yayındaki listelerde yer alan kripto cüzdan adresleriyle tam eşleşmeyle aranır; benzerlik araması yapılmaz. Harf büyüklüğü yalnız bilgi taşımadığı biçimlerde yok sayılır:

Adres biçimiKarşılaştırma
EVM onaltılık (0x…)Harf büyüklüğüne duyarsız
Önekli bech32 (bc1…, ltc1… vb.)Harf büyüklüğüne duyarsız
Önekli CashAddrHarf büyüklüğüne duyarsız
Diğerleri (ör. Bitcoin legacy, Tron, Solana)Harf büyüklüğüne duyarlı — adresi verildiği gibi gönderin

Eşleşme ağ etiketine değil adrese göre yapılır: aynı EVM adresi farklı EVM ağlarında aynı adrestir. Listenin belirttiği ağ ayrıca listedChains alanında döner.

{
  "status": "success",
  "code": "sanction.wallet.completed",
  "data": {
    "address": "0x…",
    "chain": "ethereum",
    "isSanctioned": true,
    "riskScore": 100,
    "riskLevel": "…",
    "publicationId": "…",
    "publicationRevision": 34,
    "coverageStatus": "COMPLETE",
    "evidenceRef": "…",
    "publicationHits": [
      {
        "hitId": "…",
        "entityId": "…",
        "entityName": "…",
        "entityType": "ORGANIZATION",
        "hitType": "exact",
        "score": 100,
        "riskCategory": "sanctions",
        "riskDomains": ["sanctions"],
        "sourceListName": "OFAC SDN",
        "lists": [ { "datasetCode": "OFAC", "displayName": "OFAC SDN", "…": "…" } ],
        "listedAddress": "0x…",
        "listedChains": ["ETH"],
        "caseRule": "EVM_HEX"
      }
    ],
    "hits": []
  },
  "statusCode": 200
}
AlanAnlamı
publicationHitsListe yayınında adresi tutan listelenmiş taraflar. Aynı taraf birden çok listedeyse tek isabettir ve bütün listeleri lists içindedir
riskCategoryTarafın en katı risk alanı
listedAddress · listedChainsAdresin listedeki yazımı ve listenin belirttiği ağ veya para birimi
caseRuleUygulanan karşılaştırma kuralı: EVM_HEX | BECH32 | CASHADDR | CASE_SENSITIVE
hitsKendi cüzdan listeniz, maruziyet kayıtları ve kripto istihbaratı. Liste yayınının isabetleri bu alanda yer almaz
isSanctionedYaptırım alanındaki bir taraf adresi tutuyorsa true

Yaptırım alanındaki bir taraf adresi tutuyorsa isSanctioned: true olur ve skor 100'dür. Diğer risk alanlarındaki (ör. wanted, regulatory) bir taraf skor 90 ile döner ve inceleme gerektiren bir isabettir. Liste yayını sabitlenemezse cüzdan taraması da yapılmaz (503, yukarıda).

Hesap taraması

POST /api/v1/sanction/screening/account

Yaptırım listeleri IBAN veya banka hesap numarası yayımlamaz. Hesap taraması bu nedenle liste yayınını değil, kendi hesap listenizi (kara liste) ve hesap risk bilgisini tarar; yanıtında yayın alanları yoktur. Hesap sahibinin adını ayrıca isim taramasından geçirin.

İşlem taraması

POST /api/v1/sanction/screening/transaction

İşlemin bütün tarafları aynı liste yayınında taranır. Yanıta publicationId, publicationRevision ve coverageStatus eklenmiştir; coverageStatus tarafların en zayıf kapsam durumudur. Taraf başına kanıt, kapsam ve liste ayrıntısı resultsJson içindedir. Hiçbir taraf taranmadıysa bu alanlar boştur.

Kamu ihale yasağı taraması

POST /api/v1/sanction/intelligence/public-procurement-ban

Kişi veya kurumu, aktif liste yayınındaki yasaklılar (debarment) listelerinde ad ve TCKN/VKN ile tarar.

AlanTipZorunluAçıklama
entityNamestring—Kişi veya kurum adı
tckn · vknstring—Birebir aranır; eşit bir TCKN/VKN, ad farklı olsa da eşleşme üretir
entityTypestring—Kişi mi kurum mu
onlyActiveboolean—Yalnız yürürlükteki yasaklar
limitnumber—Dönecek en fazla isabet
customerReferencestring—Kendi kayıt kimliğiniz
productChannelstring—Hangi üründen geldiği (raporlama)

entityName, tckn ve vkn'den en az biri verilmelidir; hiçbiri yoksa istek sanction.screening.subject_invalid (400) ile reddedilir.

{
  "status": "success",
  "code": "sanction.public_procurement.completed",
  "data": {
    "matched": false,
    "riskScore": 0,
    "decision": "…",
    "hits": [],
    "publicationId": "…",
    "publicationRevision": 34,
    "coverageStatus": "PARTIAL",
    "evidenceRef": "…",
    "screenedRiskDomains": ["debarment"],
    "searchedLists": [
      { "datasetCode": "…", "displayName": "…", "datasetVersionId": "…" }
    ],
    "uncoveredSources": [
      { "datasetCode": "TR_PUBLIC_PROCUREMENT_BAN", "displayName": "…", "reason": "NOT_PUBLISHED" }
    ]
  },
  "statusCode": 200
}
AlanAnlamı
searchedListsTaramanın okuduğu yasaklı listeleri
uncoveredSourcesTaranması beklenen ancak yayında bulunmayan kaynaklar
coverageStatusKapsanmayan bir kaynak varken PARTIAL
hits[].matchBasisEşleşmenin dayanağı (ör. tckn, vkn, ad)
hits[].listsİsabetin yer aldığı listeler (isim taramasındaki yapı)
⚠️

Türkiye kamu ihale yasaklıları (KİK) bu taramada yoktur. Bu liste için makine tarafından okunabilir resmî bir kaynak bulunmadığından taranmaz; yanıt uncoveredSources içinde TR_PUBLIC_PROCUREMENT_BAN ile PARTIAL kapsam bildirir. Eşleşme olmaması, Türkiye'deki kamu ihale yasakları bakımından temiz sonuç değildir — bu kontrolü EKAP üzerinden ayrıca yapmanız gerekir.

Tarama geçmişi

GET /api/v1/sanction/screening/history

Daha önce yapılan taramaları döndürür. Denetimde "bu müşteriyi ne zaman, hangi modda taradık" sorusunun cevabıdır — customerReference alanını doldurursanız burada bulursunuz.

Sürekli izleme

Tek seferlik tarama, listeler güncellendiğinde sizi uyarmaz. Bunun için özneyi izlemeye kaydedin:

POST /api/v1/sanction/monitoring/register     # özneyi izlemeye al
GET  /api/v1/sanction/monitoring/alerts       # yeni eşleşme uyarıları
GET  /api/v1/sanction/monitoring/entities     # izlenen özneler
GET  /api/v1/sanction/monitoring/matches      # izleme kaynaklı eşleşmeler
GET  /api/v1/sanction/monitoring/dataset-freshness   # veri seti tazeliği

Müşteri kabulünde tarama yapıp izlemeye kaydetmezseniz, o müşteri ertesi gün listeye eklendiğinde haberiniz olmaz. Kabul taraması ile sürekli izleme iki ayrı yükümlülüktür.

İzlemeye alma gövdesi

{
  "externalCustomerId": "cust_9001",
  "subjectType": "person",
  "profileJson": "{\"name\":\"Ahmet Yılmaz\",\"countryCode\":\"TR\",\"dateOfBirth\":\"1980-01-31\",\"identifiers\":[{\"type\":\"tckn\",\"value\":\"12345678901\"}]}",
  "frequency": "DAILY",
  "riskDomainScope": ["sanctions", "pep"]
}
AlanAnlamı
externalCustomerIdMüşterinin sizdeki referansı. Uyarı ve webhook'ta geri döner; aynı referansla yeniden kayıt profili günceller.
subjectTypeperson veya organization.
profileJsonÖznenin profili, JSON metni olarak: name (zorunlu), countryCode, dateOfBirth, identifiers[] (type, value). Yeniden taramalar bu profille yapılır; tanımlayıcı vermek isabeti artırır.
frequencyDAILY, WEEKLY veya MONTHLY. Boş bırakılırsa günlük. Liste yayını değiştiğinde ise sıklıktan bağımsız olarak etkilenen özneler yeniden taranır.
riskDomainScopeİzlenecek risk alanları (sanctions, pep, rca, wanted, regulatory, debarment). Boş bırakılırsa yaptırım alanı.

Yanıt: { "success": true, "monitoredEntityId": "<uuid>" }. Aynı çağrı API anahtarıyla (sanction:monitoring kapsamı) ya da panel oturumuyla yapılabilir; panelde Yaptırım → İzleme → İzlemeye Al kartı aynı ucu kullanır.

İzleme webhook'ları

Yeni bir eşleşme bulunduğunda endpoint'inize sanction.monitoring.match_found olayı gönderilir; olumsuz medya izlemesi için sanction.monitoring.adverse_media_found olayı vardır. Zarf, imza ve yeniden deneme kuralları bütün ürünlerde ortaktır — bkz. Webhook'lar. Olaya abone olmak için webhook endpoint'inizde ilgili olay tipini seçin.

{
  "type": "sanction.monitoring.match_found",
  "data": {
    "monitoredEntityId": "0b5d6a51-…",
    "externalCustomerId": "cust_9001",
    "subjectName": "Ahmet Yılmaz",
    "matchedName": "Ahmet YILMAZ",
    "sourceListName": "OFAC SDN",
    "riskDomains": ["sanctions"],
    "score": 93.4,
    "canonicalEntityId": "d5990c41-…",
    "datasetGeneration": "2026-10-19",
    "detectedAt": "2026-10-19T06:12:40.000Z",
    "caseId": null,
    "screeningRequestId": "…",
    "publicationId": "…",
    "publicationRevision": 40,
    "entityIds": ["d5990c41-…", "f89dd795-…"],
    "lists": [{ "datasetCode": "OFAC", "displayName": "OFAC SDN" }]
  }
}
AlanAnlamı
monitoredEntityId, externalCustomerIdHangi izleme kaydı ve hangi müşteriniz.
subjectName, matchedName, score, riskDomainsİzlenen profil, eşleşen listelenmiş ad, skor (0–100) ve risk alanları.
sourceListName, lists[]Eşleşmeyi sunan liste ve eşleşmenin yer aldığı bütün listeler.
canonicalEntityId, entityIds[]Listelenmiş taraf ve eşleşmede birleşen bütün kayıtlar; varlık profili ucuyla okunur.
publicationId, publicationRevision, datasetGeneration, detectedAtEşleşmenin hangi liste yayınına karşı, ne zaman bulunduğu. Denetim kaydınız için saklayın.
caseIdOtomatik vaka açıldıysa vaka kimliği.

Aynı eşleşme için olay bir kez üretilir; teslimat yeniden denense de ikinci bildirim gelmez. Olayı GET /api/v1/sanction/monitoring/matches ile de görebilirsiniz.

İlgili uçlar

UçNe yapar
POST /api/v1/sanction/intelligence/adverse-mediaOlumsuz medya taraması
POST /api/v1/sanction/intelligence/public-procurement-banKamu ihalelerinden yasaklılık (yukarıda)
GET /api/v1/sanction/intelligence/entity-searchVarlık arama
GET /api/v1/sanction/intelligence/entity-profiles/:entityIdVarlık profili
GET /api/v1/sanction/intelligence/entity-graph/:entityIdİlişki grafiği
GET /api/v1/sanction/intelligence/indirect-exposure/:entityIdDolaylı maruziyet
GET /api/v1/sanction/intelligence/ownership-aggregation/:entityIdOrtaklık toplamı (%50 kuralı)
POST /api/v1/sanction/blacklistKendi kara listenize kayıt ekler. Anahtarınızın sanction:add_list_entry yetkisi olmalıdır; kayıt yalnız sizin listenize yazılır
GET /api/v1/sanction/blacklistKendi kara listenizi listeler (sanction:view_results)