Skip to main content

PEP & Sanctions Screening Guide

This guide walks you through implementing Politically Exposed Persons (PEP) and sanctions screening using the Matchstra API.

Overview​

PEP and sanctions screening helps you comply with Anti-Money Laundering (AML) and Know Your Customer (KYC) regulations by identifying individuals and entities that appear on global watchlists.

Use cases:

  • Customer onboarding for financial institutions
  • Vendor and supplier due diligence
  • Real estate transaction screening
  • Compliance with FINTRAC, OFAC, and other regulators

Quick Example​

const response = await fetch('https://api.matchstra.ca/api/Screening/screen', {
method: 'POST',
headers: {
'X-API-Key': 'your_api_key_here',
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'Vladimir Putin',
entityType: 'Individual',
minScore: 80
})
});

const result = await response.json();

if (result.success && result.data.hasMatch) {
console.log(`⚠️ Found ${result.data.matchCount} match(es)`);
console.log(`Highest confidence: ${result.data.highestScore}%`);
} else {
console.log('✅ No matches found - safe to proceed');
}

Understanding Entity Types​

Specify the type of entity you're screening:

Individual​

For screening persons (customers, vendors, beneficial owners).

{
"name": "John Smith",
"dateOfBirth": "1980-05-15",
"entityType": "Individual",
"minScore": 70
}

Organization​

For screening companies, NGOs, and other entities.

{
"name": "ABC Trading Corp",
"entityType": "Organization",
"minScore": 75
}

Confidence Scoring​

The minScore parameter controls the sensitivity of matching:

Score RangeRecommendationUse Case
90-100High confidenceStrict compliance, low false positives
70-89BalancedStandard due diligence
50-69SensitiveCast wider net, more review required
Below 50Very sensitiveExploratory, many false positives

Recommended: Start with minScore: 70 and adjust based on your risk tolerance.

Date of Birth Matching​

Including date of birth significantly improves match accuracy:

{
"name": "John Smith",
"dateOfBirth": "1980-05-15T00:00:00Z",
"entityType": "Individual",
"minScore": 70
}

Benefits:

  • Reduces false positives for common names
  • Increases confidence in positive matches
  • Helps distinguish between similarly named individuals

Format: ISO 8601 date-time string (e.g., 1980-05-15T00:00:00Z)

Understanding Results​

No Matches Found​

{
"success": true,
"message": "Screening completed successfully",
"data": {
"id": 12345,
"hasMatch": false,
"matchCount": 0,
"highestScore": 0,
"matches": [],
"remainingRequests": 485
}
}

Action: Safe to proceed with onboarding/transaction.

Matches Found​

{
"success": true,
"message": "Screening completed successfully",
"data": {
"id": 12346,
"hasMatch": true,
"matchCount": 2,
"highestScore": 95.5,
"matches": [
{
"name": "John A. Smith",
"score": 95.5,
"entityType": "Individual",
"sources": ["OFAC SDN", "UN Sanctions"],
"dateOfBirth": "1980-05-15",
"nationality": "US"
},
{
"name": "John Anthony Smith",
"score": 78.2,
"entityType": "Individual",
"sources": ["EU Sanctions"],
"dateOfBirth": "1980-05-20",
"nationality": "GB"
}
],
"remainingRequests": 484
}
}

Action: Review matches and apply your risk policies.

Match Analysis​

Each match includes:

name​

The matched entity name from the watchlist.

score​

Confidence score (0-100) indicating match strength. Higher = more confident.

entityType​

Type of matched entity (Individual or Organization).

sources​

Array of data sources where the match was found:

  • OFAC SDN - US Office of Foreign Assets Control Specially Designated Nationals
  • UN Sanctions - United Nations Security Council sanctions
  • EU Sanctions - European Union sanctions
  • UK Sanctions - UK HM Treasury sanctions
  • Canadian Sanctions - Global Affairs Canada
  • Interpol - Interpol wanted persons
  • PEP - Politically Exposed Persons databases

dateOfBirth​

Date of birth from the watchlist (if available).

nationality​

Country or nationality of the entity (if available).

Implementation Patterns​

Basic Screening Workflow​

async function screenPerson(name, dob) {
const response = await fetch('https://api.matchstra.ca/api/Screening/screen', {
method: 'POST',
headers: {
'X-API-Key': process.env.MATCHSTRA_API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: name,
dateOfBirth: dob,
entityType: 'Individual',
minScore: 70
})
});

const result = await response.json();

if (!result.success) {
throw new Error(`Screening failed: ${result.message}`);
}

return result.data;
}

// Usage
const screeningResult = await screenPerson('John Smith', '1980-05-15');

if (screeningResult.hasMatch) {
console.log('⚠️ MATCHES FOUND - Manual review required');

for (const match of screeningResult.matches) {
console.log(`- ${match.name} (${match.score}% confidence)`);
console.log(` Sources: ${match.sources.join(', ')}`);
}
} else {
console.log('✅ No matches - Proceed with onboarding');
}

