Guides
Compliance & Screening
Sanctions screening, KYC/KYB verification, transaction monitoring, and ongoing compliance workflows.
Compliance & Screening
Regulatory compliance tools including sanctions screening against 25+ global lists, KYC/KYB workflows, and automated transaction monitoring.
Sanctions Screening
Data Sources
| Region | Sources |
|---|---|
| United States | OFAC SDN, OFAC Consolidated, BIS Denied Persons, FinCEN |
| European Union | EU FSF, Belgian Financial Sanctions, Dutch DNSL |
| United Kingdom | OFSI Consolidated, FCDO Sanctions |
| International | UN Security Council, INTERPOL Red Notices |
| Asia-Pacific | Australian DFAT, Singapore MAS |
| Americas | Canadian SEMA, Argentine REPET, Mexican SAT 69.B |
Customer Onboarding
Screen every customer before account creation:
import { Lux } from '@luxfi/bank-sdk';
const lux = new Lux({ apiKey: process.env.LUX_API_KEY });
const screening = await lux.sanctions.screen({
name: customer.fullName,
type: 'person',
dateOfBirth: customer.dateOfBirth,
country: customer.country,
sources: ['SDN', 'UN', 'FSF', 'OFSI'],
minScore: 85
});
if (screening.matchCount > 0) {
// Flag for compliance review
} else {
// Create customer
await lux.customers.create({ ...customer, sanctionsScreeningId: screening.id });
}Batch Screening
const results = await lux.sanctions.screenBatch({
cases: customers.map(c => ({
id: c.id,
name: c.fullName,
type: c.entityType,
dateOfBirth: c.dateOfBirth,
country: c.country
})),
sources: ['SDN', 'UN', 'FSF', 'OFSI', 'SECO', 'DFAT'],
minScore: 80
});Transaction Screening
const screening = await lux.sanctions.screen({
name: payment.beneficiary.name,
type: payment.beneficiary.type,
country: payment.beneficiary.country
});
if (screening.matchCount > 0) {
throw new PaymentBlockedError({ reason: 'sanctions_match', screeningId: screening.id });
}Ongoing Monitoring
Subscribe to sanctions list updates via webhooks and re-screen active customers when lists change.
KYC/KYB Verification
Individual (KYC)
// Document verification
const doc = await lux.kyc.verifyDocument({
customerId: customer.id,
documentType: 'passport',
documentFront: customer.passportImage,
});
// Liveness check
const liveness = await lux.kyc.verifyLiveness({
customerId: customer.id,
selfieImage: customer.selfieImage
});
// Address verification
const address = await lux.kyc.verifyAddress({
customerId: customer.id,
documentType: 'utility_bill',
documentImage: customer.utilityBillImage
});Business (KYB)
// Registry check
const registry = await lux.kyb.verifyRegistry({
businessName: business.legalName,
registrationNumber: business.registrationNumber,
country: business.country
});
// Beneficial owner identification + screening
const owners = await lux.kyb.identifyBeneficialOwners({
businessId: business.id,
ownershipThreshold: 25
});Transaction Monitoring
Rule-Based Alerts
const rules = [
{ name: 'high_value', condition: (tx) => tx.amount > 10000, severity: 'medium' },
{ name: 'high_risk_country', condition: (tx) => HIGH_RISK.includes(tx.country), severity: 'high' },
{ name: 'velocity', condition: async (tx, id) => (await getCount(id, '24h')) > 10, severity: 'medium' },
];Reporting
Suspicious Activity Reports
Generate SARs with complete transaction history, subject details, and suspicious activity descriptions for regulatory filing.
Best Practices
- Screen early — before account creation, not after
- Use multiple sources — don't rely on a single sanctions list
- Set appropriate thresholds — balance false positives vs missed matches
- Document decisions — keep records of all compliance decisions
- Monitor continuously — re-screen when lists update
- Test regularly — validate with known sanctioned entities