AML Screening API
The AML (Anti-Money Laundering) Screening API allows you to check individuals against global sanctions lists, PEP (Politically Exposed Persons) databases, and other compliance watchlists. This helps you meet regulatory requirements and reduce risk exposure.
- Base URL:
https://verification.didit.me
- Endpoint:
/v2/aml/
- Authentication:
Client Token (Bearer Token)
The authentication endpoint uses a different base URL than the API endpoints. Ensure you use the correct URLs to avoid connectivity issues.
This API requires a Pro Plan subscription and has an associated cost per call. Results won't be saved in your console. For pricing details, visit our API Pricing page (opens in a new tab).
Process Overview
Follow these steps to perform AML screening:
Step 1: Authenticate
Obtain a valid access_token
by following the Authentication documentation. This token is required in the Authorization
header of your request.
The access_token
is valid for 24 hours. You only need to re-authenticate once it expires.
Step 2: Prepare Request Parameters
Parameter | Type | Required? | Description | Example Value |
---|---|---|---|---|
|
| Yes | Full name of the person to screen | "John Michael Doe" |
|
| Yes | Date of birth in YYYY-MM-DD format | "1985-05-15" |
|
| Yes | Nationality in ISO 3166-1 alpha-3 format | "USA" |
|
| No | Document identification number (recommended for more accurate results) | "AB123456" |
|
| No | Customization options for AML screening | See options details below |
Options Object
The options
parameter allows you to customize the AML screening process:
Option | Type | Required? | Description | Default Value |
---|---|---|---|---|
|
| No | AML risk scores below this will be approved, above will be declined. | 80 |
The full_name
, date_of_birth
, and nationality
fields are mandatory. Always provide these fields to ensure accurate AML screening results.
Step 3: Send the Request
Make a POST
request to /v2/aml/
with the prepared parameters and include the access_token obtained in step 1 in the header.
Example Request
POST /v2/aml/ HTTP/1.1
Host: verification.didit.me
Content-Type: application/json
Authorization: Bearer {access_token}
{
"full_name": "John Michael Doe",
"date_of_birth": "1985-05-15",
"nationality": "USA",
"document_number": "AB123456",
"options": {
"aml_score_approve_threshold": 75,
}
}
Response
The response provides detailed information about the AML screening results, including potential matches and risk scores.
Example Response
{
"request_id": "11111111-2222-3333-4444-555555555555",
"aml": {
"status": "Declined",
"total_hits": 1,
"hits": [
{
"id": "cl-info-probidad-3fd0f04facc53bd94ebec9aaedf56d18",
"match": false,
"score": 0.4,
"target": true,
"caption": "PABLO ALFONSO ESCOBAR NAVARRO",
"datasets": ["cl_info_probidad"],
"features": {
"country_mismatch": 1.0,
"person_name_phonetic_match": 0.67
},
"last_seen": "2024-10-28T02:50:03",
"first_seen": "2024-01-17T02:50:01",
"properties": {
"name": ["PABLO ALFONSO ESCOBAR NAVARRO"],
"topics": ["role.pep"],
"country": ["cl"]
}
}
],
"score": 40.0,
"screened_data": {
"full_name": "Pablo Escobar",
"nationality": "COL",
"date_of_birth": "1975-12-01",
"document_number": "CAA000000"
},
"warnings": [
{
"risk": "POSSIBLE_MATCH_FOUND",
"additional_data": null,
"log_type": "warning",
"short_description": "Possible match found in AML screening",
"long_description": "The Anti-Money Laundering (AML) screening process identified potential matches with watchlists or high-risk databases, requiring further review."
}
]
},
"created_at": "2024-07-24T08:54:25.443172Z"
}
Response Fields
Field | Type | Description |
---|---|---|
|
| Unique identifier for the API request |
|
| AML screening status (Approved, or Declined) |
|
| Total number of potential matches found |
|
| Overall risk score (0-100, higher values indicate higher risk) |
|
| Array of potential matches found |
|
| Unique identifier for the match |
|
| Indicates if it's considered a definite match |
|
| Match confidence score (0-1) |
|
| Indicates if this is a primary target match |
|
| Display name of the match |
|
| Lists of data sources where the match was found |
|
| Matching criteria and scores |
|
| Date when the match was last seen in the database |
|
| Date when the match was first seen in the database |
|
| Additional information about the match |
|
| The data that was used for screening |
|
| List of warnings for the verification |
|
| Timestamp when the request was created |
Error Handling
Status Code | Error | Description |
---|---|---|
400 | Bad Request | Invalid parameters or missing required fields |
401 | Unauthorized | Invalid or missing access_token |
403 | Forbidden | Not authorized to access this API or insufficient subscription plan |
Example Error Response
{
"error": {
"code": "MISSING_REQUIRED_FIELD",
"message": "Missing required field: nationality"
}
}
Common Error Codes
Error Code | Description |
---|---|
MISSING_REQUIRED_FIELD | A mandatory field is missing in the request |
INVALID_DATE_FORMAT | Date of birth is not in the required YYYY-MM-DD format |
INVALID_NATIONALITY | Nationality code is not in the valid ISO 3166-1 alpha-3 format |
Code Examples
async function submitAmlScreening(accessToken, fullName, dateOfBirth, nationality, documentNumber = null, options = null) {
const url = `https://verification.didit.me/v2/aml/`;
// Prepare request data
const requestData = {
full_name: fullName,
date_of_birth: dateOfBirth,
nationality: nationality
};
// Add optional document number if provided
if (documentNumber) {
requestData.document_number = documentNumber;
}
// Add options if provided
if (options) {
requestData.options = options;
}
const requestOptions = {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${accessToken}`
},
body: JSON.stringify(requestData)
};
try {
const response = await fetch(url, requestOptions);
if (!response.ok) {
const errorData = await response.json();
throw new Error(errorData.error?.message || errorData.detail || 'Unknown error occurred');
}
return await response.json();
} catch (error) {
console.error('Error in AML screening:', error);
throw error;
}
}
// Example usage
async function performAmlScreening() {
try {
// 1. Get client token (implement based on auth documentation)
const token = await getClientToken();
// 2. Custom options (optional)
const options = {
aml_score_approve_threshold: 75,
};
// 3. Submit AML screening
const result = await submitAmlScreening(
token.access_token,
'John Michael Doe',
'1985-05-15',
'USA',
'AB123456', // Optional document number
options // Optional customization options
);
console.log('AML screening result:', result);
// Handle the screening result
if (result.aml.status === 'Approved') {
console.log('No significant AML risks detected.');
} else if (result.aml.status === 'Declined') {
console.log('High-risk AML matches detected.');
}
return result;
} catch (error) {
console.error('Error:', error);
throw error;
}
}
AML Monitoring
When using the AML API, you have the option to enable ongoing monitoring for screened individuals. If enabled, we will continuously monitor all approved individuals against new additions to global watchlists and alert you if new matches are found.
AML Monitoring is an optional paid add-on service that costs only $0.07 additional per check. You can enable or disable this feature in your Verification Settings.
Best Practices
-
Data Accuracy:
- Provide complete and accurate information to minimize false positives.
- Include all known aliases or variations of the person's name.
- Always include the document number when available for more precise matching.
-
Match Review:
- Review all potential matches, even those with lower scores.
- Pay special attention to matches from sanctions lists, which have higher regulatory impact.
- Consider the recency of the match data when evaluating risk.
-
Threshold Configuration:
- Configure your risk score thresholds based on your risk appetite using the
options
parameter. - Set the
aml_score_approve_threshold
according to your compliance requirements.
- Configure your risk score thresholds based on your risk appetite using the