Customer
The Customer endpoints form the operational backbone of the TruRisk AI module, facilitating the end-to-end lifecycle of compliance screening—from initial AI analysis to final human disposition.
What is a "Customer"?
In the context of the AML Watcher API, a Customer represents a distinct entity—either an Individual or a Corporate Body—submitted for risk assessment. A Customer record is not merely static data; it is a dynamic object that contains:
- Identity Profile: The core input data (Name, DOB, National IDs, Corporate Registration).
- Risk Intelligence: The AI-generated output, including Match Scores, Verdicts, and Natural Language Narratives.
- Compliance Status: The current state of the record (e.g., Pending AI Review, Completed, Analyst Confirmed/Declined).
Using the endpoints below, you can programmatically submit entities for real-time AI screening, retrieve detailed risk narratives for your compliance dashboard, and log audit-trail decisions made by your human analysts.
When Adverse Media is included in categories, TruRisk links each article to the specific screened entity rather than matching on name alone, and factors in the recency of the reporting when generating the verdict and key drivers.
1. Create & Screen Customer
TruRisk Customer Screening is the main entry point for AI-driven risk assessment. This endpoint submits an entity to the system for AML database matching and AI narrative generation.
The API supports two distinct modes: TruRisk Lite for basic screening and TruRisk Advanced for deep-dive analysis requiring identifiers and relationship data. You may pass tru_risk_mode to choose a mode; if omitted, the organization default_mode from Configuration is used.
TruRisk Lite verifies identity using core identifiers only—full name and date of birth or incorporation date, with an optional biometric image—and returns a concise verification summary. It is optimized for speed and best suited to high-volume onboarding and initial screening. TruRisk Advanced evaluates the extended identity and relationship attributes supplied in the request (nationality, identification numbers, address, occupation, industry, known aliases, parent/spouse/sibling, and entity-specific identifiers) to produce a detailed, audit-ready narrative. It is intended for complex or higher-risk investigations, where documentation depth matters more than processing speed.
When a webhook is registered for your organization, the system will deliver TruRisk results to that endpoint.
Endpoint: https://api.amlwatcher.com/api/tru-risk-customers
Method: POST
- HTTP
- Javascript
- PHP
- Python
- Ruby
- Java
- cURL
- C#
- Go
POST /api/tru-risk-customers HTTP/1.1
Host: api.amlwatcher.com
Content-Type: application/json
Authorization: Bearer Token
{
"name": "Entity Name",
"tru_risk_mode": "TruRisk Advanced",
"birth_incorporation_date": "25-12-1952",
"entity_type": ["Person", "Company"],
"categories": ["Adverse Media", "PEP", "Sanctions", "Insolvency"],
"countries": ["PK", "US"],
"match_score": 80,
"exact_search": false,
"nationality": "Pakistani",
"identification_number": "42201-XXXXXXX-X",
"occupation": "Director",
"industry": "Finance",
"address": "123 Business Ave, Karachi",
"parent": "Parent Name",
"spouse": "Jane Doe",
"sibling": "Alix Doe",
"known_alias": "Person Alias",
"biometric_search_image": "data:image/png;base64,iVBORw0KGgo..."
}
var myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer Token");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
name: "Entity Name",
tru_risk_mode: "TruRisk Advanced",
birth_incorporation_date: "25-12-1952",
entity_type: ["Person"],
categories: ["PEP", "Sanctions"],
countries: ["PK"],
match_score: 80,
exact_search: false,
nationality: "Pakistani",
identification_number: "42201-XXXXXXX-X",
occupation: "Director",
industry: "Finance",
address: "123 Business Ave, Karachi",
parent: "Parent Name",
spouse: "Jane Doe",
sibling: "Alix Doe",
known_alias: "Person Alias",
biometric_search_image: "base64_string_here",
});
var requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow",
};
fetch("https://api.amlwatcher.com/api/tru-risk-customers", requestOptions)
.then((response) => response.json())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://api.amlwatcher.com/api/tru-risk-customers',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS =>'{
"name": "Entity Name",
"tru_risk_mode": "TruRisk Advanced",
"birth_incorporation_date": "25-12-1952",
"entity_type": ["Person"],
"categories": ["PEP"],
"match_score": 80,
"identification_number": "42201-XXXXXXX-X",
"occupation": "Director",
"industry": "Finance",
"parent": "Person Parent",
"address": "Karachi, Pakistan"
}',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'Authorization: Bearer Token'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
import requests
import json
url = "https://api.amlwatcher.com/api/tru-risk-customers"
payload = json.dumps({
"name": "Entity Name",
"tru_risk_mode": "TruRisk Advanced",
"birth_incorporation_date": "25-12-1952",
"entity_type": ["Person"],
"categories": ["Sanctions"],
"match_score": 80,
"identification_number": "42201-XXXXXXX-X",
"nationality": "Pakistani"
})
headers = {
'Authorization': 'Bearer Token',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("https://api.amlwatcher.com/api/tru-risk-customers")
https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["Authorization"] = "Bearer Token"
request.body = JSON.dump({
"name": "Entity Name",
"tru_risk_mode": "TruRisk Advanced",
"birth_incorporation_date": "25-12-1952",
"entity_type": ["Person"],
"categories": ["PEP"],
"match_score": 80,
"identification_number": "42201-XXXXXXX-X"
})
response = https.request(request)
puts response.read_body
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class Main {
public static void main(String[] args) throws Exception {
URL url = new URL("https://api.amlwatcher.com/api/tru-risk-customers");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty("Authorization", "Bearer Token");
conn.setDoOutput(true);
String jsonInputString = "{\"name\": \"Entity Name\", \"tru_risk_mode\": \"TruRisk Advanced\", \"match_score\": 80}";
try(OutputStream os = conn.getOutputStream()) {
byte[] input = jsonInputString.getBytes("utf-8");
os.write(input, 0, input.length);
}
System.out.println(conn.getResponseCode());
}
}
curl --location --request POST 'https://api.amlwatcher.com/api/tru-risk-customers' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer Token' \
--data-raw '{
"name": "Entity Name",
"tru_risk_mode": "TruRisk Advanced",
"birth_incorporation_date": "25-12-1952",
"entity_type": ["Person"],
"categories": ["Sanctions"],
"match_score": 80,
"identification_number": "42201-XXXXXXX-X"
}'
using RestSharp;
var client = new RestClient("https://api.amlwatcher.com/api/tru-risk-customers");
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer Token");
request.AddJsonBody(new {
name = "Entity Name",
tru_risk_mode = "TruRisk Advanced",
match_score = 80,
identification_number = "42201-XXXXXXX-X"
});
IRestResponse response = client.Execute(request);
package main
import (
"fmt"
"net/http"
"strings"
)
func main() {
url := "https://api.amlwatcher.com/api/tru-risk-customers"
payload := strings.NewReader(`{"name": "Entity Name", "tru_risk_mode": "TruRisk Advanced"}`)
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
req.Header.Add("Authorization", "Bearer Token")
res, _ := http.DefaultClient.Do(req)
fmt.Println(res.Status)
}
Request Body
Core Fields (Mandatory)
| Parameter | Type | Description |
|---|---|---|
name | String | Required. The full name of the person or company. |
entity_type | Array | Required. Type of entity. Allowed values: Person, Company, Organization, Crypto_Wallet, Vessel, Aircraft. Example: ["Person"], ["Company"]. |
categories | Array | Required. AML databases to screen against (e.g., ["PEP"], ["Sanctions"]). |
match_score | Integer | Required. Threshold for matching (0-100). |
Optional Fields
| Parameter | Type | Description |
|---|---|---|
tru_risk_mode | Enum | Optional. Must be TruRisk Lite or TruRisk Advanced if provided. If omitted, the organization default_mode from TruRisk Configuration is used. |
Identifier Logic (Mutually Exclusive)
Only one of the following identifiers can be provided in a single request. Providing multiple identifiers will result in a validation error.
| Parameter | Type | Dependency |
|---|---|---|
identification_number | String | Passport, National ID, or Emirates ID. |
imo_number | String | Valid only if entity_type includes Vessel. |
tail_number | String | Valid only if entity_type includes Aircraft. |
business_registration_number | String | Used for Corporate entities. |
Advanced Identity and Relationships
These fields are utilized by the AI Agent in Advanced Mode to generate high-fidelity risk narratives.
| Parameter | Type | Description |
|---|---|---|
birth_incorporation_date | String | Format: DD-MM-YYYY. |
nationality | String | The country of citizenship. |
occupation | String | Current professional role. |
industry | String | Sector of business activity. |
parent | String | Name of parent for enhanced screening. |
spouse | String | Name of spouse for enhanced screening. |
sibling | String | Name of sibling for enhanced screening. |
address | String | Physical residence or business address. |
known_alias | String | Alternative names or AKAs. |
biometric_search_image | String | Base64 encoded image string for biometric screening. |
Success Response
{
"status": "SUCCESS",
"data": {
"customer_id": "Your Customer ID",
"search_reference": "Your Search Reference",
"organization_id": "Your Organization ID",
"name": "Entity Name",
"tru_risk_mode": "TruRisk Advanced",
"status": "Pending",
"verdict": "",
"recommendation": "",
"narrative": null,
"key_drivers": [],
"analyst_decision": "",
"analyst_decision_reason": "",
"match_score": 80,
"birth_incorporation_date": "01-01-1990",
"nationality": "Generic Land",
"identification_number": "ID-12345-XYZ",
"business_registration_number": "",
"imo_number": "",
"tail_number": "",
"occupation": "Professional",
"industry": "Generic Industry",
"address": "123 Main Street, Suite 100",
"parent": "Parent Name",
"spouse": "Spouse Name",
"sibling": "Sibling Name",
"known_alias": "J-Doe",
"entity_type": ["Person"],
"categories": ["PEP", "Sanctions"],
"countries": ["US"],
"biometric_search_image": null,
"upload_source": "API",
"deleted_at": null,
"deleted_reason": null,
"created_at": "2026-02-16T08:00:00.000Z",
"updated_at": "2026-02-16T08:00:00.000Z"
},
"error": false
}
2. Get Customers (Queue)
This endpoint allows you to retrieve a paginated list of screened entities from the TruRisk queue. It supports extensive filtering by AI verdict, analyst decision, date ranges, and screening modes.
Endpoint: https://api.amlwatcher.com/api/tru-risk-customers
Method: GET
- HTTP
- Javascript
- PHP
- Python
- Ruby
- Java
- cURL
- C#
- Go
GET /api/tru-risk-customers?page=1&page_size=10&verdict=potential_match&tru_risk_mode=TruRisk Advanced HTTP/1.1
Host: api.amlwatcher.com
Authorization: Bearer Token
fetch("https://api.amlwatcher.com/api/tru-risk-customers?page=1&page_size=10", {
method: "GET",
headers: { Authorization: "Bearer Token" },
})
.then((response) => response.json())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://api.amlwatcher.com/api/tru-risk-customers?page=1&page_size=10',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => array('Authorization: Bearer Token'),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
import requests
url = "[https://api.amlwatcher.com/api/tru-risk-customers](https://api.amlwatcher.com/api/tru-risk-customers)"
params = {'page': 1, 'page_size': 10}
headers = {'Authorization': 'Bearer Token'}
response = requests.get(url, headers=headers, params=params)
print(response.text)
require "uri"
require "net/http"
url = URI("https://api.amlwatcher.com/api/tru-risk-customers?page=1&page_size=10")
https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = "Bearer Token"
response = https.request(request)
puts response.read_body
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws Exception {
URL url = new URL("https://api.amlwatcher.com/api/tru-risk-customers?page=1&page_size=10");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Authorization", "Bearer Token");
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuffer content = new StringBuffer();
while ((inputLine = in.readLine()) != null) content.append(inputLine);
in.close();
System.out.println(content.toString());
}
}
curl --location --request GET 'https://api.amlwatcher.com/api/tru-risk-customers?page=1&page_size=10' \
--header 'Authorization: Bearer Token'
using RestSharp;
var client = new RestClient("https://api.amlwatcher.com/api/tru-risk-customers?page=1&page_size=10");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer Token");
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
package main
import (
"fmt"
"net/http"
"io/ioutil"
)
func main() {
url := "https://api.amlwatcher.com/api/tru-risk-customers?page=1&page_size=10"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer Token")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := ioutil.ReadAll(res.Body)
fmt.Println(string(body))
}
Query Parameters
| Parameter | Type | Description |
|---|---|---|
page | Integer | Page number for pagination. |
page_size | Integer | Number of records per page (Default: 10). |
search | String | Search by name or upload source (e.g., CSV filename). |
verdict | Enum | Filter by AI result: true_positive, false_positive, true_negative, uncertain, potential_match. |
analyst_decision | Enum | Filter by human review: Confirmed, Declined, or empty for Pending. |
tru_risk_mode | String | Filter by mode: TruRisk Lite or TruRisk Advanced. |
start_date | String | Filter by creation date start. Format: DD-MM-YYYY. |
end_date | String | Filter by creation date end. Format: DD-MM-YYYY. |
Response Fields
Root & Pagination
| Parameter | Type | Description |
|---|---|---|
status | String | Status of the API request (e.g., SUCCESS). |
error | Boolean | Indicates if the request encountered an error. |
data.customers | Array | List of customer screening records. |
data.pagination | Object | Metadata for current page, size, total count, and total pages. |
Customer Object Details
| Parameter | Type | Description |
|---|---|---|
customer_id | String | Unique internal identifier for the record. |
search_reference | String | External reference ID used for case linking. |
name | String | Name of the entity screened. |
tru_risk_mode | String | Mode used for analysis (TruRisk Lite or TruRisk Advanced). |
status | String | Analysis status: COMPLETED, Pending, or in-progress. |
verdict | Enum | The AI assessment result (e.g., true_positive, potential_match). |
recommendation | String | AI-suggested action (e.g., Enhanced Due Diligence Required). |
narrative | String | AI-generated text explanation of the risk findings. In TruRisk Lite this is a concise verification summary; in TruRisk Advanced it is a detailed, audit-ready narrative documenting the reasoning behind the verdict. |
key_drivers | Array | Specific data points that triggered the AI verdict. |
analyst_decision | String | Final decision by a human reviewer (Confirmed or Declined). |
analyst_decision_reason | String | Notes provided by the analyst regarding their decision. |
match_score | Integer | Confidence score of the match (0-100). |
entity_type | Array | Classifications assigned to the entity. |
categories | Array | AML database categories screened against. |
countries | Array | List of countries associated with the entity. |
birth_incorporation_date | String | Date of birth or incorporation in YYYY-MM-DD or DD-MM-YYYY format. |
identification_number | String | Passport or National ID used for screening. |
imo_number | String | Vessel identification number (if applicable). |
tail_number | String | Aircraft identification number (if applicable). |
address | String | Physical address of the entity. |
nationality | String | Country of citizenship. |
occupation | String | Professional role of the entity. |
industry | String | Business sector. |
parent / spouse / sibling | String | Relationship data points used for PEP/RCA screening. |
known_alias | String | Alternate names or AKAs. |
created_at | String | Timestamp of record creation. |
updated_at | String | Timestamp of the last modification. |
deleted_at | String | Timestamp of soft deletion (null if active). |
deleted_reason | String | Audit reason provided for deletion. |
Success Response
{
"status": "SUCCESS",
"data": {
"customers": [
{
"address": "",
"analyst_decision": "",
"analyst_decision_reason": "",
"biometric_search_image": null,
"birth_incorporation_date": null,
"business_registration_number": "",
"categories": [
"SIE",
"Adverse Media",
"PEP",
"Insolvency",
"Warnings and Regulatory Enforcement",
"PEP Level 4",
"PEP Level 1",
"SIP",
"PEP Level 2",
"PEP Level 3",
"Fitness and Probity",
"Sanctions"
],
"countries": ["US", "UK"],
"created_at": "2026-02-16T10:18:34.076000Z",
"customer_id": "Your Customer ID",
"deleted_at": null,
"deleted_reason": null,
"entity_type": [
"Aircraft",
"Company",
"Crypto_Wallet",
"Organization",
"Person",
"Vessel"
],
"identification_number": "",
"imo_number": "",
"industry": "",
"key_drivers": [],
"known_alias": "",
"match_score": 80,
"name": "Entity Name",
"narrative": "Any narrative.",
"nationality": "",
"occupation": "",
"organization_id": "Your Organization ID",
"parent": "",
"recommendation": "Enhanced Due Diligence Required",
"search_reference": "Your Search Reference",
"sibling": "",
"spouse": "",
"status": "COMPLETED",
"tail_number": "",
"tru_risk_mode": "TruRisk Lite",
"updated_at": "2026-02-16T10:18:34.076000Z",
"upload_source": "",
"verdict": "true_positive"
}
],
"pagination": {
"page": 1,
"page_size": 10,
"total_count": 613,
"total_pages": 62
}
}
}
3. Update Customer (Analyst Decision)
Use this endpoint to confirm or decline the AI's verdict. This is a critical step for closing the compliance loop.
Provide analyst_decision, analyst_decision_reason, or both — but at least one must be non-empty. Both fields cannot be omitted or empty at the same time.
Endpoint: https://api.amlwatcher.com/api/tru-risk-customers/update
Method: POST
- HTTP
- Javascript
- PHP
- Python
- Ruby
- Java
- cURL
- C#
- Go
POST /api/tru-risk-customers/update HTTP/1.1
Host: api.amlwatcher.com
Content-Type: application/json
Authorization: Bearer Token
{
"customer_id": "Your Customer ID",
"analyst_decision": "Declined",
"analyst_decision_reason": "Your analyst decision reason."
}
var myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer Token");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
customer_id: "Your Customer ID",
analyst_decision: "Declined",
analyst_decision_reason: "Your analyst decision reason.",
});
fetch("https://api.amlwatcher.com/api/tru-risk-customers/update", {
method: "POST",
headers: myHeaders,
body: raw,
})
.then((response) => response.json())
.then((result) => console.log(result));
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://api.amlwatcher.com/api/tru-risk-customers/update',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => '{"customer_id":"Your Customer ID","analyst_decision":"Declined","analyst_decision_reason":"Your analyst decision reason."}',
CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer Token'),
));
$response = curl_exec($curl);
echo $response;
import requests
import json
url = "https://api.amlwatcher.com/api/tru-risk-customers/update"
payload = {
"customer_id": "Your Customer ID",
"analyst_decision": "Declined",
"analyst_decision_reason": "Your analyst decision reason."
}
headers = {'Authorization': 'Bearer Token', 'Content-Type': 'application/json'}
response = requests.post(url, headers=headers, data=json.dumps(payload))
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("https://api.amlwatcher.com/api/tru-risk-customers/update")
https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["Authorization"] = "Bearer Token"
request.body = JSON.dump({"customer_id" => "Your Customer ID", "analyst_decision" => "Declined", "analyst_decision_reason" => "Your analyst decision reason."})
puts https.request(request).body
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class Main {
public static void main(String[] args) throws Exception {
URL url = new URL("https://api.amlwatcher.com/api/tru-risk-customers/update");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty("Authorization", "Bearer Token");
conn.setDoOutput(true);
String json = "{\"customer_id\": \"Your Customer ID\", \"analyst_decision\": \"Declined\", \"analyst_decision_reason\": \"Your analyst decision reason.\"}";
try(OutputStream os = conn.getOutputStream()) {
os.write(json.getBytes("utf-8"));
}
System.out.println(conn.getResponseCode());
}
}
curl --location --request POST 'https://api.amlwatcher.com/api/tru-risk-customers/update' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer Token' \
--data-raw '{
"customer_id": "Your Customer ID",
"analyst_decision": "Declined",
"analyst_decision_reason": "Your analyst decision reason."
}'
using RestSharp;
var client = new RestClient("https://api.amlwatcher.com/api/tru-risk-customers/update");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer Token");
request.AddJsonBody(new { customer_id = "Your Customer ID", analyst_decision = "Declined", analyst_decision_reason = "Your analyst decision reason." });
IRestResponse response = client.Execute(request);
package main
import (
"fmt"
"strings"
"net/http"
)
func main() {
url := "https://api.amlwatcher.com/api/tru-risk-customers/update"
payload := strings.NewReader(`{"customer_id": "Your Customer ID", "analyst_decision": "Declined", "analyst_decision_reason": "Your analyst decision reason."}`)
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
req.Header.Add("Authorization", "Bearer Token")
res, _ := http.DefaultClient.Do(req)
fmt.Println(res.Status)
}
Request Body
| Parameter | Type | Description |
|---|---|---|
customer_id | String | Required. The unique ID of the customer record. |
analyst_decision | Enum | Conditionally required. Must be Confirmed or Declined if provided. At least one of analyst_decision or analyst_decision_reason must be non-empty. |
analyst_decision_reason | String | Conditionally required. A brief explanation for the decision (max 500 characters). At least one of analyst_decision or analyst_decision_reason must be non-empty. |
You may send analyst_decision, analyst_decision_reason, or both. However, both cannot be empty — at least one must contain a value.
Success Response
{
"data": {
"address": "",
"analyst_decision": "Declined",
"analyst_decision_reason": "Your analyst decision reason.",
"biometric_search_image": null,
"birth_incorporation_date": "25-12-1952",
"business_registration_number": "",
"categories": [
"Adverse Media",
"PEP",
"Insolvency",
"PEP Level 4",
"PEP Level 1",
"PEP Level 2",
"PEP Level 3",
"Sanctions"
],
"countries": [],
"created_at": "2026-02-16T08:26:52.342000Z",
"customer_id": "Your Customer ID",
"deleted_at": null,
"deleted_reason": null,
"entity_type": ["Company", "Person"],
"identification_number": "",
"imo_number": "",
"industry": "",
"key_drivers": ["Adverse Media"],
"known_alias": "",
"match_score": 80,
"name": "Entity Name",
"narrative": "your narrative.",
"nationality": "",
"occupation": "",
"organization_id": "Your Organization ID",
"parent": "",
"recommendation": "Compliance Review Required",
"search_reference": "Your Search Reference",
"sibling": "",
"spouse": "",
"status": "COMPLETED",
"tail_number": "",
"tru_risk_mode": "TruRisk Advanced",
"updated_at": "2026-02-16T10:08:38.121000Z",
"upload_source": "",
"verdict": "potential_match"
},
"error": false,
"status": "SUCCESS"
}
4. Delete Customer
Performs a soft delete on a customer record. A reason is mandatory for compliance audit trails.
Endpoint: https://api.amlwatcher.com/api/tru-risk-customers/delete
Method: POST
- HTTP
- Javascript
- PHP
- Python
- Ruby
- Java
- cURL
- C#
- Go
POST /api/tru-risk-customers/delete HTTP/1.1
Host: api.amlwatcher.com
Content-Type: application/json
Authorization: Bearer Token
{
"customer_id": "Your Customer ID",
"deleted_reason": "Duplicate entry created by API test."
}
var raw = JSON.stringify({
customer_id: "Your Customer ID",
deleted_reason: "Duplicate entry created by API test.",
});
fetch("https://api.amlwatcher.com/api/tru-risk-customers/delete", {
method: "POST",
headers: {
Authorization: "Bearer Token",
"Content-Type": "application/json",
},
body: raw,
})
.then((response) => response.json())
.then((result) => console.log(result));
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://api.amlwatcher.com/api/tru-risk-customers/delete',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => '{"customer_id":"Your Customer ID","deleted_reason":"Duplicate entry created by API test."}',
CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer Token'),
));
echo curl_exec($curl);
import requests
import json
url = "https://api.amlwatcher.com/api/tru-risk-customers/delete"
payload = {"customer_id": "Your Customer ID", "deleted_reason": "Duplicate entry created by API test."}
headers = {'Authorization': 'Bearer Token', 'Content-Type': 'application/json'}
print(requests.post(url, headers=headers, data=json.dumps(payload)).text)
require "uri"
require "json"
require "net/http"
url = URI("https://api.amlwatcher.com/api/tru-risk-customers/delete")
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["Authorization"] = "Bearer Token"
request.body = JSON.dump({"customer_id" => "Your Customer ID", "deleted_reason" => "Duplicate entry created by API test."})
puts Net::HTTP.start(url.host, url.port, use_ssl: true) {|http| http.request(request)}.body
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class Main {
public static void main(String[] args) throws Exception {
URL url = new URL("https://api.amlwatcher.com/api/tru-risk-customers/delete");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Authorization", "Bearer Token");
conn.setRequestProperty("Content-Type", "application/json");
conn.setDoOutput(true);
String json = "{\"customer_id\": \"Your Customer ID\", \"deleted_reason\": \"Duplicate entry created by API test.\"}";
try(OutputStream os = conn.getOutputStream()) { os.write(json.getBytes("utf-8")); }
System.out.println(conn.getResponseCode());
}
}
curl --location --request POST 'https://api.amlwatcher.com/api/tru-risk-customers/delete' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer Token' \
--data-raw '{
"customer_id": "Your Customer ID",
"deleted_reason": "Duplicate entry created by API test."
}'
using RestSharp;
var client = new RestClient("https://api.amlwatcher.com/api/tru-risk-customers/delete");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer Token");
request.AddJsonBody(new { customer_id = "Your Customer ID", deleted_reason = "Duplicate entry created by API test." });
Console.WriteLine(client.Execute(request).Content);
package main
import (
"fmt"
"strings"
"net/http"
)
func main() {
url := "https://api.amlwatcher.com/api/tru-risk-customers/delete"
payload := strings.NewReader(`{"customer_id": "Your Customer ID", "deleted_reason": "Duplicate entry created by API test."}`)
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer Token")
res, _ := http.DefaultClient.Do(req)
fmt.Println(res.Status)
}
Request Body
| Parameter | Type | Description |
|---|---|---|
customer_id | String | Required. The unique ID of the customer record. |
deleted_reason | String | Required. A brief explanation for the decision. |
Success Response
{
"status": "SUCCESS",
"data": {
"deleted_reason": "Duplicate entry created by API test.",
"message": "Customer deleted successfully"
},
"error": false
}
5. Bulk Operations
The Bulk Operations endpoints allow you to process large volumes of customers efficiently by uploading CSV files. You can upload batches for screening and track the status of past uploads.
Once a batch is uploaded, TruRisk screens every customer in the file, assigns a verdict and recommendation to each, and—if enabled in Configuration—automatically creates a case for records that need follow-up. Every bulk execution is logged for audit purposes and can be reviewed through the upload history endpoint below.
Upload Bulk File
Uploads a CSV file for batch processing. The system will queue the file and process customers asynchronously. tru_risk_mode is optional; if omitted, the organization default_mode from Configuration is used.
Endpoint: https://api.amlwatcher.com/api/customers/bulk-upload
Method: POST
Content-Type: multipart/form-data
- HTTP
- cURL
- Javascript
- PHP
- Python
- Ruby
- Java
- C#
- Go
POST /api/customers/bulk-upload HTTP/1.1
Host: api.amlwatcher.com
Authorization: Bearer Token
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="tru_risk_mode"
TruRisk Advanced
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="trurisk-template-lite.csv"
Content-Type: text/csv
(CSV file content here)
------WebKitFormBoundary7MA4YWxkTrZu0gW--
curl --location --request POST 'https://api.amlwatcher.com/api/customers/bulk-upload' \
--header 'Authorization: Bearer Token' \
--form 'tru_risk_mode="TruRisk Advanced"' \
--form 'file=@"/path/to/your/trurisk-template-lite.csv"'
const formdata = new FormData();
formdata.append("tru_risk_mode", "TruRisk Advanced");
formdata.append("file", fileInput.files[0], "trurisk-template-lite.csv");
const requestOptions = {
method: "POST",
headers: { Authorization: "Bearer Token" },
body: formdata,
redirect: "follow",
};
fetch("https://api.amlwatcher.com/api/customers/bulk-upload", requestOptions)
.then((response) => response.json())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://api.amlwatcher.com/api/customers/bulk-upload',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => array(
'tru_risk_mode' => 'TruRisk Advanced',
'file'=> new CURLFile('/path/to/trurisk-template-lite.csv')
),
CURLOPT_HTTPHEADER => array(
'Authorization: Bearer Token'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
import requests
url = "https://api.amlwatcher.com/api/customers/bulk-upload"
payload = {'tru_risk_mode': 'TruRisk Advanced'}
files = [
('file', ('trurisk-template-lite.csv', open('/path/to/trurisk-template-lite.csv','rb'), 'text/csv'))
]
headers = {'Authorization': 'Bearer Token'}
response = requests.request("POST", url, headers=headers, data=payload, files=files)
print(response.text)
require "uri"
require "net/http"
url = URI("https://api.amlwatcher.com/api/customers/bulk-upload")
https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = "Bearer Token"
form_data = [['tru_risk_mode', 'TruRisk Advanced'],['file', File.open('/path/to/trurisk-template-lite.csv')]]
request.set_form form_data, 'multipart/form-data'
response = https.request(request)
puts response.read_body
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.Files;
public class Main {
public static void main(String[] args) throws Exception {
String url = "https://api.amlwatcher.com/api/customers/bulk-upload";
String boundary = "---Boundary" + System.currentTimeMillis();
String lineFeed = "\r\n";
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Authorization", "Bearer Token");
conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
conn.setDoOutput(true);
OutputStream outputStream = conn.getOutputStream();
PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream, "UTF-8"), true);
// Add Field
writer.append("--" + boundary).append(lineFeed);
writer.append("Content-Disposition: form-data; name=\"tru_risk_mode\"").append(lineFeed);
writer.append(lineFeed);
writer.append("TruRisk Advanced").append(lineFeed);
// Add File
File file = new File("/path/to/trurisk-template-lite.csv");
writer.append("--" + boundary).append(lineFeed);
writer.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + file.getName() + "\"").append(lineFeed);
writer.append("Content-Type: text/csv").append(lineFeed);
writer.append(lineFeed);
writer.flush();
Files.copy(file.toPath(), outputStream);
outputStream.flush();
writer.append(lineFeed);
writer.append("--" + boundary + "--").append(lineFeed);
writer.close();
System.out.println(conn.getResponseCode());
}
}
using RestSharp;
var client = new RestClient("https://api.amlwatcher.com/api/customers/bulk-upload");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer Token");
request.AddParameter("tru_risk_mode", "TruRisk Advanced");
request.AddFile("file", "/path/to/trurisk-template-lite.csv");
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
package main
import (
"bytes"
"fmt"
"io"
"mime/multipart"
"net/http"
"os"
)
func main() {
url := "https://api.amlwatcher.com/api/customers/bulk-upload"
method := "POST"
payload := &bytes.Buffer{}
writer := multipart.NewWriter(payload)
_ = writer.WriteField("tru_risk_mode", "TruRisk Advanced")
file, _ := os.Open("/path/to/trurisk-template-lite.csv")
defer file.Close()
part, _ := writer.CreateFormFile("file", "trurisk-template-lite.csv")
io.Copy(part, file)
writer.Close()
client := &http.Client{}
req, _ := http.NewRequest(method, url, payload)
req.Header.Add("Authorization", "Bearer Token")
req.Header.Set("Content-Type", writer.FormDataContentType())
res, _ := client.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}
Request Body Parameters
| Parameter | Type | Description |
|---|---|---|
file | File | Required. The CSV file containing customer data. |
tru_risk_mode | Enum | Optional. Must be TruRisk Lite or TruRisk Advanced if provided. If omitted, the organization default_mode from TruRisk Configuration is used. |
Success Response
{
"data": {
"message": "Bulk upload queued for processing",
"status": "Pending",
"total_customers": 150,
"upload_id": "Your Upload ID"
},
"error": false,
"status": "SUCCESS"
}
Get Bulk Upload History
Retrieves a paginated history of all bulk file uploads, including their processing status and mode.
Endpoint: https://api.amlwatcher.com/api/customers/bulk-upload/history
Method: GET
- HTTP
- cURL
- Javascript
- PHP
- Python
- Ruby
- Java
- C#
- Go
GET /api/customers/bulk-upload/history?status=Completed&tru_risk_mode=TruRisk Advanced HTTP/1.1
Host: api.amlwatcher.com
Authorization: Bearer Token
curl --location --request GET 'https://api.amlwatcher.com/api/customers/bulk-upload/history?status=Completed&page=1' \
--header 'Authorization: Bearer Token'
fetch(
"https://api.amlwatcher.com/api/customers/bulk-upload/history?status=Completed&page=1",
{
method: "GET",
headers: {
Authorization: "Bearer Token",
},
},
)
.then((response) => response.json())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://api.amlwatcher.com/api/customers/bulk-upload/history?status=Completed&page=1',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => array(
'Authorization: Bearer Token'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
import requests
url = "https://api.amlwatcher.com/api/customers/bulk-upload/history"
params = {'status': 'Completed', 'page': '1'}
headers = {'Authorization': 'Bearer Token'}
response = requests.request("GET", url, headers=headers, params=params)
print(response.text)
require "uri"
require "net/http"
url = URI("https://api.amlwatcher.com/api/customers/bulk-upload/history?status=Completed&page=1")
https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = "Bearer Token"
response = https.request(request)
puts response.read_body
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws Exception {
URL url = new URL("https://api.amlwatcher.com/api/customers/bulk-upload/history?status=Completed&page=1");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Authorization", "Bearer Token");
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuffer content = new StringBuffer();
while ((inputLine = in.readLine()) != null) content.append(inputLine);
in.close();
System.out.println(content.toString());
}
}
using RestSharp;
var client = new RestClient("https://api.amlwatcher.com/api/customers/bulk-upload/history?status=Completed&page=1");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer Token");
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
package main
import (
"fmt"
"net/http"
"io/ioutil"
)
func main() {
url := "https://api.amlwatcher.com/api/customers/bulk-upload/history?status=Completed&page=1"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer Token")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := ioutil.ReadAll(res.Body)
fmt.Println(string(body))
}
Query Parameters
| Parameter | Type | Description |
|---|---|---|
page | Integer | Pagination page number. |
page_size | Integer | Records per page (Default 10). |
search | String | Search by upload ID or filename. |
status | Enum | Filter by status: Pending, Processing, Completed, Failed. |
tru_risk_mode | String | Filter by mode: TruRisk Lite or TruRisk Advanced. |
start_date | String | Filter by upload date start (DD-MM-YYYY). |
end_date | String | Filter by upload date end (DD-MM-YYYY). |
Response Fields
| Parameter | Type | Description |
|---|---|---|
upload_id | String | Unique ID for the bulk batch. |
file_name | String | Original name of the uploaded CSV. |
tru_risk_mode | String | Mode used for this batch. |
status | String | Current processing status (Completed, Pending, etc.). |
customers | Integer | Total customers found in the file. |
customers_created | Integer | Number of customers successfully created. |
customers_processed | Integer | Number of customers fully processed by AI. |
upload_date | String | Timestamp of the upload. |
uploaded_by | String | User who performed the upload. |
Success Response
{
"data": {
"pagination": {
"page": 1,
"page_size": 1,
"total_count": 106,
"total_pages": 11
},
"uploads": [
{
"cases_created": 0,
"customers": 1,
"customers_created": 1,
"customers_processed": 1,
"file_name": "trurisk-template-lite.csv",
"status": "Completed",
"tru_risk_mode": "TruRisk Advanced",
"upload_date": "2026-02-16T12:07:32.569000Z",
"upload_id": "Your Upload ID",
"uploaded_by": "User Name"
}
]
},
"error": false,
"status": "SUCCESS"
}