Risk-Based Decision Logic​

function assessRisk(screeningResult) {
if (!screeningResult.hasMatch) {
return 'LOW'; // No matches - safe
}

const highestScore = screeningResult.highestScore;

if (highestScore >= 90) {
return 'HIGH'; // Strong match - likely sanctioned
} else if (highestScore >= 75) {
return 'MEDIUM'; // Moderate match - needs review
} else {
return 'LOW-MEDIUM'; // Weak match - possible false positive
}
}

// Usage
const risk = assessRisk(screeningResult);

switch (risk) {
case 'HIGH':
// Reject application, file SAR/STR
rejectApplication();
fileReport();
break;

case 'MEDIUM':
// Escalate to compliance team
escalateToCompliance();
break;

case 'LOW-MEDIUM':
// Optional review
flagForReview();
break;

case 'LOW':
// Auto-approve
approveApplication();
break;
}

Bulk Screening​

For screening multiple entities:

async function bulkScreen(entities) {
const results = await Promise.all(
entities.map(entity =>
fetch('https://api.matchstra.ca/api/Screening/screen', {
method: 'POST',
headers: {
'X-API-Key': process.env.MATCHSTRA_API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: entity.name,
dateOfBirth: entity.dob,
entityType: entity.type,
minScore: 70
})
}).then(r => r.json())
)
);

return results.map((result, index) => ({
entity: entities[index],
screening: result.data,
hasMatch: result.data?.hasMatch || false
}));
}

// Usage
const entities = [
{ name: 'John Smith', dob: '1980-05-15', type: 'Individual' },
{ name: 'Jane Doe', dob: '1975-08-22', type: 'Individual' },
{ name: 'ABC Corp', type: 'Organization' }
];

const bulkResults = await bulkScreen(entities);
const flagged = bulkResults.filter(r => r.hasMatch);

console.log(`Screened ${entities.length} entities, found ${flagged.length} with matches`);
Rate Limits

Be mindful of rate limits when bulk screening. Consider implementing batching or rate limiting on your end.

Retrieving Past Screenings​

List All Screenings​

curl -X GET https://api.matchstra.ca/api/Screening/list \
-H "X-API-Key: your_api_key_here"

Get Specific Screening​

curl -X GET https://api.matchstra.ca/api/Screening/12345 \
-H "X-API-Key: your_api_key_here"

Best Practices​

1. Screen at Key Touchpoints​

  • Onboarding: Screen all new customers
  • Periodic Review: Re-screen existing customers annually
  • Transaction Monitoring: Screen parties in high-value transactions
  • Vendor Approval: Screen all new vendors and partners

2. Implement Tiered Thresholds​

Use different minScore values based on risk:

const thresholds = {
highRisk: 85, // High-value accounts, sensitive industries
standard: 70, // Normal customers
lowRisk: 60 // Low-value, low-risk relationships
};

const minScore = determineRiskCategory(customer) === 'high'
? thresholds.highRisk
: thresholds.standard;

3. Document All Decisions​

Maintain audit logs of:

  • Screening requests and results
  • Risk assessment decisions
  • Manual review outcomes
  • Approval/rejection rationale

4. Handle False Positives​

Common causes of false positives:

  • Common names (e.g., "John Smith")
  • Missing date of birth
  • Name variations and nicknames
  • Transliteration differences

Mitigation:

  • Always include date of birth when available
  • Implement manual review for borderline scores
  • Train staff on false positive analysis

5. Stay Updated​

Sanctions lists change frequently. Re-screen:

  • Existing customers annually (minimum)
  • High-risk customers quarterly
  • After major geopolitical events

Compliance Considerations​

Regulatory Requirements​

Different jurisdictions have specific requirements:

JurisdictionRegulatorKey Requirement
CanadaFINTRACScreen against Canadian sanctions
USAFinCENScreen OFAC SDN list
EUEBAScreen EU sanctions lists
UKFCAScreen UK HMT lists

Matchstra covers all major lists by default.

Record Keeping​

Maintain screening records for:

  • Canada: 5 years minimum (FINTRAC)
  • USA: 5 years minimum (FinCEN)
  • EU: 5 years minimum (AMLD5)

Store:

  • Request payload (name, DOB, entity type)
  • Response data (all matches and scores)
  • Timestamp of screening
  • API key used
  • User/system that initiated screening

Error Handling​

See the Error Handling guide for comprehensive error scenarios.

Common screening errors:

400 Bad Request​

{
"success": false,
"message": "Validation failed",
"errors": ["Name is required", "EntityType must be 'Individual' or 'Organization'"]
}

Fix: Validate input before submission.

429 Too Many Requests​

{
"success": false,
"message": "Rate limit exceeded",
"errors": ["Request quota exhausted"]
}

Fix: Check remainingRequests in responses and implement rate limiting.

Next Steps​